- 版本:2.0.7
- GitHub:https://github.com/OzymandiasTheGreat/libfvad-wasm
- NPM:https://npmjs.net.cn/package/%40ozymandiasthegreat%2Fvad
- 下载
- 昨日:0
- 上周:0
- 上个月:0
libfvad-wasm
我需要一个能够在 Android 上通过 NativeScript 运行的 VAD 库。与浏览器和 Node 的兼容性将是一个额外的优势。经过一番搜索后,我意识到最好的选择可能是使用从 WebRTC 项目中提取并编译为 WASM 的 VAD 库。
这将通过 NativeScript 在 Android 上运行,并在浏览器和较新版本的 Node 中原生运行。我想的唯一缺点是,由于 Apple 不允许在应用中使用 WASM,因此不支持 iOS。
我首先发现了一个 Mozilla 拥有的仓库,其中包含了从 WebRTC_VAD 代码中提取并使用 Emscripten 编译的代码。这是一个很好的起点,尽管最终不可行,因为这个仓库包含太多不必要的 C 代码,整个仓库似乎已经废弃。
然后,在我的搜索中,我发现了 libfvad。这个项目相当活跃,不包含不必要的代码,甚至将 VAD 包含在易于消费的 API 中。所以我决定选择这个,并用 Emscripten 打包,以便它可以在任何地方运行。
所以,我们在这里。接下来是 API 参考。
API 参考
此包是一个 ES 模块。要与其在较旧的浏览器中使用,您需要 Babel 或类似工具。要与其在 Node 中使用,您需要支持 ES 模块和 WASM 的版本。要与其在 NativeScript 中使用,您不需要任何额外的东西,因为 {N} 默认导入嵌入的版本。还提供了类型定义。
主要默认导出是一个异步函数,它解析为类构造函数 VAD。还有一些命名导出 VADMode、VADEvent 和 VAD_FRAME;
VADMode 定义了 VAD 的侵略性。较高的模式意味着假阳性更少,并且可能错过的说话更多。可用的模式有
- NORMAL
- LOW_BITRATE(针对低比特率流优化)
- AGGRESSIVE(这似乎在大多数情况下效果最好)
- VERY_AGGRESSIVE
VADEvent 是一个枚举,包含以下成员 { ERROR, SILENCE, VOICE }
。
VAD_FRAME 是 VAD 处理的单个帧的固定大小。为了获得最佳结果,您的缓冲区应该可以被 VAD_FRAME 整除。
VAD(mode: VADMode, rate: number);
// Convenience function for browsers, as AudioWorklet returns data as Float32Array
// which is incompatible with this library
static VAD.floatTo16BitPCM(buffer: Float32Array): Int16Array;
// Single frame processing used internally. Not very useful on its own
VAD.processFrame(frame: Int16Array): VADEvent;
// Buffer processing, larger buffers return more accurate results
VAD.processBuffer(buffer: Buffer | ArrayBufferView): VADEvent;
// Free the resources used by this instance. The instance is not usable afterward
VAD.destroy(): void;
您还可以在 include/fvad.h
中找到由 dist/libfvad.wasm
导出的 C API。
示例
Web
您可以在 ./docs
中找到一个浏览器示例。截至本文写作时,它只能在 Chrome 中工作,因为库中使用了 JavaScript 私有字段 (#)。您也可以在浏览器中实时查看它 这里
Node
您可以在 ./examples/node
中找到一个示例代码。只需在其中运行 cd
并运行 node ./index.js
。示例脚本仅在 Linux 上运行!然而,它只有几行代码,因此非常容易将其适配到您的操作系统。
NativeScript
同样,WASM 仅支持 Android。责怪 Apple。
要运行示例应用,请运行 cd ./examples/nativescript
并运行 ns run android
。就是这样。
示例使用工作线程在后台运行音频录制循环,并以异步方式与主应用通信。