Android不承认TTS引擎

时间:2012-02-26 03:44:53

标签: android android-4.0-ice-cream-sandwich text-to-speech

我正在开发一个非常简单的应用程序。这是我脑性麻痹的女儿。它只是一个很大的YES和NO按钮,所以她可以在要求时按下它们。

嗯......我正在使用SVOX经典TTS引擎。

一切顺利,直到我的平板电脑升级到ICS。现在,每次我运行应用程序时,都会打开市场,要求我安装TTS。我点击“回”然后,我的应用说话。 这非常烦人。

以下是Google API所说的内容:

*成功检查将由CHECK_VOICE_DATA_PASS结果代码标记,表示在创建TextToSpeech对象后,此设备已准备好发言。如果没有,我们需要让用户知道安装设备成为多语言对话机所需的数据!下载和安装数据是通过触发ACTION_INSTALL_TTS_DATA意图完成的,该意图将用户带到Android Market,并让她/他启动下载。下载完成后,将自动安装数据。以下是onActivityResult()实现的示例:*

这是我的代码:

public class yesOunoActivity extends Activity implements OnInitListener{
ImageView yes;
ImageView no;
public TextToSpeech tts;
private int MY_DATA_CHECK_CODE = 0;

@Override
public 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);

    tts = new TextToSpeech(this, this);

    setContentView(R.layout.yesorno);

    yes = (ImageView) findViewById(R.id.yes);
    no = (ImageView) findViewById(R.id.no);


    yes.setClickable(true); 
    yes.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent arg1) {

             if (arg1.getAction() == android.view.MotionEvent.ACTION_DOWN) {                             
                 tts.speak("yes!", TextToSpeech.QUEUE_ADD, null);
             }
             return true;
        }
    });


    no.setClickable(true); 
    no.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent arg1) {

             if (arg1.getAction() == android.view.MotionEvent.ACTION_DOWN) {                             

                //Intent myIntent = new Intent(v.getContext(), ParametrosActivity.class);
                tts.speak("no!", TextToSpeech.QUEUE_ADD, null);
             }
            return true;
    }

    });


}


@Override
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
            tts = new TextToSpeech(this, this);
        } else {
            // missing data, install it
            //ATTENTION: BELOW THIS GIVES ME PROBLEMS SINCE IT OPENS MARKET
            //AND I HAVE TO HIT THE BACK BUTTON, THEN, IT SPEAKS!
            //BTW TTS ENGINE "IS" INSTALLED!!
            Intent installIntent = new Intent();
            installIntent
                    .setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
            startActivity(installIntent);
        }
    }

}

@Override
public void onInit(int status) {
    if (status == TextToSpeech.SUCCESS) {
    } else if (status == TextToSpeech.ERROR) {
    }
}

@Override
public void onDestroy() {
    if (tts != null) {
        tts.stop();
        tts.shutdown();
    }
    super.onDestroy();
    System.gc();
}

    }

如果我删除上面带有“注意”的区域(因为我确定已经安装了TTS),它会在我第一次运行应用程序时运行,如果我离开应用程序并再次打开它,它会显示 “说话失败了:没有绑定引擎”

这就像它不会创建TTS对象,因为应用程序仍然在内存中。

所以,伙计们......你们认为我应该做些什么?

这让我发疯,我真的需要通过平板电脑与女儿沟通!

任何帮助表示赞赏!!

6 个答案:

答案 0 :(得分:1)

我的应用程序也遇到了这个问题:TTS适用于2.3,但是当我尝试使用4.0时,它的问题与你的问题相同(我现在在搜索解决方案时发现了这个问题)。如果您通过“设置”强制关闭应用程序并再次启动它,但只是“退出”并返回使ICS中的TTS引擎无法绑定,则引擎将起作用。

我在运行mTts.shutdown().后尝试将TTS对象(mTts)设置为null当我在退出后再次启动应用程序时,我的mTts.speak()行出现了空错误。

至少对于ICS来说,有些事情并没有放弃TTS引擎。 我的解决方案(现在)是我让我的TTS对象静态

// in Activity
private static TextToSpeech mTts;
.
.
.
// in onCreate()
mTts = new TextToSpeech(this, this);
.
.
.
// in onDestroy()
if (mTts != null) {
   mTts.stop();
   mTts.shutdown();
   mTts = null;
}

我之前只使用了一个TTS对象,所以我认为这种方法没有太多缺点。

答案 1 :(得分:0)

在我的应用程序中,我还使用checkintent.setAction(...)来检查是否安装了必要的tts文件(在升级到ICS之前,它就像魅力一样)。在ICS中,它始终返回文件丢失。所以现在我忽略了这个检查:我正在创建对象,它初始化很好。 此外,我使用了两种不同语言的实例。这似乎也不再起作用了。 现在,当我为其中一个实例设置语言时,该对象的另一个实例被设置为相同的语言(行为类似于一个实例)。

答案 2 :(得分:0)

我通过安装ivona同时安装了Tts引擎解决了所有问题,但是我发现其他问题,例如没有默认tts安装使用这两个一起使得一个工作不是一个很好的修复,但它的修复,

此外,我找不到允许我的手机安装非市场应用程序的选项,即我的SD卡上的apk

答案 3 :(得分:0)

我有同样的问题并解决了。也许这是一个时间问题,但不确定,但是说话之前的一个简单的动作帮助了我。 无论如何,我这样做了:

mTts = new TextToSpeech(this, this);

String engine = mTts.getDefaultEngine();

mTts = new TextToSpeech(this, this,engine);

Log.d("","...something here...");

然后,当我按下发言按钮时,它说话。您应该在OnInit方法上观察变量状态。也许separate thread可以帮助在应用中进行讨论。

顺便说一句,如果您确定已安装TTS,则可以移除块Intent checkIntent = new Intent();进行检查。

我绝对希望这可以帮助你。

答案 4 :(得分:0)

这就是我在onActivityResult(...)

中的内容
@Override
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, this);
        } else {
            // missing data, install it
            Intent installIntent = new Intent();
            installIntent.setAction(
                TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
            startActivity(installIntent);
        }
*/
        if (mTts==null) {
            Intent installIntent = new Intent();
            installIntent.setAction(
                TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
            startActivity(installIntent);                           
        }
        mTts = new TextToSpeech(this, this);                
    }
}

我没有使用if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {...},而是检查mTts是否已经实例化。您还必须将mTts设置为static,正如jlquant和Rakesh在之前的帖子中所提到的那样,因此您将只有一个实例。例如,private static TextToSpeech mTts

所以,除非你“强制停止”应用程序或它因错误而停止工作,否则它将不再调用startActivity(installIntent); - 每次都要求你安装TTS的烦人的罪魁祸首。

答案 5 :(得分:-1)

姜饼允许在语音输入中设置默认tts&输出/默认tts

姜饼只允许语言中的'首选'tts和语音输出的输入/文本。

所以tts是首选而不是默认值,这意味着它不清楚使用哪个。

默认情况下,应用程序覆盖了我认为更好的选项。