首页 > 其他分享 >基于双级阈值及过零率的语音激活检测(VAD)

基于双级阈值及过零率的语音激活检测(VAD)

时间:2023-10-26 11:04:30浏览次数:31  
标签:双级 零率 frame stop VAD length len np data


语音激活检测(Voice Activity Detection, VAD):也称为端点检测,目的就是要找到音频信号的开始和结束位置。

时域方法:

  • 音量:只用音量来进行端点检测,是最简单的方法,但是会对清音造成误判。
  • 音量和过零率:以音量为主,过零率为辅,可以对清音进行较准确的检测。

这里介绍第二种方法,结合音量和过零率的语音激活检测方法:

  •  以高阈值tu为标准,决定端点,作为初始端点;
  • 将端点前后延伸到低阈值tl处(如下图N1、N2点);
  • 再将端点前后延伸到过零率(tzc)处,以包含语音中的清音部分。

基于双级阈值及过零率的语音激活检测(VAD)_VAD

图中 tl 的范围是完全包含了 tu 的范围。为什么还需要第一步,因为仅仅用第2步的话,噪音的部分会被计算进来。

结合过零率找到 SUV 来做端点检测,基于如下的特征:浊音 ZCR < 静音 ZCR < 清音 ZCR。

import librosa
import matplotlib.pyplot as plt
import numpy as np
import soundfile as sf

# 加载数据
file_path = 'test1.wav'
y, fs = librosa.load(file_path, sr=8000, mono=False)
if len(y) == 2:
    y = y[0, :]

# 分帧:每帧数据、每帧最大值、每帧幅度
frame_length = 160
hop_length = 80
frame_datas = []
frame_maxs = []
frame_amps = []
frame_zcrs = []
for i in range(0, len(y) - frame_length, hop_length):
    frame_data = y[i: i + frame_length] - np.mean(y[i: i + frame_length])
    frame_max = np.max(frame_data)
    frame_amp = np.sum(np.abs(frame_data))
    frame_datas.append(frame_data)
    frame_maxs.append(frame_max)
    frame_amps.append(frame_amp)

# 过门限率
door_th = np.abs(np.min(frame_maxs)) * 2
for i in range(len(frame_datas)):
    frame_data = frame_datas[i]
    frame_data = frame_data - door_th
    frame_zcr = np.sum(np.abs([np.sign(frame_data[j]) - np.sign(frame_data[j + 1]) for j in range(len(frame_data) - 1)])) / 2
    frame_zcrs.append(frame_zcr)

# 基于双级阈值及过零率的语音激活检测(VAD)
th = np.max(frame_amps) * 0.1
tl = np.max(frame_amps) * 0.05
th_zcr = np.max(frame_zcrs) * 0.2
th_pairs = []
temp = np.argwhere(frame_amps > th).squeeze()
stop_flag = 1
start = 0
stop  = 0
for i in range(len(temp) - 1):
    if stop_flag == 1:
        start = temp[i]
        stop_flag = 0
    elif abs(temp[i] - temp[i - 1]) == 1 and (abs(temp[i] - temp[i + 1]) > 1 or i + 1 == len(temp) - 1) :
        stop = temp[i]
        stop_flag = 1
        th_pairs.append([start, stop])
dst_data = np.zeros_like(y)
for i in range(len(th_pairs)):
    start = th_pairs[i][0]
    stop = th_pairs[i][1]
    for i in range(start, 0, -1):
        if frame_amps[i] < tl:
            start_1 = i
            break
    for i in range(stop, len(frame_amps), 1):
        if frame_amps[i] < tl:
            stop_1 = i
            break
    for i in range(start_1, 0, -1):
        if frame_zcrs[i] < th_zcr:
            start_2 = i
            break
    for i in range(stop_1, len(frame_zcrs), 1):
        if frame_zcrs[i] < th_zcr:
            stop_2 = i
            break
    dst_data[hop_length * start_2: hop_length * stop_2 + frame_length] = \
    y[hop_length * start_2: hop_length * stop_2 + frame_length]

# sf.write('dst_data2.wav', dst_data, fs)
plt.subplot(4, 1, 1)
plt.plot(y)
plt.subplot(4, 1, 2)
print(len([i for i in range(0, len(y) - frame_length, hop_length)]), len(frame_amps))
plt.plot([i for i in range(0, len(y) - frame_length, hop_length)], frame_amps)
plt.subplot(4, 1, 3)
plt.plot([i for i in range(0, len(y) - frame_length, hop_length)], frame_zcrs)
plt.subplot(4, 1, 4)
plt.plot(dst_data)
plt.show()

基于双级阈值及过零率的语音激活检测(VAD)_端点检测_02

参考: 语音处理/语音识别基础(六)- 语音的端点检测(EPD/VAD)

标签:双级,零率,frame,stop,VAD,length,len,np,data
From: https://blog.51cto.com/u_14036511/8030970

相关文章

  • 基于ZCU104的PS和PL数据交互例程(三):vivado中创建IP
    基于ZCU104的PS和PL数据交互例程(三):vivado中创建IP以创建带有AXI-LITE接口的IP为例子按照下面步骤创建这里注意,这里选择的NumberofRegisters,会在后面的代码里面对应slv_reg0,slv_reg1,...,slv_reg3打开IP目录,右键刚才的IP,选择EidtinIPPackagercontroller_v1_0......
  • Xilinx VIvado学习-01 数值处理之减法器
    Verilog数值处理,在处理减法的时候,需要注意溢出问题。实例:a-b=c moduleun_sub(inputunsigned[7:0]a,inputunsigned[7:0]b,output[7:0]sub,outputcarry);assign{carry,sub}=a-b;endmoduleViewCode仿真代码:`timescale1ns/1ps////////////......
  • 基于ZCU104的PS和PL数据交互例程(二):vivado中封装现有工程成IP
    基于ZCU104的PS和PL数据交互例程(二):vivado中封装现有工程成IP设计DUT功能正常创建一个vivado工程,添加一个dut.v的文件功能:读入100个输入数据,每个数据依次加0,1,2,...,然后输出。比如输入是0到99,则输出是0,2,4,到198,如下图所示。状态机:时序图:端口情况:创建vivado工程正常创建新......
  • [CERC2014] Outer space invaders
    题目描述Thealiensfromouterspacehave(finally!)invadedEarth.Defendyourself,orbedisintegrated!Orassimilated.Oreaten.Wearenotyetsure.Thealiensfollowaknownattackpattern.Therearennattackers,thei−thi−thoneappearsattimeaiai......
  • Vivado生成bitstream时报错[Opt 31-67] Problem: A LUT3 cell in the design is missi
    这个原因主要是因为有一个引脚没有用到,解决方法。1、打开Schematic。2、根据提示的模块去找,比如说我的报错。[Opt31-67]Problem:ALUT3cellinthedesignismissingaconnectiononinputpinI1,whichisusedbytheLUTequation.Thispinhaseitherbeenleftun......
  • vivado关联vscod不卡顿处理
    安装版本 推荐:cmd /S /k "code -g [file name]:[line number]"免安装版本只能用这个方法  D:/*****/*****/MicrosoftVSCode/Code.exe-g[filename]:[linenumber] ......
  • 如何用IDEA生成Javadoc
    在IDEA的工具选项卡中选择生成JavaDoc如图所示生成JavaDoc​ -encodingUTF-8-charsetUTF-8......
  • 运算符-包机制-javaDoc生成文档
    publicclassDemo12{publicstaticvoidmain(String[]args){//与(and)或(or)非(取反)booleana=true;booleanb=false;System.out.println("a&&b:"+(b&&a));//逻辑与运算:两个变量都为真,结果才为trueSystem.......
  • 如何生成javaDoc文档
    命令行方法打开IDEA的showinexplore,在文件夹路径前输入cmd打开命令窗口输入javadoc-encodingUTF-8-charsetUTF-8文档名.java成功后就可以在该文件夹下看到生成的javaDoc文档注:打开IDEAshowinexplore的方法-encodingUTF-8-charsetUTF-8是为了防止中......
  • VIVADO VCS VERDI联合仿真
    ./tb_test.shverdi-ffilelist.f-ssf*.fsdb&......