Потоковое аудио в FLAC или AMR_WB в Google Speech API

Мне нужно запустить API речи Google в средах с низкой пропускной способностью.

Основываясь на чтении лучших практик, мне кажется, что лучше всего использовать формат AMR_WB.

Однако следующий код не создает исключений, и я не получаю ответов в методе onError(t: Throwable), но API вообще не возвращает никаких значений в методе onNext(value: StreamingRecognizeResponse).

Если я изменю формат в .setEncoding() с FLAC или AMR_WB обратно на LINEAR16, все будет нормально.

AudioEmitter.kt

fun start(
            encoding: Int = AudioFormat.ENCODING_PCM_16BIT,
            channel: Int = AudioFormat.CHANNEL_IN_MONO,
            sampleRate: Int = 16000,
            subscriber: (ByteString) -> Unit
    )

MainActivity.kt

builder.streamingConfig = StreamingRecognitionConfig.newBuilder()
        .setConfig(RecognitionConfig.newBuilder()
                .setLanguageCode("en-US")
                .setEncoding(RecognitionConfig.AudioEncoding.AMR_WB)
                .setSampleRateHertz(16000)
                .build())
        .setInterimResults(true)
        .setSingleUtterance(false)
        .build()

person Wesley    schedule 06.10.2018    source источник
comment
Думаю, проблема может быть в вашем sampleRate из AudioEmitter. Попробуйте установить значение 44100, 22050 или 11025, если тип кодировки при распознавании потоковой передачи - FLAC.   -  person aminography    schedule 01.11.2018
comment
Может быть, вы сможете выполнить эту официальную процедуру устранения неполадок? cloud.google.com/speech-to-text/docs/support# устранение неполадок, чтобы определить причину проблемы.   -  person Bsquare ℬℬ    schedule 05.11.2018
comment
@aminography Я испортил эти настройки, к сожалению, это не помогло.   -  person Wesley    schedule 05.11.2018
comment
@Bsquare Смотрел много раз. Перепробовал все возможные комбинации настроек, которые я смог найти, и все равно не повезло. Похоже, что и здесь, и на форуме «облако-речь-обсуждение» команда полностью разобщена.   -  person Wesley    schedule 05.11.2018
comment
Вы пытались преобразовать звуковой файл в FLAC или что-то еще, просто чтобы проверить, является ли это ключом к вашей проблеме?   -  person Bsquare ℬℬ    schedule 07.11.2018


Ответы (1)


Google не распознает ваши данные, потому что вы сообщаете ему, что данные находятся в формате FLAC или AMR_WB, в то время как вы продолжаете передавать сырые несжатые звуковые фрагменты, которые создает AudioRecord.read().

Теперь, чтобы заставить его работать, у вас есть два варианта. Первый - самостоятельно преобразовать данные в требуемый формат, возможно, используя какую-нибудь стороннюю библиотеку. Второй - использовать MediaRecorder из библиотеки Android. К сожалению, он поддерживает только запись в место назначения, подобное файлу, поэтому вы не можете просто заменить им AudioRecorder, но есть обходной путь, описанный в этот ответ.

person Alexander Solovets    schedule 06.11.2018