PocketSphynix不会按预期连续输出语音到文本

时间:2019-01-26 02:25:41

标签: android speech-to-text pocketsphinx

动机和背景故事(无需阅读可选):

我有一段有效的代码,可以同时使用Pocket sphnix和谷歌识别器,以便同时支持基于菜单的语音导航和文本的连续播放。

因此,如果用户使用的单词与菜单项匹配,则用户代码将使用他们的语音导航应用程序:

“好了,开始x” “好原子,停止x” “好吧,做z”

注意:PocketSphinx找到了“ Ok atom”触发短语,然后取消了杀死的PocketSphinx,并且由于具有更好的准确性,Google语音用于更长的短语。

如果识别器不匹配,它将开始连续语音朗读到像聊天机器人一样发送到后端的文本(由Google语音处理):

“嗨,我叫格林·拇指博士。 “今晚吃什么...。”

如果沉默了10秒钟,谷歌语音将被取消,而PocketSphinx将再次针对关键字/唤醒词触发器=“好原子”启动

**一切正常,直到后端应用程序也需要实际的原始音频字节为止。我在整个stackoverflow上进行了搜索,没有一个解决方案有效,或者对于我的项目来说是切合实际的。

然后,我发现PocketSphinx可以将原始数据还给您,因此我不得不考虑Google语音,仅使用PocketSphinx **

实际问题:

但是,在重构/删除Google语音识别器并仅使用PocketSphinx之后,由于我需要轻松访问识别的“原始音频字节”,因此PocketSphinx会继续听到其触发词“ ok atom”,而没有听到其他任何词/声音在触发字之前或之后!!

无论我说什么(例如“ hello”,“ hi”,“ 1,2,3”等),它只会听到触发器“ ok atom”,请参阅我的相关代码段

设置袖口毛孔的AsynTask的代码段:

 @Override
        protected Exception doInBackground(Void... params) {
            try {
                SpeechRecognitionService speechService = serviceReference.get();

                Assets assets = new Assets(speechService);


                File assetDir = assets.syncAssets();


                speechService.pocketSphinxRecognizer = defaultSetup()
                        .setAcousticModel(new File(assetDir, "en-us-ptm"))
                        .setDictionary(new File(assetDir, "cmudict-en-us.dict"))
                        // threshold to balance between false +/- (higher is less sensitive, was 1e-45f)
                        .setKeywordThreshold(1e-30f)
                        .getRecognizer();
                speechService.pocketSphinxRecognizer.addListener(listener);

                // create keyword-activation search
                speechService.pocketSphinxRecognizer.addKeyphraseSearch(KWS_SEARCH, KEYPHRASE);
            } catch (IOException e) {
                return e;
            }
            return null;
        }

袖珍毛孔生命周期方法的代码段:

private String KWS_SEARCH = "ok atom"; 

private void switchSearch(String searchName) {
            pocketSphinxRecognizer.stop();
            if (searchName.equals(KWS_SEARCH))
                pocketSphinxRecognizer.startListening(searchName);
            else
                pocketSphinxRecognizer.startListening(searchName, 10000);
        }

        private class PocketSphinxRecognitionListener implements edu.cmu.pocketsphinx.RecognitionListener {
            @Override
            public void onPartialResult(Hypothesis hypothesis) {

                try {
                    if (hypothesis != null) {
                        String cmd = hypothesis.getHypstr();

                        Log.d(TAG, "onPartialResult:" + cmd);

                        if (cmd.equalsIgnoreCase(KWS_SEARCH))
                        {

                            handleResults(cmd);
                        }
                        else
                        {
                            sendToBacknedForProcessing(cmd);
                        }

                    }

                }
                catch (NullPointerException exc)
                {
                    exc.printStackTrace();
                }
            }

            @Override
            public void onBeginningOfSpeech() {}

            @Override
            public void onEndOfSpeech() {

                if (!pocketSphinxRecognizer.getSearchName().equals(KWS_SEARCH))
                {
                  switchSearch(KWS_SEARCH);
                }
            }

            @Override
            public void onResult(Hypothesis hypothesis) {


                if (hypothesis != null) {
                    String cmd = hypothesis.getHypstr();
                    Log.d(TAG, "onResult:" + cmd);

                        sendToBacknedForProcessing(cmd);
                }
                }


            @Override
            public void onError(Exception e) {
                Log.e(TAG, "Pocketsphinx encounted an exception: " + e.getMessage());
            }

            @Override
            public void onTimeout() {
                switchSearch(KWS_SEARCH);
            }
        }

我实际上是逐步地浏览了这篇热门文章(https://www.guidearea.com/pocketsphinx-continuous-speech-recognition-android-tutorial/),但仍然没有正确的结果。

我想做的是支持两种模式:语音模式(如果识别出正确的单词),否则会持续发送到后端的文本。

感谢一百万!

0 个答案:

没有答案