拆分 Ogg Opus 文件流

Syl*_*ens 5 javascript audio ogg opus google-speech-api

我正在尝试将 OGG_OPUS 编码流发送到谷歌的语音到文本流服务。由于 Google 对流请求施加了时间限制,因此我必须以固定的时间间隔将音频流路由到另一个 Google Speech To Text 流会话。

据我了解,OGG流中的页面无法独立读取,因为页面中的数据是通过考虑上一页和下一页的数据来计算的。如果是这样的话,我们是否可以在某个点切断流并用剩余的数据重新创建一个全新的流?在某个点停止并在新流中发送数据是行不通的,因为初始 OGG 标头数据包在第二个流中也不可用。

我知道这个问题可以使用 PCM 数据来解决,因为它没有编码,PCM 流可以在任何点简单地分割并变成一个新的流。由于比特率太高,我无法使用 PCM 流,而且我也不喜欢使用无损质量,因为我正在传输语音数据流。

参考文献:https://www.rfc-editor.org/rfc/rfc7845#section-3

Ant*_*ris 3

OpusFileSplitter可以分割 Opus 音频文件。

只要文件以流开始 (BOS) 标头和注释页开头,Ogg 页面就可以独立读取。您可以通过创建以 Ogg 标头页开头且后有 Ogg 数据/音频页的新文件,将一个 Ogg 文件拆分为多个文件。例如,这个 Ogg Opus 文件:

*********************************************************
*          *              *              *              *
*  Header  *  Audio Data  *  Audio Data  *  Audio Data  *
*   Page   *    Page 1    *    Page 2    *    Page 3    *
*          *              *              *              *
*********************************************************
Run Code Online (Sandbox Code Playgroud)

可以分为2个文件:

***************************
*          *              *
*  Header  *  Audio Data  *
*   Page   *    Page 1    *
*          *              *
***************************

******************************************
*          *              *              *
*  Header  *  Audio Data  *  Audio Data  *
*   Page   *    Page 2    *    Page 3    *
*          *              *              *
******************************************
Run Code Online (Sandbox Code Playgroud)

关于可以分割并跨越多个页面的音频片段,您是正确的。我假设如果页面包含不完整的音频片段,可能会丢失几毫秒,但这不应破坏语音识别。不幸的是,我的本地测试使用了util生成的Opus文件opusenc,它没有创建跨页面分割段的页面,这对于分割文件来说似乎是一件好事!

OpusFileSplitter.scanPages()展示如何找到页面边界。