3

私は最近CMU Sphinxを再訪し、チュートリアルから始めてサンプル アプリケーションを適応させて、Android 用の基本的なホットワード検出器をセットアップしようとしました。

ドキュメントを深く掘り下げても、それ以上読めなくなるまで解決できなかったさまざまな問題があります...

それらを複製するために、キーワードwakeup youwakeup meを検出するように設計された基本的なプロジェクトを作成しました。

私の辞書:

me M IY
wakeup W EY K AH P
you Y UW

私の言語モデル:

\data\
ngram 1=5
ngram 2=5
ngram 3=4

\1-grams:
-0.9031 </s> -0.3010
-0.9031 <s> -0.2430
-1.2041 me -0.2430
-0.9031 wakeup -0.2430
-1.2041 you -0.2430

\2-grams:
-0.3010 <s> wakeup 0.0000
-0.3010 me </s> -0.3010
-0.6021 wakeup me 0.0000
-0.6021 wakeup you 0.0000
-0.3010 you </s> -0.3010

\3-grams:
-0.6021 <s> wakeup me
-0.6021 <s> wakeup you
-0.3010 wakeup me </s>
-0.3010 wakeup you </s>

\end\

上記の両方は、提案されたツールを使用して作成されました。

そして私のキーフレーズファイル:

wakeup you /1e-20/
wakeup me /1e-20/

上にリンクされたサンプル アプリケーションを適応させた、私のコードは次のとおりです。

public class PocketSphinxActivity extends Activity implements RecognitionListener {

    private static final String CLS_NAME = PocketSphinxActivity.class.getSimpleName();

    private static final String HOTWORD_SEARCH = "hot_words";

    private volatile SpeechRecognizer recognizer;

    @Override
    public void onCreate(Bundle state) {
        super.onCreate(state);
        setContentView(R.layout.main);

        new AsyncTask<Void, Void, Exception>() {
            @Override
            protected Exception doInBackground(Void... params) {
                Log.i(CLS_NAME, "doInBackground");

                try {

                    final File assetsDir = new Assets(PocketSphinxActivity.this).syncAssets();

                    recognizer = defaultSetup()
                            .setAcousticModel(new File(assetsDir, "en-us-ptm"))
                            .setDictionary(new File(assetsDir, "basic.dic"))
                            .setKeywordThreshold(1e-20f)
                            .setBoolean("-allphone_ci", true)
                            .setFloat("-vad_threshold", 3.0)
                            .getRecognizer();

                    recognizer.addNgramSearch(HOTWORD_SEARCH, new File(assetsDir, "basic.lm"));
                    recognizer.addKeywordSearch(HOTWORD_SEARCH, new File(assetsDir, "hotwords.txt"));
                    recognizer.addListener(PocketSphinxActivity.this);

                } catch (final IOException e) {
                    Log.e(CLS_NAME, "doInBackground IOException");
                    return e;
                }

                return null;
            }

            @Override
            protected void onPostExecute(final Exception e) {
                Log.i(CLS_NAME, "onPostExecute");

                if (e != null) {
                    e.printStackTrace();
                } else {
                    recognizer.startListening(HOTWORD_SEARCH);
                }
            }
        }.execute();
    }

    @Override
    public void onBeginningOfSpeech() {
        Log.i(CLS_NAME, "onBeginningOfSpeech");
    }

    @Override
    public void onPartialResult(final Hypothesis hypothesis) {
        Log.i(CLS_NAME, "onPartialResult");

        if (hypothesis == null)
            return;

        final String text = hypothesis.getHypstr();
        Log.i(CLS_NAME, "onPartialResult: text: " + text);

    }

    @Override
    public void onResult(final Hypothesis hypothesis) {
        // unused
        Log.i(CLS_NAME, "onResult");
    }

    @Override
    public void onEndOfSpeech() {
        // unused
        Log.i(CLS_NAME, "onEndOfSpeech");
    }


    @Override
    public void onError(final Exception e) {
        Log.e(CLS_NAME, "onError");
        e.printStackTrace();
    }

    @Override
    public void onTimeout() {
        Log.i(CLS_NAME, "onTimeout");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.i(CLS_NAME, "onDestroy");

        recognizer.cancel();
        recognizer.shutdown();
    }
}

:- 選択したキー フレーズ (およびその他の関連ファイル) をより類似しないように変更し、静かな環境で実装をテストする必要があります。適用されたセットアップとしきい値は非常にうまく機能します。

問題

  1. wakeup youまたはwakeup meと言うと、両方が検出されます。

最後の音節に増加した重みを適用する方法を確立できません。

  1. 私が単にwakeupと言うと、多くの場合 (常にではありませんが) 両方が検出されます。

これを回避する方法を確立できません。

  1. バックグラウンド ノイズに対してテストする場合、偽陽性が頻繁に発生します。

使用している基本しきい値を下げることができません。そうしないと、通常の条件下でキーフレーズが一貫して検出されません。

  1. バックグラウンド ノイズに対して長時間 (再現するには 5 分で十分です) テストした場合、すぐに静かな環境に戻ってキーフレーズを発声すると、検出されません。

静かな環境でテストが開始されたかのように、キーフレーズが正常に繰り返し検出されるまでに不確定な時間がかかります。

関連する可能性のある質問を見つけましたが、リンクが機能しなくなりました。認識機能をより頻繁にリセットする必要があるのではないかと思います。バックグラウンド ノイズが検出しきい値に平均化されないようにリセットするにはどうすればよいでしょうか。

  1. 最後に、キーフレーズを制限するという私の要件によって、音響モデルのサイズを縮小できるのでしょうか?

もちろん、アプリケーション内でパッケージ化する際のオーバーヘッドは有益です。

最後に (正直に!)、特に@NikolayShmyrevがこの質問を見つけてくれることを期待していますが、基本的な Android 実装/SDK を gradle 経由で完全にラップする計画はありますか?

ここまで来てくれた方々に感謝です…

4

1 に答える 1

2

私の言語モデル:

言語モデルは使用しないので必要ありません。

使用している基本しきい値を下げることができません。そうしないと、通常の条件下でキーフレーズが一貫して検出されません。

1e-20 は妥当なしきい値です。何が起こっているのかをよりよく理解できるように、誤検出がある場所のサンプル記録を提供できます。

バックグラウンド ノイズに対して長時間 (再現するには 5 分で十分です) テストした場合、すぐに静かな環境に戻ってキーフレーズを発声すると、検出されません。

これは予期される動作です。全体的に、バックグラウンド ノイズが長いと、レコグナイザーがオーディオ パラメーターにすばやく適応することが難しくなります。騒がしい場所で言葉を見つけたい場合は、ノイズ キャンセリング機能を備えた Bluetooth ヘッドセットなど、何らかのハードウェア ノイズ キャンセリング機能を使用することをお勧めします。

最後に、限られたキーフレーズに対する私の要件によって、音響モデルのサイズを縮小できるのでしょうか?

今はできません。スポッティングだけを探している場合は、https: //snowboy.kitt.​​ai を試すことができます

于 2016-09-03T22:07:44.653 に答える