#语音识别 #语音 #语音 #活动 #检测 #识别 #音频流

voice_activity_detector

使用Silero VAD模型实现的语音活动检测器

8个版本

0.1.0 2024年6月3日
0.0.6 2024年4月30日
0.0.1 2024年3月25日

多媒体类别中排名第174位

Download history 9/week @ 2024-05-04 12/week @ 2024-05-11 1/week @ 2024-05-18 18/week @ 2024-05-25 140/week @ 2024-06-01 16/week @ 2024-06-08 2/week @ 2024-06-15 30/week @ 2024-06-29 113/week @ 2024-07-06 57/week @ 2024-07-13 35/week @ 2024-07-20 77/week @ 2024-07-27 92/week @ 2024-08-03 149/week @ 2024-08-10 33/week @ 2024-08-17

每月下载量
每月下载量:352次

kalosm-sound中使用

自定义许可协议
大小:1.5MB

代码行数:649行(不包括注释)

语音活动检测器

提供模型和扩展,用于在音频中检测语音。

独立的语音活动检测器

该crate提供了一个独立的语音活动检测器(VAD),可用于预测音频块中的语音。此实现使用了Silero VAD

VAD预测线性脉冲编码调制(LPCM)编码音频样本。这些可能是8位或16位整数,或者是32位浮点数。

模型使用256、512和768个样本的块大小进行训练,以16,000赫兹的采样率进行训练,使用512、768和1024个样本的块大小。这些值是推荐的最佳性能值,但不是必需的。底层模型的基本要求是采样率不能超过块大小的31.25倍。

fn main() -> Result<(), voice_activity_detector::Error> {
    use voice_activity_detector::{VoiceActivityDetector};

    let chunk = vec![0i16; 512];
    let mut vad = VoiceActivityDetector::builder()
        .sample_rate(8000)
        .chunk_size(512usize)
        .build()?;
    let probability = vad.predict(chunk);
    println!("probability: {}", probability);

    Ok(())
}

传递给 predict 的样本将根据其长度被截断或填充。

扩展

音频流处理

预测迭代器和流

fn main() -> Result<(), voice_activity_detector::Error> {
    use voice_activity_detector::{IteratorExt, VoiceActivityDetector};

    let samples = [0i16; 5120];
    let vad = VoiceActivityDetector::builder()
        .sample_rate(8000)
        .chunk_size(512usize)
        .build()?;

    let probabilities = samples.into_iter().predict(vad);
    for (chunk, probability) in probabilities {
        if probability > 0.5 {
            println!("speech detected!");
        }
    }
    Ok(())
}

标签迭代器和流

标签迭代器和流也处理音频样本流。而不是只返回每个块的语音概率,这些返回语音或非语音的标签。这个辅助函数允许添加额外的填充,以防止语音块的突然中断。

  • threshold:介于0.0和1.0之间的值。大于或等于此值的概率将被认为是语音。
  • padding_chunks:为语音块添加额外的块。
fn main() -> Result<(), voice_activity_detector::Error> {
    use voice_activity_detector::{LabeledAudio, IteratorExt, VoiceActivityDetector};

    let samples = [0i16; 51200];
    let vad = VoiceActivityDetector::builder()
        .sample_rate(8000)
        .chunk_size(512usize)
        .build()?;

    // This will label any audio chunks with a probability greater than 75% as speech,
    // and label the 3 additional chunks before and after these chunks as speech.
    let labels = samples.into_iter().label(vad, 0.75, 3);
    for label in labels {
        match label {
            LabeledAudio::Speech(_) => println!("speech detected!"),
            LabeledAudio::NonSpeech(_) => println!("non-speech detected!"),
        }
    }
    Ok(())
}

功能标志

  • async:启用结构体和函数与 ::future::Stream 一起工作。
  • load-dynamic:默认情况下,此库从微软下载预构建的ONNX Runtime。这对于大多数用例来说既方便又可以直接使用。对于需要更多控制的用例,此功能标志为 load-dynamic 启用了 ort 库的功能。请参阅ort库文档

这不会链接到任何动态库,而是使用dlopen()在运行时加载库。这可以用来控制ONNX Runtime二进制文件的路径(意味着它们不必直接位于您的可执行文件旁边),并避免共享库地狱。要使用此功能,请启用load-dynamic Cargo功能,并将ORT_DYLIB_PATH环境变量设置为onnxruntime.dll/libonnxruntime.so/libonnxruntime.dylib的路径 - 您也可以使用相对路径,例如ORT_DYLIB_PATH=./libonnxruntime.so(它将相对于可执行文件)。为了方便起见,您应该下载或编译ONNX Runtime二进制文件,将它们放入永久位置,并永久设置环境变量。

更多示例

请参阅测试目录以获取更多示例。

限制

语音活动检测器和辅助函数仅在单声道音频流上工作。如果您的用例涉及多个通道,您需要根据需要拆分通道并可能再次交织它们。

我们目前还没有对所有平台的功能进行验证,以下是我们测试的平台:| Windows | macOS | Linux | | :-----: | :---: | :---: | | 🟢 | 🟢 | 🟢 |

🟢 = 可用

🔵 = 目前正在开发中

🟡 = 目前尚未测试

🔴 = 目前无法使用(可能在未来使用)

依赖

~3.5–9MB
~84K SLoC