安卓TTS无法朗读

14

我正在尝试在我的Activity中实现安卓的语音合成技术,但是我遇到了一个奇怪的错误。从我的代码中我听不到任何声音。只有当我将speak方法放置在onInit方法中时,它才起作用,否则它不会说话。

我的代码如下:

public class GameOverActivity extends Activity implements OnInitListener {
private TextToSpeech talker;
....
talker = new TextToSpeech(this, this);  
say("Something",false);
...
   public void onInit(int status) {  
        if (status == TextToSpeech.SUCCESS) {
          talker.setLanguage(Locale.US);
        }
        else if (status == TextToSpeech.ERROR) {
            Toast.makeText(this,"Error occurred while initializing Text-To-Speech engine", Toast.LENGTH_LONG).show();
        }

void say(String text, boolean flush) {
         if(flush == true)
         {
        talker.speak(text,TextToSpeech.QUEUE_FLUSH,null);
         }
         if(flush == false)
         {
        talker.speak(text,TextToSpeech.QUEUE_ADD,null);
         }         
    }

奇怪的是如果我把say方法放在onInit中,它就能正常工作!

我仔细观察了logcat,以下是结果:

TtsService.OnCreate () TTs正在加载 AudioTrack已启动 TTSService.setLanguage 成功加载en-US 将语音速度设置为100

然后就没有任何事情发生了。

对于上述代码有什么问题有什么想法吗?

提前致谢!


当 say 启动时,flush 的值是多少? - Brian
无论将其设置为真或假,都没有任何区别。 - Nick
面临相同的问题。 - DikShU
5个回答

19

经过几个小时的代码查看,我注意到问题在于TTS引擎初始化需要一些时间。如果初始化还没有完成,调用speak方法将会失败。

如果你想在按钮点击时“说”一些话,你可能不需要这个,因为用户在按下按钮之前会花些时间思考,此时初始化已经完成。

如果你想在初始化完成后立即“说”出一些话,使用以下代码:

talker = new TextToSpeech(this, new TextToSpeech.OnInitListener() {

        @Override
        public void onInit(int arg0) {
       if(arg0 == TextToSpeech.SUCCESS) 
           {
        talker.setLanguage(Locale.US);
            say(gameover,true);
            say(line,false);
            say(definition_string,false);
            }
        }
    });

4
建议您在主要活动中实现 TextToSpeech.OnInitListener。 请尝试此操作。
public class GameOverActivity extends Activity implements TextToSpeech.OnInitListener {

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

        int result = mTts.setLanguage(Locale.US);
        // Try this someday for some interesting results.
        // int result mTts.setLanguage(Locale.FRANCE);
        if (result == TextToSpeech.LANG_MISSING_DATA ||
                result == TextToSpeech.LANG_NOT_SUPPORTED) {
            // Lanuage data is missing or the language is not supported.
            //Log.e(TAG, "Language is not available.");
        } else {
            // Check the documentation for other possible result codes.
            // For example, the language may be available for the locale,
            // but not for the specified country and variant.

            // The TTS engine has been successfully initialized.
            // Allow the user to press the button for the app to speak again.
            // mAgainButton.setEnabled(true);
            // Greet the user.
            //sayHello();
        }
    } else {
        // Initialization failed.

    }

}

private TextToSpeech mTts;
}

2
另一个导致此问题的原因可能是您的TTS引擎。有时,在三星手机上,默认的TTS引擎是三星引擎,它在某些语言(如波斯语)上无法工作(我不是指波斯文本,即使您尝试阅读英语文本,它仍然无法工作,这很奇怪,但确实发生)。为了解决这个问题,您只需要在代码中设置TTS引擎(或手动选择“设置 -> 语言输入 -> 文字转语音 -> Google文字转语音”)。请注意保留HTML标签。

我默认使用Google,但是通过代码仍然听不到任何声音。 - DikShU
@DikShU 可能是由于不同的原因,导致TTS无法正常工作,有数十亿种可能性。其中最重要的原因之一是软件版本,尝试更新到最新版本。 - Hossein Shahdoost

2

如果您的目标是 Android 11,则可能还需要将此代码添加到清单文件中,以使 TTS 正常工作:

    <queries>
    <intent>
        <action android:name="android.intent.action.TTS_SERVICE" />
    </intent>
   </queries>

0

我在使用文本转语音时遇到的一个问题是,如果它安装在SD卡上,那么当USB插入时它就无法工作。因此,您可以尝试从USB断开测试设备,看看是否解决了问题。

另一件事情是,您可以尝试逐步执行程序,并查看是否意外地更改了文本转语音对象。在代码的讲话部分设置断点,并查看您talker对象中的所有变量。


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