1

私はポケットフィンクスを使用して、誰かが話すときに Android アプリケーションの単語を認識しています。ポケットフィンクスが記録する声の最大振幅を返す機能を実装したいと考えています。私が単語を話す場合、代わりにサウンドレベルを取得する必要があります(単語が認識されるか、デコーダからではないかのいずれか)。私がやったこと:ポケットフィンクスのコードを調べます->ソースファイルで現在コメントされているSpeechRecognizer:

 /*              while (!interrupted()
                && ((timeoutSamples == NO_TIMEOUT) || (remainingSamples > 0))) {
            int nread = recorder.read(buffer, 0, buffer.length);

            if (-1 == nread) {
                throw new RuntimeException("error reading audio buffer");
            } else if (nread > 0) {
                decoder.processRaw(buffer, nread, false, false);

                int max = 0;
                for (int i = 0; i < nread; i++) {
                    max = Math.max(max, Math.abs(buffer[i]));
                }....

この最大値はバッファから計算されているようです。完全な記録からこれを計算するにはどうすればよいですか。誰かが私にヒントを与えることができますか?

4

1 に答える 1

0

max を SpeechRecognizer クラスのフィールドにして、毎回初期化するのではなく、認識の開始時にのみ初期化します。

class SpeechRecognizer() {

     double maxLevel;

     void startRecognition() {
         maxLevel = 0.0;
     }

     ....         
        @Override
        public void run() {
                decoder.processRaw(buffer, nread, false, false);

                double level = 0;
                for (int i = 0; i < nread; i++) {
                    level += buffer[i] * buffer[i];
                }
                level = sqrt(level / nread);
                if (maxLevel < level)
                    maxLevel = level
      ....

}

ここでは、単純な最大値ではなく二乗平均平方根 (RMS) を使用することをお勧めします。これは、最大振幅のより安定した推定値であり、クリックのような振幅の単純なバーストに耐性があるためです。

また、すべてのバッファから結果とともに RMS を返し、レコグナイザ内ではなく、アプリケーション内で maxLevel を更新することもお勧めします。

于 2015-12-08T21:06:57.547 に答える