onUtteranceCompleted() теряется, если полученное TTS слишком длинное

Я только что заметил «недокументированную аномалию» в движке Android TTS: если текст для произнесения слишком длинный (более 4 КБ символов), то onUtteranceCompleted() для этого конкретного высказывания никогда не будет получено...

Кто-нибудь еще сталкивался с этим?

Это известная ошибка или ограничение?

Что можно сделать, чтобы обойти это?


person an00b    schedule 28.07.2011    source источник
comment
Я знаю, что этот пост немного устарел, но видели ли вы группы. google.com/group/android-developers/browse_thread/thread/ как потенциальное решение? В основном это говорит об использовании tts.isSpeaking() в качестве обходного пути.   -  person Jack    schedule 11.08.2011


Ответы (2)


Я не знал об ограничении, так как предпочитаю небольшие фрагменты речи (полезно при паузе или приостановке активности).

Когда вы вызываете говорить, вы можете добавить новое высказывание в конец очереди, используя это для режима очереди: TextToSpeech.QUEUE_ADD

Протестируйте, чтобы убедиться, что предложение не звучит по-другому, но я думаю, что просто автоматический разбор следующего предложения (или слова, если необходимо) после длины отсечки будет работать.

person ProjectJourneyman    schedule 13.09.2011
comment
+1 за то, что вы единственный, кто принял вызов. Действительно, имитация длинного текста путем разбиения его на небольшие фрагменты — единственный обходной путь, который я могу придумать прямо сейчас. Было бы неплохо, если бы Google задокументировал это ограничение. - person an00b; 18.09.2011

Я не уверен, будет ли это полезно в вашем случае, но в аналогичной ситуации я использовал анонимный широковещательный приемник с IntentFilter для TextToSpeech.ACTION_TTS_QUEUE_PROCESSING_COMPLETED, как указано ниже.

  filter = new IntentFilter(TextToSpeech.ACTION_TTS_QUEUE_PROCESSING_COMPLETED);
receiver = new BroadcastReceiver(){

        public void onReceive(Context p1, Intent p2)
        {
            if (p2.getAction().equals(TextToSpeech.ACTION_TTS_QUEUE_PROCESSING_COMPLETED) && tts != null)
            {
            //
                //code here
            }
        }
    };
context.registerReceiver(receiver, filter);
    tts = new TextToSpeech(context, this);

Надеюсь, что когда-нибудь это может кому-то помочь

person febinkk    schedule 29.08.2012
comment
спасибо, оказывается, это единственный способ точно угадать длину TTS. Остальным способом является сохранение в mp3. - person djdance; 07.05.2017
comment
Откуда мы знаем, что mp3 или Wav созданы полностью...? Нужна помощь @djdance - person Deep Dave; 28.08.2017