基于GMM-UBM的说话人识别 MSR Identity Toolkit

说话人识别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


这里写图片描述

  • 3
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 29
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值