10个版本 (5个稳定版)
3.0.2 | 2023年10月1日 |
---|---|
3.0.0-beta0 |
|
2.0.1 | 2023年7月13日 |
2.0.0 | 2023年3月14日 |
0.16.0 |
|
#122 in 音频
66 每月下载次数
在 2 crates 中使用
145KB
3K SLoC
Rustpotter
一个用Rust编写的开源唤醒词检测器。
概述
本项目旨在检测实时音频流中的特定唤醒词。
rustpotter允许两种检测方法,都是基于音频的梅尔频率倒谱系数(mfccs)。
-
唤醒词参考:当使用此类唤醒词时,rustpotter通过测量实时流音频mfccs与构建唤醒词参考所使用的记录的mfccs之间的相似度来进行检测,使用动态时间规整算法。创建一个功能性的唤醒词参考需要3到8个wav记录。计算量随用于创建唤醒词参考的记录数量增加。它的准确性不如用足够的数据训练的唤醒词模型。
-
唤醒词模型:当使用这些文件时,rustpotter会将实时流音频mfccs传递给一个分类神经网络,并依赖其预测来进行检测。训练一个功能性的唤醒词模型需要一个标记的wav记录的训练集和测试集(其中“label”是网络应预测该音频片段的标签,或在文件名中包含“[label]”)或未标记的(相当于文件名中包含“[none]”)。唤醒词模型的大小取决于您选择的模型类型以及它所训练的音频持续时间(由训练集中的最大音频持续时间定义)。当用足够的数据训练时,所有模型类型都提供相当好的体验(非常低的漏检或误检)。
库
您可以通过不同的编程接口在多个平台上使用rustpotter。
- rustpotter-cli:在
命令行
上使用Rustpotter。(为Windows、macOs和Linux预构建的二进制文件) - rustpotter-java:在
Java
上使用Rustpotter。(在Maven上可用,支持Windows、macOs和Linux) - rustpotter-worklet:使用 Rustpotter 在
browser
中作为 Web Audio API 处理器节点。
音频格式支持
Rustpotter 在内部以 PCM 32bit float 单声道音频在 16000Hz 下工作。
它处理任何采样率的 pcm 音频,只使用第一个通道的数据,并支持以下采样编码
- 8、16 或 32 位 PCM 有符号整数样本。
- 32 位 PCM 浮点样本。
创建唤醒词文件时,您可以使用与支持格式匹配的 wav 记录,音频格式从 wav 头中读取。
在检测时间,库消耗原始数据,需要正确配置可用的音频格式选项。
检测机制概述
Rustpotter 处理音频数据并保持一个 mfccs 向量窗口(可以看作是 mfccs 矩阵),直到加载的唤醒词所需的长度。
Rustpotter 请求的输入长度取决于音频格式,相当于 30ms 的音频。内部,它为每 10ms 的音频生成一个 mfccs 向量,这意味着每次调用 process 方法时,音频窗口更新 3 次。
从窗口足够大的那一刻起,Rustpotter 开始在每次更新时对窗口进行评分,以找到成功的检测(评分超过定义的 threshold
)。
直到处理 n 个更多更新(特征窗口长度的一半)之前,检测被认为是 partial detection
(未发出)。如果在同时找到具有更高评分的检测,它将替换当前的部分检测,并重置此倒计时。
评分
评分是一个范围在 0 - 1 之间的数值,表示检测的准确性。
当使用唤醒词模型时,评分表示预测标签与 none
标签预测之间的逆相似性。
当使用唤醒词参考时,评分表示与创建时使用的每个记录的 mfccs 的聚合相似性。根据评分模式选项计算。
评分模式
当使用唤醒词参考时,rustpotter 需要对创建时使用的每个记录的 mfccs 进行评分统一。
您可以使用 score_mode
选项配置如何执行此操作。以下模式可用
- Avg:使用平均值(均值)。
- Max:使用最大值。
- Median:使用中位数。相当于 P50。
- P25、P50、P75、P80、P90、P95:使用指示的百分位数值。在非精确匹配之间使用线性插值。
平均评分
检测时计算的另一个范围在 0 - 1 之间的数值。
当使用唤醒词参考时,平均阈值表示当前音频 mfccs 与通过平均创建时使用的记录的 mfccs 生成的单个 mfccs 矩阵的相似性。平均阈值可用于降低 CPU 使用率,因为它在平均评分不足时终止检测。
当使用唤醒词模型时,它表示预测标签与下一个匹配标签预测之间的逆相似性。除非您使用训练以检测多个标签的模型,否则它将匹配评分。
请记住,您可以将 avg_threshold
配置设置为 0 来禁用使用此评分。
部分检测
为了丢弃错误检测,您可能需要一定数量的部分检测发生。这通过 min_scores
配置选项进行配置。
检测
成功的 Rustpotter 检测提供了有关检测过程的某些相关信息,以便您知道如何配置检测器以实现良好的配置(最小化丢失/错误检测的数量)。
使用唤醒词参考时,它看起来像这样
RustpotterDetection {
/// Detected wakeword name.
name: "hey home",
/// Detection score against the averaged features matrix. (zero if disabled)
avg_score: 0.41601,
/// Detection score. (calculated from the scores using the selected score mode).
score: 0.6618781,
/// Detection score against the mfccs of each record used on creation.
scores: {
"hey_home_g_5.wav": 0.63050425,
"hey_home_g_3.wav": 0.6301979,
"hey_home_g_4.wav": 0.61404395,
"hey_home_g_1.wav": 0.6618781,
"hey_home_g_2.wav": 0.62885964
},
/// Number of partial detections.
counter: 40,
/// Gain applied by the gain-normalizer or 1.
gain: 1.,
}
使用唤醒词模型时,它看起来像这样
RustpotterDetection {
/// Detected label.
name: "hey home",
/// Inverse similarity against the seconds more probable label. (zero if disabled)
avg_score: 0.9994159,
/// Inverse similarity against the 'none' label probability.
score: 0.9994159,
/// Label probabilities.
scores: {
"hey home": 7.999713,
"none": -10.5787945
}
/// Number of partial detections.
counter: 28,
/// Gain applied by the gain-normalizer or 1.
gain: 1.,
}
Rustpotter 提供了对当前部分检测的引用,允许读取它以进行调试。
模型类型
以下尺寸适用于在1950毫秒音频上训练的模型文件。它们是:
- 微型:2层线性网络(320K)。
- 小型:3层线性网络(768K)。
- 中型:3层线性网络(2.1M)。
- 大型:3层线性网络(3.1M)。
音频过滤器
Rustpotter 包含两种音频过滤器实现:一个 增益-归一化
过滤器和 低音-通
过滤器。
默认情况下,这些过滤器是禁用的,其主要目的是在噪声存在的情况下提高检测器的性能。
网络演示
您可以在此处找到 spot 演示,以便您可以快速使用网络浏览器尝试 Rustpotter。
它包括使用语音合成服务生成的多声音模型。您也可以加载自己的模型。
您可以在此处找到 唤醒词参考生成器演示,以便您可以快速录制样本并使用您自己的声音生成 Rustpotter 唤醒词参考。
请注意,两者完全运行在您的浏览器上,您的声音不会被发送到任何地方
,它们使用 Github Pages 进行托管。
变更日志概述
每个主要版本引入的更改的简要概述。
v3
- 引入唤醒词模型,并将先前功能重构为唤醒词参考。
- 允许通过唤醒词配置 mfccs 数量(不支持添加不同尺寸的唤醒词)。
v2
- 重新构建库,与 v1 不兼容。
- 添加音频过滤器。
v1
- 初始版本。
基本用法
use rustpotter::{Rustpotter, RustpotterConfig, Wakeword};
// assuming the audio input format match the rustpotter defaults
let mut rustpotter_config = RustpotterConfig::default();
// Configure format/filters/detection options
...
// Instantiate rustpotter
let mut rustpotter = Rustpotter::new(&rustpotter_config).unwrap();
// load a wakeword
rustpotter.add_wakeword_from_file("./tests/resources/hey_home.rpw").unwrap();
// You need a buffer of size `rustpotter.get_samples_per_frame()` when using samples.
// You need a buffer of size `rustpotter.get_bytes_per_frame()` when using bytes.
let mut samples_buffer: Vec<i16> = vec![0; rustpotter.get_samples_per_frame()];
// while true { Iterate forever
// fill the buffer with the required samples
...
let detection = rustpotter.process(samples_buffer);
if let Some(detection) = detection {
println!("{:?}", detection);
}
// }
参考
该项目最初是项目 node-personal-wakeword 的移植,它基于公开可用的文章,并使用了许多令人惊叹的 crate。
动机
这个项目的动机是了解音频分析和 Rust 语言/生态系统。
因此,这并不是一个打算用于生产的工具,但通过良好的唤醒词模型,它达到了预期的质量。
贡献
您可以自由地提出或贡献您心中的任何改进,无论是代码还是检测过程。
如果您需要任何帮助,请随时提出问题。
最好的祝愿!
依赖关系
~11MB
~215K SLoC