如何从 JavaScript 使用 Opus 编解码器

Posted

技术标签:

【中文标题】如何从 JavaScript 使用 Opus 编解码器【英文标题】:How can I use Opus Codec from JavaScript 【发布时间】:2013-12-31 04:00:16 【问题描述】:

我想看看是否可以使用 getUserMedia 或最新浏览器中的类似内容直接访问 Opus。

我一直在研究它,但没有很好的结果。

我知道在webkitSpeechRecognition API 中实际使用了 Opus 或 Speex。我想做语音识别,但使用我自己的服务器而不是 Google 的。

【问题讨论】:

【参考方案1】:

所以有很多关于 Emscripten 的建议,但没有人提出,所以我使用 Emscripten 将编码器 opus-tools 移植到 javascript。根据您的想法,现在有以下机会:

Encoding FLAC, WAVE, AIFF, RAW files || demo || Web Worker 大小:1.3 MiB Encoding raw stuff for immediately processing or sending without container || demo || Web Worker 大小:0.6 MiB Encoding to Ogg-Opus and WAV from getUserMedia stream 在使用 Mozilla Firefox 时,可以使用MediaRecorder,它还可以与AudioContext.decodeAudioData() 一起在支持的平台上将任意声音文件转换为 Opus 格式

【讨论】:

哇!这真太了不起了。将此标记为已接受的答案,尽管我尚未对其进行测试! @OmarIthawi 谢谢。查看this demo 和report bugs 或告诉我如何让它更棒。【参考方案2】:

我们使用 emscripten 使用 gsm610 和 getUserMedia 进行编码和解码,它运行得非常好,即使在移动设备上也是如此。如今,javascript 几乎可以提供原生性能,因此 emscripten 可用于编译编解码器。唯一的问题是 .js 文件可能非常大,因此您只想编译正在使用的部分。

【讨论】:

现在我们唯一的挑战是找到一个可以与 getUserMedia 一起使用的免费开源视频编解码器。【参考方案3】:

这不是一个完整的解决方案,@Brad 的答案实际上是此时的正确答案。

一种方法是编译 Opus to Emscripten 并希望您的 PC 可以使用 JavaScript 处理编码。另一种选择是使用speex.js。

【讨论】:

【参考方案4】:

很遗憾,目前无法直接从 JavaScript 访问浏览器编解码器进行编码。唯一的方法是利用 WebRTC 并在服务器上设置记录。我已经尝试过使用 Chromium 中的其他代码编译 libjingle 以使其在 Node.js 服务器上运行……这几乎是不可能的。

您目前唯一能做的就是将原始 PCM 数据发送到您的服务器。这会占用相当多的带宽,但您可以通过将 float32 样本转换为 16 位(如果您的语音识别可以处理,则为 8 位)将其最小化。

希望媒体记录器 API 很快就会出现,以便我们可以使用浏览器编解码器。

【讨论】:

非常感谢。我想我已经到达了 html5 的边缘。遗憾的是,我将使用 rtmp 回到基于 Flash 的解决方案。 可悲的是,谷歌已经在x-webkit-speechwebkitSpeechRecognition 两个组件中拥有这个,我希望他们只允许更改服务器。这真的可以解决我的问题。 @OmarIthawi 我实际上不同意语音识别 API 是应该这样做的地方。我可以想象这样一种情况,语音识别可以由浏览器本身完成,而无需将其发送到某个服务器。 Media Recorder API 可以满足您的迫切需求。否则,如果您可以通过浏览器插件覆盖语音识别,将会很有帮助。 我实际上需要做语音识别:),这就是这个问题的目的。当然,Media Recorder 更适合一般的录制和编解码器问题。 @OmarIthawi 是的,我知道您正在寻找语音识别。我的意思是我不同意应该可以覆盖语音识别 API 中的特定功能部分。浏览器不应该总是连接到服务器来提供语音识别......它们可以使用本地软件进行语音识别。 可以做的是完全覆盖语音识别,提供您想做的任何语音识别,从而解决您的问题。

以上是关于如何从 JavaScript 使用 Opus 编解码器的主要内容,如果未能解决你的问题,请参考以下文章

使用 VLC 从其他计算机上的 ffmpeg 接收 rtp (opus) 流

如何在 Java 中播放 Opus 编码的音频?

如何在 Node JS 中将原始 PCM 流转换为 Discord 机器人的 opus 或 wav 流?

是否可以使用 opus API 将 opus-fltp 转换为 opus-s16(或)将 opus-fltp 解码为 pcm

从设备发送 NAudio / Opus 编码的音频作为 RTP

从 .opus 转换为 .wav