Intereting Posts
Picasso не сохраняет соотношение сторон при изменении размера изображения Предотвращение повторения тревоги в выходные дни Обратный вызов DialogFragment при изменении ориентации Проблема с Android 2.3.4 SSL Android-словарь для Android – проверка орфографии – Android Studio Android Studio 3.0: canary 6: android.content.res.Resources $ NotFoundException внутри Запуск активности Радиальный градиент в формате XML с размером родителя Данные не сохраняются в Firebase из приложения Android Как я могу заставить курсора пережить изменение ориентации? Как получить root ViewGroup из макета, который был установлен с помощью setContentView? Управление соединениями SQLite на Android Аудиовыход на гарнитуре и громкой связи одновременно File.delete () не удаляет полностью пустой файл образа изображения Невозможно скомпилировать проект в студии Android. Gradle: недопустимый символ: 'switch' Ошибка при импорте проекта андроида («Неверное местоположение» или «Причина: неожиданный конец данных блока»)

Распознавание голоса не работает, когда голос находится под записью

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

button_start.setOnTouchListener( new View.OnTouchListener() { @Override public boolean onTouch(View arg0, MotionEvent event) { if (pressed == false) { 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,"voice.recognition.test"); intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "zh-HK"); intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS,1); sr.startListening(intent); Log.i("111111","11111111"); pressed = true; } recordAudio(); } if((event.getAction()==MotionEvent.ACTION_UP || event.getAction()==MotionEvent.ACTION_CANCEL)) { stopRecording(); } return false; } }); } public void recordAudio() { isRecording = true; try { mediaRecorder = new MediaRecorder(); mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); mediaRecorder.setOutputFile(audioFilePath); mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); mediaRecorder.prepare(); } catch (Exception e) { e.printStackTrace(); } mediaRecorder.start(); } public void stopRecording() { if (isRecording) { mediaRecorder.stop(); mediaRecorder.reset(); // set state to idle mediaRecorder.release(); mediaRecorder = null; isRecording = false; } else { mediaPlayer.release(); mediaPlayer.reset(); mediaPlayer = null; } } class listener implements RecognitionListener { // standard codes onReadyForSpeech, onBeginningOfSpeech, etc } 

Вопросов:

Я сделал приложение шаг за шагом, и сначала приложение не имеет функций записи, и распознавание голоса работает отлично.

После того, как я много раз тестировал и считал, что распознавание голоса в порядке, я начинаю включать функции записи с помощью MediaRecorder .

Затем я тестировал, как только кнопка button_start нажата, сообщение ERROR3 AUDIO сразу появляется даже до того, как я попытался говорить.

Я воспроизвожу запись голоса. Голос записывается и сохраняется правильно.

Что происходит? Почему нельзя записывать в то же время при распознавании голоса?

Благодаря!

Solutions Collecting From Web of "Распознавание голоса не работает, когда голос находится под записью"

–EDIT– модуль для Opus-Record WHILE Speech-Recognition также работает

–EDIT– 'V1BETA1' потоковое, непрерывное, распознавание с незначительными изменениями в примерном проекте . Измените это ' readData () ', поэтому исходный PCM в 'sData' разделяется двумя потоками (threadSink thread, threadizerIPI из примера проекта). Для раковины просто подключите кодер, используя поток PCM, обновленный при каждом IO 'sData'. Помните CLO поток, и он будет работать. Просмотрите ' writeAudiaDataToFile () ' для получения дополнительной информации о fileSink ….

–EDIT– посмотреть эту тему

Будет основной конфликт по HAL и буфер микрофона, когда вы попытаетесь сделать:

 speechRecognizer.startListening(recognizerIntent); // <-- needs mutex use of mic 

а также

 mediaRecorder.start(); // <-- needs mutex use of mic 

Вы можете выбрать только одно из этих действий, чтобы владеть аудио API, лежащим в основе микрофона!

Если вы хотите подражать функциям Google Keep, где вы говорите только один раз и как вывод из одного процесса ввода (ваша речь в микрофон), вы получаете два отдельных типа вывода (STT и файлSink, например, MP3), тогда вы должны разделить Что-то, когда он выходит из слоя HAL из микрофона.

Например:

  1. Поднимите аудио RAW, когда PCM 16 выходит из буфера микрофона

  2. Разделите байты вышеупомянутого буфера (вы можете получить поток из буфера и передать поток 2 места)

  3. STRM 1 для API для STT до или после его кодирования (есть API-интерфейсы STT, принимающие как Raw PCM 16, так и закодированные)

  4. STRM 2 в кодировщик, затем в файлSink для вашего захвата записи

Split может работать либо на фактическом буфере, создаваемом микрофоном, либо на потоке производных тех же байтов.

Для чего вы получаете, я рекомендую вам посмотреть getCurrentRecording() и consumeRecording() здесь .

Ссылка на STT API: Google «pultz speech-api» . Обратите внимание, что в упомянутых здесь API есть варианты использования.

  • buferUtils
  • код
  • Больше кода