安卓系统无法识别TTS引擎

11

我在开发一个非常简单的应用程序,为我患有脑瘫的女儿设计。它只有一个大的“是”和“否”的按钮,所以她可以在被要求时按下它们。

好吧……我正在使用SVOX Classic TTS引擎。

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

以下是Google API的说明:

*如果我们的TextToSpeech对象创建后,成功的检查将标记为CHECK_VOICE_DATA_PASS结果代码,表示此设备已准备好进行语音输出。否则,我们需要告诉用户安装所需的数据,使设备成为一个多语言的语音输出机器!通过触发ACTION_INSTALL_TTS_DATA意图来下载和安装数据,该意图将带领用户进入Android市场并允许他/她启动下载。下载完成后,将自动安装数据。以下是您的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();
}

    }
如果我删除上面带有“ATTENTION”的部分(因为我确定已经安装了TTS),它在第一次运行应用程序时可以工作,但如果我离开应用程序然后再次打开它,它会显示“speak failed: not bound to tts engine”。
就像它没有创建TTS对象一样,因为应用程序仍然在内存中。
那么,大家...你们认为我应该怎么做呢?
这让我疯狂,我真的需要通过平板电脑与我的女儿进行沟通!
感谢任何帮助!

@Carols Pereira - 你解决了这个问题吗?有用户报告称遇到了你面临的同样问题,但是当我们在模拟器中测试时,它正常工作。你能够确定此问题的根本原因吗?这是否是svox中的一个错误? - aquero
6个回答

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对象来运行应用程序,因此我认为这种方法没有太多的缺点。


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。


0

我通过安装Ivona解决了这个问题,同时拥有两个Tts引擎可以解决所有问题,尽管我发现其他问题,例如没有默认的tts安装,但是使用两个引擎一起使用可以解决一个问题,虽然不是很好的解决方法,但是也算是一个解决方法。

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


1
你应该通过USB调试线将手机连接到电脑上,然后在命令行中输入:adb install <PC上.apk文件的路径> - Erol

0
在我的应用程序中,我还使用了checkintent.setAction(...)来检查是否安装了必要的TTS文件(在升级到ICS之前这个功能一直很好用)。在ICS中,它总是返回文件丢失。所以现在我只忽略这个检查:我创建对象并且初始化正常。 此外,我为两种不同的语言使用了两个实例。这似乎也不再起作用。 现在当我为其中一个实例设置语言时,对象的另一个实例也被设置为相同的语言(表现得像一个实例)。

0

我曾经遇到过同样的问题并解决了。也许是在限制时间方面存在问题,不确定,但在发言之前执行了一个简单的操作帮助了我。 无论如何我这样做:

mTts = new TextToSpeech(this, this);

String engine = mTts.getDefaultEngine();

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

Log.d("","...某些内容在此...");

然后当我点击我的说话按钮时,它会说话。您应该在OnInit方法上观察变量状态。也许单独的线程可以帮助应用程序进行对话。

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

我真心希望这能帮助到您。


-1

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

姜饼只允许在语言和输入/文本到语音输出中选择“首选”tts。

因此,tts优先于默认设置,这意味着不太清楚哪个会被使用。

我认为,在应用程序覆盖的情况下,具有默认设置的选项更好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接