无法直接调用TextToSpeech实例的speak()

时间:2015-07-09 19:24:06

标签: java android text-to-speech

我会先添加代码。

class Child
  include Mongoid::Document
  include Mongoid::Paperclip
  embedded_in :parent, inverse_of: :childrens
  has_mongoid_attached_file :photo,
       path: "parent/:id_parent/child/:id/:filename"

  Paperclip.interpolates :id_parent do |attachment, style|
    return attachment.instance.parent.id.to_s
  end

end

我正在努力使用TextToSpeech实例。

当我点击按钮时,它说话。

但是,当我直接使用TextToSpeech实例调用speak()方法时,它根本就不会说话。

调用单击按钮时调用的speakOut()方法也不起作用。

我不知道为什么会这样。

3 个答案:

答案 0 :(得分:1)

单击按钮时 方法工作的原因是因为 onClickListener() onClick()方法。

相反,该行

myTTS.speak("Why doesn't this work?", TextToSpeech.QUEUE_FLUSH, null);

没有Android可以触发的侦听器/方法调用。所以基本上要解决这个问题,你需要在事件监听器中调用上面的方法,例如 onTouchEvent() onClickListener()

答案 1 :(得分:1)

TextToSpeech构造函数启动与该服务的连接,该服务位于另一个进程中。在建立连接之前,您创建的TTS对象不可用。在侦听器的onInit()方法中报告连接的状态。您需要保留在那里报告的状态,以了解服务何时可用。

我稍微重复了你的例子,并添加了日志语句来演示行为。

public class MainActivity extends Activity {
    private static final String TAG = "Demo";

    TextToSpeech myTTS;
    boolean mInitComplete;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.i(TAG, "onCreate()");

        setContentView(R.layout.activity_main);

        Button btnSpeak = (Button)findViewById(R.id.button1);
        btnSpeak.setOnClickListener(new View.OnClickListener() {
            public void onClick(View arg0) {
                speakOut("You pressed the button");
            }
        });
    }

    private void speakOut(String msg) {
        if (mInitComplete) {
            int status = myTTS.speak(msg, TextToSpeech.QUEUE_FLUSH, null);
            if (status == TextToSpeech.SUCCESS) {
                Log.i(TAG, "speakOut(): SUCCESS");
            } else {
                Log.i(TAG, "speakOut(): ERROR");
            }
        } else {
            Log.i(TAG, "speakOut(): TTS Not Initialized");
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.i(TAG, "onResume()");

        myTTS = new TextToSpeech(this, new TextToSpeech.OnInitListener() {
            @Override
            public void onInit(int status) {
                if (status == TextToSpeech.SUCCESS) {
                    mInitComplete = true;
                    Log.i(TAG, "onInit(): TTS Initialized");
                } else {
                    Log.i(TAG, "onInit(): TTS Init Failed");
                }
            }
        });

        speakOut("This will fail because TTS init is not complete");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.i(TAG, "onPause()");

        myTTS.shutdown();
        mInitComplete = false;
    }
}

答案 2 :(得分:1)

如果出现btnSpeak时尽可能快地按UIspeakOut方法也会失败。在调用Text To Speech之前,您无法调用speak方法onInit。在speak之前调用onInit方法并不违法,但您可以看到没有任何反应。

致电speakOut发言并启用btnSpeak中的onInit。如果在调用bntSpeak之前启用并按下onInit,则不会听到任何内容。如果互联网很慢,这很容易发生。