私は現在、Pythonでボイスチャットプログラムを作成しようとしています。すべてのヒント/トリックはこれを行うことを歓迎します。
これまでのところ、pyAudioはPortAudioのラッパーであることがわかりました。それで、私はそれをいじって、マイクから入力ストリームを取得してスピーカーに再生しました。もちろんRAWのみ。
しかし、RAWデータをnetowrk経由で送信することはできません(サイズが大きいため)。そのため、それをエンコードする方法を探しています。そして、私はネットを検索し、 Pythonのこのspeexラッパーに出くわしました。真実であるのは良さそうです、そして私を信じてください、そうでした。
pyAudioでは、入力オーディオバッファから取得するチャンクのサイズを設定できます。リンクのサンプルコードでは、320に設定されています。エンコードすると、チャンクあたり最大40バイトのデータになります。これはかなり受け入れられると思います。そして今、問題のために。
入力ストリームを取得し、チャンクをエンコードし、デコードして再生するだけのサンプルプログラムを開始します(テストのためにネットワーク経由で送信するのではありません)。コンピュータをアイドル状態にしてこのプログラムを実行すると、うまく機能しますが、Firefoxなどを起動するとすぐに、オーディオ入力バッファがすべて詰まります。成長するだけで、すべてがクラッシュし、バッファでオーバーフローエラーが発生します。
では、なぜ私はストリームの320バイトを取得しているのですか?1024バイトか何かを取ることができ、それはバッファへのプレッシャーを和らげるでしょう。しかし。speexに1024バイトのデータをエンコード/デコードするように指定すると、クラッシュして、バッファには大きすぎると表示されます。または、エンコード/デコードしますが、サウンドは非常にノイズが多く、1024チャンクのごく一部のみをエンコードし、残りは静的ノイズであるかのように「途切れ途切れ」になります。だから、音はヘリコプターのように聞こえます、笑。
私はいくつかの調査を行いましたが、speexは一度に320バイトのデータしか変換できないようで、広帯域の場合は640バイトしか変換できないようです。しかし、それは標準ですか?この問題を解決するにはどうすればよいですか?speexで動作するようにプログラムを構築するにはどうすればよいですか?使用可能なすべてのデータを取得してバッファーから読み取るミドルバッファーを使用して、これを320ビットにチャンクし、エンコード/デコードすることができます。しかし、これには少し時間がかかり、問題の非常に悪い解決策のようです。
私の知る限り、オーディオをエンコードするPython用のエンコーダーは他にないので、受け入れ可能な小さなパッケージでネットワーク経由で送信できますか?私は今3日間グーグルしています。
また、このpyMediaライブラリがありますが、この種のソフトウェアでmp3/oggに変換するのが良いかどうかはわかりません。
これを読んでくれてありがとう、誰かが私を助けてくれることを願っています!(: