当前位置:   article > 正文

python 语音学习-Vad检测+滑动平均(剔除语音空白)_pydub vad检测

pydub vad检测

功能

将一段语音中空白处剔除

代码详解

from scipy.ndimage.morphology import binary_dilation
import librosa
import numpy as np
import struct
import librosa.display
import webrtcvad
import soundfile as sf

// ** a的b次方  32767
int16_max = (2 ** 15) - 1
#输入
wav, source_sr = librosa.load("chunk123.wav", sr=None)

// 计算语音检测窗口大小  //为整除 30秒X16000=总帧长
samples_per_window = (30 * 16000) // 1000

// 修剪音频的结尾,使其具有窗口大小的倍数。使wav的长度能被 samples_per_window整除
wav = wav[:len(wav) - (len(wav) % samples_per_window)]

// 浮点数波形转换为16位单声道PCM  *:接收到的参数会形成一个元组,**:接收到的参数会形成一个字典。如下代码。
// webrtcvad 的 is_speech 接收的是buf 所以这里需要转换
pcm_wave = struct.pack("%dh" % len(wav), *(np.round(wav * int16_max)).astype(np.int16))

// 执行语音激活检测
voice_flags = []
//  这里共有三种帧长可以用到,分别是80/10ms,160/20ms,240/30ms。其它采样率
// 的48k,32k,24k,16k会重采样到8k来计算VAD。之所以选择上述三种帧长度,是因为语
// 音信号是短时平稳信号,其在10ms~30ms之间可看成平稳信号,高斯马尔科夫等比较
// 的信号处理方法基于的前提是信号是平稳的,在10ms~30ms,平稳信号处理方法是可
// 以使用的。
//   从vad的代码中可以看出,实际上,系统只处理默认10ms,20ms,30ms长度的数据,
// 其它长度的数据没有支持,笔者修改过可以支持其它在10ms-30ms之间长度的帧长度
// 发现也是可以的。
//   vad检测共四种模式,用数字0~3来区分,激进程度与数值大小正相关。
// 0: Normal,1:low Bitrate, 2:Aggressive;3:Very Aggressive 可以根据实际的使用
vad = webrtcvad.Vad(mode=3)
for window_start in range(0, len(wav), samples_per_window):
    window_end = window_start + samples_per_window
    // append 进来的都是Boolean  这里以samples_per_windowx2 的长度去检测是否为人声
    voice_flags.append(vad.is_speech(pcm_wave[window_start * 2:window_end * 2],
                                     sample_rate=16000))
voice_flags = np.array(voice_flags)
// 
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/288684
推荐阅读
相关标签