语音识别之语音激活(VAD)检测(一)

导读

语音激活检测(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来分割音频很明显是无法实现的。

下一篇文章我们将介绍如何通过模型来实现对语音的分割

参考

  1. 语音活性检测
  2. 还是不会VAD?三分钟看懂语音激活检测方法
  3. Python 使用 auditok 聲音活性偵測工具教學與範例

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
社会演员多的头像社会演员多普通用户
上一篇 2023年9月1日
下一篇 2023年9月1日

相关推荐