说话人识别MSR Identity Toolkit
使用微软的声纹识别工具箱,记录使用步骤
该工具箱包含了常规的基于GMM-UBM方法以及state-of-the-art的基于i-vector方法,本文记录的是GMM-UBM方法,使用TIMIT语料库进行训练
先说明这个demo对训练语句的划分方式,总共630人共6300句话,530人共5300句话用来训练UBM,剩余100人共1000句话,说话人适应过程中拿每个人10句中的9句去做适应训练,则可以训练出100个说话人模型,最后拿100个人每个人剩下的1句话共100句话去测试,100个模型,100句话,则总共可以做10000次试验,其中包括100个target、9900个imposter。
1.框图介绍
GMM-UBM框图如下所示
UBM,通用背景模型,其实就是一个大的GMM模型,工具箱的demo中默认是构造256个高斯元的混合高斯模型。
2.数据准备
工具箱使用的是TIMIT语料,当然,你也可以用自己收集的语料去训练。这里先介绍下数据的准备。
timit语料库录制了630个人,每个人10句总共6300个短句,这630个人包含8个地区不同比例男女的口音,其它关于timit语料库更详细的介绍可以在语料库文件夹中的readme文件中找到。
2.1 timit文件转换
timti中文件虽然也是wav后缀,但它的文件头信息与标准wav格式并不一样,用windows自带的播放器并不能播放,在UltraEdit中查看信息显示如下
可以看到文件头信息中包含的是有关timit语料库中的信息,网上有很多读取timt格式数据的介绍,包括调用voicebox函数等,方式很多也都比较简单,我用matlab2016b直接用audioread可以正常读取,因此就没选用其它方法。
本实验中编写m函数查找timti文件夹中所有wav文件,然后再原路径写wav,之后就可以正常使用timit语料库了,简单代码如下
wav_filesName = find_wav('..\timit_use');
[m,n] = size(wav_filesName);
%% 保存wav文件名,添加人名前缀
tic
hwt = waitbar(0,'please wait....');
for i = 1:m
[x,fs] = audioread(wav_filesName(i,:));
y = resample(x,1,2);
p = strfind(wav_filesName(i,:),'.w');
writefileName = ['..\timit_wav8000',wav_filesName(i,13:p+3)];
audiowrite(writefileName,y,8000);
waitbar(i/m);
end
close(hwt);
toc
2.2.特征提取
这里我们使用倒谱特征,提取的工具很多,可以使用voicebox工具箱中的函数,我们这里是借助HTK工具箱提取39维倒谱特征
特征参数配置如下,其中SOURCEFORMAT配置的是WAV,因为我们是直接从wav转换成mfcc
SOURCEFORMAT = WAV
TARGETKIND = MFCC_0_D_A
TARGETRATE = 100000.0 ##10000 = 10000*100ns = 1ms
WINDOWSIZE = 250000.0
NUMCEPS = 12
PREEMCOEF = 0.97
NUMCHANS = 27 #定义美尔频谱的频道数量
CEPLIFTER = 22 #定义倒谱所用到的滤波器组内滤波器个数。
然后执行htk命令就行
Hcopy -A -D -C config -S script.scp
其中script.scp包含了wav文件路径以及生成的mfcc文件路径,这个文件可以用matlab程序去自动打印生成
2.3.准备需要的脚本文件
程序需要读取三个文件:ubm.lst、speaker_model_maps.lst、trials.lst
ubm.lst : 用来训练UBM,包含530个人共5300个特征文件路径名,格式为 特征路径名
speaker_model_maps.lst:用来适应训练人的特征路径名 格式为为 人名 特征路径名
trials.lst : 每个模型(人名)都对应所有测试语句,格式为 人名 特征路径名 标签
其中trials.lst容易弄错,举例文件前几行如下
mrmh0 ../../TIMIT_corpus/timit_wav8000htkfeature/mrmh0_sx391.htk target
mrmh0 ../../TIMIT_corpus/timit_wav8000htkfeature/mrml0_sx71.htk impostor
mrmh0 ../../TIMIT_corpus/timit_wav8000htkfeature/mrms0_sx390.htk impostor
mrmh0 ../../TIMIT_corpus/timit_wav8000htkfeature/mrms1_sx47.htk impostor
第一列为人名,也即模型名,每个模型要对应100个测试语句,所以这个模型名的有100行,中间的为100个特征路径名,最后一列为标签,只有属于第一列模型的语句才是target,其它的都为imposter,打印这个文件代码如下
%% 打印trial.lst,
% 除去ubm的5300和speaker的100*9,还剩100个人的100句话,
% 每个模型都分别测试这100句话,总共100*100 = 100000次试验
fid = fopen('trials.lst','a');
path = '../../TIMIT_corpus/timit_wav8000htkfeature/';
for spk = 5310:10:m
for i = 5301:m
% 取后100个人的每个人的第10个
if mod(i,10)==0
p0 = strfind(wav_filesName(i,:),'\'); p = strfind(wav_filesName(i,:),'.w');
if i == spk
label = 'target';
else
label = 'imposer';
end
pathFilename = [wav_filesName(spk,p0(1)+1:p0(2)-1),' ',... path,wav_filesName(i,p0(1)+1:p0(2)-1),'_',wav_filesName(i,p0(2)+1:p),'htk',' ',... label];
fprintf(fid,'%s\n',pathFilename);
end
end
end
fclose(fid);
3.运行demo
GMM-UBM总体思路比较简单,demo中分为以下四步
Step0: Opening MATLAB pool
Step1: Training the UBM
Step2: Adapting the speaker models from UBM
Step3: Scoring the verification trials
第一步中打开matlab并行工具箱,因为timti数据量较大,现在的CPU基本都是多核,可以加快训练时间
训练结束后后给出了DET(Detection Error Tradeoff)曲线,从曲线中可以看出,实际中合理选择判断阈值,可以将FNR与FPR降到1%以下。目前只是直接运行的结果,后续可以进行特征选择以及倒谱均值归一化等操作进行fine tuning