主要内容

使用i-Vectors进行说话人验证

音箱验证,身份验证,是确认扬声器的身份,他们声称是谁的任务。说话人确认已经很多年活跃的研究领域。早期的性能突破是使用高斯混合模型和通用背景模型(GMM-UBM)[1]在声学特征上(通常MFCC.).例如,请参见说话人确认使用高斯混合模型.一个GMM-UBM系统的主要困难包括闭会期间的变化。联合因子分析(JFA)提出了通过分别建模扬声器间的变异和信道或会话变异性,以补偿这种变化性[2][3].然而,[4]发现JFA中的频道因子也包含有关扬声器的信息,并提出将通道和扬声器空间组合成一个总变化空间.然后通过使用后端程序(例如线性判别分析(LDA)和级联协方差标准化(WCCN),然后进行评分,如余弦相似度得分等中的intersession可变性。[5]提出用概率LDA (PLDA)模型代替余弦相似度评分。[11][12]提出了一种用于高斯高斯高斯的方法,因此在PLDA中制造高斯假设,称为G-PLDA或简化的PLDA。虽然I-vectors最初提出用于发言者核查,但它们已应用于许多问题,如语言识别,扬声器日益增长,情感识别,年龄估计和反欺骗[10].最近,深度学习技术被提出用D-载体或者的x矢量[8][6]

使用i-vector system

音频工具箱提供象征系统它封装训练的i - 载体系统,登记扬声器或其他音频标签的能力,评估决策阈值的系统,并识别或验证的扬声器或其他音频标签。看象征系统有关使用此功能并将其应用于多个应用程序的示例。

要了解有关I-Vector System如何工作的更多信息,请继续执行该示例。

开发i-向量系统

在此示例中,您可以为扬声器验证开发一个标准的I形式系统,该系统使用LDA-WCCN后端具有余弦相似度评分或G-PLDA评分。

纵观例子,你会发现可调参数实时控制。改变控件不重新运行的例子。如果更改了控制,你必须重新运行的例子。

数据集管理

此示例使用技术的格拉茨大学(PTDB-TUG)的间距跟踪数据库[7].该数据集由20位以英语为母语的人阅读来自TIMIT语料库的2342个语音丰富的句子组成。下载并提取数据集。根据您的系统,下载和提取数据集可能需要大约1.5小时。

URL =.'https://www2.spsc.tugraz.at/databases/ptdb-tug/speech_data_zipped.zip';downloadFolder = TEMPDIR;datasetFolder =完整文件(downloadFolder,'ptdb-tug');如果~存在(datasetFolder“目录”) disp ('下载PTDB-TUG(3.9 G)...')解压(url,数据集文件夹)结束
下载PTDB-TUG(3.9克)...

创建一个音频数据存储指向数据集的对象。数据集最初用于参与音高跟踪培训和评估,并包括喉部读数和基线音调决策。仅使用原始的录音。

广告= audioDatastore([完整文件(datasetFolder,“语音数据”,“女性”,“MIC”),fullfile(数据集文件夹,“语音数据”,“男性”,“MIC”)),......'IncludeSubfolders',真的,......'fileextensions',“wav”);文件名= ads.Files;

文件名包含扬声器的ID。解码文件名设置的标签音频数据存储对象。

SpeakerIds = ExtractBetween(文件名,“mic_”,'_');Ads.Labels =分类(扬声器);CountAckeLabel(广告)
ANS =20×2表标签数量_____ F01 F02 236 F03 236 F04 236 F05 236 F06 236 F07 236 F08 236 F09 234 F10 236 236 236 M01 M02 M03 236 236 236 M04 M05 M06 236 236⋮

分离音频数据存储对象转换为训练、评估和测试集。训练集包含16个扬声器。评估集包含4个演讲者,并进一步分为注册集、评估训练i向量系统的检测误差权衡集和测试集。

developmentLabels =分类([“M01”,“M02”,“M03”,“M04”,“M06”,“M07”,“M08”,“M09”,“f01”,“F02”,“F03”,“F04”,“F06”,“F07”,“F08”,“F09”]);evaluationLabels =分类([“M05”,“M010”,“F05”,“F010”]);adsTrain =子集(广告,ismember(ads.Labels,developmentLabels));adsEvaluate =子集(广告,ismember(ads.Labels,evaluationLabels));numFilesPerSpeakerForEnrollment =3.;[adsEnroll,adsTest,adsDET] = splitEachLabel(adsEvaluate,numFilesPerSpeakerForEnrollment,2);

显示生成的标签分布音频数据存储对象。

countEachLabel (adsTrain)
ANS =16×2表标签数量_____ F01 F02 236 F03 236 F04 236 F06 236 F07 236 F08 236 F09 234 236 236 M01 M02 M03 236 236 236 M04 M06 M07 236 236 236 M08 M09 236
countEachLabel(adsEnroll)
ANS =2×2表标签计数_____ _____ F05 3 M05 3
CountAckeLabel(ADSDET)
ANS =2×2表标签数_____ _____ F05 231 M05 231
计数标签(adsTest)
ANS =2×2表标签计数_____ _____ F05 2 M05 2

从训练数据集中读取音频文件,收听它,并绘制它。重置数据存储。

[音频,audioInfo] =读(adsTrain);FS = audioInfo.SampleRate;T =(0:尺寸(音频,1)-1)/ FS;声音(音响,FS)图(T,音频)xlabel(“时间(s)”)ylabel('振幅')轴([0 t(end) -1 1])标题('从训练集的样本话语')

重置(adstrain)

您可以减少数据集,并在本例中使用,加快以性能为代价的运行参数的数量。在一般情况下,减少数据集的开发和调试一个很好的做法。

加速示例=如果speedUpExample adsTrain = splitEachLabel(adsTrain,30);adsDET = splitEachLabel (adsDET 21);结束

特征提取

创建一个audioFeatureExtractor对象提取20个mfcc、20个delta- mfcc和20个delta-delta mfcc。使用增量窗口长度为9。提取特征从25 ms Hann窗口与10 ms跳。

努姆科夫斯=20.;deltawindowlength =.9;windowDuration =0.025;HopDuration =.0.01;windowSamples =圆(windowDuration * fs);hopSamples =圆(hopDuration * fs);overlapSamples = windowSamples - hopSamples;afe = audioFeatureExtractor (......'采样率'fs,......'窗户'损害(windowSamples“周期性”),......'overlaplencth',重叠,............'MFCC',真的,......'mfccDelta',真的,......'mfccdeltadelta',真的);setExtractorParams(AFE,'MFCC','DeltaWindowLength',deltawindowlength,'NumCoeffs',numcoeffs)

从训练数据存储中读取的音频中提取特征。特性被返回为numHops-经过-numfeatures.矩阵。

设有=提取物(AFE,音频);[numHops,numFeatures] =大小(特征)
numHops = 797
numFeatures = 60

训练

训练的i - 载体系统是计算昂贵的和耗时的。如果您有并行计算工具箱™,可以分布在多个核上的工作,加快例子。确定分区的最佳数量为你的系统。如果没有并行计算工具箱™,使用单个分区。

如果~ isempty(版本(“平行”)) && ~speedUpExample pool = gcp;numPar = numpartitions (adsTrain、池);其他的numPar=1;结束
使用“local”配置文件启动并行池(parpool)…连接到并行池(工作人员数量:6)。

特征正规化因素

使用辅助功能,辅助特征提取,提取从数据集所有功能。这辅助特征提取功能从音频中的语音区域提取MFCC。语音检测是由detectSpeech功能。

特征在于= {};抽搐帕弗ii=1:numPar-adsPart=partition(adsTrain,numPar,ii);featuresPart=cell(0,numel(adsPart.Files));iii=1:numel(adsPart.Files)audioData=read(adsPart);featuresPart{iii}=helperFeatureExtraction(audioData,afe,[]);结束featuresAll = [featuresAll,featuresPart];结束allFeatures =猫(2,featuresAll {:});fprintf('特征提取从训练集完成(%0.0f秒)。,toc)
从训练特征提取一套完整的(58秒)。

计算每个功能的全局均值和标准偏差。您将在未来的呼唤中使用这些辅助特征提取函数以标准化功能。

常规常规=均值(Allfeatures,2,'omitnan');normalfactors.STD=STD(所有特征,[],2,'omitnan');

通用背景模型(UBM)

初始化高斯混合模型(GMM),该模型将成为i向量系统中的通用背景模型(UBM)。组件权重初始化为均匀分布。在TIMIT数据集上训练的系统通常包含2048个组件。

numComponents=64.如果加速示例numComponents=32;结束Alpha = Oner(1,NumComponents)/ NumComponents;mu = randn(numfeatures,num components);vari = rand(numfeatures,num components)+ eps;UBM = struct(“ComponentProportion”,α,“亩”,亩,“西格玛”、变化);

使用期望最大化(EM)算法训练UBM。

MAXITER =10.如果speedUpExample MAXITER = 2;结束抽搐ITER = 1:MAXITER抽动%的期望n =零(1,NumComponents);f =零(NumFeatures,NumComponents);s =零(NumFeatures,NumComponents);l = 0;帕弗II = 1:numpar adspart = partition(adstrain,numpar,ii);尽管hasdata(Adspart)audiodata =读取(Adspart);%提取特征y =辅助术(Audiodata,AFE,符号因素);%计算后验数liklihood对数似然= helperGMMLogLikelihood(Y,UBM);%计算后验归一化概率Amax = Max(Loglikelihood,[],1);loglikelihoodsum = amax + log(sum(exp(loglikelihip-amax),1));Gamma = Exp(Loglikelihood  -  loglikelihoodsum)';%compute baum-welch统计n=和(伽马,1);f=Y*gamma;s=(Y*Y)*伽马;%更新了对话语的充分统计数据N=N+N;F=F+F;S=S+S;%更新日志可能性L = L + sum(loglikehoodsum);结束结束%打印当前日志可能性fprintf('培训UBM:%d /%d完整(%0.0f秒),log-likeelihie =%0.0f \ n'iter,麦克斯特、toc、L)%最大化N=最大值(N,每股收益);ubm.成分比例=最大值(N/总和(N),每股收益);ubm.ComponentPilotion=ubm.ComponentPilotion/总和(ubm.ComponentPilotion);ubm.mu=F./N;ubm.sigma=最大值(S/N-ubm.mu.^2,每股收益);结束
Training UBM: 1/10 complete(59秒),Log-likelihood = -162907120 Training UBM: 2/10 complete(53秒),Log-likelihood = -82282814 Training UBM: 3/10 complete(54秒),Log-likelihood = -78667384 Training UBM: 4/10 complete(55秒),Log-likelihood = -77041863训练UBM: 7/10完成(52秒),Log-likelihood = -75958218训练UBM: 7/10完成(52秒),Log-likelihood = -75724712训练UBM: 8/10完成(53秒),Log-likelihood = -75561701训练UBM: 9/10完成(54秒),Log-likelihood = -75417170训练UBM:10/10完成(55秒),对数可能性= -75275185

计算Baum-Welch统计

Baum-welch统计数据是N(第零阶)和F在EM算法中使用的(一阶)的统计,使用最终UBM计算。

N C ( s ) = T γ. T ( C )

F C ( s ) = T γ. T ( C ) Y T

  • Y T 是时候的特征矢量 T

  • s { s 1. , s 2. , , s N } , 在哪里 N 为发言者的人数。为了训练整个可变性空间,每个音频文件都被认为是一个单独的扬声器(无论它是否属于一个物理的单个扬声器)。

  • γ. T ( C ) 后验概率是UBM的组成部分吗 C 说明了特征向量 Y T

计算训练集上的零阶和一阶Baum-Welch统计量。

NumSpeakers = Numel(adstrain.files);nc = {};fc = {};抽搐帕弗II = 1:numpar adspart = partition(adstrain,numpar,ii);numfiles = numel(adspart.files);npart = cell(1,numfiles);fpart = cell(1,numfiles);jj=1:numFiles audioData=read(adsPart);%提取特征y =辅助术(Audiodata,AFE,符号因素);%计算后验记录可能性对数似然= helperGMMLogLikelihood(Y,UBM);%计算后验归一化概率Amax = Max(Loglikelihood,[],1);loglikelihoodsum = amax + log(sum(exp(loglikelihip-amax),1));Gamma = Exp(Loglikelihood  -  loglikelihoodsum)';%compute baum-welch统计n =总和(γ1);F = Y *伽马;Npart {JJ} =重塑(N,1,1,numComponents);Fpart {JJ} =重塑(F,numFeatures,1,numComponents);结束nc = [nc,npart];FC = [FC,FPART];结束fprintf('Baum-Welch统计完成(%0.0f秒)' \n',toc)
鲍姆·韦尔奇统计完成(54秒)。

将统计信息展开为矩阵和中心 F ( s ) ,如上所述[3],这样

  • N ( s ) 是A. C F × C F 对角线矩阵块是 N C ( s ) ( C = 1. , C )

  • F ( s ) 是A. C F × 1. 通过连接得到的超向量 F C ( s ) ( C = 1. , C )

  • C 在UBM部件的数量。

  • F 是特征向量中的特征数量。

N =数控;F = Fc;民大=重塑(ubm.mu numFeatures 1, []);s = 1:numSpeakers N{s} = repelem(重塑(Nc{s},1,[]),numFeatures);F{s} =重塑(Fc{s} - Nc{s}.*muc,[],1);结束

因为本例假设对角协方差矩阵的UBM,N也是对角矩阵,并且保存为有效的计算向量。

总可变性空间

在I - 向量模型中,理想的扬声器监控器由扬声器 - 独立的组件和扬声器依赖组件组成。扬声器依赖性组件包括总可变空间模型和扬声器的I形式。

M = M + TW.

  • M 是扬声器话语监督员

  • M 是说话者和信道无关的超向量,它可以取为UBM超向量。

  • T 为低秩矩形矩阵,表示总变异性子空间。

  • W 是扬声器的i-载体

i向量的维数, W ,通常比C维说话者话语超向量低得多,这使得i向量,或i向量,是一个更紧凑和易于处理的表示。

训练总变异的空间, T ,首先随机初始化T,然后迭代地执行这些步骤[3]:

  1. 计算隐藏变量的后部分布。

L T ( s ) = + T × σ. - 1. × N ( s ) × T

2.收集所有发言者的数据。

κ.. = s F ( s ) × ( L T - 1. ( s ) × T × σ. - 1. × F ( s ) )

A. C = s N C ( s ) L T - 1. ( s )

3.更新总的可变性空间。

T C = A. C - 1. × κ..

T = [ T 1. T 2. T C ]

[3]提出初始化 σ. 通过UBM的变化,然后更新 σ. 根据方程式:

σ. = ( s N ( s ) ) - 1. ( ( s s ( s ) ) - 诊断 ( κ.. × T ) )

其中s是居中的二阶Baum-welch统计数据。但是,更新 σ. 通常会在实践中删除,因为它几乎没有效果。此示例不会更新 σ.

创建变量。

σ= ubm.sigma (:);

指定总变性空间的尺寸。用于Timit数据集的典型值为1000。

numTdim =32.如果numTdim = 16;结束

初始化T单位矩阵,并预先分配单元格数组。

T = RANDN(NUMER(UBM.SIGMA),NUMTDIM);t = t / narm(t);我=眼睛(numtdim);EY =细胞(NumSpeakers,1);Eyy = Cell(NumSpeakers,1);Linv = Cell(NumSpeakers,1);

设置迭代训练次数。报道的典型值是20。

numIterations =5.

运行训练循环。

iterIdx=1:numIterations% 1。计算隐藏变量的后验分布TtimesInverseSSdiag = (t /σ)';帕弗S = 1:numSpeakers L =(I + TtimesInverseSSdiag * N {S} * T);Linv {S} = PINV(L);EY {S} = Linv {S} * TtimesInverseSSdiag * F {S};EYY {S} = Linv {S} +安永{S} *安永{S}';结束%2.累计所有发言者的统计数据Eymat=cat(2,Ey{:});FFmat=cat(2,F{:});Kt=FFmat*Eymat';K=mat2cell(Kt',numTdim,repelem(numFeatures,numComponents));newT=cell(numComponents,1);C = 1:NumComponents Aclocal = Zeros(NumTDIM);S = 1:NumPakers Aclocal = Aclocal + NC {s}(:,c)* eyy {s};结束%3.更新总变异空间纽特·c {} = (pinv (AcLocal) * K c {}) ';结束T =猫(1,蝾螈{:});fprintf('Training Total variation Space: %d/%d complete (%0.0f seconds).\n',iterIdx,numIterations,TOC)结束
培训总变异空间:1/5完成(2秒)。培训总变异空间:2/5完成(2秒)。培训总变异空间:3/5完成(2秒)。培训总变异空间:4/5完整的(1秒)。培训总变异空间:5/5完整的(1秒)。

I - 矢量提取

一旦总变异空间的计算,可以计算出I-向量作为[4]:

W = ( + T σ. - 1. NT ) T σ. - 1. F

此时,您仍在将每个训练文件视为单独的扬声器。但是,在下一步中,当您培训投影矩阵以减少维度并提高扬声器间差异时,必须用适当的,不同的扬声器ID标记i vectors。

创建一个单元格数组,其中单元格数组的每个元素都包含一个特定说话人文件的i向量矩阵。

扬声器=唯一(adstrain.labels);NumSpeakers = Numel(扬声器);ivectorperspaeer = cell(numspeakers,1);ts = t./sigma;TSI = TS';Ubmmu = ubm.mu;抽搐帕弗speakerIdx = 1: numSpeakers%子集数据存储到你正在适应扬声器。Adspart =子集(adstrain,adstrain.labels ==扬声器(扬声器));numfiles = numel(adspart.files);viverperfile =零(numtdim,numfiles);fileidx = 1:numfiles audiodata =读取(adspart);%提取特征y =辅助术(Audiodata,AFE,符号因素);%计算后验记录可能性对数似然= helperGMMLogLikelihood(Y,UBM);%计算后验归一化概率Amax = Max(Loglikelihood,[],1);loglikelihoodsum = amax + log(sum(exp(loglikelihip-amax),1));Gamma = Exp(Loglikelihood  -  loglikelihoodsum)';%compute baum-welch统计n =总和(γ1);f = Y * gamma - n.*(ubmMu);viverperfile(:,fileidx)= pinv(i +(ts。* repelem(n(:),numfeatures))'* t)* tsi * f(:);结束ivectorperspeaker {speakeridx} = vivectorperfile;结束fprintf('I-矢量从训练集(%0.0F秒)萃取。\ N',toc)
从训练集中提取的i向量(60秒)。

投影矩阵

许多不同的后端已经被提出了I-载体。最直接的,并且仍然表现良好的一个是线性判别分析(LDA)和类内协方差归一化(WCCN)的组合。

创建一个训练向量矩阵和一张地图,指明哪个i向量对应于哪个说话人。将投影矩阵初始化为单位矩阵。

w = ivectorPerSpeaker;utterancePerSpeaker = cellfun (@ (x)大小(x, 2), w);ivectorsTrain =猫(2 w {:});projectionMatrix =眼睛(大小(w {1}, 1));

LDA试图最小化类内差异,最大化说话人之间的差异。可以按照中所述进行计算[4]:

给予:

s B = s = 1. s ( W s - W ) ( W s - W )

s W = s = 1. s 1. N s = 1. N s ( W s - W s ) ( W s - W s )

在哪里

  • W s = ( 1. N s ) = 1. N s W s 是每个说话人的i向量的平均值。

  • W = 1. N s = 1. s = 1. N s W s 是所有扬声器的平均i向量。

  • N s 是每个说话人的话语数。

解决最佳特征向量的特征值方程:

s B v = λ. s W v

最好的特征向量是那些具有最大特征值的。

performllda =.真的如果performLDA抽动numEigenvectors =16.;SW =零(大小(projectionMatrix,1));SB =零(大小(projectionMatrix,1));wbar =平均值(猫(2,W {:}),2);II = 1:NUMER(W)WS = W {II};WSBAR =均值(WS,2);sb = sb +(wsbar  -  wbar)*(wsbar  -  wbar)';SW = SW + COV(WS',1);结束[A,〜] = eigs(SB,SW,numEigenvectors);A =(A./vecnorm(A))';ivectorsTrain = A * ivectorsTrain;W = mat2cell(ivectorsTrain,尺寸(ivectorsTrain,1),utterancePerSpeaker);projectionMatrix = A * projectionMatrix;fprintf(“LDA投影矩阵计算(%0.2f秒)”,toc)结束
LDA投影矩阵计算(0.22秒)。

WCCN试图对I-Vector空间逐级协方差扩展,因此在I形载比较中将揭示高内扬声器变异性的方向。[9]

给予类内协方差矩阵:

W = 1. s s = 1. s 1. N s = 1. N s ( W s - W s ) ( W s - W s )

在哪里

  • W s = ( 1. N s ) = 1. N s W s 是每个说话人的i向量的平均值。

  • N s 是每个说话人的话语数。

解决用于使用Cholesky分解B:

W - 1. = BB

performwccn =.真的如果performWCCN tic =0.9;W =零(大小(projectionMatrix,1));ii = 1:numel(w) w = w + cov(w{ii}',1);结束W = W /元素个数(W);W = (1 - alpha)*W + alpha*eye(size(W,1));B =胆固醇(pinv (W),“低”); projectionMatrix=B*projectionMatrix;fprintf('WCCN投影矩阵计算(%0.4F秒)。,toc)结束
计算WCCN投影矩阵(0.0063秒)。

培训阶段现在完成。您现在可以使用通用背景模型(UBM),总可变空间(T)和投影矩阵来注册和验证扬声器。

火车G-PLDA型号

将投影矩阵应用于列车集。

vivectors = Cellfun(@(x)proigndmatrix * x,ivectorperspaeer,'统一输出',错误的);

这个算法实现在这个例子是一个高斯PLDA概述[13].在高斯PLDA中,i矢量表示为:

φ. ij = μ. + vy. + ε. ij

Y ν ( 0 , ι )

ε. ij ν ( 0 , λ. - 1. )

在哪里 μ. 是I-vectors的全球含义, λ. 是噪声项的全精度矩阵吗 ε. ij , 和 v 是因子加载矩阵,也称为特征语音。

指定要使用的特征等级的数量。通常数字在10到400之间。

numEigenVoices =16.

确定不相交的人的数量,特征向量的维数,每个说话人的话语数。

K = numel(ivectors);d =尺寸(ivectors {1},1);utterancePerSpeaker = cellfun(@(x)的大小(X,2),ivectors);

发现样品的总数和居中的i向量。

N = = 1. K N

μ. = 1. N , J φ. , J

φ. ij = φ. ij - μ.

伊夫特氏士Matrix = CAT(2,Ivectors {:});n =尺寸(伊象Matrix,2);mu =平均值(ivectorsmatrix,2);伊鸠斯Matrix= Ivectorsmatrix  -  mu;

确定从训练的i-矢量,然后美白的i矢量的白化矩阵。指定是ZCA增白,美白PCA,或没有美白。

whiteningType ='ZCA'如果strcmpi (whiteningType'ZCA')S = COV(ivectorsMatrix');[〜,SD,SV] = SVD(S);W = DIAG(1 ./(SQRT(DIAG(SD))+ EPS))* SV';ivectorsMatrix = W * ivectorsMatrix;eleesif.strcmpi (whiteningType'pca')S = COV(ivectorsMatrix');[sv,sd] = eig;W = DIAG(1 ./(SQRT(DIAG(SD))+ EPS))* SV';ivectorsMatrix = W * ivectorsMatrix;其他的W =眼睛(尺寸(伊象师Matrix,1));结束

应用长度规范化,然后将训练i向量矩阵转换回单元数组。

ivectorsMatrix = ivectorsMatrix./vecnorm(ivectorsMatrix);

计算全局二阶矩为

s = ij φ. ij φ. ij T

S = ivectorsMatrix * ivectorsMatrix';

将训练i向量矩阵转换回单元数组。

ivectors = mat2cell (ivectorsMatrix D utterancePerSpeaker);

根据样本数量对人进行排序,然后根据每个说话人的话语数量对i向量进行分组。预计算的一阶矩 -第四人

F = J = 1. N φ. ij

uniqueLengths =唯一的(utterancePerSpeaker);numUniqueLengths = numel(uniqueLengths);speakerIdx = 1;F =零(d,K);UniqueLengthidx = 1:NumUniqueLengths IDX = find(发出语音培训器==单声头长度(Uniquelengthidx));temp = {};SpeakerIDXWithinUniqueLiqueLength = 1:Numel(IDX)Rho = vo = virecors(IDX(扬声器);temp = [temp; rho];% #好< AGROW >F(:,speakerIdx)=总和(RHO {:},2);speakerIdx = speakerIdx + 1;结束ivectorsSorted {uniqueLengthIdx} =温度;% #好< SAGROW >结束

初始化特征音矩阵V和反噪声方差项, λ.

V = randn (D, numEigenVoices);λ= pinv (S / N);

指定EM算法的迭代次数以及是否应用最小分歧。

numIter =5.;minimumDivergence =真的

使用描述的EM算法列车训练G-PLDA模型[13]

ITER = 1:numIter%的期望伽玛=零(Numegenvoices,Numegenvoices);Eytotal = Zeros(Numegenvoices,K);r = zeros(numegenvoices,numegenvoices);Idx = 1;lengthIndex = 1:numUniqueLengths ivectorLength = uniqueLengths(lengthIndex);相同的给定长度的%分离的i-矢量IV = {ivectorsSorted lengthIndex};%计算MM = pinv(ivectorLength*(V'*(Lambda*V)) + eye(numEigenVoices));%方程(A.7)在[13]中%循环遍历每个扬声器的当前i矢量长度speakerIndex=1:numel(iv)% V的潜变量一阶矩EY = M * V'* LAMBDA * F(:,IDX);%[13]中(A.8)式%计算秒矩。EYY =安永*安永';%更新RyyR = R + ivectorLength *(M + EYY);[13]中的%等式(A.13)%附加eycotal.EyTotal(:,IDX)=安永;IDX = IDX + 1;%如果使用最小分歧,更新伽马。如果最小散度伽马=伽马+(M+Eyy);%[13]中(A.18)式结束结束结束%计算TTT = EyTotal * f ';[13]中%等式(A.12)%最大化v = tt'* pinv(r);%[13]中(A.16)式波长= PINV((S  -  V * TT)/ N);[13]中%等式(A.17)%最低分歧如果minimumDivergence = gamma/K;%[13]中(A.18)式V = V *胆固醇(γ,“低”);%[13]中的方程式(A.22)结束结束

培训G-PLDA模型后,您可以使用它来根据所描述的日志似然比计算分数[14].鉴于已为本,增白,和长度归一化的,比分被计算为两个I载体:

分数 ( W 1. , W T ) = [ W 1. T W T T ] [ σ. + VV. T VV. T VV. T σ. + VV. T ] [ W 1. W T ] - W 1. T [ σ. + VV. T ] - 1. W 1. - W T T [ σ. + VV. T ] - 1. W T + C

在哪里 W 1. W T 是注册和测试I-vectors, σ. 是噪声项的方差矩阵, v 是特征性矩阵。这 C 项是可分解的常数,在实践中可以去掉。

speakerIdx =2.;绝对的=1.;w1 = ivectors {speakerIdx} (:, utteranceIdx);speakerIdx =1.;绝对的=10.wt=ivectors{speakerIdx}(:,utranceidx);VVt=V*V';Sigmaplusvvvt=pinv(Lambda)+vvvt;term1=pinv([Sigmaplusvt VVt;VVt-Sigmaplusvt]);term2=pinv(Sigmaplusvt);w1wt=[w1;wt];分数=w1wt'*term1*w1wt-w1'*term2*w1-wt'*term2*wt'*
分数= 52.4507

在实践中,测试i向量,以及根据您的系统,注册向量,并不用于G-PLDA模型的训练。在下面的评估部分中,您将使用以前未见过的数据进行注册和验证。支持函数金宝app,gpldaScore封装上述得分步骤,并且另外进行定心,增白,和归一化。保存训练有素的G-PLDA模型作为与支撑功能的使用结构金宝appgpldaScore

gpldaModel=struct(“亩”,亩,......“WhiteningMatrix”,w,......“EigenVoices”v,......'sigma',PINV(LAMBDA));

登记

注册不在训练数据集中的新发言者。

对每个文件使用的步骤的这个序列中的登记组中的每个扬声器产生I-载体:

  1. 特征提取

  2. 鲍姆 - 韦尔奇统计:确定零和一阶统计

  3. I - 矢量提取

  4. 秘密赔偿

然后平均文件中的i向量,为说话人创建i向量模型。对每个发言者重复上述步骤。

扬声器=唯一(Adsenroll.Labels);NumSpeakers = Numel(扬声器);注册专业eakersbyIdx = Cell(NumSpeakers,1);抽搐帕弗speakerIdx = 1: numSpeakers%子集数据存储到你正在适应扬声器。adsPart=子集(adsEnroll,adsEnroll.Labels==说话人(speakerIdx));numFiles=numel(adsPart.Files);ivectorMat=零(大小(projectionMatrix,1),numFiles);fileidx = 1:numfiles audiodata =读取(adspart);%提取特征y =辅助术(Audiodata,AFE,符号因素);%计算后验记录可能性对数似然= helperGMMLogLikelihood(Y,UBM);%计算后验归一化概率Amax = Max(Loglikelihood,[],1);loglikelihoodsum = amax + log(sum(exp(loglikelihip-amax),1));Gamma = Exp(Loglikelihood  -  loglikelihoodsum)';%compute baum-welch统计n =总和(γ1);f = Y * gamma - n.*(ubmMu);%I  - 矢量提取W = PINV(I +(TS * repelem(N(:),numFeatures))” * T)* TSI * F(:)。% Intersession补偿w=projectionMatrix*w;ivectorMat(:,fileIdx)=w;结束%i  - 矢量模型注册eAkersbyIdx {speakeridx} =均值(ivectormat,2);结束fprintf('扬声器注册(%0.0f秒)。\ n',toc)
扬声器注册(0秒)。

出于记帐的目的,将i-vector单元格数组转换为结构,speaker id作为字段,i-vector作为值

Enrolled Speakers=struct;s = 1:NumSpeakers注册专用箱。(字符串(扬声器))= enrolledspeakersbyIdx {s};结束

确认

指定CSS或G-PLDA评分方法。

scoringMethod =“GPLDA”

拒真率(FRR)

扬声器错误拒绝率(FRR)是给定扬声器错误拒绝的速率。为已注册的扬声器i-vector和同一扬声器的i-vectors创建一个分数数组。

speakersToTest =独特(adsDET.Labels);numSpeakers =元素个数(speakersToTest);scoreFRR =细胞(numSpeakers, 1);抽搐帕弗扬声器= 1:NumPeakers Adspart =子集(ADSDET,ADSDET.Labels == BudderStotest(SpeakerIdx));numfiles = numel(adspart.files);idvectortest =注册专用eakers。(Stringerstotest(SpeakerIdx)));%#确定得分=零(numfiles,1);fileidx = 1:numfiles audiodata =读取(adspart);%提取特征y =辅助术(Audiodata,AFE,符号因素);%计算后验记录可能性对数似然= helperGMMLogLikelihood(Y,UBM);%计算后验归一化概率Amax = Max(Loglikelihood,[],1);loglikelihoodsum = amax + log(sum(exp(loglikelihip-amax),1));Gamma = Exp(Loglikelihood  -  loglikelihoodsum)';%compute baum-welch统计n =总和(γ1);f = Y * gamma - n.*(ubmMu);%提取矢量iW = PINV(I +(TS * repelem(N(:),numFeatures))” * T)* TSI * F(:)。% Intersession补偿W = projectionMatrix *瓦特;%的分数如果strcmpi(scoringMethod,“CSS”)得分(FILEIDX)=点(伊葡萄园,W)/(常规(W)*常规(idvectottest));其他的分数(fileIdx) = gpldaScore (gpldaModel w ivectorToTest);结束结束scoreFRR{speakerIdx}=分数;结束fprintf('FRR计算值(%0.0F秒)。\ N',toc)
FRR计算(17秒)。

认假率(FAR)

说话人错误接受率(FAR)是指不属于注册说话人的话语被错误接受为属于注册说话人的比率。为登记的发言者和不同发言者的i向量创建分数数组。

speakersToTest =独特(adsDET.Labels);numSpeakers =元素个数(speakersToTest);记分=细胞(NumSpeakers,1);抽搐帕弗SpeakerIDX = 1:NumSpeakers Adspart =子集(ADSDET,ADSDET.LABELS〜= Speederstotest(SpeakerIDX));numfiles = numel(adspart.files);idvectortest =注册专用eakers。(Stringerstotest(SpeakerIdx)));%#确定得分=零(numfiles,1);fileidx = 1:numfiles audiodata =读取(adspart);%提取特征y =辅助术(Audiodata,AFE,符号因素);%计算后验记录可能性对数似然= helperGMMLogLikelihood(Y,UBM);%计算后验归一化概率Amax = Max(Loglikelihood,[],1);loglikelihoodsum = amax + log(sum(exp(loglikelihip-amax),1));Gamma = Exp(Loglikelihood  -  loglikelihoodsum)';%compute baum-welch统计n =总和(γ1);f = Y * gamma - n.*(ubmMu);%提取矢量iW = PINV(I +(TS * repelem(N(:),numFeatures))” * T)* TSI * F(:)。%Intersession补偿w = projectionMatrix * w;%的分数如果strcmpi(scoringMethod,“CSS”)得分(FILEIDX)=点(伊葡萄园,W)/(常规(W)*常规(idvectottest));其他的分数(fileIdx) = gpldaScore (gpldaModel w ivectorToTest);结束结束scoreFAR{speakerIdx}=分数;结束fprintf(` FAR ` (%0.0f秒).\n `,toc)
FAR计算(17秒)。

等错误率(EER)

要比较多个系统,您需要一个组合FRR性能的单个度量标准。为此,您确定了相同的错误率(eer),这是远程和FRR曲线相遇的阈值。在实践中,eer阈值可能不是最佳选择。例如,如果扬声器验证用作电线传输的多认证方法的一部分,则远远可能比FRR更加重大加权。

阿明=分钟(猫(1,scoreFRR {:},{scoreFAR:}));AMAX = MAX(猫(1,scoreFRR {:},{scoreFAR:}));thresholdsToTest = linspace(AMIN,AMAX,1000);%计算FRR和FAR每一个阈值。如果strcmpi(scoringMethod,“CSS”)%在CSS中,较大的分数表示的登记和测试ivectors是% 相似的。FRR=平均值(cat(1,评分FRR{:})thresholdsToTest);其他的%在G-PLDA,较小的分值表示登记并测试ivectors是% 相似的。FRR=平均值(cat(1,评分FRR{:})>阈值STOTEST);FAR=平均值(cat(1,评分FRR{:})<阈值STOTEST);结束[〜,EERThresholdIdx] =分钟(ABS(FAR  -  FRR));EERThreshold = thresholdsToTest(EERThresholdIdx);EER =平均值([FAR(EERThresholdIdx),FRR(EERThresholdIdx)]);图图(thresholdsToTest,FAR,'K',......阈值,frr,'B',......eErthreshold,eer,'RO',“MarkerFaceColor”,“r”)标题(sprintf ('等错误率=%0.4F,阈值=%0.4F',EER,EERThreshold))xlabel('临界点')ylabel(的错误率) 传奇('虚假接受率(远)',“误拒率”,“等错误率(EER)”,'地点','最好的事物') 网格紧的

金宝app支持功能

特征提取和规范化

函数[特征,Numframes] = HelperFeatureextraction(AudioData,AFE,诺源管)%的输入:%audioData  - 音频数据的列向量%AFE  -  audioFeatureExtractor对象%normFactors  - 的用于归一化的特征平均值和标准偏差。%如果normFactors为空,则不应用标准化。%%输出%特征 - 提取的特征矩阵% numFrames -返回的帧数(特征向量)%正常化audioData = audioData / max (abs (audioData (:)));%防范的NaNaudiodata(Isnan(audiodata))= 0;分离语音片段idx = detectSpeech (audioData afe.SampleRate);特点= [];II = 1:大小(IDX,1)f =提取物(AFE,AUDIODATA(IDX(II,1):IDX(II,2))));特征= [特征; f];% #好< AGROW >结束%特征归一化如果〜isempty(徽章)特征=(特征 -  ragefactors.mean')./ nammactors.std';结束功能=特征';%咽部平均减法(用于信道噪声)如果~isempty(normFactors) feature = feature - mean(feature,“所有”);结束numFrames =大小(功能,2);结束

高斯多分量混合对数似然

函数L=helpergmmloglikelike(x,gmm)xMinusMu=repmat(x,1,1,numel(gmm.ComponentProportion))-permute(gmm.mu,[1,3,2]);permuteSigma=permute(gmm.sigma,[1,3,2]);Lunweighted=-0.5*(和(和(和(对数(和),1)+和(和(xMinusMu 1)+大小(gmm.mu和1)*对数(2*pi));temp=pressure(和(和对数,[1,3,2]);如果大小(温度,1)== 1%如果只有一个帧,末尾的单例维度为折扣中删除的%。这会占该边缘案例。temp = temp ';结束L =温度+日志(gmm.ComponentProportion)';结束

G-PLDA得分

函数分数= gpldaScore (w1, gpldaModel wt)%中心数据w1 = w1 - gpldammodel .mu;wt = wt - gpldammodel .mu;%美白数据w1 = gpldamodel.whiteningmatrix * w1;wt = gpldamodel.whiteningmatrix * wt;%长度 - 标准化数据W1 = w1./vecnorm(w1);重量= wt./vecnorm(wt);%基于日志可能性评分I-VORS的相似性。VVT = gpldaModel.EigenVoices * gpldaModel.EigenVoices';SVVt = gpldaModel.Sigma + VVT;TERM1 = PINV([SVVt VVT; VVT SVVt]);TERM2 = PINV(SVVt);w1wt = [W1;重量];得分= w1wt '* TERM1 * w1wt  -  W1' * TERM2 * w1wt'* TERM2 *重量%;结束

参考

[1]雷诺兹,道格拉斯A.,等人。“说话人确认使用适合高斯混合模型。”数字信号处理,卷。10,不。1-3,2000年1月,第19-41页。DOI.org (Crossref), doi: 10.1006 / dspr.1999.0361。

[2] Kenny,Patrick等。“扬声器识别中的联合因子分析与Eigenchannels。”IEEE在音频,语音和语言处理中的交易,第15卷,第5期。4, 2007年5月,第1435-47页。DOI.org (Crossref),DOI:10.1109 / TASL.2006.881693。

[3] Kenny,P.等人。“扬声器验证中的Interspeaker变异性研究。”IEEE交易对音频,语音和语言处理,第16卷,第5期。5、2008年7月,第980-88页。DOI.org (Crossref),DOI:10.1109 / TASL.2008.925147。

[4] Dehak, Najim等《说话人验证的前端因素分析》IEEE交易对音频,语音和语言处理第19卷第2期4, 2011年5月,第788-98页。DOI.org (Crossref),DOI:10.1109 / TASL.2010.2064307。

[5] Matejka,Pavel,Ondrej Glembek,Fabio Castaldo,M.J.Alam,Oldrich Plchot,Patrick Kenny,Lukas Burget和Jan Cernocky。“I - 矢量扬声器验证中的全协变ubm和重型PLDA。”2011年IEEE音响,言语和信号处理国际会议(ICASSP),2011年。https://doi.org/10.1109/icassp.2011.5947436。

[6] Snyder, David等,《x -向量:用于说话人识别的鲁棒DNN嵌入》。2018年IEEE音响,演讲和信号处理国际会议(ICASSP),ieee,2018,pp。5329-33。DOI.org (Crossref), doi: 10.1109 / ICASSP.2018.8461375。

[7]信号处理和语音通信实验室。进入2019年12月12日。https://www.spsc.tugraz.at/databases-and-tools/ptdb-tug-pitch-tracking-database-from-graz-university-of-technology.html.

[8] Variani, Ehsan等,“用于小足迹文本相关说话人验证的深度神经网络”。2014 IEEE声学、语音和信号处理国际会议(ICASSP), IEEE, 2014, pp. 4052-56。DOI.org (Crossref),DOI:10.1109 / ICASSP.2014.6854363。

[9] Dehak, Najim, Réda Dehak, James R. Glass, Douglas A. Reynolds和Patrick Kenny。“没有评分标准化技术的余弦相似度评分”。奥德赛(2010)。

[10]维尔马,Pulkit和普拉迪普K.达斯。“我向量的语音处理应用调查报告。”国际期刊语音技术第18卷第2期4, 2015年12月,第529-46页。DOI.org (Crossref),DOI:10.1007 / S10772-015-9295-3。

[11] D.加西亚-Romero和C.埃斯皮-威尔逊,“在说话者识别系统的I-矢量长度规范化的分析”。语际, 2011, pp. 249-252。

[12]肯尼,帕特里克。“贝叶斯扬声器验证重型前锋”。奥德赛2010 -演讲者和语言识别研讨会,布尔诺,捷克共和国,2010年

[13] 统一生物认证中的概率线性鉴别分析变体计算机科学结构,句法和统计模式识别的讲义,2014,464-75。https://doi.org/10.1007/978-3-662-44415-3_47。

[14] Rajan、Padmanabhan、Anton Afanasyev、Ville Hautamäki和Tomi Kinnunen.2014.“从单个到多个注册I向量:用于说话人验证的实用PLDA评分变体。”数字信号处理31日(8):93 - 101。https://doi.org/10.1016/j.dsp.2014.05.001。