Android TTS не говорит

Я пытаюсь внедрить технологию преобразования текста в речь Android в своей деятельности, но сталкиваюсь со странной ошибкой. Я не слышу звука из моего кода. Метод говорить работает, только если я помещаю его в метод 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

а потом ничего не происходит.

Любая идея о том, что не так с приведенным выше кодом?

Заранее спасибо!


person Nick    schedule 12.03.2012    source источник
comment
каково значение сброса, когда говорят инициирует?   -  person Brian    schedule 12.03.2012
comment
Это не имеет никакого значения, если сделать это правдой или ложью   -  person Nick    schedule 12.03.2012


Ответы (4)


После еще нескольких часов просмотра кода я заметил, что проблема в том, что инициализация механизма 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);
            }
        }
    });
person Nick    schedule 15.03.2012

Рекомендуется реализовать 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;
}
person onexf    schedule 19.05.2016

Другой причиной этой проблемы может быть ваш механизм TTS. Иногда в телефонах SAMSUNG механизм TTS по умолчанию — это SAMSUNG Engine, который не работает на некоторых языках, таких как персидский (я не имею в виду персидский текст, даже если вы пытаетесь прочитал английский текст, все равно не работает, странно, но бывает). Чтобы решить эту проблему, все, что вам нужно сделать, это установить механизм TTS в вашем коде (или выбрать Setting -> Language input -> Text to speech -> Google Text-to-speech вручную).

person Hossein Shahdoost    schedule 18.01.2017

Одна проблема, с которой я столкнулся при преобразовании текста в речь, заключается в том, что если он установлен на SD-карту, то он не будет работать при подключении USB. Поэтому вы можете попробовать отключить тестовое устройство от USB и посмотреть, решит ли это проблему.

Еще одна вещь, которую вы можете попробовать, — это пройтись по программе и посмотреть, не изменяете ли вы каким-либо образом свой объект преобразования текста в речь случайно. Установите точку останова в говорящей части вашего кода и просмотрите все переменные в вашем говорящем объекте.

person Lokiare    schedule 12.03.2012