分割Ogg Opus文件流

5
我正在尝试将OGG_OPUS编码的流发送到Google的语音转文字流服务。由于Google对流请求设置了时间限制,因此我需要在固定的时间间隔内将音频流路由到另一个Google语音转文字流会话中。
根据我所读的内容,OGG流中的页面不能独立读取,因为在计算页面数据时要考虑前后页面的数据。如果是这样,我们是否可以在某个点截断流,并使用剩余的数据创建全新的流?但是,在特定点停止并在新流中发送数据并不起作用,因为第二个流中也没有最初的OGG头数据包。
我知道这个问题可以使用PCM数据解决,因为它没有被编码,PCM流可以在任何点上简单地分割并转换成新流。但是由于它的高比特率,我不能使用PCM流,而且我也不想使用无损质量,因为我正在传输语音数据流。
参考文献: https://www.rfc-editor.org/rfc/rfc7845#section-3

你有任何测试代码或opus文件吗?尝试使用下面的“OpusFileSplitter”... - anthumchris
1个回答

3

OpusFileSplitter 能够分割 Opus 音频文件。

只要文件以流开始 (BOS) 头和注释页开头,就可以独立读取 Ogg 页面。你可以通过创建新的文件,在 Ogg 头页面之后添加 Ogg 数据/音频页面,将一个 Ogg 文件分割成多个文件。例如,这个 Ogg Opus 文件:

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

可以分成两个文件:

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

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

您关于音频片段可能被拆分并跨越多个页面的情况是正确的。我假设如果一个页面包含不完整的音频片段,可能会丢失几毫秒,但这不应该影响语音识别。不幸的是,我的本地测试使用了由opusenc工具生成的Opus文件,它没有创建跨越多个页面的分段,这似乎对于分割文件是好事! OpusFileSplitter.scanPages() 显示了如何找到页面边界。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接