Подтвердить что ты не робот

TTS-UtteranceProgressListener не вызывается

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

Я использую Text To Speech (TTS), который приводит к речевому слушателю после того, как он задает вопрос... Я обнаружил через выходы журнала, что TTS onInit вызывается, но UtteranceProgressListener нет, и я не могу понять почему. Любая помощь приветствуется.

// ---Initialize TTS variables---

        // Implement Text to speech feature
        tts = new TextToSpeech(this, new ttsInitListener());

        // set listener to the TTS engine
        tts.setOnUtteranceProgressListener(new ttsUtteranceListener());

        if (!tts.isSpeaking()) {
            tts.speak("Speak to me", TextToSpeech.QUEUE_FLUSH, null);
        }

// --- TEXT TO SPEECH && SPEECH TO TEXT METHODS ---

class ttsInitListener implements OnInitListener {

    @Override
    public void onInit(int status) {

        if (status == TextToSpeech.SUCCESS) {
            tts.setLanguage(Locale.getDefault());

        } else {
            tts = null;
            Toast.makeText(mContext, "Failed to initialize TTS engine.",
                    Toast.LENGTH_SHORT).show();
        }
    }
}

class ttsUtteranceListener extends UtteranceProgressListener {

    @Override
    public void onDone(String utteranceId) {
        if (processStart) {
            speech.startListening(intent);
        } else {
            ...
        }

    }

    @Override
    public void onError(String utteranceId) {
    }

    @Override
    public void onStart(String utteranceId) {
    }    
}

Я добавил логические выходы ко всем моим методам TTS и Speech. Вызов UtteranceProgressListener onStart даже не вызывается:

11-30 00:38:37.299: D/OpenGLRenderer(15842): Enabling debug mode 0
11-30 00:38:39.782: I/TextToSpeech(15842): Connected to ComponentInfo{com.google.android.tts/com.google.android.tts.service.GoogleTTSService}
11-30 00:38:39.782: I/TextToSpeech(15842): Set up connection to ComponentInfo{com.google.android.tts/com.google.android.tts.service.GoogleTTSService}
11-30 00:38:39.782: D/LOOK AT ME!!!(15842): ttsInitListener - onInit
4b9b3361

Ответ 1

нашел ответ...

Оказывается, что ресурсы TTS, которые я нашел в Интернете, используют один источник строки TTS, поэтому третий параметр в tts.speak(String text, int queueMode, HashMap params) был установлен в null.

любому, кто имеет эту проблему в будущем:

если вы установите для третьего параметра значение null, для отслеживания объекта UtteranceProgressListener нет идентификатора. Исправление создало и инициализировало хэш-карту, после чего можно было отследить добавление к включенному массиву для каждой новой TTS с новым идентификатором. Здесь код:

HashMap<String, String> map = new HashMap<String, String>();

то перед вызовом tts.speak...

map.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "UniqueID");

тогда вы можете вызывать говорить со всеми параметрами...

tts.speak(text, TextToSpeech.QUEUE_FLUSH, map);

Ответ 2

Чтобы добавить к WizardKnight хороший ответ:

Новый API предпочитает Bundle, поэтому замените HashMap на Bundle

Bundle params = new Bundle();
params.putString(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "");

затем, когда вы произнесете разговор

tts.speak(text, TextToSpeech.QUEUE_FLUSH, params, "UniqueID");

Ключ должен использовать идентификатор в разговоре. Вы можете поместить его в Bundle, но он больше ничего не сделает для вас. Он должен быть в разговоре, чтобы вызвать слушателя.

Ответ 3

У меня есть проводное решение для определения погоды, которое закончилось.

Шаг 1. Создайте этот класс в своем коде.

class Waiter extends AsyncTask<Void,Void,Void>{
        @Override
        protected Void doInBackground(Void... voids) {
            while (tts.isSpeaking()){
                try{Thread.sleep(1000);}catch (Exception e){}
            }
            return null;
        }
        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            //TTS has finished speaking. WRITE YOUR CODE HERE
        }
    }

Шаг 2: Вызовите его при вызове tts.speak(...)

tts.speak(...);
new Waiter().execute();

Ответ 4

Большинство технологий, которые играют важную роль в жизни человека, доступны на английском языке. Развитие технологий на других языках также стало интересной целью в такой стране, как Индия, где люди не используют английский в качестве первого языка. Только передача технологии с одного языка на другой не является прямой задачей. Поскольку каждый язык имеет свою особую характеристику, в связи с чем он затрагивает различные исследовательские проблемы. Среди различных доступных технологий в этой статье в первую очередь обсуждается техника преобразования текста в речь (TTS). TTS означает автоматическую генерацию речевого сигнала из заданного входного текста [1]. Речь - самая основная форма общения be- между людьми. Однако каждый человек не умеет читать и писать, может общаться с помощью речи. Вероятно, из-за своего высокого влияния на повседневную жизнь человека, обработка речи была предметом исследований на протяжении десятилетий. Синтез речи в целом означает синтетическое производство речи с помощью машин.