拆分 Ogg Opus 文件流

Splitting an Ogg Opus File stream

我正在尝试将 OGG_OPUS 编码流发送到 google 的语音转文本流服务。 由于 Google 对他们的流请求施加了时间限制,我必须按固定间隔将音频流路由到另一个 Google 语音到文本流 session。

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

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

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

OpusFileSplitter 可以拆分 Opus 音频文件。

只要文件以流开头 (BOS) header 和注释页开头,就可以独立读取 Ogg 页面。您可以通过创建以 Ogg header 页面开头并在 .例如,这个 Ogg Opus 文件:

*********************************************************
*          *              *              *              *
*  Header  *  Audio Data  *  Audio Data  *  Audio Data  *
*   Page   *    Page 1    *    Page 2    *    Page 3    *
*          *              *              *              *
*********************************************************

可以拆分成 2 个文件:

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

******************************************
*          *              *              *
*  Header  *  Audio Data  *  Audio Data  *
*   Page   *    Page 2    *    Page 3    *
*          *              *              *
******************************************

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

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