Intereting Posts
Ресурсы, указанные в манифесте, не могут изменяться по конфигурации Robospice – продолжает поддерживать обслуживание специй при изменении активности Попытка работать с ExoPlayer – много неизвестных Android установил, что GridView имеет только 2 столбца на строку Как мы можем определить null как тип данных в Android, как мы определяем nsNull в iPhone После установки плагина ADT, Добро пожаловать в Android Development не появляется Соединение Bluetooth RFCOMM не может быть установлено последовательно на Android 4.2 Различие между действием «Перетаскивание» и действием «Fling» в recyclerview SharedPreferences не удаляется при удалении пользователя Переадресация внутри макета на другой макет Как обмениваться файлами cookie в пользовательских вкладках chrome android Android: файлы, которые я пишу на SD-карте, не отображаются в Windows Explorer, для Acer Iconiatab Определение продолжительности и формата аудиофайла Ложная ошибка от Eclipse: функция «__android_log_print» не может быть решена (Android, CDT) Создание пользовательского уведомления, андроида

Как приостановить android.speech.tts.TextToSpeech?

Я играю текст с андроидом TTS – android.speech.tts.TextToSpeech

Я использую: TextToSpeech.speak чтобы говорить, и .stop для остановки. Есть ли способ также приостановить текст?

Solutions Collecting From Web of "Как приостановить android.speech.tts.TextToSpeech?"

У TTS SDK нет никаких функций паузы, о которых я знаю. Но вы можете использовать synthesizeToFile() для создания аудиофайла, содержащего вывод TTS. Затем вы будете использовать объект MediaPlayer для воспроизведения, паузы и прекращения воспроизведения файла. В зависимости от длины текстовой строки может потребоваться немного больше времени для создания звука, потому что функция synthesizeToFile() должна будет завершить весь файл, прежде чем вы сможете его воспроизвести, но эта задержка должна быть приемлемой для большинства приложений.

Я использовал расщепление строки и используемую функцию playilence (), как показано ниже:

 public void speakSpeech(String speech) { HashMap<String, String> myHash = new HashMap<String, String>(); myHash.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "done"); String[] splitspeech = speech.split("\\."); for (int i = 0; i < splitspeech.length; i++) { if (i == 0) { // Use for the first splited text to flush on audio stream textToSpeech.speak(splitspeech[i].toString().trim(),TextToSpeech.QUEUE_FLUSH, myHash); } else { // add the new test on previous then play the TTS textToSpeech.speak(splitspeech[i].toString().trim(), TextToSpeech.QUEUE_ADD,myHash); } textToSpeech.playSilence(750, TextToSpeech.QUEUE_ADD, null); } } 

Вы можете сделать паузу TTS между предложениями или в любом месте, добавив до трех периодов («.»), За которыми следует одно место «». Пример ниже имеет длительную паузу в начале и снова перед телом сообщения. Я не уверен, что это то, что вам нужно.

  private final BroadcastReceiver SMScatcher = new BroadcastReceiver() { @Override public void onReceive(final Context context, final Intent intent) { if (intent.getAction().equals( "android.provider.Telephony.SMS_RECEIVED")) { // if(message starts with SMStretcher recognize BYTE) StringBuilder sb = new StringBuilder(); /* * The SMS-Messages are 'hiding' within the extras of the * Intent. */ Bundle bundle = intent.getExtras(); if (bundle != null) { /* Get all messages contained in the Intent */ Object[] pdusObj = (Object[]) bundle.get("pdus"); SmsMessage[] messages = new SmsMessage[pdusObj.length]; for (int i = 0; i < pdusObj.length; i++) { messages[i] = SmsMessage .createFromPdu((byte[]) pdusObj[i]); } /* Feed the StringBuilder with all Messages found. */ for (SmsMessage currentMessage : messages) { // periods are to pause sb.append("... Message From: "); /* Sender-Number */ sb.append(currentMessage.getDisplayOriginatingAddress()); sb.append(".. "); /* Actual Message-Content */ sb.append(currentMessage.getDisplayMessageBody()); } // Toast.makeText(application, sb.toString(), // Toast.LENGTH_LONG).show(); if (mTtsReady) { try { mTts.speak(sb.toString(), TextToSpeech.QUEUE_ADD, null); } catch (Exception e) { Toast.makeText(application, "TTS Not ready", Toast.LENGTH_LONG).show(); e.printStackTrace(); } } } } } }; 

Если вы опустите пробел после последнего периода, он будет (или может) работать не так, как ожидалось.

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

Затем создайте рекурсивную функцию, которая воспроизводит следующее слово после завершения текущего слова, сохраняя при этом счетчик текущего слова.

В случае отсутствия опции паузы вы можете добавить молчание в течение продолжительности, когда вы хотите задержать работу TTS Engine. Это, конечно, должно быть предопределенной «паузой» и, например, не включало бы функциональность кнопки паузы.

Для API <21: public int playSilence (long durationInMs, int queueMode, параметры HashMap)

Для> 21: public int playSilentUtterance (long durationInMs, int queueMode, String utteranceId)

Не забудьте использовать TextToSpeech.QUEUE_ADD, а не TextToSpeech.QUEUE_FLUSH, иначе он очистит ранее запущенную речь.

Разделить messages на части и прослушать последнее utterance , используя onutteranceprogress listener

  tts.playSilence(1250, TextToSpeech.QUEUE_ADD, null); 

Кроме того, экранированная цитата (\ "), похоже, несколько приостанавливается – по крайней мере, если вы поместили ее вокруг слова, она добавит пространство вокруг слова.