私の質問に答えるために、Raspberry Piにロボットを作成しようとしています。
最初は名前を聞いたときにだけ応答するように設定しましたが、本当にうまくいきました。ところで、もう少し自然な会話を追加してみると問題が生じました。
ロボットがaplayコマンドを使用して話すたびに、arecordコマンドは自分の音声をキャプチャし、処理のためにロボットに送信します。ロボットは私の声と自分の声の違いを区別することができなかったので、繰り返し自分自身に話し始めました(とても面白いです。付け加えなければなりません)。
聞いている内容が正確に話す内容であることを確認するために、ボットコードを調べましたが(テキストに変換した後)うまく機能せず(時にはそれ自体が理解してほとんど変更しない)、少し余分な時間がかかりました。これを発見するための処理時間がありましたが、その間私が聞いている音が自分の音かどうかを調べようとしたので、私のコマンドは処理されませんでした。
私は同じシステムのaplayインスタンスが話した内容をrecordインスタンスに無視させる方法があるかどうか疑問に思います。私は確かに低レベルのソリューションが可能であると思います(例えば、ヘッドフォンなしでSkypeを使用する方法が気になります。友達の音声を無限に繰り返さないために音声認識を使用する必要はありません)。
しばらく解決策を探していましたが、この問題に対する言及が見つからないようです(一般的な問題のようです)。たぶん私はこの現象の名前を知らないかもしれません。アイデア?
答え1
arecord
制御しているスピーカーのマイクを介してサウンドをキャプチャするのに問題があると、遅延が発生する可能性がaplay
あります。
あなたが探しているキーワードはエコキャンセル。たとえば、Linuxベースのスマートフォンでは、ALSAとPulseaudioに既存のソフトウェアを使用できます。
デフォルトでは、アルゴリズムは受信した入力と送信された出力を関連付けて遅延を測定し、音量を決定し、入力から正しい遅延とスケーリングを含む出力を減算してキャンセルする必要があります。