Android中的全球TTS

时间:2011-11-16 22:36:36

标签: android android-activity text-to-speech

您好我正在开发一个盲人用户应用程序,因此我经常使用文本到语音作为实际上唯一一种如何响应用户操作的方法。 我决定在应用程序中运行一个全局TTS实例。 我已经用这种方式实现了

package com.simekadam.blindguardian;

import android.content.Context;
import android.speech.tts.TextToSpeech;
import android.speech.tts.TextToSpeech.OnInitListener;

public class SpeechHelper implements OnInitListener {

private static TextToSpeech mTts;
private String text; 
private static final SpeechHelper helper = new SpeechHelper();

public static SpeechHelper getInstance(){

    return helper;
}


public void say(String text, Context context){

    if(mTts == null){
        this.text = text;
        mTts = new TextToSpeech(context, (OnInitListener) helper);

    }
    else{
        mTts.speak(text, TextToSpeech.QUEUE_FLUSH, null);
    }
}


@Override
public void onInit(int status) {
    // TODO Auto-generated method stub
    if (status == TextToSpeech.SUCCESS) {
        mTts.speak(text, TextToSpeech.QUEUE_FLUSH, null);
    }
}

public void stopTTS(){
    if(mTts != null){
        mTts.shutdown();
        mTts.stop();
        mTts = null;
    }
}

}

起初 - 它的工作但是 ..我想查看语音数据的可用性

protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    Intent checkIntent = new Intent();
    checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
    startActivityForResult(checkIntent, MY_DATA_CHECK_CODE);
    text = getIntent().getExtras();
}


protected void onActivityResult(
        int requestCode, int resultCode, Intent data) {
    if (requestCode == MY_DATA_CHECK_CODE) {
        if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {
            // success, create the TTS instance
            mTts = new TextToSpeech(this, (OnInitListener) this);
            mTts.setLanguage(new Locale("cze", "CZE"));
        } else {
            // missing data, install it
            Intent installIntent = new Intent();
            installIntent.setAction(
                TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
            startActivity(installIntent);
        }
    }       
}

它来自Android开发人员门户网站的代码,但是我无法从不是android.Activity的子类的类启动Activity for result。 请问如何在不使用活动的情况下进行检查,这种调用TTS的方法是否正确? (我之前已经使用了所有的活动实现了它,但由于TTS错误关闭,有几个内存泄漏 - 当我正确关闭它时,它必须在每次调用时再次创建 - 只是太慢..)

3 个答案:

答案 0 :(得分:2)

在您知道TTS数据可用后,从onActivityResult()初始化您的全局实例。您的应用程序需要一个活动,因此从条目活动开始,所有后续活动都可以在初始化后使用您的全局实例。还要考虑何时以及如何关闭它。

答案 1 :(得分:2)

您不需要使用ACTION_CHECK_TTS_DATA。而是使用isLanguageAvailable这样: (确保仅在onInit完成后调用此方法)

    // check if language is available
    switch (tts.isLanguageAvailable(locale))
    {
        case TextToSpeech.LANG_AVAILABLE:
        case TextToSpeech.LANG_COUNTRY_AVAILABLE:
        case TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE:
            Log.d(TAG, "SUPPORTED");
            break;
        case TextToSpeech.LANG_MISSING_DATA:
            Log.d(TAG, "MISSING_DATA");//launch the install data activity
            break;
        case TextToSpeech.LANG_NOT_SUPPORTED:
            Log.d(TAG, "NOT SUPPORTED");//report failure
            break;
    }

答案 2 :(得分:0)

以下是gregm对类似问题的一些回答:

TTS - CHECK_VOICE_DATA_FAIL - Check engine availlable

Why is the ACTION_CHECK_TTS_DATA Intent "awkward to use"?

还建议仅使用TextToSpeech.isLanguageAvailable()而不是ACTION_CHECK_TTS_DATA,以及指向帮助程序类的指针。

我在一些带有Locale.US的Android 4.1.2手机上测试了这个,它可以很好地激活TTS引擎,并且可以很好地与第三方引擎配合使用。在旧的Android 1.6手机(G1)上测试时,看起来没有安装库存TTS引擎(LANG_MISSING_DATA)。在这种情况下,以下代码将重定向到要安装的商店:

Intent installIntent = new Intent();
installIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
startActivity(installIntent);

之后,在应用程序中使用tts引擎工作正常。基本上,来自android家伙的旧博客文章有点矫枉过正,因为根据我的经验它不能很好地与Android 4.x一起使用(ANDROID_CHECK_TTS_DATA总是在Android 4中返回CHECK_VOICE_DATA_MISSING_DATA。 x)的