首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UtteranceProgressListener不适用于Android

UtteranceProgressListener不适用于Android
EN

Stack Overflow用户
提问于 2014-02-17 22:37:15
回答 2查看 3.8K关注 0票数 5

我正在制作一个应用程序,它使用tts来合成wav文件,每次一个广播接收器被触发。我正在使用AndroidStudio (最新的),并使用API 19和最小15。

我有带BroadcastListener的服务。每次执行BroadcastListener onReceive方法时,我都会使用

tts.synthesizeToFile(playing, null, storagePath + "/" + "tst.wav");

该文件已成功创建,但从未调用UtteranceProgressListener的UtteranceProgressListener()方法。

代码语言:javascript
复制
public void onCreate() {
    super.onCreate();

    //Get TTS capabilities
    //TODO: Use TextToSpeech.Engine.ACTION_CHECK_TTS_DATA to check if tts is available
    tts = new TextToSpeech(PresenterService.this,
            new TextToSpeech.OnInitListener() {
                @Override
                public void onInit(int status) {

                    //If the TTS engine was started successfully

                    if (status != TextToSpeech.ERROR) {

                        tts.setLanguage(Locale.US);
                        tts.setPitch(PRESENTER_PITCH);
                        tts.setSpeechRate(PRESENTER_RATE);
                    }

                }
            });

    tts.setOnUtteranceProgressListener(new TtsUtteranceListener());



    IntentFilter filter = new IntentFilter();
    filter.addAction("xxxxxxxxxxxxxxxxxx");

    mReceiver = new TrackChangedReceiver(tts);
    registerReceiver(mReceiver, filter);

}

TtsUtteranceListener类:

代码语言:javascript
复制
public class TtsUtteranceListener extends UtteranceProgressListener {

    @Override
    public void onDone(String utteranceId) {
        Log.d("TtsUtteranceListener", "utterance Done: " + utteranceId);
    }

    @Override
    public void onStart(String utteranceId) {
        Log.d("TtsUtteranceListener", "utterance Start: " + utteranceId);
    }

    @Override
    public void onError(String utteranceId) {
        Log.d("TtsUtteranceListener", "utterance Error: " + utteranceId);
    }
}

侦听器上的方法:

代码语言:javascript
复制
public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();

    if (action != null) {
        if (action.equalsIgnoreCase("xxxxxxxxxxxxxxxxx")) {
            String playing = "test string";
            tts.synthesizeToFile(playing, null, storagePath + "/" + "tst.wav");
        }
    }
}

我使用的是AndroidStudio,在调试模式下,我可以看到tts对象的mUtteranceProgressListener有一些对象引用:

代码语言:javascript
复制
com.example.android.ttstest.TtsUtteranceListener@41eaf8d8

但是听众的方法从来没有被调用过。Log.d()调用永远无法工作,并且那里的任何断点都不会被触发。

在调用时,我还尝试将UtteranceProgressListener声明为匿名类。

代码语言:javascript
复制
tts.setOnUtteranceProgressListener(new UtteranceProgressListener(){...});

但同样的事..。

有人能指出我做错了什么吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-18 22:01:45

好吧,我解决了。问题是我没有通过KEY_PARAM_UTTERANCE_ID考试。

代码语言:javascript
复制
if (action.equalsIgnoreCase("xxxxxxxxxxxxxxxxx")) {
    HashMap<String, String> hashTts = new HashMap<String, String>();
    hashTts.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "id");

    String playing = "test string";
    tts.synthesizeToFile(playing, hashTts, storagePath + "/" + "tst.wav");
}

我将参数参数作为null传递:

代码语言:javascript
复制
tts.synthesizeToFile(playing, null, storagePath + "/" + "tst.wav");
票数 8
EN

Stack Overflow用户

发布于 2017-09-18 20:11:36

我有一个有线的解决方案来检测tts是否已经发言完毕。虽然它不是优化的,但工作很好。

步骤1:在代码中创建这个类。(代码相同,而不是单独的文件)

代码语言:javascript
复制
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(.)时调用它

代码语言:javascript
复制
tts.speak(...);
new Waiter().execute();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21840688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档