首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android TTS onUtteranceCompleted回调未被调用

Android TTS onUtteranceCompleted回调未被调用
EN

Stack Overflow用户
提问于 2011-01-11 08:13:26
回答 4查看 18.8K关注 0票数 15

我正在尝试让Android TTS API读取我的“话语”,然后调用onUtteranceCompleted()侦听器,但未成功。我已经注册了我的TTS对象,并且它返回了SUCCESS,所以我永远也搞不懂为什么我的回调没有被调用。

我试着寻找帮助,但似乎其他人也有困难。我错过了什么简单的东西吗?

感谢你能提供的任何帮助。

代码语言:javascript
复制
package com.test.mytts;

import java.util.HashMap;

import android.app.Activity;
import android.media.AudioManager;
import android.os.Bundle;
import android.speech.tts.TextToSpeech;
import android.speech.tts.TextToSpeech.OnInitListener;
import android.speech.tts.TextToSpeech.OnUtteranceCompletedListener;
import android.widget.TextView;
import android.widget.Toast;

public class MyTTS extends Activity implements OnInitListener, OnUtteranceCompletedListener
{   
    TextView tv;
    private TextToSpeech _tts;

    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        tv = new TextView(this);

        tv.setText("MyTTS: ");

        super.onCreate(savedInstanceState);
        setContentView(tv);

        _tts = new TextToSpeech(this, this);
    }

    @Override
    public void onInit(int status) 
    {
        HashMap<String, String> myHashAlarm = new HashMap<String, String>();

        myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_NOTIFICATION));
        myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "test");

        if (status == TextToSpeech.SUCCESS)
        {
            Toast.makeText(this, "Trying to speak...", Toast.LENGTH_SHORT).show();

            int result = _tts.setOnUtteranceCompletedListener(this);

            tv.append(String.valueOf(result));

            _tts.setSpeechRate((float) .5);

            _tts.speak("Testing one, two, three", TextToSpeech.QUEUE_ADD, myHashAlarm);
        }
        else
            Toast.makeText(this, "Failed to initialize TTS.", Toast.LENGTH_SHORT).show();

    }

    @Override
    public void onUtteranceCompleted(String utteranceId) 
    {
        Toast.makeText(this, "onUtteranceCompleted", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onDestroy()
    {
        super.onDestroy();
        _tts.shutdown();
    }
}
EN

回答 4

Stack Overflow用户

发布于 2011-08-20 06:07:19

在tts对象的onInit函数中调用setOnUtteranceCompletedListener。

如果要在调用onUtteranceCompleted函数时对UI进行任何更改,请在runOnUIThread方法中添加代码。

并且一定要记住在调用to ()函数时添加Hashmap param值

示例:

代码语言:javascript
复制
TextToSpeech tts= new TextToSpeech(context, new OnInitListener() {

 @Override
 public void onInit(int status) {

    mTts.setOnUtteranceCompletedListener(new OnUtteranceCompletedListener() {

        @Override
        public void onUtteranceCompleted(String utteranceId) {

            runOnUiThread(new Runnable() {

                @Override
                public void run() {
                //UI changes
                }
            });
        }
    });

 }
});


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

params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID,"stringId");

tts.speak("Text to Speak",TextToSpeech.QUEUE_FLUSH, params);
票数 21
EN

Stack Overflow用户

发布于 2011-02-22 10:44:27

我认为除非您指定一个带有id的语句,例如:

代码语言:javascript
复制
map.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, utteranceid);

将不会调用您的话语完成方法。

在这种情况下,map是您在说话时传递给引擎的Hashmap。

票数 20
EN

Stack Overflow用户

发布于 2013-07-29 18:33:05

这将适用于API级别的>=15。

代码语言:javascript
复制
import java.util.HashMap;
import java.util.Locale;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.speech.tts.TextToSpeech;
import android.speech.tts.TextToSpeech.OnInitListener;
import android.speech.tts.UtteranceProgressListener;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity implements OnInitListener{

    private static final int CHECK_TTS_DATA = 0X123;
    protected static final String TAG = MainActivity.class.getSimpleName();
    private TextToSpeech textToSpeech;
    private Button buttonSayIt;
    private EditText editTextTts;
    String tts;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        buttonSayIt=(Button) findViewById(R.id.buttonSayIt);
        editTextTts=(EditText) findViewById(R.id.editTextTts);
        buttonSayIt.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                tts=editTextTts.getText().toString();
                Log.d(TAG, tts);
                speach(tts,"you_utterance_id");
            }
        });
        //check for TTs data
        Intent checkTtsDataIntent=new Intent();
        checkTtsDataIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
        startActivityForResult(checkTtsDataIntent, CHECK_TTS_DATA);

    }

    protected void speach(String tts,String utteranceId) {
        HashMap<String, String> params = new HashMap<String, String>();
        params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID,utteranceId);
        textToSpeech.speak(tts,TextToSpeech.QUEUE_FLUSH,params);
    }

    @Override
    public void onInit(int status) {
        if(status==TextToSpeech.SUCCESS){
            if(textToSpeech.isLanguageAvailable(Locale.US)==TextToSpeech.LANG_AVAILABLE){
                textToSpeech.setLanguage(Locale.US);
            }
        }else if(status==TextToSpeech.ERROR){
            Toast.makeText(this, "Sorry Text To Speach faild", Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(requestCode==CHECK_TTS_DATA){
            if(resultCode==TextToSpeech.Engine.CHECK_VOICE_DATA_PASS){
                textToSpeech=new TextToSpeech(this, this);      
                textToSpeech.setOnUtteranceProgressListener(utteranceProgressListener);
            }else{
                Intent installTtsIntent=new Intent();
                installTtsIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
                startActivity(installTtsIntent);
            }
        }
    }

    UtteranceProgressListener utteranceProgressListener=new UtteranceProgressListener() {

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

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

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

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4652969

复制
相关文章

相似问题

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