マイクからデータを録音し、スピーカーからリアルタイムで再生しようとしていますが、多少の遅延がありますが、いくつか問題があります。私は python と alsaaudio を使用することを選択しました。現在問題が発生しているスクリプトは、 こちらで見つけることができます。これは、これまでのところ(遅延部分ではない)で機能しますが、クリックが発生します。alsaaudio docs には、次のように書かれています。
PCM オーディオの再生に関する問題の最も一般的な理由は、PCM デバイスへの書き込みがデバイスのデータ レートと正確に一致する必要があることです。
デバイスに書き込まれるデータが少なすぎると、アンダーランになり、醜いクリック音が発生します。逆に、デバイスに書き込まれるデータが多すぎると、書き込み関数はブロック (PCM_NORMAL モード) するか、0 を返します (PCM_NONBLOCK モード)。
ドキュメントを誤解しているようです。 write() について次のように述べています。
PCM.write(データ)
音をデータに書き込み(再生)ます。データの長さは、フレーム サイズの倍数である必要があり、ピリオドのサイズと正確に一致する必要があります。
私のスクリプトのピリオドは 160 です。
read() について次のように述べています。
PCM_NORMAL モードでは、この関数は完全な期間が利用可能になるまでブロックし、タプル (長さ、データ) を返します。ここで、長さはキャプチャされたデータのフレーム数、データは文字列としてキャプチャされたサウンド フレームです。返されるデータの長さは、periodsize*framesize バイトになります。
私のスクリプトでは、period_size*frame_size も 160 に等しくなければなりませんが、長さ (タプル read() が返す部分) を出力すると、940 になります。明らかに、適切な量のデータを out に渡していないようです。 write() ですが、どこに行けばよいかわかりません。このコードは主に見つけた例を使ってまとめました。alsaaudio / サウンドで作業を始めたばかりで、いくつかの興味深いプロジェクトをまとめようとしていたので、まだ多くのことを知りません。
また、マイクからライブで録音してから、100 ミリ秒の遅延で再生したかったので、time.sleep() をコメントしました。コメントを外すと、長さが 940 から -32 に繰り返し変化するように見え、最終的に out.write() が例外をスローします (データが不足しています)。
サウンド データをリアルタイムで 100 ミリ秒の遅延で録音および再生する方法 (またはスクリプトの何が問題なのか) を教えてもらえますか?