web-dev-qa-db-ja.com

音声ファイル入力から人間の声を検出する

トーキングトムアプリと同様に、自動音声録音機能を実装しようとしています。次のコードを使用して、オーディオレコーダーから入力を読み取り、バッファーを分析します。

 float totalAbsValue = 0.0f;
 short sample = 0;

 numberOfReadBytes = audioRecorder.read( audioBuffer, 0, bufferSizeInBytes);

 // Analyze Sound.
 for( int i=0; i<bufferSizeInBytes; i+=2 )
 {
     sample = (short)( (audioBuffer[i]) | audioBuffer[i + 1] << 8 );
     totalAbsValue += Math.abs( sample ) / (numberOfReadBytes/2);
 }

 // Analyze temp buffer.
 tempFloatBuffer[tempIndex%3] = totalAbsValue;
 float temp = 0.0f; 

 for( int i=0; i<3; ++i )
 temp += tempFloatBuffer[i];

これで、オーディオレコーダーからの音声入力を検出でき、オーディオバッファーを分析できます。

バッファは浮動小数点値に変換され、それが一定量増加した場合、バックグラウンドにサウンドがあると想定され、録音が開始されます。しかし問題は、アプリがファン/ ACダクトの音を含むすべてのバックグラウンドノイズの記録を開始することです。

誰かがバッファを分析して人間の声だけを検出するのを手伝ってくれる?または、オーディオレコーダーの入力から人間の声を検出する他の方法はありますか?

前もって感謝します、

29
Timson

音声検出はそ​​れほど単純ではありません。いくつかのアルゴリズムがあり、それらのいくつかは公開されています(例 GSM VAD )。いくつかのオープンソースVADライブラリが利用可能です。そのうちのいくつかについて説明します ここ

9
msh

きれいな録音がしたいなら

  1. 音声からノイズをフィルターします。[〜#〜] fft [〜#〜]を使用して、ローパス、ハイパス、バンドパスなどのフィルターを適用できますフィルター FFTを使用したフィルタリング および フィルター

2.ろ過後、ノイズが減少し、音声認識APIを使用できます

API

フィルタリングが多いほど、ノイズは少なくなります。認識は多くなりますが、ノイズとともにボイスも削除される可能性があるため、フィルタリングには注意が必要です。

FFtについての詳細も読む

人間の声の高速フーリエ変換

お役に立てれば :)

4
Albert Laure

音声検出については、fttアルゴリズムを試してください。

ノイズについては、speexライブラリを試してください。

3
afpro

正確に何を探していますか?音声で人間のスピーチを除外したいですか、それとも実際にその人が言ったことを知りたいですか?

人間の音声のフィルタリングは、ほぼすべてのスマートフォンで、デバイスの背面にある2番目のマイクでバックグラウンドノイズを録音し、2つの信号を差し引くことで行われます。しかし、正直なところ、2つの信号に直接アクセスできるAndroid APIは見ていません。

スピーチからテキストへの変換を行いたい場合は、Sphinx4とPraatをご覧ください。どちらもこの機能を果たしますが、Androidの実装を見たことはありません。 Sphinx4はJavaで完全に記述されていると主張しているため、Androidアプリに埋め込むことが可能であるべきです。

2
jboi

入力を処理する方法は、ノイズを除去する専用ライブラリを使用することです。

たとえば、 http://audacity.sourceforge.net はノイズ除去を行います。

ノイズの主なタイプを特徴付けている限り、音声のみが残っているはずです。

ユーザーからのキャプチャの前、およびユーザーがキャプチャを終了した後にサンプリングデータを収集することは価値があります。これにより、環境内のノイズのサンプルが同時に提供されます。これは、各ユーザーが固有のバックグラウンドノイズの課題に直面している場合に役立ちます。

2
Faisal Memon

Microsoftの音声認識APIの使用を検討しましたか?スタートレックでコンピューターに何かを尋ねる前に、「コンピューター」と言うように、音声キーの発声を使用して録音を開始できます。 ISpRecognizer :: CreateRecoContextを使用して、認識文法を読み込み、認識を開始します。次に、ISpPhraseを使用してチェックを実装し、記録を開始する必要があるかどうかを確認します。

1
Okuma.Scott

Windowsで同様の問題を解決しようとしました。私がすばやく学んだことの1つは、高速フーリエ変換を使用した単純な周波数分析では不十分です。マイクの単純なタップから手をたたくまで、多くのノイズが人間の周波数に影響を与えます。ある程度の高度なフィルタリングでもそれはできません。私は、最も簡単な方法は、ノイズをクラウドAPIに取り、音声に書き起こしてもらうことです。クラウドAPIが妥当な長さの文字列に文字変換できる場合は、録音を続行できます。それ以外の場合は、録音を停止します。これには、ノイズをサンプリングしてクラウドプロバイダーに送信する必要があります。

1
HelloNoggy

完全に一般的なケースでは、これは未解決の問題です。実用的な意味で...

最初のステップは、できるだけノイズのない録音をすることです。他の人が指摘したように、それは指向性のあるマイクから始まり、可能な限り維持したいサウンドに焦点を合わせています。

2番目のステップはフィルタリングです。前述のように、電話会社は、人間が音声理解のために実際に必要とする周波数範囲について多くの作業を行いました。その範囲外の周波数を除外すると、音声は...まあ、電話のように聞こえますが、バックグラウンドノイズはさらに取り除かれます。

それを超えたい場合、事態は非常に複雑になる可能性があります。特定の録音でノイズと見なすもののサンプルを示すことができる場合、いくつかのアルゴリズムがあり、それを分析して、残しておきたいサウンドを損なうことなくそれを差し引こうとします。これは単純なプログラミングではありません。もし私があなただったら、それを再発明/再実装しようとするのではなく、すでに正しく理解している人から購入することを真剣に検討したいと思います。 Android=で使用できるものがあるかどうか、または典型的なAndroidボックスに、リアルタイムなどで実行するのに十分な計算能力があるかどうかはわかりません。(スタジオでSoundSoapを使用してA/Cノイズを除去しましたが、非常にうまく機能します。)

実際、私自身の傾向は、問題を解決したものに単純化することです。私が得ることができる最も指向性があり、最も近いマイクを使用し、Android録音を行います...しかし、信号を行います市販のツールを使用して、後でクリーンアップするための処理ですが、私はすでに後者に投資しているため、バイアスがかかっていることを認めます。

1
Xaknp

彼らのほとんどは質問を誤解しており、彼らの回答はあなたとは異なる問題を解決します。

バッファ内のオーディオを解析して、人間の声の範囲の周波数を検索する必要があります。それらを検出したら、誰かが話し始めたことを意味し、録音を開始できます(スピーチの最初の部分が含まれているため、バッファも含めることを忘れないでください)。

オーディオRAWストリームの周波数のリストを出力するルーチンを検索します

0
Marco Marsala