matlab语音识别系统(源代码)最新版

合集下载

语音识别与合成入门1(内有matlab源码)

语音识别与合成入门1(内有matlab源码)

所謂「音訊」(Audio Signals),泛指人類可以聽到的聲音,這些聲音可已有很多不同的分類方式,例如,若以發音的來源,可以大概分類如下:• 生物音:人聲、狗聲、貓聲等。

• 非生物音:引擎聲、關門聲、打雷聲、樂器聲等。

若以訊號的規律性,又可以分類如下:• 規律音:波形具有規律性,可以看出週期的重複性,人耳可以感覺其穩定音高的存在,例如單音絃樂器、人聲清唱等。

• 不規律音:波形不具規律性,看不出明顯的週期,人耳無法感覺出穩定音高的存在,例如打雷聲、拍手聲、敲鑼打鼓聲、人聲中的氣音等。

本課程將以人聲與音樂聲的處理與辨識為探討重點。

一般人聲的特性如下:1. 長期(一個句子):變化劇烈且無規律性,例如下圖(a)2. 短期(一個音框):變化不大且有規律性,例如下圖(b)聲音代表了空氣的密度隨時間的變化,基本上是一個連續的函數,但是若要將此訊號儲存在電腦裡,就必須先將此訊號數位化。

一般而言,當我們將聲音儲存到電腦時,有下列幾個參數需要考慮:• 取樣頻率(Sample Rate):每秒鐘所取得的聲音資料點數,以 Hertz(簡寫 Hz)為單位。

點數越高,聲音品質越好,但是資料量越大,常用的取樣頻率如下:8 kHz (電話音質、一般玩具IC音質)2.11.025 KHz3.16 KHz(一般語音辨識所採用)4.44.1 KHz (CD 音質)• 單點解析度(Bit Resolution):每個聲音資料點所用的位元數,常用的數值如下:1.8-bit:可表示的數值範圍為 0~255 或 -128~1272.16-bit:可表示的數值範圍為 -32768~32767• 聲道:一般只分單聲道(Mono)或立體聲(Stereo)。

以我所錄的「清華大學資訊系」來說,這是單聲道的聲音,取樣頻率是 16000(16 KHz),解析度是 8 Bits(1 Byte),總共包含了 64960 點(等於 64960/16000 = 4.06 秒),所以檔案大小就是大約 65 KB 左右。

声源定位matlab程序

声源定位matlab程序

声源定位matlab程序在MATLAB中进行声源定位的程序通常涉及到信号处理和声学定位技术。

声源定位的目标是确定声音的方向,通常使用麦克风阵列来实现。

以下是一个简单的MATLAB程序示例,用于声源定位:matlab.% 定义麦克风阵列参数。

numMics = 4; % 麦克风数量。

micSpacing = 0.1; % 麦克风间距(以米为单位)。

% 模拟接收到的声音信号。

fs = 44100; % 采样率。

t = (0:1/fs:1-1/fs)'; % 时间向量。

f1 = 1000; % 第一个声源的频率。

f2 = 2000; % 第二个声源的频率。

signal1 = sin(2pif1t); % 第一个声源的信号。

signal2 = sin(2pif2t); % 第二个声源的信号。

% 模拟麦克风接收到的声音。

micSignals = zeros(length(t), numMics);for i = 1:numMics.distance = (i-1) micSpacing; % 麦克风到声源的距离。

delay = distance/340; % 延迟(声音传播速度为340m/s)。

micSignals(:,i) = [zeros(round(delayfs),1);signal1(1:end-round(delayfs))] + [zeros(round(delayfs),1); signal2(1:end-round(delayfs))];end.% 声源定位。

[azimuth,elevation] =locateSource(micSignals,fs,micSpacing);% 显示结果。

disp(['声源方位角: ', num2str(azimuth), '°']);disp(['声源俯仰角: ', num2str(elevation), '°']);需要注意的是,以上代码中的`locateSource`函数是一个虚构的函数,实际上需要根据具体的声源定位算法来实现。

gru matlab代码

gru matlab代码

GRU MATLAB代码一、引言本文将详细探讨GRU(Gated Recurrent Unit)神经网络的MATLAB代码实现。

GRU是一种强大的循环神经网络(RNN)结构,常用于自然语言处理和语音识别任务中。

通过理解和实现GRU的MATLAB代码,我们可以更好地理解其原理和工作机制,并将其应用于实际问题中。

二、GRU简介2.1 循环神经网络(RNN)循环神经网络是一种具有循环连接的神经网络,可以处理序列数据。

RNN中的每个单元都会保留前一时刻的状态,并将其作为当前时刻的输入之一。

这种循环结构使得RNN非常适用于处理时序数据,如文本、音频等。

2.2 GRU结构GRU是一种RNN变体,通过引入门控机制来解决传统RNN存在的梯度爆炸和梯度消失问题。

GRU由一组门控单元组成,包括更新门(update gate)和重置门(reset gate)。

通过这些门控单元,GRU可以选择性地更新或忽略输入数据,并且能够更好地捕捉序列中的长期依赖关系。

2.3 GRU的工作原理GRU的关键是更新门和重置门。

更新门控制前一时刻的状态如何被传递到当前时刻,而重置门控制当前时刻的输入如何与前一时刻的状态相结合。

GRU单元的输出由此计算得出,并可作为下一个时刻的输入。

三、GRU MATLAB代码实现3.1 环境设置在开始编写GRU的MATLAB代码之前,我们需要先设置一些必要的环境。

首先,确保已安装MATLAB并具备基本的编程能力。

其次,我们需要下载并安装一个MATLAB深度学习框架,例如Deep Learning Toolbox。

这些准备工作完成后,我们可以开始编写GRU的MATLAB代码了。

3.2 数据预处理在实现GRU之前,我们需要对输入数据进行预处理。

这包括数据清洗、标准化等步骤,以便将数据整理为合适的输入格式。

3.3 定义GRU模型在MATLAB中,我们可以使用深度学习工具包提供的API来定义GRU模型。

通过设置模型的各个参数,我们可以根据具体需求来构建一个适用于当前问题的GRU模型。

男声变女声matlab程序

男声变女声matlab程序

%载入声音[s,fs, nbits] = wavread('222');%播放原始声音soun d(s,fs ,n bits);%帧长 %窗长 FL = 80;WL = 240;P = 10;s = s/max(s);L = len gth(s);FN = floor(L/FL)-2;%归一化 %读入语音长度 %计算帧数 %预测和重建滤波器exc = zeros(L,1);zi_pre = zeros(R1);s_rec = zeros(L,1);zi_rec = zeros(P1); %激励信号(预测误差) %预测滤波器的状态 %重建语音%合成滤波器exc_s yn = zeros(L,1);s_syn = zeros(L,1);last_s yn = 0; %合成的激励信号(脉冲串) %合成语音 %存储上一个(或多个)段的最后一个脉冲的下标%合成滤波器的状态%变调不变速滤波器exc_s yn_t = zeros(L,1);s_syn_t = zeros(L,1);last_s yn_t = 0;zi_s yn_t = zeros(R1); %合成的激励信号(脉冲串) %合成语音 %存储上一个(或多个)段的最后一个脉冲的下标%合成滤波器的状态%变速不变调滤波器(假设速度减慢一倍)hw = hammi ng(WL);%汉明窗 %依次处理每帧语音for n = 3:FN%计算预测系数s_w = s( n*FL-WL+1: n*FL).*hw;[A E] = lpc(s_w, P); %汉明窗加权后的语音 %用线性预测法计算 P 个预测系数% A 是预测系数,E 会被用来计算合成激励的能量%预测系数个数%用filter函数s_f计算激励[exc1,zi_pre] = filter(A,1,s_f,zi_pre);exc( (n-1)*FL+1: n*FL) = exc1; %计算得到的激励%用filter函数和exc重建语音[s_rec1,zi_rec] = filter(1,A,exc1,zi_rec);s_rec(( n-1)*FL+1: n*FL) = s_rec1; %计算得到的重建语音s_Pitch = exc( n*FL-222: n*FL); PT = fin dpitch(s_Pitch);G = sqrt(E*PT); %计算基音周期PT%计算合成激励的能量Gtemp n_syn = [1: n*FL-last_s yn ]';exc_s yn1 = zeros(le ngth(temp n_syn ),1);exc_sy n1(mod(tempn_sy n,PT)==O) = G; %某一段算出的脉冲exc_s yn1 = exc_s yn1((n-1)*FL-last_s yn+1: n*FL-last_s yn);[s_syn 1,zi_s yn] = filter(1,A,exc_s yn 1,zi_s yn);exc_sy n((n-1)*FL+1: n*FL) = exc_sy n1; %计算得到的合成激励s_sy n((n-1)*FL+1: n*FL) = s_sy n1; %计算得到的合成语音last_syn = last_sy n+PT*floor(( n*FL-last_sy n)/PT);%男声变女声PT1 =floor(PT/2); %减小基音周期poles = roots(A);deltaOMG =150*2*pi/fs;for p=1:10 %增加共振峰频率,实轴上方的极点逆时针转,下方顺时针转if imag(poles(p))>0 poles(p) = poles(p)*exp(j*deltaOMG);elseif imag(poles(p))<0 poles(p) = poles(p)*exp(-j*deltaOMG);endendA1=poly(poles);temp n_syn_t = [1: n*FL-last_s yn _t]';s_f = S(( n-1)*FL+1: n*FL); %本帧语音,下面就要对它做处理exc_s yn1_t = zeros(le ngth(temp n_syn _t),1);exc_sy n1_t(mod(tempn_syn_t,PT1)==0) = G; %某一段算出的脉冲exc_s yn 1_t = exc_s yn 1_t(( n-1)*FL-last_s yn _t+1: n*FL-last_s yn _t);[s_syn 1_t,zi_s yn_t] = filter(1,A1,exc_s yn 1_t,zi_s yn _t);exc_syn_t(( n-1)*FL+1: n*FL) = exc_syn 1_t; %计算得到的合成激励s_syn_t(( n-1)*FL+1: n*FL) = s_syn 1_t; %计算得到的合成语音last_syn_t = last_syn_t+PT1*floor(( n*FL-last_syn_t)/PT1);end%绘图plot(s_syn_t),xlabel(' n (samples)'), ...ylabel('Amplitude'), title('变换后语音信号'),... xlim([0,le ngth(s_syn_t)]);%播放改变后的声音soun d(2*s_s yn _t);%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% findpitch 函数%计算一段语音的基音周期function PT = fin dpitch(s)[B, A] = butter(5, 700/4000);s = filter(B,A,s);R = zeros(143,1);for k=1:143R(k) = s(144:223)'*s(144-k:223-k);end[R1,T1] = max(R(80:143));T1 = T1 + 79;R1 = R1/( norm(s(144-T1:223-T1))+1);[R2,T2] = max(R(40:79));T2 = T2 + 39;R2 = R2/( norm(s(144-T2:223-T2))+1); [R3,T3] = max(R(20:39));T3 = T3 + 19;R3 = R3/( norm(s(144-T3:223-T3))+1); Top = T1;Rop = R1;if R2 >= 0.85*RopRop = R2;Top = T2; end if R3 > 0.85*RopRop = R3;Top = T3;endPT = Top;return。

利用Matlab进行语音合成和语音识别技术实现

利用Matlab进行语音合成和语音识别技术实现

利用Matlab进行语音合成和语音识别技术实现人类的语音交流是一种非常重要的沟通方式。

然而,由于各种原因,有些人可能会失去语音能力,这给他们的生活带来了极大的困扰。

幸运的是,现代技术的快速发展为这些人提供了帮助的可能性。

利用Matlab进行语音合成和语音识别技术的实现,为失去语音能力的人提供了一种有效的解决方案。

语音合成技术是指根据既定的文本或输入内容,生成人工合成语音的过程。

Matlab是一个功能强大的工具,可以用于语音合成的实现。

它具有丰富的信号处理和声音处理函数,可以通过调用这些函数来进行语音合成。

首先,我们需要选择一种合适的语音合成算法。

一个常用的算法是基于傅里叶变换的加法合成算法。

这个算法将输入文本转化为一个频谱图,然后将频谱图转换为时域信号,最后通过声音设备输出。

在Matlab中,我们可以使用fft函数进行频谱分析,并使用ifft函数进行逆傅里叶变换以转换为时域信号。

在进行语音合成之前,我们还需要合适的语音库。

语音库通常包含一系列基本音素以及它们的语音特征。

通过指定一个特定的文本,我们可以根据语音库中的音素选择相应的语音特征,然后使用合成算法生成相应的语音。

除了语音合成,Matlab还可以用于语音识别技术的实现。

语音识别是指将语音信号转化为文本或其他形式的过程。

这在现代通信和人机交互中非常常见,例如,语音助手和电话自动接听系统。

语音识别的实现通常依赖于声学模型和语言模型。

声学模型主要用于建模和识别不同语音特征,在Matlab中可以利用模式识别算法来实现声学模型。

语言模型则主要用于识别和解析语音信号的上下文信息。

在进行语音识别之前,我们需要收集一些训练数据用于模型的训练。

这些训练数据包括多个语音样本以及相应的文本转录。

通过这些数据,我们可以使用Matlab中的机器学习算法进行模型的训练和优化。

常用的机器学习算法包括HMM (隐马尔可夫模型)和DNN(深度神经网络)等。

一旦完成了语音识别模型的训练和优化,我们就可以使用这个模型进行实际的语音识别。

基于MATLAB的汉语数字语音识别系统

基于MATLAB的汉语数字语音识别系统
张 培 玲 , 凌 飞 成
( 河南理工大学 电气学院 , 河南 焦作 440) 5 0 0

要: 应用动 态时间规整 (T 为识别 算法, 用M C ( E 频率倒谱 系数) D W) 采 F CM L 为主要语音特 征参数 , 建立 了一 个汉
语数字语音识别 系统 , 中包括语音信号 的预 处理 、 其 特征 参数的提 取 、 别模板 的训练、 别匹配算 法; 识 识 同时 , 出利 提 用 MA L B图形用户界 面开发环境设计语音识 别 系统界 面 , TA 设计 简单 , 用方便 , 使 系统界 面友好 。
为 了体 现语 音 的动态 特性 及能 量对 语音 区分 的作 用 , 在 上述 语 音 特征 矢 量 中加 人 了一 阶差 分 MF C 还 C 及 其 一 阶能 量 和一 阶差分 能 量 , 中能量 参 数 用语 音 其
平 均能 量进 行 了归一 化 。
3 训 练 与识 别
路 径不 是 随 意选 择 的 , 因为任 何 一种 语 音 的发 音快 慢 都有 可 能变化 , 但是 其各 部分 的先后 次 序不 可能 改变 , 因此 所选 的路 径必 定是从 左 下角 出发 , 在右上 角结 束 ,

xk z ) / . (一 n (一 (e K. i ∑ )
尸 ) xkl (=l( 。 ).

( 1 )
( 2 )
其中 , 为 52 l 点。然后再求信号能量谱 , : 即 5 根据 ( ) ) 4 式进行频率弯折 , 在弯折后 的频率轴 上取等间隔滤波器组在频域对功率谱进行滤波.
4 对加窗后的语音信号进行 5 2 ) 1 点离散傅立叶变
换( F , : D T) 即
用过零率找到语音端点的相对精确位置 , 分解 出每一 个 语 音段 。 个实例见 图 2 其 中 5 , 表示无 声段 ,表示 有声 , 段 , 示 有 声 段 结束 后 的无 声 部 分 。从 图 中可 知 有 H表

MATLAB实用源代码

clcclear allInputImage=imread('11.png'); %读入要处理的图像GrayImage=rgb2gray(InputImage);% 将图像转换为灰度图像figure(1)imshow(Gx) % 显示使用matlab自带sobel水平算子得到的图片GrayImage=double(GrayImage); % 把图像变为双精度图像类型[m n]=size(GrayImage); %图像的大小(长和宽)g=zeros(m,n); %定义一个大小为S的空矩阵for i=2:m-1for j=2:n-1g(i,j)=GrayImage(i-1,j-1)+2*GrayImage(i-1,j)+GrayImage(i-1,j+1)-GrayImage(i+1 ,j-1)-2*GrayImage(i+1,j)-GrayImage(i+1,j+1); %Sobel算子的垂直梯度endend%边缘像素的操作g(1,:)=0;g(:,1)=0;g(m,:)=0;g(:,n)=0;figure(2)SFImage=uint8(g); % 显示滤波后的图像imshow(SFImage)MATLAB实用源代码(2010-03-31 09:41:21)转载标签:杂谈1.图像反转MATLAB 程序实现如下:I=imread('xian.bmp');J=double(I);J=-J+(256-1); %图像反转线性变换H=uint8(J);subplot(1,2,1),imshow(I);subplot(1,2,2),imshow(H);2.灰度线性变换MATLAB 程序实现如下:I=imread('xian.bmp');subplot(2,2,1),imshow(I);title('原始图像');axis([50,250,50,200]);axis on; %显示坐标系I1=rgb2gray(I);subplot(2,2,2),imshow(I1);title('灰度图像');axis([50,250,50,200]);axis on; %显示坐标系J=imadjust(I1,[0.1 0.5],[]); %局部拉伸,把[0.1 0.5]内的灰度拉伸为[0 1] subplot(2,2,3),imshow(J);title('线性变换图像[0.1 0.5]');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系K=imadjust(I1,[0.3 0.7],[]); %局部拉伸,把[0.3 0.7]内的灰度拉伸为[0 1] subplot(2,2,4),imshow(K);title('线性变换图像[0.3 0.7]');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系3.非线性变换MATLAB 程序实现如下:I=imread('xian.bmp');I1=rgb2gray(I);subplot(1,2,1),imshow(I1);title(' 灰度图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系J=double(I1);J=40*(log(J+1));H=uint8(J);subplot(1,2,2),imshow(H);title(' 对数变换图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系4.直方图均衡化MATLAB 程序实现如下:I=imread('xian.bmp');I=rgb2gray(I);figure;subplot(2,2,1);imshow(I);subplot(2,2,2);imhist(I);I1=histeq(I);figure;subplot(2,2,1);imshow(I1);subplot(2,2,2);imhist(I1);5. 线性平滑滤波器用MA TLAB实现领域平均法抑制噪声程序:I=imread('xian.bmp');subplot(231)imshow(I)title('原始图像')I=rgb2gray(I);I1=imnoise(I,'salt & pepper',0.02);subplot(232)imshow(I1)title(' 添加椒盐噪声的图像')k1=filter2(fspecial('average',3),I1)/255; %进行3*3模板平滑滤波k2=filter2(fspecial('average',5),I1)/255; %进行5*5模板平滑滤波k3=filter2(fspecial('average',7),I1)/255; %进行7*7模板平滑滤波k4=filter2(fspecial('average',9),I1)/255; %进行9*9模板平滑滤波subplot(233),imshow(k1);title('3*3 模板平滑滤波');subplot(234),imshow(k2);title('5*5 模板平滑滤波');subplot(235),imshow(k3);title('7*7 模板平滑滤波');subplot(236),imshow(k4);title('9*9 模板平滑滤波');6.中值滤波器用MA TLAB实现中值滤波程序如下:I=imread('xian.bmp');I=rgb2gray(I);J=imnoise(I,'salt&pepper',0.02);subplot(231),imshow(I);title('原图像');subplot(232),imshow(J);title('添加椒盐噪声图像'); k1=medfilt2(J); %进行3*3模板中值滤波k2=medfilt2(J,[5,5]); %进行5*5模板中值滤波k3=medfilt2(J,[7,7]); %进行7*7模板中值滤波k4=medfilt2(J,[9,9]); %进行9*9模板中值滤波subplot(233),imshow(k1);title('3*3模板中值滤波'); subplot(234),imshow(k2);title('5*5模板中值滤波'); subplot(235),imshow(k3);title('7*7模板中值滤波'); subplot(236),imshow(k4);title('9*9 模板中值滤波');7.用Sobel算子和拉普拉斯对图像锐化:I=imread('xian.bmp');subplot(2,2,1),imshow(I);title('原始图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I1=im2bw(I);subplot(2,2,2),imshow(I1);title('二值图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系H=fspecial('sobel'); %选择sobel算子J=filter2(H,I1); %卷积运算subplot(2,2,3),imshow(J);title('sobel算子锐化图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系h=[0 1 0,1 -4 1,0 1 0]; %拉普拉斯算子J1=conv2(I1,h,'same'); %卷积运算subplot(2,2,4),imshow(J1);title('拉普拉斯算子锐化图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系8.梯度算子检测边缘用MA TLAB实现如下:I=imread('xian.bmp');subplot(2,3,1);imshow(I);title('原始图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I1=im2bw(I);subplot(2,3,2);imshow(I1);title('二值图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I2=edge(I1,'roberts');figure;subplot(2,3,3);imshow(I2);title('roberts算子分割结果'); axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I3=edge(I1,'sobel');subplot(2,3,4);imshow(I3);title('sobel算子分割结果');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I4=edge(I1,'Prewitt');subplot(2,3,5);imshow(I4);title('Prewitt算子分割结果'); axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系9.LOG算子检测边缘用MA TLAB程序实现如下:I=imread('xian.bmp');subplot(2,2,1);imshow(I);title('原始图像');I1=rgb2gray(I);subplot(2,2,2);imshow(I1);title('灰度图像');I2=edge(I1,'log');subplot(2,2,3);imshow(I2);title('log算子分割结果');10.Canny算子检测边缘用MA TLAB程序实现如下:I=imread('xian.bmp');subplot(2,2,1);imshow(I);title('原始图像')I1=rgb2gray(I);subplot(2,2,2);imshow(I1);title('灰度图像');I2=edge(I1,'canny');subplot(2,2,3);imshow(I2);title('canny算子分割结果');11.边界跟踪(bwtraceboundary函数)clcclear allI=imread('xian.bmp');figureimshow(I);title('原始图像');I1=rgb2gray(I); %将彩色图像转化灰度图像threshold=graythresh(I1); %计算将灰度图像转化为二值图像所需的门限BW=im2bw(I1, threshold); %将灰度图像转化为二值图像figureimshow(BW);title('二值图像');dim=size(BW);col=round(dim(2)/2)-90; %计算起始点列坐标row=find(BW(:,col),1); %计算起始点行坐标connectivity=8;num_points=180;contour=bwtraceboundary(BW,[row,col],'N',connectivity,num_points);%提取边界figureimshow(I1);hold on;plot(contour(:,2),contour(:,1), 'g','LineWidth' ,2);title('边界跟踪图像');12.Hough变换I= imread('xian.bmp');rotI=rgb2gray(I);subplot(2,2,1);imshow(rotI);title('灰度图像');axis([50,250,50,200]);grid on;axis on;BW=edge(rotI,'prewitt');subplot(2,2,2);imshow(BW);title('prewitt算子边缘检测后图像');axis([50,250,50,200]);grid on;axis on;[H,T,R]=hough(BW);subplot(2,2,3);imshow(H,[],'XData',T,'YData',R,'InitialMagnification','fit'); title('霍夫变换图');xlabel('\theta'),ylabel('\rho');axis on , axis normal, hold on;P=houghpeaks(H,5,'threshold',ceil(0.3*max(H(:))));x=T(P(:,2));y=R(P(:,1));plot(x,y,'s','color','white');lines=houghlines(BW,T,R,P,'FillGap',5,'MinLength',7); subplot(2,2,4);,imshow(rotI);title('霍夫变换图像检测');axis([50,250,50,200]);grid on;axis on;hold on;max_len=0;for k=1:length(lines)xy=[lines(k).point1;lines(k).point2];plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow');plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');len=norm(lines(k).point1-lines(k).point2);if(len>max_len)max_len=len;xy_long=xy;endendplot(xy_long(:,1),xy_long(:,2),'LineWidth',2,'Color','cyan');13.直方图阈值法用MA TLAB实现直方图阈值法:I=imread('xian.bmp');I1=rgb2gray(I);figure;subplot(2,2,1);imshow(I1);title(' 灰度图像')axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系[m,n]=size(I1); %测量图像尺寸参数GP=zeros(1,256); %预创建存放灰度出现概率的向量for k=0:255GP(k+1)=length(find(I1==k))/(m*n); %计算每级灰度出现的概率,将其存入GP中相应位置endsubplot(2,2,2),bar(0:255,GP,'g') %绘制直方图title('灰度直方图')xlabel('灰度值')ylabel(' 出现概率')I2=im2bw(I,150/255);subplot(2,2,3),imshow(I2);title('阈值150的分割图像')axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I3=im2bw(I,200/255); %subplot(2,2,4),imshow(I3);title('阈值200的分割图像')axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系14. 自动阈值法:Otsu法用MA TLAB实现Otsu算法:clcclear allI=imread('xian.bmp');subplot(1,2,1),imshow(I);title('原始图像')axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系level=graythresh(I); %确定灰度阈值BW=im2bw(I,level);subplot(1,2,2),imshow(BW);title('Otsu 法阈值分割图像')axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系15.膨胀操作I=imread('xian.bmp'); %载入图像I1=rgb2gray(I);subplot(1,2,1);imshow(I1);title('灰度图像')axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系se=strel('disk',1); %生成圆形结构元素I2=imdilate(I1,se); %用生成的结构元素对图像进行膨胀subplot(1,2,2);imshow(I2);title(' 膨胀后图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系16.腐蚀操作MATLAB 实现腐蚀操作I=imread('xian.bmp'); %载入图像I1=rgb2gray(I);subplot(1,2,1);imshow(I1);title('灰度图像')axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系se=strel('disk',1); %生成圆形结构元素I2=imerode(I1,se); %用生成的结构元素对图像进行腐蚀subplot(1,2,2);imshow(I2);title('腐蚀后图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系17.开启和闭合操作用MA TLAB实现开启和闭合操作I=imread('xian.bmp'); %载入图像subplot(2,2,1),imshow(I);title('原始图像');axis([50,250,50,200]);axis on; %显示坐标系I1=rgb2gray(I);subplot(2,2,2),imshow(I1);title('灰度图像');axis([50,250,50,200]);axis on; %显示坐标系se=strel('disk',1); %采用半径为1的圆作为结构元素I2=imopen(I1,se); %开启操作I3=imclose(I1,se); %闭合操作subplot(2,2,3),imshow(I2);title('开启运算后图像');axis([50,250,50,200]);axis on; %显示坐标系subplot(2,2,4),imshow(I3);title('闭合运算后图像');axis([50,250,50,200]);axis on; %显示坐标系18.开启和闭合组合操作I=imread('xian.bmp'); %载入图像subplot(3,2,1),imshow(I);title('原始图像');axis([50,250,50,200]);axis on; %显示坐标系I1=rgb2gray(I);subplot(3,2,2),imshow(I1);title('灰度图像');axis([50,250,50,200]);axis on; %显示坐标系se=strel('disk',1);I2=imopen(I1,se); %开启操作I3=imclose(I1,se); %闭合操作subplot(3,2,3),imshow(I2);title('开启运算后图像');axis([50,250,50,200]);axis on; %显示坐标系subplot(3,2,4),imshow(I3);title('闭合运算后图像');axis([50,250,50,200]);axis on; %显示坐标系se=strel('disk',1);I4=imopen(I1,se);I5=imclose(I4,se);subplot(3,2,5),imshow(I5); %开—闭运算图像title('开—闭运算图像');axis([50,250,50,200]);axis on; %显示坐标系I6=imclose(I1,se);I7=imopen(I6,se);subplot(3,2,6),imshow(I7); %闭—开运算图像title('闭—开运算图像');axis([50,250,50,200]);axis on; %显示坐标系19.形态学边界提取利用MATLAB实现如下:I=imread('xian.bmp'); %载入图像subplot(1,3,1),imshow(I);title('原始图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I1=im2bw(I);subplot(1,3,2),imshow(I1);title('二值化图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I2=bwperim(I1); %获取区域的周长subplot(1,3,3),imshow(I2);title('边界周长的二值图像');axis([50,250,50,200]);grid on;axis on;20.形态学骨架提取利用MATLAB实现如下:I=imread('xian.bmp');subplot(2,2,1),imshow(I);title('原始图像');axis([50,250,50,200]);axis on;I1=im2bw(I);subplot(2,2,2),imshow(I1);title('二值图像');axis([50,250,50,200]);axis on;I2=bwmorph(I1,'skel',1); subplot(2,2,3),imshow(I2); title('1次骨架提取');axis([50,250,50,200]); axis on;I3=bwmorph(I1,'skel',2); subplot(2,2,4),imshow(I3); title('2次骨架提取');axis([50,250,50,200]); axis on;21.直接提取四个顶点坐标I = imread('xian.bmp');I = I(:,:,1);BW=im2bw(I);figureimshow(~BW)[x,y]=getpts。

基于matlab语音端点检测双门限部分代码[整理版]

基于Matlab的语音端点检测方法浅析语音的端点检测在语音的编码、语音识别、语音增强、说话人识别中起着非常重要的作用,直接影响着后续工作的正确率。

本文介绍了端点检测的基本方法:基于短时能量的、基于短时过零率的、双门限检测的方法,,并通过Matlab仿真对双门限检测的方法进行分析。

端点检测是语音识别中非常重要的一步。

所谓语音端点检测,就是从一段给定的语音信号中找出语音的起始点和结束点。

在语音识别系统中,正确、有效的进行端点检测不仅可以减少计算量和缩短处理时间,而且能排除无声段的噪声干扰、提高语音识别的正确率。

所谓端点检测,就是从一段给定的语音信号中找出语音的起始点和结束点。

在语音识别系统中,正确、有效地进行端点检测不仅可以减少计算量和缩短处理时间,而且能排除无声段的噪声干扰、提高语音识别的正确率。

研究表明,即使是在安静的环境下,语音识别系统一半以上的错误可能主要来基于Matlab编写的语音端点检测程序function [x1,x2] = vad(x)%幅度归一化到[-1,1]x = double(x);x = x / max(abs(x));%常数设置FrameLen = 240;FrameInc = 80;amp1 = 10;amp2 = 2;zcr1 = 10;zcr2 = 5;maxsilence = 8; % 6*10ms = 30msminlen = 15; % 15*10ms = 150msstatus = 0;count = 0;silence = 0;%计算过零率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);%计算短时能量amp = sum(abs(enframe(filter([1 -0.9375], 1, x), FrameLen, FrameInc)), 2);%调整能量门限amp1 = min(amp1, max(amp)/4);amp2 = min(amp2, max(amp)/8);%开始端点检测x1 = 0;x2 = 0;for n=1:length(zcr)goto = 0;switch statuscase {0,1} % 0 = 静音, 1 = 可能开始if amp(n) > amp1 % 确信进入语音段x1 = max(n-count-1,1);status = 2;silence = 0;count = count + 1;elseif amp(n) > amp2 | ... % 可能处于语音段zcr(n) > zcr2status = 1;count = count + 1;else % 静音状态status = 0;count = 0;endcase 2, % 2 = 语音段if amp(n) > amp2 | ... % 保持在语音段zcr(n) > zcr2count = count + 1;else % 语音将结束silence = silence+1;if silence < maxsilence % 静音还不够长,尚未结束count = count + 1;elseif count < minlen % 语音长度太短,认为是噪声status = 0;silence = 0;count = 0;else % 语音结束status = 3;endendcase 3,break;endendcount = count-silence/2;x2 = x1 + count -1;subplot(311)plot(x)axis([1 length(x) -1 1])ylabel('Speech');line([x1*FrameInc x1*FrameInc], [-1 1], 'Color', 'red'); line([x2*FrameInc x2*FrameInc], [-1 1], 'Color', 'red');subplot(312)plot(amp);axis([1 length(amp) 0 max(amp)])ylabel('Energy');line([x1 x1], [min(amp),max(amp)], 'Color', 'red'); line([x2 x2], [min(amp),max(amp)], 'Color', 'red');subplot(313)plot(zcr);axis([1 length(zcr) 0 max(zcr)])ylabel('ZCR');line([x1 x1], [min(zcr),max(zcr)], 'Color', 'red');line([x2 x2], [min(zcr),max(zcr)], 'Color', 'red');。

基于MATLAB的特定人语音识别软件开发与设计

基于MATLAB的特定人语音识别软件开发与设计本文将详细介绍基于MATLAB的特定人语音识别软件的开发与设计,从数据采集、数据预处理、特征提取、训练模型以及测试评估等方面进行介绍。

同时,本文还会对该软件的实时性、准确性、稳定性进行分析并进行改进优化。

一、数据采集数据采集是语音识别系统开发的第一步,也是最为关键的一步。

采集到的数据质量将直接影响后续的预处理、特征提取以及模型训练。

在采集数据时,应该尽可能保证采集设备的统一性,以便后续的数据处理与模型训练。

同时,采集的语音数据应具有较高的覆盖率和多样性,以便让模型具有更好的泛化能力。

二、数据预处理在数据预处理阶段,需要对采集到的语音数据进行一系列的预处理操作,例如去除背景噪音、去除重复数据、平衡数据分布等。

这些操作有助于提高预处理的效果,从而提高后续的特征提取以及模型训练的准确度。

三、特征提取特征提取是语音识别系统中最为复杂的一步,其目的是将原始的语音信号转化为易于处理的数学特征。

在特征提取中,需要使用一些特征提取算法,例如短时傅里叶变换、梅尔倒谱系数、线性预测系数等。

这些算法可以大大减少语音信号的冗余信息,提取出信号的主要特征,从而提高模型的分类准确度。

四、训练模型在模型训练中,需要选择适当的模型算法以及调整算法的超参数。

在语音识别中,常用的模型算法有隐马尔可夫模型、深度神经网络、循环神经网络等。

训练模型的过程中,需要使用一些评估指标,例如准确率、召回率、F1值等,以评估模型的优劣。

同时,在训练过程中,需要使用一些技巧,例如交叉验证、正则化、学习率衰减等,以优化模型的泛化能力。

五、测试评估在模型训练完成后,需要使用测试数据对模型进行评估。

在测试评估中,需要使用一些评估指标,例如准确率、召回率、误判率等,以评估模型的性能。

同时,还需要针对测试结果进行分析,从而找出模型存在的问题并进行改进优化。

六、实时性、准确性、稳定性改进优化在实际应用中,需要保证语音识别系统的实时性、准确性以及稳定性,否则无法满足用户需求。

基于matlab的语音识别系统

基于matlab的语音识别系统专业综合课程设计系: 信息与通信工程专业: 通信工程班级: 081班设计题目: 基于matlab的语音识别系统学生姓名:指导教师:完成日期:2011年12月27日一(设计任务及要求1.1设计任务作为智能计算机研究的主导方向和人机语音通信的关键技术,语音识别技术一直受到各国科学界的广泛关注。

以语音识别开发出的产品应用领域非常广泛,有声控电话交换、语音拨号系统、信息网络查询、家庭服务、宾馆服务、旅行社服务系统、订票系统、声控智能玩具、医疗服务、银行服务、股票查询服务、计算机控制、工业控制、语音通信系统、军事监听、信息检索、应急服务、翻译系统等,几乎深入到社会的每个行业、每个方面,其应用和经济社会效益前景非常广泛。

本次任务设计一个简单的语音识别系。

1.2设计要求要求:使用matlab软件编写语音识别程序二(算法方案选择2.1设计方案语音识别属于模式识别范畴,它与人的认知过程一样,其过程分为训练和识别两个阶段。

在训练阶段,语音识别系统对输入的语音信号进行学习。

学习结束后,把学习内容组成语音模型库存储起来;在识别阶段,根据当前输入的待识别语音信号,在语音模型库中查找出相应的词义或语义。

语音识别系统与常规模式识别系统一样包括特征提取、模式匹配、模型库等3个基本单元,它的基本结构如图1所示。

图1 语音识别系统基本结构图本次设计主要是基于HMM模型(隐马尔可夫模型)。

这是在20世纪80年代引入语音识别领域的一种语音识别算法。

该算法通过对大量语音数据进行数据统计,建立识别词条的统计模型,然后从待识别语音信号中提取特征,与这些模型进行匹配,通过比较匹配分数以获得识别结果。

通过大量的语音,就能够获得一个稳健的统计模型,能够适应实际语音中的各种突发情况。

并且,HMM算法具有良好的识别性能和抗噪性能。

2.2方案框图图2 HMM语音识别系统2.3隐马尔可夫模型HMM过程是一个双重随机过程:一重用于描述非平稳信号的短时平稳段的统计特征(信号的瞬态特征);另一重随机过程描述了每个短时平稳段如何转变到下一个短时平稳段,即短时统计特征的动态特性(隐含在观察序列中)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

matlab 语音识别系统(源代码)最新版目录一、设计任务及要求⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯1二、语音识别的简单介绍2.1 语者识别的概念⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯22.2 特征参数的提取⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯32.3 用矢量量化聚类法生成码本⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯32.4VQ 的说话人识别⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯4三、算法程序分析3.1 函数关系⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯.43.2 代码说明⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯53.2.1 函数mfcc ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯53.2.2 函数disteu ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯53.2.3 函数vqlbg ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯.63.2.4 函数test ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯63.2.5 函数testDB ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯73.2.6 函数train ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯83.2.7 函数melfb ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯8四、演示分析⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯.9五、心得体会⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯.11附:GUI 程序代码⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯12、设计任务及要求用MATLAB 实现简单的语音识别功能;具体设计要求如下:用MATLAB 实现简单的数字1~9 的语音识别功能语音识别的简单介绍基于VQ的说话人识别系统,矢量量化起着双重作用。

在训练阶段,把每一个说话者所提取的特征参数进行分类,产生不同码字所组成的码本。

在识别(匹配)阶段,我们用VQ方法计算平均失真测度(本系统在计算距离d 时,采用欧氏距离测度),从而判断说话人是谁。

语音识别系统结构框图如图1 所示。

图 1 语音识别系统结构框图2.1 语者识别的概念语者识别就是根据说话人的语音信号来判别说话人的身份。

语音是人的自然属性之一,由于说话人发音器官的生理差异以及后天形成的行为差异,每个人的语音都带有强烈的个人色彩,这就使得通过分析语音信号来识别说话人成为可能。

用语音来鉴别说话人的身份有着许多独特的优点,如语音是人的固有的特征,不会丢失或遗忘;语音信号的采集方便,系统设备成本低;利用电话网络还可实现远程客户服务等。

因此,近几年来,说话人识别越来越多的受到人们的重视。

与其他生物识别技术如指纹识别、手形识别等相比较,说话人识别不仅使用方便,而且属于非接触性,容易被用户接受,并且在已有的各种生物特征识别技术中,是唯一可以用作远程验证的识别技术。

因此,说话人识别的应用前景非常广泛:今天,说话人识别技术已经关系到多学科的研究领域,不同领域中的进步都对说话人识别的发展做出了贡献。

说话人识别技术是集声学、语言学、计算机、信息处理和人工智能等诸多领域的一项综合技术,应用需求将十分广阔。

在吃力语音信号的时候如何提取信号中关键的成分尤为重要。

语音信号的特征参数的好坏直接导致了辨别的准确性。

2.2 特征参数的提取对于特征参数的选取,我们使用mfcc 的方法来提取。

MFCC参数是基于人的听觉特性利用人听觉的屏蔽效应,在Mel 标度频率域提取出来的倒谱特征参数。

MFCC参数的提取过程如下:1. 对输入的语音信号进行分帧、加窗,然后作离散傅立叶变换,获得频谱分布信息。

设语音信号的DFT为:N 1j 2 nkX a (k) x(n)e N,0 k N 1(1)n1其中式中x(n) 为输入的语音信号,N 表示傅立叶变换的点数。

2. 再求频谱幅度的平方,得到能量谱。

3. 将能量谱通过一组Mel 尺度的三角形滤波器组。

我们定义一个有M个滤波器的滤波器组(滤波器的个数和临界带的个数相近) ,采用的滤波器为三角滤波器,中心频率为f(m),m=1,2,3, ···,M 本系统取M=100。

4. 计算每个滤波器组输出的对数能量。

N12S(m) ln( |X a(k) |2H m (k)), (2)0 m M 1其中H m (k) 为三角滤波器的频率响应5. 经过离散弦变换( DCT)得到MFCC系数。

M1C(n) S (m)cos( n(m 0.5 / m)),(3) m00 n N 1MFCC系数个数通常取20—30,常常不用0 阶倒谱系数,因为它反映的是频谱能量,故在一般识别系统中,将称为能量系数,并不作为倒谱系数,本系统选取20 阶倒谱系数。

2.3 用矢量量化聚类法生成码本我们将每个待识的说话人看作是一个信源,用一个码本来表征。

码本是从该说话人的训练序列中提取的MFCC特征矢量聚类而生成。

只要训练的序列足够长,可认为这个码本有效地包含了说话人的个人特征,而与讲话的内容无关。

本系统采用基于分裂的LBG的算法设计VQ码本, X k(k 1,2, , K )为训练序列,B为码本。

具体实现过程如下:1. 取提取出来的所有帧的特征矢量的型心 ( 均值) 作为第一个码字矢量 B1。

2. 将当前的码本 Bm 根据以下规则分裂,形成 2m 个码字。

B m B m (1 ) B m B m (1 )其中 m 从 1 变化到当前的码本的码字数,ε是分裂时的参数,本文ε=0.01 。

3. 根据得到的码本把所有的训练序列 ( 特征矢量 )进行分类,然后按照下面 两个公式计算训练矢量量化失真量的总和 D [ n]以及相对失真 (n 为迭代次数,初始=∞, B 为当前的码书 ) ,若相对失真小于某一阈值ε,迭代结束,当2m 个码字的码书,转5。

否则,转下一步。

相对失真:D(n 1) D n|D n |4. 重新计算各个区域的新型心,得到新的码书,转 3 。

5. 重复2 ,3 和4步,直到形成有 M 个码字的码书 (M 是所要求的码字数 ) 其中 D0=10000。

2.4 VQ 的说话人识别设是未知的说话人的特征矢量 {X 1,K ,X T },共有 T 帧是训练阶段形成的码 书,表示码书第 m 个码字,每一个码书有 M 个码字。

再计算测试者的平均量化 失真 D ,并设置一个阈值,若 D 小于此阈值,则是原训练者,反之则认为不是原 训练者。

D 1/T j 1min[d (x j ,B m )](7)j 11mM三、 算法程序分析在具体的实现过程当中, 采用了 matlab 软件来帮助完成这个项目。

在 matlab 中主要由采集,分析,特征提取,比对几个重要部分。

以下为在实际的操作中, 具体用到得函数关系和作用一一列举在下面。

3.1 函数关系主要有两类函数文件 Train.m 和 Test.m在 Train.m 调用 Vqlbg.m 获取训练录音的 vq 码本,而 Vqlbg.m 调用 mfcc.m 获取单个录音的 mel 倒谱系数,接着 mfcc.m 调用 Melfb.m--- 将能量谱通过一组 Mel 尺度的三角形滤波器组。

在 Test.m 函数文件中调用 Disteu.m 计算训练录音(提供 vq 码本)与测试 录音(提供 mfcc )mel 倒谱系数的距离,即判断两声音是否为同一录音者提供。

Disteu.m 调用 mfcc.m 获取单个录音的 mel 倒谱系数。

mfcc.m 调用 Melfb.m--- 将能量谱通过一n=0, D [ 1]前的码书就是设计好的 量化失真量和:Kmin d (X k ,B )k1D (n)5)6)组Mel 尺度的三角形滤波器组。

3.2 具体代码说明3.2.1 函数mffc:function r = mfcc(s, fs)m = 100;n = 256;l = length(s);nbFrame = floor((l - n) / m) + 1; % 沿- ∞方向取整for i = 1:nfor j = 1:nbFrameM(i, j) = s(((j - 1) * m) + i); % 对矩阵M赋值endendh = hamming(n); % 加hamming 窗,以增加音框左端和右端的连续性M2 = diag(h) * M;for i = 1:nbFrameframe(:,i) = fft(M2(:, i)); % 对信号进行快速傅里叶变换FFTendt = n / 2;tmax = l / fs;m = melfb(20, n, fs); %将上述线性频谱通过Mel 频率滤波器组得到Mel 频谱, 下面在将其转化成对数频谱n2 = 1 + floor(n / 2);z = m * abs(frame(1:n2, :)).^2;r = dct(log(z)); % 将上述对数频谱,经过离散余弦变换(DCT)变换到倒谱域,即可得到Mel 倒谱系数(MFCC参数)3.2.2 函数disteu--- 计算测试者和模板码本的距离function d = disteu(x, y)[M, N] = size(x); % 音频x 赋值给【M,N】[M2, P] = size(y); % 音频y赋值给【M2,P】if (M ~= M2)error(' 不匹配!') % 两个音频时间长度不相等endd = zeros(N, P);if (N < P)% 在两个音频时间长度相等的前提下copies = zeros(1,P);for n = 1:Nd(n,:) = sum((x(:, n+copies) - y) .^2, 1);endelsecopies = zeros(1,N); for p = 1:Pd(:,p) = sum((x - y(:, p+copies)) .^2, 1)'; end%% 成对欧氏距离的两个矩阵的列之间的距离 end d = d.^0.5; 3.2.3 函数 vqlbg--- 该函数利用矢量量化提取了音频的 vq 码本 function r = vqlbg(d,k) e = .01; r = mean(d, 2); dpr = 10000; for i = 1:log2(k)r = [r*(1+e), r*(1-e)]; while (1 == 1) z = disteu(d, r); [m,ind] = min(z, [], 2); t = 0; for j = 1:2^ir(:, j) = mean(d(:, find(ind == j)), 2); x = disteu(d(:, find(ind == j)), r(:, j)); for q = 1:length(x) t = t + x(q); end endif (((dpr - t)/t) < e) break; else dpr = t; end end end3.2.4 函数 test function finalmsg = test(testdir, n, code) for k = 1:n% read test sound file of each speakerfile = sprintf('%ss%d.wav', testdir, k); [s, fs] = wavread(file); 得到测试人语音的 mel 倒谱系数 阈值设置处 就判断一次,因为模板里面只有一个文件 计算得到模板和要判断的声音之间的v = mfcc(s, fs); % distmin = 4; %%d = disteu(v, code{1}); %距离”dist = sum(min(d,[],2)) / size(d,1); %% 测试阈值数量级 msgc = sprintf(' 与模板语音信号的差值为 :%10f ', dist); disp(msgc); % 此人匹配3.2.5 函数 testDB 这个函数实际上是对数据库一个查询 ,根据测试者的声音 , 找相应的文件 ,并且 给出是谁的提示function testmsg = testDB(testdir, n, code) nameList={'1','2','3','4','5','6','7','8','9' };% 这个是我们要识别的 9 个数 for k = 1:n % file = sprintf('%ss%d.wav', testdir, k);[s, fs] = wavread(file); v = mfcc(s, fs); distmin = inf; k1 = 0;for l = 1:length(code) d = disteu(v, code{l}); dist = sum(min(d,[],2)) / size(d,1);变换得到一个距离的量if dist <= distmin % msg = sprintf(' 求 !\n', k);finalmsg = ' 定 disp(msg); end% 此人不匹配一个阈值,小于阈值,则就是这个人 第 %d 位说话者与模板语音信号匹配 此位说话者符合要求 !'; % 界面显示语句,, 符合要if dist > distmin msg = sprintf(' 求 !\n', k);finalmsg = ' 意设定disp(msg); end end第%d 位说话者与模板语音信号不匹配 , 不符合要此位说话者不符合要求 !'; % 界面显示语句,可随数据库中每一个说话人的特征%找出文件的路径 对找到的文件取 mfcc 变换if dist < distmindistmin = dist;%%者的识别k1 = l;end这里和test 函数里面一样但多了一个具体语endmsg=nameList{k1}msgbox(msg);end3.2.6 函数train--- 该函数就是对音频进行训练,也就是提取特征参数function code = train(traindir, n)k = 16; % number of centroids requiredfor i = 1:n % 对数据库中的代码形成码本file = sprintf('%ss%d.wav', traindir, i); disp(file);[s, fs] = wavread(file); v = mfcc(s, fs); %code{i} = vqlbg(v, k); % 话人的VQ码本end 3.2.7 函数melfb--- 确定矩阵的滤波器function m = melfb(p, n, fs)计算MFCC's 提取特征特征,返回值是Mel 倒谱系数,训练VQ码本是一个log 的dct 得到的通过矢量量化,得到原说f0 = 700 / fs;fn2 = floor(n/2);lr = log(1 + 0.5/f0) / (p+1);% convert to fft bin numbers with 0 for DC term bl = n * (f0 * (exp([0 1 p p+1] * lr) - 1)); 直接转换为FFT 的数字模型b1 =floor(bl(1)) + 1;b2 = ceil(bl(2));b3 = floor(bl(3));b4 = min(fn2, ceil(bl(4))) - 1;pf = log(1 + (b1:b4)/n/f0) / lr;fp = floor(pf);pm = pf - fp;r = [fp(b2:b4)1+fp(1:b3)]; c = [b2:b41:b3] + 1;v = 2 * [1-pm(b2:b4) pm(1:b3)]; m = sparse(r, c, v, p, 1+fn2)四、演示分析我们的功能分为两部分: 对已经保存的9 个数字的语音进行辨别和实时的判断说话人说的是否为一个数. 在前者的实验过程中, 先把9 个数字的声音保存成wav的格式, 放在一个文件夹中, 作为一个检测的数据库. 然后对检测者实行识别, 系统给出提示是哪个数字.在第二个功能中,实时的录取一段说话人的声音作为模板, 提取mfcc 特征参数, 随后紧接着进行遇着识别, 也就是让其他人再说相同的话, 看是否是原说话者.实验过程及具体功能如下:先打开Matlab 使Current Directory 为录音及程序所所在的文件夹再打开文件“ enter .m”,点run 运行,打开enter 界面,点击“进入” 按钮进入系统。

相关文档
最新文档