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

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

Основываясь на чтении о лучших практиках, кажется, лучше всего использовать формат 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()

Ответ 1

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

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