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

Posted

技术标签:

【中文标题】将 FLAC 或 AMR_WB 中的音频流式传输到 Google Speech API【英文标题】:Streaming Audio in FLAC or AMR_WB to the Google Speech API 【发布时间】:2019-03-11 12:58:46 【问题描述】:

我需要在带宽较低的环境中运行 google Speech api。

根据阅读有关最佳实践的信息,似乎我最好的选择是使用 AMR_WB 格式。

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

如果我将.setEncoding() 中的格式从FLACAMR_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()

【问题讨论】:

我认为问题可能来自您的sampleRateAudioEmitter。当流识别中的编码类型为FLAC时,尝试设置为44100、22050或11025。 也许你可以按照这个官方的故障排除程序? cloud.google.com/speech-to-text/docs/support#troubleshooting 定义问题的来源。 @aminography 我弄乱了这些设置,不幸的是它没有帮助。 @Bsquare 看了很多遍。已经尝试了我能找到的所有可能的设置组合,但仍然没有运气。看起来无论是在这里还是在云演讲论坛上,团队都完全脱离了参与。 您是否尝试将声音文件转换为 FLAC 或其他格式,只是为了检查它是否是您问题的关键? 【参考方案1】:

Google 不会识别你的数据,因为你告诉它数据是 FLACAMR_WB 格式,而你一直传递 AudioRecord.read() 的原始未压缩音频块产生。

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

【讨论】:

以上是关于将 FLAC 或 AMR_WB 中的音频流式传输到 Google Speech API的主要内容,如果未能解决你的问题,请参考以下文章

将音频流式传输到本地网络

如何通过套接字或框架将音频从 iPhone 的麦克风流式传输到 Mac/PC?

将音频流式传输到 linux 中的“扬声器服务器”

通过网络将系统音频流式传输到 Web 浏览器 (javascript)

将音频文件流式传输到 soundpool load() Android

如何从 Python 中的 Youtube URL 流式传输音频(无需下载)?