Потоковое аудио в 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 на него, но есть обходное решение, описанное в этом ответе.