导读
语音激活检测(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
来分割音频很明显是无法实现的。文章来源:https://www.toymoban.com/news/detail-528678.html
下一篇文章我们将介绍如何通过模型来实现对语音的分割文章来源地址https://www.toymoban.com/news/detail-528678.html
参考
- 语音活性检测
- 还是不会VAD?三分钟看懂语音激活检测方法
- Python 使用 auditok 聲音活性偵測工具教學與範例
到了这里,关于语音识别之语音激活(VAD)检测(一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!