- waverecord(n, fs, ch, dtype):该函数可通过Windows的音频设备实现录音功能
n:采样点数,决定录音的长度;
fs:采样频率,默认值为11025,即以11025Hz进行采样;
ch:通道数,默认为1,如果指定为2,则采样为双通道立体声数据,该参数可以忽略;
dtype:采样数据的存储格式,用字符串指定,可以是:'doeble'、'single'、'int16'、'int8',其中,只有int8是采用8位精度进行采样,其他都是16位采样精度,并将采样结果转换为指定的MATLAB数据类型。 - ************************
Fs = 11025;
y = wavrecord(5*Fs, Fs, 'int16');
wavplay(y, Fs);
************************
此代码中通过Windows录音设备用11025Hz采样频率录制5秒的数据,采样精度为16位,存储格式为int 16,并通过Windows放音设备进行回放。 - wavread函数可读取一个已存在的.wav音频文件。
- 录音时需要仔细调整好MIC的音量,目的是使得噪声电平比较低,而语音信号不会过强,既要避免语音信号的幅度过小,又要防止其幅度太高,以致切顶,造成失真。
- 波形中两相邻尖峰的距离就是基音周期,实际上就是说话人的声带振动的周期。
- 一般用短时能量的概念来描述语音信号的幅度。
- x(n)分帧,其中n为采样点,将语音信号分成每20~30ms一帧,相邻两帧起始点之间的间隔为10ms,即两帧之间有10~20ms的交叠。
- 由于采样频率的差异,帧长和帧移所对应的实际采样点数不同,对于8kHz采样频率,30ms的帧长对应240点,记为N,而10ms的帧移对应为80点,记为M。
- 将语音信号分帧后计算每帧的短时能量,再设定一个门限,就可以实现一个简单的端点检测算法,但是这样的算法并不可靠。因为人的语音分清音或浊音两种。
- 浊音为声带振动发出,对应的语音信号幅度高、周期性明显的特点;
清音则不会有声带的振动,只是靠空气在口腔中的摩擦、冲击或爆破而发声,其团史能量一般比较小,往往会被基于能量的算法漏过去。这就是为什么需要其他算法,如过零率检测的原因。 - 在清音断,由于口腔空气摩擦的效果,所造成的波形在幅度上的变化比较剧烈,通常可以用一帧信号中波形穿越零电平的次数来描述这种变化的剧烈程度,称为过零率。
- 在实际应用中,为了避免静音段的随机噪声产生过高的过零率,通常先设定一个门限,当前后两个采样的符号不同,而且差值大于该门限的时候,就将过零率的数值加1。
- voicebox工具箱中分帧函数是enframe。
- f = enframe(x, len, inc);
其中,x为输入语音信号,len指定了帧长,inc指定帧移。函数返回为n*len的一个矩阵,每行都是一帧数据。 - 在计算短时能量之前,首先将语音信号通过一个一阶高通滤波器1-0.9375z^(-1),通常称为预加重滤波器。
- 预加重滤波器的目的在于滤除低频干扰,尤其是50Hz或60Hz的工频干扰,将对于语音识别更为有用的高频部分的频谱进行提升,还可起到消除直流偏移、抑制随机噪声和提升清音部分能量的效果。
- 语音信号圣母部分的幅度比较低,但是过零率的数值却很高,而在后面的韵母部分过零率则比较低。
- 在实际应用中,通常是利用过零率来检测清音,用短时能量来检测浊音,两者配合实现可靠的断电检测。用得较多的是一种双门限的算法。
- 为了后面处理的方便,首先可将输入的语音信号进行归一化,将其幅度限制在[-1, 1]之间,命令如下:
x = x / max(abs(x)); - Matlab中尽量避免使用循环,前面的过零率计算方法用到了两重循环,其速度比较慢,为了提高算法的效率,应使用矢量化的计算方法:
**************************************
tmp1 = enframe(x(1:end-1), FrameLen, FrameInc);tmp2 = enframe(x(2:end) , FrameLen, FrameInc);signs = (tmp1.*tmp2)<0;diffs = (tmp1 -tmp2)>0.02;zcr = sum(signs.*diffs, 2);
**************************************其中,tmp1和tmp2都是由x得到,但是相互之间相差一个采样点;signs为符号数组,用于存储相邻两个采样点的符号是否相同,即是否穿越零电平;diffs用来度量相邻两个采样点之间的距离,如果距离大于门限0.02,则为1,否则为0;最后将两个矩阵点相乘就可以得到同时满足两个条件的采样点矩阵;然后将其按帧求和,就可以得到过零率。 - 双门限:在进行端点检测之前,首先为短时能量和过零率分别确定两个门限。一个是比较低的门限,数值比较小,对信号的变化比较敏感,很容易就被超过;另一个是比较高的门限,数值比较大,信号必须达到一定的强度,该门限才可能被超过。低门限被超过未必是语音的开始,有可能是时间很短的噪声引起的;高门限被超过则可以基本确信是由于语音信号引起的。
- 整个语音信号的端点检测分为四段:静音、过渡段、语音段、结束。程序中使用一个变量status来表示当前所处的状态。
端点检测流程图
第12章 MATLAB录音工具
最新推荐文章于 2024-03-22 09:29:37 发布