导读
语音激活检测(Vioce Activation Detection)简称VAD
,用来检测语音信号是否存在
。VAD技术在语音领域中应用非常的广泛,在语音识别中我们可以对长语音通过VAD来检测出语音信号的空隙,通过这个空隙来分割语音,将长语音切分成短语音来进行语音识别。在电话通信中,为了减少存储数据所使用的空间,我们可以通过VAD技术将空隙的语音信号进行移除。
VAD的检测算法有多种,比较简单的一种算法是通过短时能量(STE,short time energy)
和短时过零率(ZCC,zero cross counter)
利用能量的特征来进行检测。短时能量就是指一帧语音信号的能量
,过零率则是指一帧语音的时域信号穿过0的次数
。除此之外,有些VAD检测算法会综合多个维度的语音特征包括能量特征
、频域特征
、倒谱特征
、谐波特征
、长时信息特征
等。
下面我们就基于STE
来实现一个VAD算法,主要基于auditok
来实现
auditok实现VAD检测
- 安装
pip install auditok
- 读取音频文件
通过auditok
读取音频文件,并绘制出音频文件的波形图
import os,auditok
wav_path = "example.wav"
#读取音频文件
audio = auditok.load(wav_path)
#绘制语音波形图
audio.plot()
#跳过开始的前2s,跳过没有声音的音频
audio = auditok.load(wav_path, skip=2)
- VAD检测并且分割音频
auditok
提供了一个split
函数,可以通过声音信号能量的强弱来判断是否有人说话,从而根据语音的空隙来分割音频,这对于一段长语音的音频做分割时非常重要的,通常ASR模型是无法一次处理过长的音频
save_slice_path = "slice_wav/slice"
#检测音频中的声音进行切分
audio_slices = audio.split(
min_dur=1, #包含声音最短的音频长度
max_dur=15, #包含声音最长的音频长度,超过这个长度会被切断
max_silence=0.3, #音频中没有声音音频的最长长度
energy_threshold=55 #判断音频中包含声音必须大于这个阈值
)
#切分音频
for i, r in enumerate(audio_slices):
post_id = os.path.basename(wav_path)[:-4]
# 输出分割音频中包含的信息
print("slice wav {i}: {r.meta.start:.3f}s -- {r.meta.end:.3f}s".format(i=i, r=r))
# 播放分段的音频
r.play(progress_bar=True)
# 将分段后的音频保存为wav文件
audio_name = "{}_{}.wav".format(post_id,i+1)
save_wav_path = os.path.join(save_slice_path,audio_name)
filename = r.save(save_wav_path)
print("save:{}".format(filename))
问题
上面我们使用了auditok
来通过语音信号的能量对于音频的间隙进行分割,但是这种算法也引入了一个问题,如果音频是由人的说话声音+BGM组合成
或者多人同时说话
的呢?也就是一段音频中即使人没说话了,但是BGM也一直都在,这时候我们通过STE
来分割音频很明显是无法实现的。
下一篇文章我们将介绍如何通过模型来实现对语音的分割
参考
- 语音活性检测
- 还是不会VAD?三分钟看懂语音激活检测方法
- Python 使用 auditok 聲音活性偵測工具教學與範例
文章出处登录后可见!
已经登录?立即刷新