【问题标题】:Android not acknowledging TTS EngineAndroid 不承认 TTS 引擎
【发布时间】:2012-02-26 03:44:53
【问题描述】:

我正在这里开发一个非常简单的应用程序。这是给我脑瘫女儿的。这只是一个很大的“是”和“否”按钮,所以她可以在需要时按下它们。

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

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

以下是 Google API 的说明:

*在我们的 TextToSpeech 对象创建后,成功的检查将由 CHECK_VOICE_DATA_PASS 结果代码标记,表明该设备已准备好说话。如果没有,我们需要让用户知道安装设备成为多语种说话机所需的数据!下载和安装数据是通过触发 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 引擎”

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

那么,伙计们……你们认为我应该怎么做?

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

感谢任何帮助!

【问题讨论】:

  • @Carols Pereira - 你能解决这个问题吗?一位用户报告说他们遇到了与您相同的问题,但是当我们在模拟器中对其进行测试时,它对我们来说效果很好。您是否能够确定此问题的根本原因?这是 svox 中的错误吗?

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


【解决方案1】:

我的应用程序也遇到了这个问题:TTS 在 2.3 中工作,但是当我尝试 4.0 时,它的症状与您的问题相同(我现在在寻找解决方案时才发现)。如果您通过“设置”强制关闭应用程序并重新启动它,引擎将工作,但只是“退出”并返回会使 ICS 中的 TTS 引擎未绑定。

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

至少对于 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 对象,所以我认为这种方法没有太多缺点。

【讨论】:

    【解决方案2】:

    这就是我在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 的烦人罪魁祸首。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 您应该通过 USB 调试线将手机连接到 PC,然后在命令行输入:adb install
      【解决方案4】:

      我遇到了同样的问题并解决了。也许这是边界的时间问题,不确定,但说话前的一个简单动作帮助了我。 反正我是这样做的:

      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(); 进行检查。

      我绝对希望这对您有所帮助。

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

          gingerbread 只允许语言和输入/文本到语音输出中的“首选”tts。

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

          我认为默认的应用程序覆盖是一个更好的选择。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-06
            • 2012-03-05
            • 2012-07-31
            • 1970-01-01
            • 2011-11-13
            相关资源
            最近更新 更多