10

アクティビティに Android のテキスト読み上げテクノロジを実装しようとしていますが、奇妙なエラーが発生します。コードから音が聞こえません。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);
         }         
    }

奇妙なことに、onInit に say メソッドを配置すると、正常に動作します。

logcat を注意深く見た結果は次のとおりです。

TtsService.OnCreate () TTs が AudioTrack をロードしています TTSService.setLanguage が en-US でロードされ、音声レートを 100 に設定することに成功しました

そして何も起こりません。

上記のコードの何が問題なのか、何か考えはありますか?

前もって感謝します!

4

4 に答える 4

17

さらに数時間コードを調べた後、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);
            }
        }
    });
于 2012-03-15T09:00:50.527 に答える
3

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;
}
于 2016-05-19T05:52:18.733 に答える
0

テキスト読み上げで私が抱えていた問題の1つは、SDカードにインストールされている場合、USBが接続されていると機能しないことです。そのため、テストデバイスをUSBから取り外して、問題が解決するかどうかを確認してみてください。

もう1つ試すことができるのは、プログラムをステップ実行して、誤ってテキスト読み上げオブジェクトを変更していないかどうかを確認することです。コードのトーク部分にブレークポイントを設定し、トーカーオブジェクトのすべての変数を確認します。

于 2012-03-12T14:26:53.010 に答える