将FLAC或AMR_WB中的音频流式传输到Google Speech API

Wes*_*ley 14 android kotlin google-speech-api

我需要在稍微低带宽的环境中运行google speech api.

基于阅读最佳实践,我最好的选择是使用AMR_WB格式.

但是,以下代码不会产生异常,并且我在onError(t: Throwable)方法中没有得到任何响应,但API 在方法中根本没有返回任何值onNext(value: StreamingRecognizeResponse).

如果我改变格式或.setEncoding()从回到一切工作正常.FLACAMR_WBLINEAR16

AudioEmitter.kt

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

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()
Run Code Online (Sandbox Code Playgroud)

Ale*_*ets 0

Google 不会识别您的数据,因为您告诉它数据是FLACAMR_WB格式,而您却不断传递生成的原始、未压缩的音频块AudioRecord.read()

现在,为了使其发挥作用,您有两种选择。第一种是自己将数据转换为所需的格式,可能使用一些第三方库。第二种是使用Android 库中的MediaRecorder 。不幸的是,它仅支持写入类似文件的目标,因此您不能简单地用它替换AudioRecorder ,但此答案中描述了一种解决方法。