前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用Python进行语音活动检测(VAD)

使用Python进行语音活动检测(VAD)

原创
作者头像
buzzfrog
发布2023-12-11 14:06:09
1.3K0
发布2023-12-11 14:06:09
举报
文章被收录于专栏:云上修行云上修行

引言

现今,在线通讯软件对于高质量的语音传输要求日益提高,其中,有效识别和处理音频信号中的人声段落成为了一个不可忽视的挑战。语音活动检测(Voice Activity Detection,VAD)技术正是为此而生,它可以识别出人声活动并降低背景噪声,优化带宽利用率,提升语音识别的准确性。据报道,谷歌为 WebRTC 项目开发的 VAD 是目前最好的 VAD 之一,它快速、现代且免费(WebRTC,即Web Real-Time Communication,作为一种支持网页浏览器进行实时语音、视频通话和点对点分享的技术,内置了一套高效的VAD算法)。下文将详细介绍webrtcvad模块,并演示如何用Python搭建一个简单的人声语音活动检测系统。

官网地址:https://github.com/wiseman/py-webrtcvad

WebRTC VAD简介

WebRTC VAD是一个灵活的音频处理模块,它可以根据不同的环境噪声水平自动调整其敏感度,是的它在静态或动态噪声环境下都能稳定运行。此VAD模块支持不同的操作模式,能够适应不同复杂度和检测性能的需求。

核心特性

  • 多模式运行: WebRTC VAD提供了3种不同的模式,从0(最低检测敏感度)到3(最高检测敏感度)。
  • 高适应性: 根据输入的声音对环境噪声和可能的畸变进行动态适应。
  • 带宽优化: 通过挑选出重要的语音帧,并舍弃非语音帧,来减少数据传输量。
  • 仅接受 16 位单声道 PCM 音频,采样率为 8000、16000、32000 或 48000 Hz。帧的持续时间必须为 10、20 或 30 毫秒:

如何使用Python实现WebRTC VAD

Python社区提供了对WebRTC VAD的封装,使得我们可以非常方便地在Python环境中使用这一强大的功能。

准备工作

安装Python包

在开始之前,我们需要安装webrtcvad这个Python模块,请在命令行中执行以下命令:

代码语言:shell
复制
pip3 install webrtcvad

导入模块

在Python代码中,我们需要导入这个已安装的模块:

代码语言:python
复制
import webrtcvad

初始化VAD

代码语言:python
复制
# 创建一个VAD对象
vad = webrtcvad.Vad()

# 设置其主动性模式,该模式是介于 0 和 3 之间的整数。0 表示在过滤非语音方面最不敏感,3 表示最敏感。
vad.set_mode(3)

最简单的示例

代码语言:python
复制
import webrtcvad

# 可以在创建 VAD 时设置主动性模式,如下所示
vad = webrtcvad.Vad(3)

# 运行VAD在 16000Hz 和 10ms时长的静默音频
sample_rate = 16000
frame_duration = 10  # in ms

# 创建 16000Hz 和 10ms时长的静默音频
frame = b'\x00\x00' * int(sample_rate * frame_duration / 1000)

# 检测音频
print(f'是否有人声: {vad.is_speech(frame, sample_rate)}')

检测音频文件示例

处理音频文件之前,确保你的音频文件是单通道的,16位采样,采样率为16000赫兹。

读取音频

代码语言:python
复制
import wave

# 读取音频文件
def read_wave(path):
    with wave.open(path, 'rb') as wf:
        sample_rate = wf.getframerate()
        frames = wf.readframes(wf.getnframes())
    return frames, sample_rate

检测语音

代码语言:python
复制
# 使用VAD检测语音
def vad_detect(vad, frames, sample_rate):
    frame_duration = 10  # 每个帧的时长
    frame_size = int(sample_rate * frame_duration / 1000)  # 每个帧的大小
    is_speech = []  # 存储结果

    for i in range(0, len(frames), frame_size):
        is_speech_frame = vad.is_speech(frames[i:i+frame_size], sample_rate)
        is_speech.append(is_speech_frame)
    
    return is_speech

完整示例代码

代码语言:python
复制
import webrtcvad
import wave

def read_wave(path):
    with wave.open(path, 'rb') as wf:
        sample_rate = wf.getframerate()
        frames = wf.readframes(wf.getnframes())
    return frames, sample_rate

def vad_detect(vad, frames, sample_rate):
    frame_duration = 10
    frame_size = int(sample_rate * frame_duration / 1000)
    is_speech = []
    
    for i in range(0, len(frames), frame_size):
        is_speech_frame = vad.is_speech(frames[i:i+frame_size], sample_rate)
        is_speech.append(is_speech_frame)
        
    return is_speech

# 主程序入口
def main():
    vad = webrtcvad.Vad()
    vad.set_mode(3)  # 设置VAD的模式
    audio, sample_rate = read_wave('your_audio_file.wav')  # 读取音频文件
    speech_flags = vad_detect(vad, audio, sample_rate)  # 运行VAD检测

    # 处理结果
    for flag in speech_flags:
        print('有语音' if flag else '无语音')

if __name__ == "__main__":
    main()

将此代码保存为一个.py文件,并替换your_audio_file.wav为你需要检测的音频文件路径,就可以运行看到每个帧是否包含语音。

总结

WebRTC的VAD是一个高效精确的语音活动检测工具,配合Python,我们可以轻松地在各种应用中集成它。通过实际编码实践,读者可以更好地理解其原理并掌握它的使用。希望这篇文章能帮助你在WebRTC VAD和Python之旅上迈出坚实的一步。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引言
  • WebRTC VAD简介
    • 核心特性
    • 如何使用Python实现WebRTC VAD
      • 准备工作
        • 初始化VAD
          • 最简单的示例
            • 检测音频文件示例
            • 总结
            相关产品与服务
            语音识别
            腾讯云语音识别(Automatic Speech Recognition,ASR)是将语音转化成文字的PaaS产品,为企业提供精准而极具性价比的识别服务。被微信、王者荣耀、腾讯视频等大量业务使用,适用于录音质检、会议实时转写、语音输入法等多个场景。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档