私は自分の声のすべての単語を自動録音して抽出できるソフトウェアを開発しています。portaudio ライブラリを使用して解決しました。しかし、私は音の検出に固執しています。無音の値をゼロに設定したので、ゼロのサンプルがある場合、それは音の開始点または終了点である必要があります。しかし、実行すると、プログラムは多くの単語を作成しました。portaudio で読み取った値は生データなので、そのように処理できないからだと思います。私は正しいですか?どうすれば修正できますか?ちなみに、私はC++でコーディングしています:D
2 に答える
PCM ストリーム内の信号の存在を検出するには、それを検出できます。dprogramz が述べたように、サウンドカードのノイズフロアはおそらく完璧ではないため、ノイズ信号が記録されます (マイクが接続されていなくても)。
解決策は、VOXまたはVADアルゴリズムを使用して、あなたの声の存在を検出することです。ほとんどのコンシューマ グレードの電子機器では、信号に対してノイズ フロアが人間の耳にとって「無音」になるほど低いため、VOX は注意が必要です。これは、ノイズ フロアと信号の振幅の差がわずかであることを意味します。サウンド カードで AGC がオンになっている場合、ノイズ フロアが移動する可能性があるため、さらに困難になる可能性があります。そうは言っても、VOXは民生用機器にうまく実装できます。しきい値を確立するには、より多くの労力が必要です。最適な場合、ストリームがアクティブな間、しきい値が定期的に計算されます。
これを行う場合、VAD アルゴリズムを実装します。あなたの目的はあなたの声を検出することなので、使用する機器に関係なく、信頼できる結果が得られるはずです。
RAW値だからだとは思いません。RAW サウンド ファイルは、周波数とボリューム情報のビットストリームです。
ただし、値がゼロになることはめったにありません (あったとしても)。マイクによって発生する少量の電気ノイズがあることを考慮する必要があります。マイクの「アイドル」dB を把握します (マイクに向かって話していないときにレベルをテストしてください)。次に、開始/終了を検出するために、無音のしきい値 (特定の数のサンプルに対して特定の dB レベル未満) を設定する必要があります。ゼロ値を検出しようとすることはほぼ不可能です。