一个基本的文本到语音应用程序不工作

时间:2010-06-12 13:52:53

标签: android

我在模拟器上尝试了以下内容,但是当应用程序启动时,它会产生运行时错误。有人可以帮我这个。继承人'我试过的代码

package com.example.TextSpeaker;

import java.util.Locale;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.speech.tts.TextToSpeech;
import android.speech.tts.TextToSpeech.OnInitListener;

public class TextSpeaker extends Activity {
/** Called when the activity is first created. */
int MY_DATA_CHECK_CODE = 0;
private TextToSpeech mtts;
String test1="hello world";
String test2="hi i am working fine";
    @Override

    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    Intent myintent = new Intent();
    myintent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
    startActivityForResult(myintent, MY_DATA_CHECK_CODE);
}
    protected void onActivityResult(int requestcode,int resultcode,Intent data)
    {
        if(requestcode == MY_DATA_CHECK_CODE)
        {
            if(resultcode==TextToSpeech.Engine.CHECK_VOICE_DATA_PASS)
            {
                // success so create the TTS engine
                mtts = new TextToSpeech(this,(OnInitListener) this);
                mtts.setLanguage(Locale.ENGLISH);
                mtts.speak(test1, TextToSpeech.QUEUE_FLUSH, null);
                mtts.speak(test2, TextToSpeech.QUEUE_FLUSH, null);
            }
            else
            {
                //install the Engine
                Intent install = new Intent();
                install.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
                startActivity(install);
            }
        }

    }


}

1 个答案:

答案 0 :(得分:0)

在发布这个问题一年多之后我就偶然发现了这个问题,但无论如何我都会继续回答,纯粹希望它能帮助将来会在这里结束的其他人。< / p>

我这是针对2.1撰写的,如果您使用&lt; 2.1(没有问题标签),请致歉

我可以立即发现一些可能让你有点悲伤的事情。

首先,以下内容:

mtts.speak(test1, TextToSpeech.QUEUE_FLUSH, null);
mtts.speak(test2, TextToSpeech.QUEUE_FLUSH, null);

如果我正确理解TextToSpeech API,使用QUEUE_FLUSH将清除当前正在说话的任何内容,因此可能第二行在第一行实际发言之前执行,并且您将体验到你所拥有的如上所述,只说最后一个。

理想情况下,你只需要其中一条线,如果用户输入不同的字符串,那么只需将其传递并让它冲出。

接下来,你应该投资一个onDestroy覆盖,在这里你可以关闭mtts对象,这可以防止你的应用程序占用TTS引擎,它总是很好的释放资源,当你完成它们,你你现在不会打开ResultSet吗?!

@Override
    public void onDestroy
            () {
        // Don't forget to shutdown!
        if (mTts != null) {
            mTts.stop();
            mTts.shutdown();
        }

        super.onDestroy();
    }

此外,正如您所述,由于您正在使用的线路,它只会说英语:

mtts.setLanguage(Locale.ENGLISH);

这很容易纠正,只需设置不同的区域设置即可。也许有一些按钮并相应地设置区域设置。我相信Google TTS引擎目前只支持英语,法语,德语,意大利语和西班牙语,但第三方TTS引擎可能会提供更多。

如果所有其他方法都失败了,我写了一篇可能有用的tutorial here

祝你好运!