Как вы используете речь в реальном времени Android для текста?

В андроиде 4.1 вы можете преобразовать текст в режиме реального времени в текстовое преобразование, используя опцию микрофона на клавиатуре .

Я смотрел документы для android.speech, пытаясь выяснить, как реализовать речь в реальном времени для текста для приложения, Однако единственным вариантом, который облегчил бы это, является опция "EXTRA_PARTIAL_RESULTS" ​​(которую сервер игнорирует каждый раз, когда я пытаюсь его использовать).

Код:

Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
        RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, "VoiceIME");
intent.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, true);
intent.putExtra(RecognizerIntent.EXTRA_SPEECH_INPUT_MINIMUM_LENGTH_MILLIS, 3000L);

mSpeaker.startListening(intent);

Никогда не возвращает частичные результаты.

Я знаю, что это возможно, так как версия для клавиатуры делает это последовательно. Кто-нибудь знает как?

Ответ 1

Перед вызовом startListening вам необходимо зарегистрировать onPartialResults -callback. Следует отметить две важные вещи:

  • структура пакета, с которым вызывается onPartialResults, не определяется API Android;
  • не каждый распознаватель речи поддерживает этот обратный вызов.

Таким образом, ваш код будет специфичным для Google Voice Search.

mSpeaker.setRecognitionListener(new RecognitionListener() {
  ...
  public void onPartialResults(Bundle partialResults) {
    // WARNING: The following is specific to Google Voice Search
    String[] results = 
      partialResults.getStringArray("com.google.android.voicesearch.UNSUPPORTED_PARTIAL_RESULTS");
    updateTheUi(results);
  }
  ...
}

Чтобы увидеть этот обратный вызов в действии в приложении с открытым исходным кодом, см. Babble:

Ответ 2

если вы хотите, чтобы частичные результаты в режиме реального времени отображались во время включения микрофона, а говорящий говорящий, вы можете отказаться от подхода, используя распознавание и распознавание dropService в пользу простого текстового блока Android в сочетании с предварительным выбором значок "mic", как вы можете сделать в приложении для заметок андроида "примечания"...

см../samples/android-16/NotePad/tests/src/com/example/android/notepad

Эта комбо обеспечивает такую ​​функцию, как u, в режиме реального времени, результаты частичного текстового речевого вывода, когда они возвращаются с серверного "voiceSearch", который каким-то образом отличается от "распознавателя" относительно "частичного" обратного вызова.

В многочисленных комментариях указано, что распознавательIntent не запускает обратный вызов 'onPartialResults'. По какой-то причине андроид 4.2, похоже, не поддерживает "непрерывный" режим речевого воспроизведения, который отлично работает с использованием javascript. Мои тесты интерфейса "RecognitionListener" в 4.2 показывают сотни обратных вызовов для onRmsChanged на событиях томов, но нулевую активность в событии "partialResult". Где-то этот обратный вызов теряется?

для js-решения, установите chrome-beta release 25 и перейдите здесь

используя андроид замечания приложение. образец и предварительный выбор значка микрофона с клавиатуры, вы можете сделать то же самое, что и ссылка JS webapp выше.

Ответ 3

Так как мы не можем точно знать имена клавиш Bundle, поступающие из обратного вызова частичных результатов, используйте это, чтобы узнать его содержимое:

public void onPartialResults(Bundle partialResults) {    
    String string = "Bundle{";
    for (String key : partialResults.keySet()) {
        string += " " + key + " => " + partialResults.get(key) + ";";
    } 
    Log.e("joshtag","onPartialResults"+string);
    //see the keynames in Logcat and extract partial reesults here
}