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

Записывать/сохранять аудио из уст за распознавание речи

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

Я хочу сохранить/записать аудио, что служба распознавания Google, используемая для речи в текстовом режиме (с помощью RecognizerIntent или SpeechRecognizer).

У меня было много идей:

  • onBufferReceived from RecognitionListener: я знаю, что это не работает, просто проверьте его, чтобы увидеть, что происходит, и onBufferReceived никогда не вызывается (тестируется на галактической Nexus с JB 4.3).
  • использовал медиамагнитофон: не работает. это нарушение распознавания речи. допускается только одна операция для микрофона
  • попытался найти, где служба распознавания сохраняет временный аудиофайл перед исполнением речи в текст api, чтобы скопировать его, но без успеха

Я был почти в отчаянии, но я только заметил, что приложение Google Keep делает то, что мне нужно делать!!!! Я немного отлаживал приложение keep, использующее logcat, и приложение также вызывает "RecognizerIntent.ACTION_RECOGNIZE_SPEECH" (как мы, разработчики, делаем), чтобы вызвать речь в тексте. но как сохранить сохранение звука? это может быть скрыть api? это "мошенничество" Google?)?

Спасибо за помощь

С наилучшими пожеланиями

4b9b3361

Ответ 1

Ответ на

@Kaarel почти завершен - результирующий звук находится в intent.getData() и может быть прочитан с помощью ContentResolver

К сожалению, возвращаемый AMR файл является низким качеством - я не смог найти способ получить высококачественную запись. Любое значение, которое я пробовал, отличное от "audio/AMR", возвратил null в intent.getData().

Если вы найдете способ получить высококачественную запись - прокомментируйте или добавьте ответ!

public void startSpeechRecognition() {
   // Fire an intent to start the speech recognition activity.
   Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
   // secret parameters that when added provide audio url in the result
   intent.putExtra("android.speech.extra.GET_AUDIO_FORMAT", "audio/AMR");
   intent.putExtra("android.speech.extra.GET_AUDIO", true);

   startActivityForResult(intent, "<some code you choose>");
}

// handle result of speech recognition
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    // the resulting text is in the getExtras:
    Bundle bundle = data.getExtras();
    ArrayList<String> matches = bundle.getStringArrayList(RecognizerIntent.EXTRA_RESULTS)
    // the recording url is in getData:
    Uri audioUri = data.getData();
    ContentResolver contentResolver = getContentResolver();
    InputStream filestream = contentResolver.openInputStream(audioUri);
    // TODO: read audio file from inputstream
}

Ответ 2

В прошлый раз, когда я проверил, Google Keep установил эти дополнительные функции:

  • android.speech.extra.GET_AUDIO_FORMAT: audio/AMR
  • android.speech.extra.GET_AUDIO: true

Они не документированы как часть документации для Android, поэтому они не являются API Android. Кроме того, Google Keep не полагается на намерение распознавателя учитывать эти дополнительные функции. Было бы неплохо, если бы такие дополнения были популяризированы и задокументированы Google.

Чтобы узнать, какие дополнения заданы Google Keep при вызове RecognizerIntent, выполните приложение, которое отвечает на RecognizerIntent, и распечатайте все дополнительные данные, которые он получает. Вы также можете установить Kõnele (http://kaljurand.github.io/K6nele/), который является реализацией RecognizerIntent. Когда Kõnele запускается Google Keep, затем нажмите и удерживайте значок настроек в форме ключа. Это показывает некоторые технические подробности о вызывающем абоненте и включает также входящие дополнения.

Ответ @Iftah объясняет, как Google Keep возвращает аудиозапись вызывающему абоненту RecognizerIntent.

Ответ 3

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

один чувак там говорит:

У меня есть решение, которое хорошо работает, чтобы распознавать речь и Аудио запись. Вот (https://github.com/katchsvartanian/voiceRecognition) является ссылкой на простой проект Android, который я создал, чтобы показать, как работает решение. Кроме того, я помещал в проект несколько экранов для иллюстрации приложение.

Я попытаюсь кратко объяснить подход, который я использовал. Я объединил два функции в этом проекте: Google Speech API и запись Flac.

API Google Speech вызывается через HTTP-соединения. Майк Пулц дает подробнее об API:

"(...) новый [Google] API - полнодуплексный потоковый API. означает, что он фактически использует два HTTP-соединения - один запрос POST для загрузки содержимого в виде" живого "фрагментированного потока, а второй GET запросить доступ к результатам, что имеет гораздо больший смысл дольше звуковые сэмплы или потоковое аудио."

Однако, этот API должен получить звуковой файл FLAC для правильной работы. Это заставляет нас перейти ко второй части: запись флагов

Я реализовал запись Flac в этом проекте через извлечение и адаптация некоторых фрагментов кода и библиотек из приложения с открытым исходным кодом называется AudioBoo. AudioBoo использует собственный код для записи и воспроизведения flac Формат.

Таким образом, можно записать звук flac, отправить его в Google Speech API, получить текст и воспроизвести записанный звук.

Проект, который я создал, имеет основные принципы, чтобы заставить его работать и для конкретных ситуаций. Чтобы заставить его работать в в другом сценарии необходимо получить ключ API Google Speech, который получается в составе группы Google Chromium-dev. Я ушел один ключ в этом проекте, чтобы показать его работу, но я удалю его в итоге. Если кому-то нужна дополнительная информация об этом, дайте мне знать потому что я не могу разместить более двух ссылок в этом сообщении.