说话失败不绑定到TTS引擎

时间:2013-08-08 15:12:50

标签: java android

所以我有一个原始活动,基本上与说话的确切代码相同,但我不得不将该代码移动到另一个活动中。我能说的唯一区别是文本到语音不是在异步方法中调用的。说话发生在speakFull方法中。 我收到这些错误:

speak failed: not bound to TTS engine
isSpeaking failed: not bound to TTS engine

我是Android开发的新手,我已经通过其他解决方案搜索了这个问题,而我似乎无法找到解决方案让我的工作成功。任何建议或帮助表示赞赏。

代码:

   package com.example.webview;

import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.speech.tts.TextToSpeech;
import android.text.method.ScrollingMovementMethod;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class ReadOut extends Activity implements TextToSpeech.OnInitListener, OnClickListener {


    boolean paused = false;
    String leftToRead = null;
    String res = null;

    @SuppressWarnings("deprecation")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.read_out);
        Intent intent = getIntent();
        res = intent.getExtras().getString("response");
        TextView textv = (TextView) findViewById(R.id.textView1);
        textv.setText(res);
        textv.setMovementMethod(new ScrollingMovementMethod());
        android.view.Display display = ((android.view.WindowManager)getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); 
        textv.setHeight((int)(display.getHeight()*0.76));
        leftToRead = speakFull(res);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        return true;
    }

    public String speakFull(String text){
        System.out.println("Speaking: " + text);
        TextToSpeech tts = new TextToSpeech(this, this);
        System.out.println("Speaking");
        String[] sentences = text.split("\n|\\.(?!\\d)|(?<!\\d)\\."); // Regex that splits the body of text into the sentences of that body which are stored in a String array.
        for(int i = 0; i < sentences.length; i++){
            if(!tts.isSpeaking() && !paused){
                System.out.println("Speaking: " + i);
                tts.speak(sentences[i], TextToSpeech.QUEUE_FLUSH, null);
            }else if(paused){
                System.out.println("Paused");
                String paused = "";
                for(int j = i - 1; j < sentences.length; j++){
                    paused += sentences[j];
                }
                return paused;
            }else{
                i--;
            }
            if(i == sentences.length - 1){
                return "Message 001: Complete";
            }
        }
        return null;
    }

    @Override
    public void onInit(int arg0) {
        // TODO Auto-generated method stub

    }

    public void clickPause(View v){
        if(paused){
            paused = false;
            Button b = (Button) findViewById(R.id.button1);
            b.setText("Play");
        }else{
            paused = true;
            Button b = (Button) findViewById(R.id.button1);
            b.setText("Pause");
            if(leftToRead == null){
                leftToRead = speakFull(res);
            }else{
                leftToRead = speakFull(leftToRead);
            }
        }
    }

    @Override
    public void onClick(DialogInterface arg0, int arg1) {
        // TODO Auto-generated method stub

    }

}

2 个答案:

答案 0 :(得分:13)

您只能在调用onInit()后调用speak()。所以请将你的tts说话onCreate中的代码改为onInit()

@Override
public void onInit(int status) {
    if (status == TextToSpeech.SUCCESS) {
         leftToRead = speakFull(res);

}

并将暂停初始化为true boolean paused = true;

答案 1 :(得分:0)

我有这个问题,但过了几分钟。现在我以这种方式解决了

myTTS.speak(speech, TextToSpeech.QUEUE_FLUSH, null);
        if(!myTTS.isSpeaking()) {
            myTTS = new TextToSpeech(this, this);
            System.out.println("tts restarted");
}

我知道,这不是一个好的解决方案,但目前可以。 仅有一个问题:在第一次出现故障时,TTS不会讲话。