【问题标题】:TTS-UtteranceProgressListener not being called未调用 TTS-UtteranceProgressListener
【发布时间】:2013-12-16 07:14:07
【问题描述】:

我不想把我所有的代码都放在这里,所以我只放相关的部分。如果您需要更多,请随时询问。

我正在使用文本转语音 (TTS),它在询问问题后会导致语音听众...我通过日志输出发现 TTS 的 onInit 正在被调用,但 UtteranceProgressListener 不是,我想不出出为什么。任何帮助表示赞赏。

// ---Initialize TTS variables---

        // Implement Text to speech feature
        tts = new TextToSpeech(this, new ttsInitListener());

        // set listener to the TTS engine
        tts.setOnUtteranceProgressListener(new ttsUtteranceListener());

        if (!tts.isSpeaking()) {
            tts.speak("Speak to me", TextToSpeech.QUEUE_FLUSH, null);
        }

// --- TEXT TO SPEECH && SPEECH TO TEXT METHODS ---

class ttsInitListener implements OnInitListener {

    @Override
    public void onInit(int status) {

        if (status == TextToSpeech.SUCCESS) {
            tts.setLanguage(Locale.getDefault());

        } else {
            tts = null;
            Toast.makeText(mContext, "Failed to initialize TTS engine.",
                    Toast.LENGTH_SHORT).show();
        }
    }
}

class ttsUtteranceListener extends UtteranceProgressListener {

    @Override
    public void onDone(String utteranceId) {
        if (processStart) {
            speech.startListening(intent);
        } else {
            ...
        }

    }

    @Override
    public void onError(String utteranceId) {
    }

    @Override
    public void onStart(String utteranceId) {
    }    
}

我为我的所有 TTS 和 Speech 方法添加了日志输出。 UtteranceProgressListener 的 onStart 甚至没有被调用:

11-30 00:38:37.299: D/OpenGLRenderer(15842): Enabling debug mode 0
11-30 00:38:39.782: I/TextToSpeech(15842): Connected to ComponentInfo{com.google.android.tts/com.google.android.tts.service.GoogleTTSService}
11-30 00:38:39.782: I/TextToSpeech(15842): Set up connection to ComponentInfo{com.google.android.tts/com.google.android.tts.service.GoogleTTSService}
11-30 00:38:39.782: D/LOOK AT ME!!!(15842): ttsInitListener - onInit

【问题讨论】:

  • 必须在 onstart 中的话语进度监听器上进行 logcat 打印输出
  • 我刚停下来。大约 20 分钟后会回来,然后我会添加并粘贴日志
  • @AndroidVenkatesh 我将输出添加到 OP

标签: android text-to-speech


【解决方案1】:

找到答案...

原来我在网上找到的TTS资源是使用单个TTS字符串源,所以tts.speak(String text, int queueMode, HashMap params)中的第三个参数设置为null。

致将来遇到此问题的任何人:

如果您将第三个参数设置为 null,则没有 ID 可供 UtteranceProgressListener 跟踪。修复是创建和初始化一个哈希图,然后添加到包含的数组中,为每个具有新 ID 的新 TTS 可以被跟踪。代码如下:

HashMap<String, String> map = new HashMap<String, String>();

那么,在调用 tts.speak 之前...

map.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "UniqueID");

那么你就可以用所有参数调用 speak...

tts.speak(text, TextToSpeech.QUEUE_FLUSH, map);

【讨论】:

  • 该唯一 ID 还可以防止您应用的 TTS 和 SpeechRecognition(此处未显示)干扰其他应用的录音和音频播放。
【解决方案2】:

附加到 WizardKnight 的好答案:

新的 API 更喜欢 Bundle,所以用 Bundle 替换 HashMap

Bundle params = new Bundle();
params.putString(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "");

然后当你拨打电话时

tts.speak(text, TextToSpeech.QUEUE_FLUSH, params, "UniqueID");

关键是在通话中使用ID。你可以把它放在 Bundle 中,但它不会为你做更多的事情。它必须在通话中才能触发监听器。

【讨论】:

  • 设置 utteranceId 解决了问题
【解决方案3】:

我有一个用于检测天气的有线解决方案 tts 讲完了。

第 1 步:在您的代码中创建此类。

class Waiter extends AsyncTask<Void,Void,Void>{
        @Override
        protected Void doInBackground(Void... voids) {
            while (tts.isSpeaking()){
                try{Thread.sleep(1000);}catch (Exception e){}
            }
            return null;
        }
        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            //TTS has finished speaking. WRITE YOUR CODE HERE
        }
    }

第 2 步:调用 tts.speak(...) 时调用它

tts.speak(...);
new Waiter().execute();

【讨论】:

  • 检查:while (tts! =null && tts.isSpeaking())
  • 这可能有效,但如上所述设置 TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID 不会那么痛苦。
【解决方案4】:

只需使用这个简单的代码:

mTTS.speak(text, TextToSpeech.QUEUE_FLUSH, null, "MyUniqueUtteranceId");

【讨论】:

    猜你喜欢
    • 2014-09-25
    • 2014-03-17
    • 2018-06-23
    • 2011-06-06
    • 2019-02-27
    • 1970-01-01
    • 2017-08-15
    • 2015-04-15
    • 2015-02-15
    相关资源
    最近更新 更多