分割Ogg Opus文件流

时间:2019-10-07 17:46:21

标签: javascript audio google-speech-api ogg opus

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

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

我知道可以使用PCM数据解决此问题,因为未对其进行编码,因此PCM流可以在任何点简单地拆分并变成新的流。由于比特率太高,我无法使用PCM流,而且我不愿使用无损质量,因为我正在传输语音数据流。

参考:https://tools.ietf.org/html/rfc7845#section-3

1 个答案:

答案 0 :(得分:2)

OpusFileSplitter可以拆分Opus音频文件。

Ogg页面可以独立读取,只要文件以Streaming of Stream(BOS)标头和注释页面开头即可。您可以通过创建新文件来将一个Ogg文件拆分为多个文件,这些文件以Ogg标头页开头,之后是Ogg数据/音频页。例如,此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()显示了如何查找页面边界。