如何在Python中使用py-webrtcvad将wav文件拆分为WebRTC VAD适配帧
基于py-webrtcvad的简单语音帧检测实现
首先给出完整可运行的最简代码,适配你当前的参数配置:
import wave import webrtcvad # 读取音频文件 spf = wave.open("test4.wav", "rb") # 基础参数校验,webrtcvad仅支持16位、单声道音频 assert spf.getsampwidth() == 2, "请使用16位深度的wav文件" assert spf.getnchannels() == 1, "请使用单声道wav文件" assert spf.getframerate() == 16000, "当前示例适配16000采样率音频" signal = spf.readframes(-1) spf.close() # 初始化VAD,灵敏度等级3为最高 vad = webrtcvad.Vad(3) sample_rate = 16000 frame_duration = 10 # 可替换为20或30,单位为毫秒 # 计算单帧字节长度 samples_per_frame = int(sample_rate * frame_duration / 1000) bytes_per_frame = samples_per_frame * 2 # 16位采样每个点占2字节 # 逐帧检测 total_frames = len(signal) // bytes_per_frame for frame_idx in range(total_frames): start_offset = frame_idx * bytes_per_frame end_offset = start_offset + bytes_per_frame current_frame = signal[start_offset:end_offset] has_speech = vad.is_speech(current_frame, sample_rate) print(f"第{frame_idx+1}帧 检测到语音: {has_speech}")
关键逻辑说明
- 帧拆分逻辑:根据你设置的帧时长计算单帧需要的字节数,直接对读取到的二进制音频流做切片即可。以10ms、16000采样率为例,单帧包含160个采样点,每个采样点占2字节,因此单帧长度固定为320字节。
- 如果你的原始音频不符合参数要求,可以用pydub做预处理,转换代码示例:
from pydub import AudioSegment # 读取原始音频 raw_audio = AudioSegment.from_wav("test4.wav") # 转换为16000采样率、单声道、16位深度 processed_audio = raw_audio.set_frame_rate(16000).set_channels(1).set_sample_width(2) # 导出为新的wav文件供VAD检测使用 processed_audio.export("processed_test.wav", format="wav")
- 如果需要提取连续的语音片段,只需要将连续判定为
True的帧的二进制数据拼接,最后写入wav文件即可。
内容的提问来源于stack exchange,提问作者Bach Le Duy
相关产品推荐
相关产品推荐

