@ 沙漠- ant- labs/ voz
对在浏览器和节点运行的JavaScript进行在线语音识别. 给Voz音频,它返回一个记录片,每个字都有起始和结尾,跨越25种语言. 音频留在本地:没有上传,也没有 API 密钥 .
一个入口, @desert-ant-labs/voz一个 Voz API (英语). 不像这个项目的其他型号 /native 子路径: Voz 没有原生的节点核心, 因此浏览器和服务器运行着同样的WebAssembly 管道—— 与 Swift SDK 相同的窗口, 车道相撞的解码和相接点—— 运行在 ONNX 运行时 .
# Browser
npm i @desert-ant-labs/voz onnxruntime-web
# Node
npm i @desert-ant-labs/voz onnxruntime-node
在浏览器中您会安装运行时间, 而不是其他的 。 输入于
需求,方式 @litertjs/core 用于这个项目的其他模式
捆绑者把它分成自己的块, 所以一个从不转录的页面从不
下载它.
import { Voz } from "@desert-ant-labs/voz";
const voz = await Voz.load();
const result = await voz.transcribe(file); // a File, Blob, ArrayBuffer, or samples
result.text; // "the transcript, as one string"
result.words[0]; // { text: "the", start: 0.08, end: 0.24 }
result.realtimeFactor; // seconds of audio per second of wall clock
文件是片面的,当模型通过它, 所以五分钟 录音和5小时的1 花费同样的记忆。 见 内存 对于这意味着什么 数字.
在节点下,你通过运行时间, 因为那里是 onnxruntime-node页:1
土生土长. 无法捆绑一个
服务器,所以这个不是.
import { Voz } from "@desert-ant-labs/voz";
import * as ort from "onnxruntime-node";
const voz = await Voz.load({ ort });
通过 ort 在浏览器中工作, 对于已经捆绑 a 的应用程序
运行时间或想要一个非 onnxruntime-web/webgpu。 。 。 .
捆绑在第一次使用时从 Hugging Face 下载并缓存( 在浏览器中缓存 API, 在节点中磁盘), 因此重装不会再次取取. 在Npm的柏油球里没有模型大小的船.
文字时间戳
每个字都带着 start 财务报告和审定财务报表 end 从音频开始的几秒钟,
字幕、文字记录和剪辑调查需要:
const { words } = await voz.transcribe(file);
for (const { text, start, end } of words) {
console.log(`${start.toFixed(2)} -> ${end.toFixed(2)} ${text}`);
}
时间来源于每个字的发音框架 而不是从第二 校正合格证,所以没有额外费用 他们的解析度是一个编码器 帧,80毫秒.
你可以转写的东西
| 投入 | 发生什么事 |
|---|---|
File, (中文(简体) ), Blob | 流出: 成块读取, 任何容器WebCodecs都可以解码 |
| 路径( 第20号+) | 流出,同样的方式 |
ArrayBuffer, (中文(简体) ), Uint8Array | 解码整段, 因为字节已经在内存中 |
Float32Array | 作为单一的16千赫样本 |
{ samples, sampleRate } | 恢复到 16 kHz |
浏览器可以交出一个 <input type="file"> 直接文件 :
input.addEventListener("change", async () => {
const result = await voz.transcribe(input.files[0], {
onProgress: (fraction) => console.log(`${Math.round(fraction * 100)}%`),
});
console.log(result.text);
});
在节点下,路径流 相同的方式a File ,它需要节点20或
较新(fs.openAsBlob。 WebCodecs 是解码压缩音频, 所以在一个
节点构建没有它, 先转换为 WAV - ffmpeg -i in.mp4 -ac 1 -ar 16000 out.wav - 到处都是溪流.
如果一个解码器返回的音频 低于容器说它持有,即
报告而不是转录: decodeAudioData 可以返回一个短缓冲
没有错误, 和记录 静静停留一分钟 比一个
失败。 在视频文件中,允许音频音轨短于
照片,它是一个警告.
内存
记录长度的常数,即流线点 上面的路径。 在M5上用铬测量,整个浏览器的峰值居民:
| 音频 | 峰值 |
|---|---|
| 1分钟 | 2.4 英国 |
| 29分钟 | 2.7 英国 |
| 29分钟,在流出前 | 7.7 GB 数字 |
该层约1.2GB为型号:349 MB重量,约900 MB重量 oNNX 运行时间为编译的会话( 测量, 而非某事) 此软件包可以配置掉 ). 其余的是浏览器本身. 重要的东西 是形状:音频不再贡献,所以长度是免费的.
它运行的地方
在浏览器中,编码器运行 网络GPU 在浏览器显示的地方
网络NN (Cromium today),解码步骤运行在神经引擎上. 两者都是
检测; Voz.load({ webnn: false }) 强制WebGPU单独.
速度, 十分钟的音频: M5, 38x 上的Chromium实时125x 一辆M1,255x 在一辆M3 Ultra, 和大约35x在Safari。 单词出错率为等值 与 Core ML 构建 Apple SDK 用户(2.83%对2.66%超过300) LibriSpeech 语句,一个对接的靴子无法区分的区别).
在节点下, onnxruntime-node 运行在CPU。 这是正确的选择
在服务器上转录一个文件,每秒音频比
同一机上的浏览器路径,因为浏览器到达了 GPU 并
onnxruntime-node默认执行提供者不会 .
页面不需要 SharedArrayBuffer 并且没有跨源隔离:运行时间
被配置到一个单一的相位线程,该线程在铬和
避免了WebKit JIT的病理,在萨法里花费了15%.
正在装入模型
Voz.load() 选择:
| 选项 | 默认 | |
|---|---|---|
ort | 浏览器中的 onnxruntime-web | 您自己的 ONNX 运行时模块; 在节点下需要 |
ep | "auto" | "webgpu" 或者说 "wasm" 以覆盖图表运行的地方 |
modelBaseUrl | 拥抱相貌 | 自己服务捆绑; 必须结束于 / |
revision | sDK的胸针 | 加权数的不同修改 |
webnn | 检测 | 在 WebNN 上运行解码步骤 |
wasmDir | 运行时间是自己的 | 哪里的nxruntime -web's .wasm 文件来自 |
onProgress | 无 | 下载进度, 作为分数 |
cache | true | 缓存已下载的捆绑 |
为了照顾自己,复制 web/ 权重重目录
在您的应用程序和点旁边 modelBaseUrl 临τ. meta.json 说出其他的,所以
这里没有要同步的文件列表 .
一个实例包含三个已编译的图表和大约1.2GB的内存(349 MB of 重磅重,所以装入一次,再用一次。 笔录就是一个例子 运行,并同时调用队列而不是互出.
所需资源
- 带有WebGPU的浏览器. Chromium 135+和 Safari 26+上测试. 浏览器 适配器无法编译编码器的 f16 阴影器 - 这就是 没有 GPU 曝光的机器 - 运行在 CPU 上,正确和多 慢慢来.
- 流出路径的节点 20+,与
onnxruntime-node已安装.
许可证
沙漠蚂蚁实验室 源头可破坏许可证。为大多数免费提供 应用软件和商务许可证必须规模化。 完整的术语在链接. 许可证发放: 许可@ desertant.com。 。 。 .
SDK的第三方通知: THIRD_PARTY_NOTICES.md。 。 。 .
权重第三方通知: THIRD_PARTY_NOTICES.md。 。 。 .