@ai-coustics/aic-sdk (英语)
节点. js 绑定相声 SDK:语音增强,语音 活动探测和音频分析.
产品文件见 docs.ai-coustics.com (中文(中国大陆) )。 。 。 .
[注] 这个SDK需要许可证密钥. 生成一个在 开发者.ai-coustics.com。 。 。 .
安装
npm install @ai-coustics/aic-sdk
为macOS(x64, arm64),Linux(x64, arm64, glibc and musl)和 视窗 (x64, arm64, MSVC). 原生SDK是静态连接的,所以没有单独的 要安装或设置搜索路径的库.
快开始
const { Model, Processor } = require('@ai-coustics/aic-sdk')
async function main() {
// Download a model once, or fetch one manually from https://artifacts.ai-coustics.io
const modelPath = await Model.download('quail-vf-2.3-s-16khz', './models')
const model = Model.fromFile(modelPath)
// Use the model's optimal configuration for the lowest delay
const sampleRate = model.getOptimalSampleRate()
const blockSize = model.getOptimalBlockSize(sampleRate)
const processor = new Processor(model, process.env.AIC_SDK_LICENSE)
processor.initialize(sampleRate, blockSize)
// Enhance a mono block in place
const audio = new Float32Array(blockSize)
processor.process(audio)
}
main()
处理是单一的。 对于多通道音频, 混入到单声道或每声道使用一个处理器
频道. 在传递音频前初始化每个实例 。 区块必须准确包含
blockSize 样本。 设定第三个 initialize 参数, variableBlockSize,改为 true
以允许更短的块; 更长的块总是被拒绝。 这也适用于VAD
处理和分析器缓冲.
以下片段假设包含 async 函数。 普通JS 文件不支持
顶级 await。 。 。 .
用于增强、VAD、分析和全文件处理、同步和
async,已经进入 examples/。 。 。 .
模型
现有型号及其身份证列于 文物. ai-coustics.io中。每个类别接受模型类型 以下列出并拒绝其他类型:
| 类 | 接受模式 |
|---|---|
Processor, (中文(简体) ), ProcessorAsync | 增强, 绕行 |
Vad, (中文(简体) ), VadAsync | 专用 VAD |
Analyzer | 分析 |
Model.download 在Node的libuv线程池上运行,并返回对模型路径的承诺.
Model.fromFile 内存图文件。 在模型或任何模型时不要修改或删除
从它创造出来的例子还活着.
增强
参数可以在音频处理时通过上下文控件更改:
const { ProcessorParameter } = require('@ai-coustics/aic-sdk')
const context = processor.getContext()
context.setParameter(ProcessorParameter.EnhancementLevel, 0.8)
context.setParameter(ProcessorParameter.Bypass, 0)
console.log(context.getParameter(ProcessorParameter.EnhancementLevel))
// Get the audio delay in samples to align the output with other streams
console.log(context.getAudioDelay())
// Clear internal state on a stream discontinuity or seek
context.reset()
自动同步处理
ProcessorAsync 财务报告和审定财务报表 VadAsync 在节点的 libuv 线程池上运行初始化和处理.
等待这些呼叫,以保持事件循环可供其他工作使用,例如网络请求.
建筑和处置保持同步.
使用 Processor 或者说 Vad 或用可以阻断的批量脚本
呼叫线。 这些课会处理每个块,没有承诺或输入副本.
const { Model, ProcessorAsync } = require('@ai-coustics/aic-sdk')
const processor = await new ProcessorAsync(model, process.env.AIC_SDK_LICENSE).withConfig(sampleRate, blockSize)
// The input remains unmodified; the promise resolves to the enhanced samples.
const audio = new Float32Array(blockSize)
const enhanced = await processor.process(audio)
两个ASync班在排队前复制输入并返回新的 Float32Array。 。 。 .
ProcessorAsync.process 返回增强的样本; VadAsync.process 返回原始内容
样本。 来电者输入仍未修改.
上下文创建是同步的. 返回上下文的方法是同步的,并且可以 用于处理运行时 :
const context = await processor.getContext()
context.setParameter(ProcessorParameter.EnhancementLevel, 0.8)
运行多条流
每个流使用一个实例并等待每个操作,然后提交下一个 。 同时 无法保证在提交命令中执行对一个案件发出的呼吁。 单独实例 可以同时处理流.
const processors = await Promise.all(
streams.map(() => new ProcessorAsync(model, licenseKey).withConfig(sampleRate, blockSize)),
)
const enhanced = await Promise.all(processors.map((processor, i) => processor.process(blocks[i])))
工作运行在节点的 libuv 线程池上, 它默认是四个线程, 并共享到
fs, (中文(简体) ), dns 财务报告和审定财务报表 crypto为平行运行更多的溪流,提高 UV_THREADPOOL_SIZE 在此之前
节点开始 :
UV_THREADPOOL_SIZE=16 node server.js
AIC_NUM_THREADS 不适用于这些绑定; async音频工作使用libuv.
语音活动检测
VAD运行一个专门的VAD模型,并且独立于任何处理器驱动.
const { Model, Vad, VadParameter } = require('@ai-coustics/aic-sdk')
const vadModel = Model.fromFile(await Model.download('vad-ms-2.1-xxs-16khz', './models'))
const vad = new Vad(vadModel, process.env.AIC_SDK_LICENSE)
const sampleRate = vadModel.getOptimalSampleRate()
vad.initialize(sampleRate, vadModel.getOptimalBlockSize(sampleRate))
const context = vad.getContext()
context.setParameter(VadParameter.Sensitivity, 0.8)
vad.process(block) // reads the block, does not modify it
if (context.isSpeechDetected()) {
console.log('speech')
}
// Raw model output, before speech-hold and thresholding
console.log(context.getRawVadProbability())
在原音频上运行 VAD
当增强和检测一起运行时,将 VAD 输入 原文 输入,而不是
处理器输出 。 增强是用来改变信号,所以在输出时检测
意思是在音频上运行 VAD , 它不再符合其模型的预期, 它堆放
处理器在预测延迟之上的延迟。 因为 vad.process 保留其输入
不动,在增强前运行它。 配置样本率相同的两个实例和
块大小 :
vad.process(block) // reads the block
processor.process(block) // enhances it in place
这两次拖延描述了不同的事物,并且是独立的:
context.getAudioDelay() // enhanced audio lags the input by this many samples
vadContext.getPredictionDelay() // the VAD decision lags the same input by this many
预测延迟不适用于音频. 用它来调整演讲决定 输入音频.
以能源为基础的语音活动检测
增强处理器可以在输出相混合前探测到其增强信号中的语音, 不装入单独的 VAD 模型。 处理前创建上下文,然后读取 每个块 :
const { VadParameter } = require('@ai-coustics/aic-sdk')
const vadContext = processor.getEnergyVadContext()
// The energy VAD uses 1.0 to 15.0; higher values detect quieter speech.
vadContext.setParameter(VadParameter.Sensitivity, 6.0)
processor.process(block)
console.log(vadContext.isSpeechDetected())
// Equal to the processor's audio delay
console.log(vadContext.getPredictionDelay())
// Clear the prediction on a stream discontinuity or seek
vadContext.reset()
一个处理器的上下文共享一个探测器,其方法可以在音频时调用
正在处理中。 处理器处理完毕后上下文仍然有效, 但没有收到
更多音频。 创建上下文即使在处理被绕过或
增强级为 0. processor.getContext().reset() 还重放能量VAD.
打开 ProcessorAsync, (中文(简体) ), getEnergyVadContext() 返回一个承诺.
使用 Vad 具有语音概率专用VAD模型(getRawVadProbability())或(或)
不依赖于增强模型的检测.
分析
分析模型评分音频质量. 收集音频用 buffer,然后用
analyzeAsync 或者说 analyze。 。 。 .
const { Model, Analyzer } = require('@ai-coustics/aic-sdk')
const analysisModel = Model.fromFile(await Model.download('tyto-1.2-l-16khz', './models'))
const analyzer = new Analyzer(analysisModel, process.env.AIC_SDK_LICENSE)
const sampleRate = analysisModel.getOptimalSampleRate()
analyzer.initialize(sampleRate, analysisModel.getOptimalBlockSize(sampleRate))
analyzer.buffer(block)
// Runs the model on a worker thread. `analyze()` does the same on the calling thread.
const result = await analyzer.analyzeAsync()
console.log(result.riskScore, result.noise, result.speakerReverb)
buffer 是同步的,不获取分析器锁。 音频收藏罐
继续时 analyzeAsync 运行在工人线。 使用 analyze 当屏蔽时
调用线程是可以接受的,比如在CLI或专职工人中.
分析使用由模型确定的固定音频持续时间. 旧样本被丢弃 随着新的音频到达。 如果收集到的音频不足,则分析台将剩余 以沉默输入.
呼吁 analyze, (中文(简体) ), reset, (中文(简体) ), updateBearerToken, (中文(简体) ), terminateSession 财务报告和审定财务报表 dispose 获取
分析器锁定并可能在同步分析运行时被屏蔽 . initialize 仅配置
那个收藏家.
所有分数从0.0到1.0. 每一个领域,除了 speakerLoudness下值
表示问题较少的音频. riskScore 预测下游发生故障的可能性
模式如语音对文本,VAD或转接.
遥测
遥测学遵循运行时环境(例如. AIC_SDK_OTEL_ENABLE) (中文(简体) ). 为了一个
单个实例 :
const processor = new Processor(model, licenseKey, {
enable: true,
sessionId: 'my-session',
exportIntervalMs: 60000,
})
遥测会话在它的原生对象被破坏后结束 。 使用 terminateSession() 改为
请求在特定生命周期中终止。 一旦处理完毕,处理器
和VAD无法再处理音频,分析器也无法再分析缓冲音频.
打开 ProcessorAsync 财务报告和审定财务报表 VadAsync,终止运行在 libuv 工人线并返回
一个承诺,因为它可能阻碍.
如果您的许可密钥是 JWT, 请刷新它的位置, 而不是重建对象 :
context.updateBearerToken(renewedJwt)
内存管理
Model, (中文(简体) ), Processor, (中文(简体) ), ProcessorAsync, (中文(简体) ), Vad, (中文(简体) ), VadAsync 财务报告和审定财务报表 Analyzer 拥有大型本土
小 JavaScript 对象后面的分配。 具有约束力的报告估计了本地记忆
v8的用法使得垃圾收集器能够对这些分配进行核算. 这影响了
收藏频率,但不保证对象何时释放.
使用 dispose() * 在特定地点释放本地资源,而不是等待
垃圾收集 :
const processor = new Processor(model, licenseKey)
try {
processor.initialize(sampleRate, blockSize)
processor.process(block)
} finally {
processor.dispose()
}
之后 dispose(),所有方法除外 dispose() 失败; 重复处理没有效果.
Async方法拒绝了他们的诺言. 如果工人持有 处置会阻断呼叫线
本地对象的锁。 处理失败后获得锁的排队工作 .
处置一个模型会发布它对于模型数据的参考. 处理器、 VAD 和分析器 从它创造的,保留了他们自己的参考资料,并且可以使用.
清理时间也会影响本地记忆的使用:
- 对象定稿时, 原生清理在事件循环上运行, 而不是同步
垃圾收集。 决赛者运行在活动启动转弯上,所以批量地创建了许多
这些对象背靠背地持有本土内存,直到循环转向. 一个
await一个 已解约( 微任务) 还不够; 真实的 Aync 边界, 如 I/ O,setTimeout或者说setImmediate对 一个紧凑的同步环路 创造了上千个 对象在循环期间积累其本地内存; 创建这些 单位工作对象在实际合成边界后,或重复使用单个实例. - 处置后RSS可能会继续提升,因为分配器可以保留释放的内存 用于再利用。 峰值内存的用法取决于同时活出的次数, 包括待最后确定的物体.
发展
建造、测试、设定基准和发布本套材料 发展.md。 。 。 .
许可证
此节点包装器在Apache 2. 0 许可证下分发(LICENSE) (中文(简体) ). 核心的SDK它
根据专有的 AIC- SDK 许可证分发链接
(单位:千美元)LICENSE.AIC_SDK) (中文(简体) ).