主要内容

语音活动检测器

检测音频信号中是否存在语音

描述

这个语音活动检测器系统对象™ 检测音频段中是否存在语音。您也可以使用语音活动检测器系统对象输出每个频率仓的噪声方差的估计。

要检测语音的存在,请执行以下操作:

  1. 创建语音活动检测器对象并设置其属性。

  2. 使用参数调用对象,就像调用函数一样。

要了解有关系统对象如何工作的更多信息,请参见什么是系统对象?

创造

描述

VAD=语音活动检测器创建一个系统对象,通过采用它可以通过每个输入通道独立地检测语音的存在。

VAD=语音活动检测器(名称、值)设置每个属性名称到指定的价值。未指定的属性具有默认值。

例子:VAD=语音活动检测器('InputDomain','Frequency')创建一个系统对象,通过采用,它接受频域输入。

属性

全部展开

除非另有说明,属性是nontunable,这意味着您不能在调用对象之后更改它们的值。对象在调用时锁定,而释放函数将解锁它们。

如果一个属性是可调,您可以随时更改其值。

有关更改特性值的详细信息,请参见基于系统对象的MATLAB系统设计.

输入信号的域,指定为“时间”“频率”.

可调:

数据类型:字符|字符串

FFT长度,指定为正标量。默认值是[],这意味着FFTLength等于输入的行数。

可调:

依赖关系

若要启用此属性,请设置输入域“时间”.

数据类型:仅有一个的|

在计算离散时间傅里叶变换(DTFT)之前应用的时域窗口函数,指定为“汉恩”,“矩形”,“平顶”,“哈明”,“切比雪夫”“皇帝”.

窗函数的设计采用了以下函数的算法:

可调:

依赖关系

若要启用此属性,请设置输入域“时间”.

数据类型:字符|字符串

窗口的dB旁瓣衰减,指定为实正标量。

可调:

依赖关系

若要启用此属性,请设置输入域“时间”“切比雪夫”“皇帝”.

数据类型:仅有一个的|

从静默帧过渡到语音帧的概率,指定为[0,1]范围内的标量。

可调:是的

数据类型:仅有一个的|

从一帧语音过渡到一帧沉默的概率,指定为范围[0,1]内的标量。

可调:是的

数据类型:仅有一个的|

用法

描述

实例

[概率,噪声估计]=VAD(audioIn)在输入端应用语音活动检测器,audioIn,并返回语音存在的概率。它还返回每个频率仓的估计噪声方差。

输入参数

全部展开

语音活动检测器的音频输入,指定为标量、向量或矩阵。如果audioIn是一个矩阵,列被视为独立的音频通道。

音频输入的大小在第一次呼叫后被锁定语音活动检测器对象改变audioIn呼叫释放在物体上。

如果输入域被设置为“时间”,audioIn必须是实值的。如果输入域被设置为“频率”,audioIn可以是实值或复数。

数据类型:仅有一个的|
复数支持:万博1manbetx是的

输出参数

全部展开

存在语音的概率,作为标量或行向量返回,列数与audioIn.

数据类型:仅有一个的|

估计每个频率箱的噪声方差,返回为具有相同列数的列向量或矩阵audioIn.

数据类型:仅有一个的|

目标函数

要使用对象函数,请将系统对象指定为第一个输入参数。例如,释放名为的系统对象的系统资源obj,使用下面的语法:

释放(obj)

全部展开

克隆 创建重复的系统对象
孤岛 确定系统对象在使用
释放 释放资源并允许更改系统对象属性值和输入特征
重置 重置内部状态系统对象
一步 系统对象算法

例子

全部崩溃

使用默认值语音活动检测器系统对象™ 检测流式音频信号中是否存在语音。

创建音频文件读取器以流式传输音频文件进行处理。定义参数,将音频信号分块为10毫秒非重叠帧。

fileReader=dsp.AudioFileReader(“计数-16-44p1-mono-15秒波形”); fs=fileReader.SampleRate;fileReader.sampleperframe=ceil(10e-3*fs);

创建默认值语音活动检测器系统对象来检测音频文件中是否存在语音。

VAD=语音活动检测器;

创建一个范围,以绘制语音活动检测器检测到的音频信号和相应的语音存在概率。创建一个音频设备编写器,通过声卡播放音频。

范围=时间范围(...“NumInputPorts”2,...“SampleRate”,财政司司长,...“时间跨度源”,“属性”,“时间间隔”3,...“BufferLength”3 * fs,...“YLimits”,[-1.5 1.5],...“TimeSpanOverrunAction”,“滚动”,...“ShowLegend”符合事实的...“ChannelNames”,{“音频”,“言语存在的可能性”}); deviceWriter=音频设备编写器(“SampleRate”,fs);

在音频流循环中:

  1. 从音频文件中读取。

  2. 计算语音出现的概率。

  3. 可视化音频信号和语音存在概率。

  4. 通过声卡播放音频信号。

虽然~isDone(fileReader) audioIn = fileReader();概率= VAD (audioIn);范围(audioIn,概率* (fileReader.SamplesPerFrame 1)) deviceWriter (audioIn);终止

使用语音活动检测器检测音频信号中是否存在语音。绘制语音存在的概率以及音频样本。

创建一个音频文件读取器系统对象™ 读取语音文件。

afr=dsp.AudioFileReader(“计数-16-44p1-mono-15秒波形”);fs=afr.取样器;

将音频分成20毫秒的帧,连续帧之间有75%的重叠。将帧时间(秒)转换为样本。确定跳跃大小(新样本的增量)。在音频文件读取器中,将每帧的样本设置为跳数大小。创建默认值dsp。AsyncBuffer对象来管理音频帧之间的重叠。

frameSize=ceil(20e-3*fs);overlapSize=ceil(0.75*frameSize);hopSize=frameSize-overlapSize;afr.SamplesPerFrame=hopSize;inputBuffer=dsp.AsyncBuffer(“能力”,框架尺寸);

创建一个语音活动检测器系统对象。请指定FFT长度为1024。

VAD=语音活动检测器(“FFTLength”,1024);

创建一个范围来绘制音频信号和相应的语音存在概率,如语音活动检测器检测到的。创建一个音频设备编写器通过声卡播放音频的系统对象。

范围=时间范围(“NumInputPorts”2,...“SampleRate”,财政司司长,...“时间跨度源”,“属性”,“时间间隔”3,...“BufferLength”3 * fs,...“YLimits”,[-1.5,1.5],...“TimeSpanOverrunAction”,“滚动”,...“ShowLegend”符合事实的...“ChannelNames”,{“音频”,“言语存在的可能性”});球员= audioDeviceWriter (“SampleRate”,fs);

初始化一个向量以保存概率值。

pHold=个(hopSize,1);

在音频流循环中:

  1. 从音频文件中读取一跳值的样本并将样本保存到缓冲区中。

  2. 从缓冲区中读取与前一帧有指定重叠的帧。

  3. 调用语音活动检测器以获取分析帧的语音概率。

  4. 将概率向量的最后一个元素设置为新的概率决策。使用时间范围可视化音频和语音存在概率。

  5. 通过声卡播放音频。

  6. 将概率向量设置为下一个循环中打印的最新结果。

虽然~isDone(afr)x=afr();n=write(inputBuffer,x);overlappedInput=read(inputBuffer,frameSize,overlapSize);p=VAD(overlappedInput);pHold(end)=p;scope(x,pHold)player(x);pHold(:)=p;终止

释放球员一旦音频播放完毕。

释放(玩家)

许多特征提取技术在频域上运行。仅将音频信号转换为频域一次是有效的。在此示例中,将流音频信号转换为频域并将该信号馈送到语音活动检测器中。如果存在语音,则使用频域信号从频域信号中提取熔融频率谱系数(MFCC)特征cepstralFeatureExtractor系统对象™.

创建一个音频文件读取器要从音频文件读取的系统对象。

fileReader=dsp.AudioFileReader(“计数-16-44p1-mono-15秒波形”); fs=fileReader.SampleRate;

处理音频在30毫秒帧与10毫秒跳。创建默认值dsp。AsyncBuffer对象来管理音频帧之间的重叠。

samplesPerFrame=ceil(0.03*fs);samplesPerHop=ceil(0.01*fs);samplesPerOverlap=samplesPerFrame-samplesPerHop;fileReader.samplesPerFrame=samplesPerHop;buffer=dsp.AsyncBuffer;

创建一个语音活动检测器系统对象和cepstralFeatureExtractor系统对象。指定它们在频域中运行。创建dsp。SignalSink记录提取的倒谱特征。

VAD=语音活动检测器(“InputDomain”,“频率”);倒谱特征=倒谱特征提取器(“InputDomain”,“频率”,“SampleRate”,财政司司长,“LogEnergy”,“替换”);sink=dsp.signalssink;

在音频流循环中:

  1. 从音频文件中读取一个跃点的样本,并将样本保存到缓冲区中。

  2. 从屏幕上读一帧缓冲器与上一帧具有指定的重叠。

  3. 调用语音活动检测器以获取分析帧的语音概率。

  4. 如果被分析帧的语音概率大于0.75,则提取倒谱特征并使用信号接收器记录特征。如果正在分析的帧的语音概率小于0.75,则向接收器写入NAN向量。

阈值= 0.75;nanVector =南(13);虽然~isDone(fileReader)audioIn=fileReader();写入(缓冲区、音频输入);overlappedAudio=读取(缓冲区、samplesPerFrame、samplesPerOverlap);X=fft(帕杜约,2048年);说话的概率=VAD(X);如果probabilityOfSpeech > threshold xFeatures = cepFeatures(X);水槽(xFeatures”)其他的水槽(nanVector)终止终止

可视化随时间变化的倒频谱系数。

时间向量=linspace(0,15,大小(sink.Buffer,1));绘图(时间向量、接收器、缓冲区)xlabel(‘时间’)伊拉贝尔(“MFCC振幅”)传说(“Log-Energy”,“c1”,“c2”,“c3”,“c4”,“c5”,“c6”,“c7”,“c8”,“c9”,“c10”,“c11”,‘c12’)

图中包含一个轴对象。axis对象包含13个类型为line的对象。这些对象代表Log-Energy, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12。

创建一个音频文件读取器对象以逐帧读取音频。

fileReader=dsp.AudioFileReader(“singing-a-major.ogg”);

创建一个语音活动检测器对象检测流式音频中是否存在语音。

VAD=语音活动检测器;

当有未读样本时,从文件中读取并确定帧包含语音活动的概率。如果帧包含语音活动,呼叫估计音频帧的基频。如果帧不包含语音活动,则将基频声明为.

f0 = [];虽然~isDone(fileReader) x = fileReader();如果VAD(x)>0.99决策=节距(x,fileReader.SampleRate,...“窗口长度”,尺寸(x,1),...“重叠长度”0,...“范围”,[200,340]);其他的决定=南;终止f0=[f0;决定];终止

绘制检测到的基音随时间变化的轮廓。

t = linspace(0,(长度(f0) * fileReader.SamplesPerFrame) / fileReader.SampleRate长度(f0));情节(t, f0) ylabel (‘基频(Hz)’)xlabel(‘时间’网格)在…上

图中包含一个轴对象。axes对象包含类型为line的对象。

算法

这个语音活动检测器实现中描述的算法[1].

如果输入域指定为“时间”,将输入信号加窗,然后根据,SidelobeAttenuationFFTLength属性。如果输入域如果指定为频率,则假设输入为音频信号的加窗离散时间傅里叶变换(DTFT)。然后将信号转换为功率域。根据[2].后验和前验信噪比根据中描述的最小均方误差(MMSE)公式进行估计[3]. 一个对数似然比测试和基于隐马尔可夫模型(HMM)的挂接方案确定当前帧包含语音的概率,根据[1].

参考文献

孙[1],Jongseo。,Nam Soo Kim, and Wonyong Sung. "A Statistical Model-Based Voice Activity Detection."信号处理信. 第6卷,第1期,1999年。

[2] 基于最佳平滑和最小统计的噪声功率谱密度估计IEEE语音和音频处理事务2001年第9卷第5期,第504-512页。

[3] 使用最小均方误差短时谱幅度估计器的语音增强IEEE声学、语音和信号处理汇刊第32卷,第6期,1984年,第1109-1121页。

扩展功能

R2018a中引入