基于MFCC系数的距离测量
所需项目文件以及语料我放在了自己的github上了:基于MFCC系数的距离测量
1 简介
1.1 本地文档简介
- 语料:包含本次实验所需要的语料
- Code:包含了本次实验的matlab代码
- pr3_3_2.m 主程序,计算两个语音之间的匹配比较
- mfcc_m.m 计算语音的MFCC特征
- mel_dist.m Mel距离,基于欧氏距离
- mfccDate.mat 提取的MFCC数据,24维
- photo 实验结果截图
1.2 距离度量简介
距离度量(Distance)用于衡量个体在空间上存在的距离,距离越远说明个体间的差异越大。
欧氏距离是最常见的距离度量,衡量的是多维空间中各个点之间的绝对距离。公式如下:
dist
(
X
,
Y
)
=
∑
i
=
1
n
(
x
i
−
y
i
)
2
\operatorname{dist}(X, Y)=\sqrt{\sum_{i=1}^{n}\left(x_{i}-y_{i}\right)^{2}}
dist(X,Y)=i=1∑n(xi−yi)2
因为计算是基于各维度特征的绝对数值,所以欧氏度量需要保证各维度指标在相同的刻度级别,比如对身高(cm)和体重(kg)两个单位不同的指标使用欧式距离可能使结果失效。
for i=1 : fn1 % 计算s1与s2之间每帧的Mel距离
Cn1=Ccep1(i,:);
Cn2=Ccep2(i,:);
Dstu=0;
for k=1 : num
Dstu=Dstu+(Cn1(k)-Cn2(k))^2;
end
Dcep(i)=sqrt(Dstu); % 每帧的Mel距离
end
2 同一个样本不同人发音(字)
2.1 语料介绍
语音是“唐”字的发音,由两个人发音组成,为了实验方便,将两个语音长度统一,采样率为44100Hz。
2.2 matlab代码
%
% pr3_3_2
clear all;
clc; close all;
%[x1,fs]=audioread('D:\Desktop\学习汇报\语料\元音\i1.wav'); % 读入信号s1-\i1\
%x2=audioread('D:\Desktop\学习汇报\语料\元音\i2.wav'); % 读入信号s2-\i2\
[x1,fs]=audioread('D:\Desktop\学习汇报\语料\同一个样本不同人发音\tang01.wav');
x2=audioread('D:\Desktop\学习汇报\语料\同一个样本不同人发音\tang02.wav');
x3=audioread('D:\Desktop\学习汇报\语料\元音\a1.wav'); % 读入信号a1-\a1\
wlen=1479;%200 % 帧长
inc=626; %80 % 帧移
x1=x1/max(abs(x1)); % 幅值归一化
x2=x2/max(abs(x2));
x3=x3/max(abs(x3));
% 计算/i1/与/i2/之间的匹配比较
[Dcep,Ccep1,Ccep2]=mel_dist(x1,x2,fs,16,wlen,inc);
fprintf('/tang01/与/tang02/之间的mel平均距离是%d\n',mean(Dcep));
figure(1)
plot(Ccep1(8,:),Ccep2(8,:),'k+'); hold on
plot(Ccep1(14,:),Ccep2(14,:),'kx');
plot(Ccep1(24,:),Ccep2(24,:),'k^');
plot(Ccep1(30,:),Ccep2(30,:),'kh');
% plot(Ccep1(3,:),Ccep2(3,:),'k+'); hold on
% plot(Ccep1(7,:),Ccep2(7,:),'kx');
% plot(Ccep1(12,:),Ccep2(12,:),'k^');
% plot(Ccep1(16,:),Ccep2(16,:),'kh');
legend('第8帧','第14帧','第24帧','第30帧','Location','NorthWest')
%legend({'第3帧','第7帧','第12帧','第16帧'},2)
xlabel('信号tang01');ylabel('信号tang02')
axis([-12 12 -12 12]);
line([-12 12],[-12 12],'color','k','linestyle','--');
title('/tang01/与/tang02/之间的MFCC参数匹配比较')
2.3 结果显示
每个音都有34帧,我从其中选择了4帧来绘图,把两个音在这些帧中前16个MFCC参数显示出来。从图中可以看出,两个音是较匹配的,他们的系数总体分布在$45^{\circ}$线附近。
不同人说同一个字平均欧氏距离:
/tang01/与/tang02/之间的mel平均距离是2.316534e+01
3 同一个样本同一个人发音
3.1 语料介绍
语音是“i”字的发音,由同一个人发音组成,为了实验方便,将两个语音长度统一,采样率为8000Hz。分为19帧,帧长200,帧移80.
2.2 实验结果
每个音都有19帧,我从其中选择了4帧来绘图,把两个音在这些帧中前16个MFCC参数显示出来。从图中可以看出,两个音是较匹配的,他们的系数分布在$45^{\circ}$线附近。
同一个样本同一个人发音平均欧氏距离:
/i1/与/i2/之间的mel平均距离是7.171738e+00
4 同一个人不同样本(单音节)
4.1 语料介绍
语音是“b”、"c"的发音,由同一个人发音组成,为了实验方便,将两个语音长度统一,采样率为16000Hz。分为24帧,帧长1479,帧移626.
4.2 实验结果
每个音都有24帧,从图中可以看出,两个音是不匹配的,他们的系数分布较广。
同一个人不同样本平均欧氏距离(单音节):
/a/与/b/之间的mel平均距离是2.968683e+01
5 同一个人不同样本(字)
4.1 语料介绍
语音是“唐”、"维"的发音,由同一个人发音组成,为了实验方便,将两个语音长度统一,采样率为44100Hz,分为34帧.
4.2 实验结果
从图中可以看出,两个音是不匹配的,他们的系数分布较广。
同一个人不同样本平均欧氏距离(字):
/tang02/与/wei/之间的mel平均距离是2.259611e+01
6 总结
6.1 欧氏距离总结
不同人说同一个样本平均欧氏距离(字):2.316534e+01
同一个人不同样本平均欧氏距离(字):2.259611e+01
同一个人不同样本平均欧氏距离(单音节):2.968683e+01
同一个样本同一个人发音平均欧氏距离(单音节):7.171738e+00
欧氏距离不适合比较单字或者单音节
6.2 MFCC系数总结
如果是同一个字或者同一个音节,MFCC系数总体都分布在 4 5 ∘ 45^{\circ} 45∘线附近,适合做实验比较。