VAD入门指南:基于Python的实现方法

主要参考资料:
在电脑上如何实现AEC回声消除,做个播放时,可以通过说话打断: https://blog.csdn.net/qq_41126242/article/details/145799439

目录

  • Silero VAD
  • 1.核心优势
  • 2.安装与依赖
  • 3.核心功能
  • 4. 基础使用
  • 5. 高级功能
  • 6. 与 WebRTC VAD 的对比
  • Silero VAD

    Silero VAD 是 Silero 语音模型系列中的语音活动检测(VAD)工具,基于深度学习实现,相比传统 VAD(如 WebRTC VAD),它在复杂噪声环境下的检测效果更好,且支持更灵活的输入格式。

    1.核心优势

  • 基于深度学习:适应复杂噪声环境,检测更精准。
  • 灵活输入:支持任意采样率(自动重采样)和音频长度。
  • 多语言支持:适用于多种语言的语音检测。
  • 轻量高效:模型文件小(约 1MB),适合实时场景。
  • 2.安装与依赖

    (1)安装

    pip install -q torch torchaudio  # 需先安装 PyTorch
    pip install -q silero-vad
    

    (2)依赖
    Python 3.7+
    PyTorch 1.10+
    TorchAudio 0.10+

    3.核心功能

    (1) 语音段检测
    输入音频波形,返回语音段的起止时间(单位:毫秒)。
    (2) 实时语音检测
    支持流式音频输入,逐帧判断是否包含语音。

    4. 基础使用

    (1) 加载模型

    import torch
    from silero_vad import utils, Vad
    
    # 加载模型
    model, utils = torch.hub.load(
        repo_or_dir='snakers4/silero-vad',
        model='silero_vad',
        force_reload=True  # 强制更新模型
    )
    
    # 工具函数
    (get_speech_timestamps, _, read_audio, *_) = utils
    

    (2)检测语音段

    # 读取音频(自动处理格式)
    audio = read_audio('audio.wav', sampling_rate=16000)  # 支持任意采样率
    
    # 检测语音段
    speech_timestamps = get_speech_timestamps(
        audio, 
        model, 
        threshold=0.5,  # 置信度阈值(0~1,越高越严格)
        sampling_rate=16000
    )
    
    print("检测到的语音段(毫秒):", speech_timestamps)
    

    输出示例:

    [
        {'start': 1000, 'end': 3500},  # 第1段语音:1s~3.5s
        {'start': 5000, 'end': 8000}   # 第2段语音:5s~8s
    ]
    

    (3) 提取语音段

    from pydub import AudioSegment
    
    # 加载原始音频
    full_audio = AudioSegment.from_file("audio.wav")
    
    # 根据时间戳切割语音段
    for segment in speech_timestamps:
        start = segment['start']  # 毫秒
        end = segment['end']
        speech_part = full_audio[start:end]
        speech_part.export(f"speech_{start}_{end}.wav", format="wav")
    

    5. 高级功能

    (1) 实时流式检测

    # 初始化 VAD 工具
    vad = Vad(model)
    
    # 模拟实时音频流(每次输入一帧)
    sampling_rate = 16000
    frame_duration_ms = 100  # 每帧100ms
    frame_size = int(sampling_rate * frame_duration_ms / 1000)
    
    # 假设 audio_stream 是实时音频流(如麦克风输入)
    for frame in audio_stream:
        # 转换为 Tensor
        audio_tensor = torch.from_numpy(frame).float()
        
        # 检测当前帧是否有语音
        is_speech = vad(audio_tensor, sampling_rate, threshold=0.5)
        
        print("Real-time Speech" if is_speech else "Silence")
    

    (2) 调整检测敏感度
    threshold 参数:范围 0.0~1.0,值越高检测越严格(减少误报)。

    min_speech_duration_ms:设置最短语音段(默认 250ms),过滤短噪声。

    6. 与 WebRTC VAD 的对比

    作者:弱冠少年

    物联沃分享整理
    物联沃-IOTWORD物联网 » VAD入门指南:基于Python的实现方法

    发表回复