主要内容

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

说话人验证或认证的任务是确认说话人的身份是否属实。多年来,发言人验证一直是一个活跃的研究领域。早期的性能突破是使用高斯混合模型和通用背景模型(GMM-UBM)。[1]在声学特征上(通常MFCC.).例如,请参见使用高斯混合模型的扬声器验证.GMM-UBM系统的主要困难之一涉及会话间的可变性。联合因素分析(JFA)被提出,以补偿这一变异性分别建模发言者间的变异性和渠道或会话变异性[2][3].然而,[4]发现JFA中的频道因子也包含有关扬声器的信息,并建议将通道和扬声器空间组合成一个总变化空间.然后使用后端程序(如线性判别分析(LDA)和类内协方差归一化(WCCN))来补偿会话间的变异性,然后是一个评分,如余弦相似度评分。[5]提出用概率LDA (PLDA)模型代替余弦相似度评分。[11][12]提出了一种将i向量高斯化的方法,从而在PLDA中做高斯假设,称为G-PLDA或简化PLDA。虽然i向量最初被提出用于说话人的验证,但它已经被应用于许多问题,如语言识别、说话人日记、情感识别、年龄估计和防欺骗[10].最近,深度学习技术被提出用d-vectorsx-vectors[8][6]

使用i向量系统

音频工具箱提供ivectorSystem其中封装了培训I - 矢量系统,注册扬声器或其他音频标签的能力,评估决策阈值的系统,并识别或验证扬声器或其他音频标签。看ivectorSystem提供使用此特性并将其应用于多个应用程序的示例。

要了解更多关于i矢量系统如何工作的信息,请继续看这个例子。

开发i-向量系统

在本例中,您将开发一个标准i向量系统,用于说话人验证,该系统使用LDA-WCCN后端,带有余弦相似度评分或G-PLDA评分。

在整个示例中,您将发现可调参数上的活动控件。更改控件不会重新运行示例。如果更改控件,则必须重新运行该示例。

数据集管理

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

URL =.“https://www2.spsc.tugraz.at/databases/PTDB-TUG/SPEECH_DATA_ZIPPED.zip”;downloadfolder = tempdir;datasetfolder = fullfile(DownloadFolder,“PTDB-TUG”);如果~存在(datasetFolder'dir') disp ('下载ptdb-tug(3.9 g)...')解压缩(URL,DataSetFolder)结尾
下载PTDB-TUG(3.9 g)......

创建一个audiodatastore.指向数据集的。该数据集最初用于音高跟踪训练和评估,包括喉镜读数和基线音高决定。仅使用原始录音。

广告= audiodataStore([fullfile(datasetfolder,“语音数据”“女性”“麦克风”),fullfile(DataSetFolder,“语音数据”“男性”“麦克风”)),...“IncludeSubfolders”,真的,...'fileextensions'“wav”);filenames = ads.files;

文件名包含扬声器id。对文件名进行解码以设置标签audiodatastore.对象。

speakerIDs = extractBetween(文件名,“mic_”“_”);ads.Labels =分类(speakerIDs);countEachLabel(广告)
ANS =.20×2表标签计数_____ _____ F01 236 F02 236 F03 236 F04 236 F05 236 F06 236 F07 236 F08 234 F09 236 F10 236 M01 236 M02 236 M03 236 M04 236 M05 236 M06 236⋮

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

developmentLabels =分类([“m01”“m02”“m03”“m04”“m06”“m07”“m08”“m09”“F01”“F02”“F03”“F04”“F06”“F07”“F08”“F09”]);evaluationslabels =分类([“m05”“M010”“F05”“F010”]);adsTrain =子集(广告,ismember (ads.Labels developmentLabels));adsEvaluate =子集(广告,ismember (ads.Labels evaluationLabels));numFilesPerSpeakerForEnrollment =3.;[adsenroll,adstest,adsdet] = splitheachlabel(adsevaluate,numfileverspeakerforenrollment,2);

显示所得标签分布audiodatastore.对象。

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
CountAckeLabel(Adsenroll)
ANS =.2×2表标签计数_____ _____ F05 3 M05 3
CountAckeLabel(ADSDET)
ANS =.2×2表标签计数_____ _____ F05 231 M05 231
CountAckeLabel(Adstest)
ANS =.2×2表标签计数_____ _____ F05 2 M05 2

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

[音频,AudioInfo] =读(adstrain);FS = AudioInfo.Sampleate;t =(0:大小(音频,1)-1)/ fs;声音(音频,FS)绘图(T,AUDIO)XLABEL(“时间(s)”) ylabel ('振幅')轴([0 t(end) -1 1])标题(“来自训练集的样本话语”的)

重置(adsTrain)

您可以减少本例中使用的数据集和参数数量,以以性能为代价加快运行时。通常,减少数据集是开发和调试的一种良好实践。

speedupexample =.如果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跳。

numcoeffs =20.;deltaWindowLength =9.;WindowDuration =.0.025;hopDuration =0.01;windowSamples =圆(windowDuration * fs);hopSamples =圆(hopDuration * fs);overlapSamples = windowSamples - hopSamples;afe = audioFeatureExtractor (...“SampleRate”fs,...“窗口”损害(windowSamples'定期'),...“OverlapLength”overlapSamples,......'MFCC',真的,...'mfccdelta',真的,...“mfccDeltaDelta”,真正的);setExtractorParams (afe'MFCC''deltawindowlength'deltaWindowLength,“NumCoeffs”numCoeffs)

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

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

培训

训练一个i向量系统在计算上是昂贵和耗时的。如果您有Parallel Computing Toolbox™,您可以将工作分散到多个核上以加快示例的速度。确定系统的最佳分区数。如果您没有并行计算工具箱™,请使用单个分区。

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

特征归一化因子

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

featuresAll = {};tparII = 1:numpar adspart = partition(adstrain,numpar,ii);功能= cell(0,numel(adspart.files));III = 1:NUMER(ADSPART.FILES)AUDIODATA =读取(ADSPART);特点{III} = HelperFeatureextraction(audiodata,AFE,[]);结尾特色= [具有功能,功能零];结尾allFeatures =猫(2,featuresAll {:});FPRINTF(“从训练集中提取特征完成(%0.0f秒)。”,TOC)
从训练集完成特征提取(58秒)。

计算每个特征的全球平均值和标准偏差。您将在以后调用HelperFeatureextraction.函数对特性进行规范化。

normFactors。M.ean = mean(allFeatures,2,“omitnan”);ramefactors.std = std(全娱乐,[],2,“omitnan”);

通用背景模型(UBM)

初始化I - 矢量系统中的通用背景模型(UBM)的高斯混合模型(GMM)。组件权重被均匀分布式初始化。在Timit数据集上培训的系统通常包含大约2048个组件。

NumComponents =64如果SpeedupExample NumComponents = 32;结尾numComponentsα= 1 (1)/ numComponents;μ= randn (numFeatures numComponents);vari = rand(numFeatures,numComponents) + eps;于是=结构(“ComponentProportion”α,“亩”,亩,'西格玛'、变化);

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

maxiter =.10如果speedUpExample maxIter = 2;结尾titer = 1:maxiter tic%的期望N = 0(1、numComponents);F = 0 (numFeatures numComponents);S = 0 (numFeatures numComponents);L = 0;parII = 1:numpar adspart = partition(adstrain,numpar,ii);hasdata(adsPart) audioData = read(adsPart);%提取特征Y = HelperFeatureextraction(Audiodata,AFE,符号因素);%计算后验对数可能性logLikelihood = helperGMMLogLikelihood (Y, ubm);%计算后验归一化概率amax = max (logLikelihood [], 1);loglikelihood = max + log(sum(exp(logLikelihood-amax),1));gamma = exp(logLikelihood - logLikelihood)';%计算Baum-Welch统计n =总和(γ1);f = y *伽玛;s =(Y. * Y)*伽玛;%更新足够的话语统计数据n = n + n;f = f + f;s = s + s;%更新日志可能性L = L + sum(loglikehoodsum);结尾结尾打印当前日志可能性FPRINTF('Training UBM: %d/%d complete (%0.0f seconds), Log-likelihood = %0.0f\n'iter,麦克斯特、toc、L)%最大化n = max(n,eps);UBM.ComponentPropoxt = Max(n / sum(n),eps);UBM.ComponentProport = UBM.ComponentPropoxt / Sum(UBM.ComponentPropoft);ubm.mu = f./n;ubm.sigma = max(s./n  -  ubm.mu. ^ 2,eps);结尾
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统计

鲍姆-韦尔奇的统计数据是N.(Zeroth订单)和F(第一阶)使用最终UBM计算的EM算法中使用的统计信息。

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 = {};tparII = 1:numpar adspart = partition(adstrain,numpar,ii);numFiles =元素个数(adsPart.Files);npart = cell(1,numfiles);fpart = cell(1,numfiles);JJ = 1:numfiles audiodata =读取(Adspart);%提取特征Y = HelperFeatureextraction(Audiodata,AFE,符号因素);%计算后验对数似然logLikelihood = helperGMMLogLikelihood (Y, ubm);%计算后验归一化概率amax = max (logLikelihood [], 1);loglikelihood = max + log(sum(exp(logLikelihood-amax),1));gamma = exp(logLikelihood - logLikelihood)';%计算Baum-Welch统计n =总和(γ1);f = y *伽玛;npart {jj} =重塑(n,1,1,num components);fpart {jj} =重塑(f,numfeatures,1,num components);结尾数控=(数控,Npart);Fc = (Fc, Fpart);结尾FPRINTF('Baum-Welch统计完成(%0.0f秒)' \n',TOC)
Baum-Welch统计数据已完成(54秒)。

将统计信息扩展到矩阵和中心 F S. 的) ,如上所述[3],这样

  • N. S. 的) 是一个 C F × C F 对角线矩阵,其块是 N. C S. 的) 一世 C = 1 C 的)

  • F S. 的) 是一个 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. + 太瓦

  • 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. 的) 的) '

一种 C = S. N. C S. 的) L. T. - 1 S. 的)

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

T. C = 一种 C - 1 × κ..

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

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

σ. = S. N. S. 的) 的) - 1 S. S. S. 的) 的) - 诊断 κ.. × T. ' 的) 的)

其中S(S)是居中的二阶Baum-Welch统计量。然而,更新 σ. 通常在实践中掉落,因为它几乎没有效果。此示例不会更新 σ.

创建变量。

σ= ubm.sigma (:);

指定总可变性空间的维度。TIMIT数据集使用的典型值是1000。

numtdim =32如果numTdim = 16;结尾

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

T = randn(元素个数(ubm.sigma) numTdim);T = T /规范(T);我=眼睛(numTdim);嗯=细胞(numSpeakers, 1);Eyy =细胞(numSpeakers, 1);Linv =细胞(numSpeakers, 1);

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

numIterations =5.

运行训练循环。

ITerIDX = 1:NUMITRATION TIC% 1。计算隐藏变量的后验分布TtimesInverseSSdiag = (t /σ)';pars = 1:numpakers l =(i + ttimesinversessdiag。* n {s} * t);linv {s} = pinv(l);ey {s} = linv {s} * ttimesinversessdiag * f {s};eyy {s} = linv {s} + ey {s} * ey {s}';结尾%2.跨扬声器累计统计数据Eymat =猫(2,Ey {:});ffmat = cat(2,f {:});kt = ffmat * eymat';k = mat2cell(kt',numtdim,Repelem(NumFeatures,NumComponents));newt = cell(NumComponents,1);c = 1:numComponents AcLocal = 0 (numTdim);s = 1:numSpeakers AcLocal = AcLocal + Nc{s}(:,:,c)*Eyy{s};结尾%3.更新总变性空间纽特·c {} = (pinv (AcLocal) * K c {}) ';结尾t =猫(1,newt {:});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

此时,您仍然将每个培训文件视为一个单独的发言者。然而,在下一步中,当您训练投影矩阵来降低维数并增加说话人之间的差异时,i向量必须用适当的、不同的说话人id进行标记。

创建单元阵列,其中小区阵列的每个元素包含针对特定扬声器的文件的i-vectors矩阵。

演讲者=独特(adsTrain.Labels);numSpeakers =元素个数(扬声器);ivectorPerSpeaker =细胞(numSpeakers, 1);TS = t /σ;TSi = TS ';ubmMu = ubm.mu;tparspeakerIdx = 1: numSpeakers%将数据存储区集到您正在调整的扬声器。Adspart =子集(adstrain,adstrain.labels ==扬声器(扬声器));numFiles =元素个数(adsPart.Files);viverperfile =零(numtdim,numfiles);fileidx = 1:numfiles audiodata =读取(Adspart);%提取特征Y = HelperFeatureextraction(Audiodata,AFE,符号因素);%计算后验对数似然logLikelihood = helperGMMLogLikelihood (Y, ubm);%计算后验归一化概率amax = max (logLikelihood [], 1);loglikelihood = max + log(sum(exp(logLikelihood-amax),1));gamma = exp(logLikelihood - logLikelihood)';%计算Baum-Welch统计n =总和(γ1);f = Y * gamma - n.*(ubmMu);ivectorPerFile(:,fileIdx) = pinv(I + (TS.*repelem(n(:),numFeatures))' * T) * TSi * f(:);结尾ivectorPerSpeaker {speakerIdx} = ivectorPerFile;结尾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-vectors的平均值。

  • W. = 1 N. S. = 1 S. 一世 = 1 N. S. W. 一世 S. 所有扬声器上的平均i-载体是含义。

  • N. S. 是每个扬声器的话语数量。

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

S. B. V. = λ. S. W. V.

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

performlda =真正的如果performlda tic numegenvectors =16;Sw = 0(大小(projectionMatrix, 1));某人= 0(大小(projectionMatrix, 1));wbar =意味着(猫(2 w {:}), 2);Ii = 1:numel(w) ws = w{Ii};wsbar =意味着(ws, 2);Sb = Sb + (wsbar - wbar)*(wsbar - wbar)';Sw = Sw + cov(ws',1);结尾(~) = eigs(某人,西南,numEigenvectors);= (A / vecnorm (A)) ';= A * ivectorsTrain;w = mat2cell (ivectorsTrain、大小(ivectorsTrain, 1), utterancePerSpeaker);投影矩阵= A *投影矩阵;FPRINTF(“LDA投影矩阵计算(%0.2f秒)”,TOC)结尾
LDA投影矩阵计算(0.22秒)。

WCCN试图与类内协方差相反地缩放i向量空间,因此在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-vectors的平均值。

  • N. S. 是每个扬声器的话语数量。

解决对于使用Cholesky分解的B:

W. - 1 = BB. '

performWCCN =真正的如果performWCCN tic =0.9;W = 0(大小(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),“低”);proigndmatrix = b * projectijatmatrix;FPRINTF(“WCCN投影矩阵计算(%0.4f秒)。”,TOC)结尾
计算WCCN投影矩阵(0.0063秒)。

培训阶段现在已经完成。现在可以使用通用背景模型(UBM)、总可变性空间(T)和投影矩阵来登记和验证扬声器。

火车G-PLDA模型

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

ivectors = cellfun (@ (x) projectionMatrix * x, ivectorPerSpeaker“UniformOutput”、假);

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

φ. ij = μ. + v 一世 + ε. ij

y 一世 ν 0. ι 的)

ε. ij ν 0. λ. - 1 的)

在哪里 μ. 是i向量的全局均值, λ. 是噪声项的全精度矩阵吗 ε. ij , V. 为因子载荷矩阵,也称为特征音。

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

numEigenVoices =16

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

k = numel(vivectors);d =尺寸(vieCTORS {1},1);发话机展示者= Cellfun(@(x)大小(x,2),vivectors);

找出样本总数,并将i向量居中。

N. = 一世 = 1 K. N. 一世

μ. = 1 N. 一世 j φ. 一世 j

φ. ij = φ. ij - μ.

ivectorsMatrix =猫(2,ivectors {:});N =大小(ivectorsMatrix 2);μ=意味着(ivectorsMatrix, 2);= vectorsmatrix -;

从训练的i向量中确定白化矩阵,然后对i向量进行白化。指定ZCA美白,PCA美白,或不美白。

whiteningType ='ZCA'如果strcmpi (whiteningType'ZCA') S = cov(vectorsmatrix ');[~, sD, sV] =圣言(年代);W = diag(1 /(sqrt(diag(sD)) + eps))*sV';向量矩阵= W *向量矩阵;elseifstrcmpi (whiteningType'pca') S = cov(vectorsmatrix ');[sv,sd] = eig;W = diag(1 /(sqrt(diag(sD)) + eps))*sV';向量矩阵= W *向量矩阵;其他的W =眼睛(大小(ivectorsMatrix, 1));结尾

应用长度归一化,然后将训练I矢量矩阵转换回小区阵列。

id vectorsmatrix = ivectorsmatrix./vecnorm(ivectorsmatrix);

计算全局二阶矩为

S. = ij φ. ij φ. ij T.

S = ivectorsMatrix * ivectorsMatrix ';

将培训I矢量矩阵转换回小区数组。

ivectors = mat2cell (ivectorsMatrix D utterancePerSpeaker);

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

F 一世 = j = 1 N. 一世 φ. ij

单一长度=唯一(发话机销料);numuniqueLengths = numel(无功能长度);扬声器= 1;f =零(d,k);1: numuniquelengthidx = find(utterancePerSpeaker== uniqueLengthIdx);temp = {};SpeakerIDXWithinUniqueLiqueLength = 1:Numel(IDX)Rho = vo = voctors(IDX(扬声器XWithinUniqueLiquiquiquiquiquiquiqueLiquiqueLiqueLiquectors);temp = [temp; rho];% #好< AGROW >f(:,扬声器)= sum(rho {:},2);SpeakerIdx = SpeakerIDX + 1;结尾ivectorsSorted {uniqueLengthIdx} = temp;% #好< 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 = venctorssorted {lengredIndex};%计算M.M = pinv(ivectorLength*(V'*(Lambda*V)) + eye(numEigenVoices));%[13]中(A.7)式%循环遍历每个扬声器的当前i矢量长度SpeakerIndex = 1:Numel(IV)% V的潜变量一阶矩EY = M * V'* lambda * f(:,IDX);%[13]中(A.8)式%计算秒矩。Eyy = Ey * Ey';%更新ryy.r = r + id vectorlength *(m + eyy);%[13]中(A.13)式%附加EyTotaleycotal(:,idx)= ey;idx = idx + 1;%如果使用最小分歧,请更新伽玛。如果最终伽玛=伽马+(M + Eyy);%[13]中(A.18)式结尾结尾结尾%计算T.TT = EyTotal * f ';%[13]中(A.12)式%最大化V = TT ' * pinv (R);%[13]中(A.16)式lambda = pinv((s  -  v * tt)/ n);[13]中%等式(A.17)%最小差异如果minimumDivergence = gamma/K;%[13]中(A.18)式V = V *胆固醇(γ,“低”);[13]中%等式(A.22)结尾结尾

培训G-PLDA模型后,您可以使用它来根据所描述的日志似然比计算分数[14].给定两个已居中,白细化和长度标准化的i-veroors,评分计算为:

分数 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向量, σ. 为噪声项的方差矩阵, V. 是特征性矩阵。的 C 项是可分解的常数,在实践中可以去掉。

speakerIdx =2;发话机=1;w1 = ivectors {speakerIdx} (:, utteranceIdx);speakerIdx =1;发话机=10;wt = vivectors {speakeridx}(:,发话机);Vvt = v * v';SigmaPlusVVT = PINV(LAMBDA)+ VVT;Term1 = PINV([SigmaPlusVVT VVT; VVT SigmaPlusVVT]);term2 = pinv(sigmaplusvvt);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”哇,...“EigenVoices”v,...“σ”,pinv(lambda));

注册

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

使用如下步骤序列为注册集中的每个扬声器的每个文件创建i-vectors:

  1. 特征提取

  2. Baum-Welch统计:确定Zeroth和一阶统计数据

  3. I - 矢量提取

  4. Intersession补偿

然后横跨文件的I-Vectors为扬声器创建I形向量模型。重复每个扬声器。

扬声器=唯一(Adsenroll.Labels);numSpeakers =元素个数(扬声器);注册专业eakersbyidx = Cell(NumSpeakers,1);tparspeakerIdx = 1: numSpeakers%将数据存储区集到您正在调整的扬声器。adspart = subset(adsenroll,adsenroll.labels ==扬声器(扬声器));numFiles =元素个数(adsPart.Files);ivectormat =零(尺寸(projectionmatrix,1),numfiles);fileidx = 1:numfiles audiodata =读取(Adspart);%提取特征Y = HelperFeatureextraction(Audiodata,AFE,符号因素);%计算后验对数似然logLikelihood = helperGMMLogLikelihood (Y, ubm);%计算后验归一化概率amax = max (logLikelihood [], 1);loglikelihood = max + log(sum(exp(logLikelihood-amax),1));gamma = exp(logLikelihood - logLikelihood)';%计算Baum-Welch统计n =总和(γ1);f = Y * gamma - n.*(ubmMu);% i矢量提取w = pinv (I + (TS。* repelem (n (:), numFeatures))的f * T * TSi * (:);% Intersession补偿w = projectionmatrix * w;ivectormat(:,fileidx)= w;结尾%i  - 矢量模型enrolledSpeakersByIdx {speakerIdx} =意味着(ivectorMat, 2);结尾FPRINTF('发言者登记(%0.0f秒).\n',TOC)
发言者登记(0秒)。

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

注册专用exce;s = 1:numSpeakers enrolledSpeakers.(string(speakers(s)))) = enrolledspeakbyidx {s};结尾

确认

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

scoringmethod =“GPLDA”

假拒绝率(FRR)

讲话者误拒率(FRR)是给定讲话者被错误拒绝的比率。为已登记的说话人i向量和同一个说话人的i向量创建一个分数数组。

speakersToTest =独特(adsDET.Labels);numSpeakers =元素个数(speakersToTest);scoreFRR =细胞(numSpeakers, 1);tpar扬声器= 1:NumSpeakers Adspart =子集(ADSDET,ADSDET.Labels == BudderStotest(SpeakerIDX));numFiles =元素个数(adsPart.Files);ivectorToTest = enrolledSpeakers。(string (speakersToTest (speakerIdx)));%#OK 得分=零(numfiles,1);fileidx = 1:numfiles audiodata =读取(Adspart);%提取特征Y = HelperFeatureextraction(Audiodata,AFE,符号因素);%计算后验对数似然logLikelihood = helperGMMLogLikelihood (Y, ubm);%计算后验归一化概率amax = max (logLikelihood [], 1);loglikelihood = max + log(sum(exp(logLikelihood-amax),1));gamma = exp(logLikelihood - logLikelihood)';%计算Baum-Welch统计n =总和(γ1);f = Y * gamma - n.*(ubmMu);%提取矢量iw = pinv (I + (TS。* repelem (n (:), numFeatures))的f * T * TSi * (:);% Intersession补偿w = projectionmatrix * w;%的分数如果Strcmpi(ScoringMethod,“CSS”) score(fileIdx) = dot(ivectorToTest,w)/(norm(w)*norm(ivectorToTest));其他的分数(fileIdx) = gpldaScore (gpldaModel w ivectorToTest);结尾结尾scoreFRR {speakerIdx} =分数;结尾FPRINTF('FRR计算(%0.0f秒)。\ n',TOC)
FRR计算(17秒)。

假验收率(远)

发言者错误接受率(遥远)是不属于登记扬声器的速率的速率被错误地被接受为属于登记的扬声器。为已注册的扬声器和不同扬声器的i-vectors创建一系列分数。

speakersToTest =独特(adsDET.Labels);numSpeakers =元素个数(speakersToTest);记分=细胞(NumSpeakers,1);tparspeakerIdx = 1:numSpeakers adpart =子集(adsDET,adsDET. labels ~=speakersToTest(speakerIdx));numFiles =元素个数(adsPart.Files);ivectorToTest = enrolledSpeakers。(string (speakersToTest (speakerIdx)));%#OK 得分=零(numfiles,1);fileidx = 1:numfiles audiodata =读取(Adspart);%提取特征Y = HelperFeatureextraction(Audiodata,AFE,符号因素);%计算后验对数似然logLikelihood = helperGMMLogLikelihood (Y, ubm);%计算后验归一化概率amax = max (logLikelihood [], 1);loglikelihood = max + log(sum(exp(logLikelihood-amax),1));gamma = exp(logLikelihood - logLikelihood)';%计算Baum-Welch统计n =总和(γ1);f = Y * gamma - n.*(ubmMu);%提取矢量iw = pinv (I + (TS。* repelem (n (:), numFeatures))的f * T * TSi * (:);% Intersession补偿w = projectionMatrix * w;%的分数如果Strcmpi(ScoringMethod,“CSS”) score(fileIdx) = dot(ivectorToTest,w)/(norm(w)*norm(ivectorToTest));其他的分数(fileIdx) = gpldaScore (gpldaModel w ivectorToTest);结尾结尾记分{speakeridx} =得分;结尾FPRINTF(` FAR ` (%0.0f秒).\n `,TOC)
FAR计算(17秒)。

相同的错误率(eer)

要比较多个系统,您需要一个结合FAR和FRR性能的单一指标。为此,您需要确定等错误率(EER),这是FAR和FRR曲线满足的阈值。在实践中,EER阈值可能不是最佳选择。例如,如果使用说话人验证作为有线传输的多身份验证方法的一部分,FAR很可能比FRR更重要。

阿明= min(猫(scoreFRR {:}, scoreFAR {:}));amax = max(猫(scoreFRR {:}, scoreFAR {:}));thresholdsToTest = linspace (amin amax, 1000);%计算每个阈值的FRR。如果Strcmpi(ScoringMethod,“CSS”的)CSS中的%,一个较大的分数表示注册和测试virtors%相似。FRR =均值(CAT(1,CASSFR {:})<阈值);= =平均值(猫(1,scountfar {:})>阈值);其他的%在G-PLDA中,较小的分数表明注册和测试载体是%相似。FRR =均值(CAT(1,CASSFRR {:})>阈值);FAR =平均值(CAT(1,Scorefar {:})<阈值);结尾[~,EERThresholdIdx] = min(abs(FAR - FRR));EERThreshold = thresholdsToTest (EERThresholdIdx);无论何时=意味着([(EERThresholdIdx), FRR (EERThresholdIdx)]);图绘制(thresholdsToTest,,'k'...thresholdsToTest FRR,“b”...EERThreshold,无论何时,'ro'“MarkerFaceColor”'r')标题(sprintf ('等错误率= %0.4f,阈值= %0.4f',eer,eerthreshold))xlabel(“阈值”) ylabel (的错误率)传说('虚假接受率(远)'“误拒率”“等错误率(EER)”“位置”“最佳”) 网格紧的

金宝app支持功能

特征提取与归一化

函数(特性,numFrames) = helperFeatureExtraction (afe audioData, normFactors)%的输入:%audiodata  - 音频数据的列向量%afe  -  audiofeatureextractor对象% normFactors -用于标准化的特征的平均值和标准偏差。%如果normFactors为空,则不应用标准化。%输出%特征 - 提取的特征矩阵% numFrames -返回的帧数(特征向量)%标准化audioData = audioData / max (abs (audioData (:)));%保护禁止纳尼audiodata(Isnan(audiodata))= 0;分离语音片段idx = detectSpeech (audioData afe.SampleRate);特点= [];II = 1:大小(IDX,1)f =提取物(AFE,AUDIODATA(IDX(II,1):IDX(II,2)));特征= [特征; f];% #好< AGROW >结尾%功能正常化如果~isempty(normFactors) features = (features-normFactors. mean ')./normFactors. std ';结尾特点=功能”;倒谱平均减法%(用于信道噪声)如果~isempty(normFactors) feature = feature - mean(feature,“所有”);结尾numFrames =大小(功能,2);结尾

高斯多组分混合物对数似然

函数l = helpergmloglikelihion(x,gmm)xminusmu = repmat(x,1,1,numel(gmm.componentpropopage)) -  permute(gmm.mu,[1,3,2]);permutingsigma = ympute(gmm.sigma,[1,3,2]);lunweighted = -0.5 *(sum(log(matutesigma),1)+ sum(xminusmu. *(xminusmu./permutegma),1)+ size(gmm.mu,1)* log(2 * pi));temp =挤压(换算(Lun Wighted,[1,3,2]));如果尺寸(temp, 1) = = 1%如果只有一个帧,末尾的单例维度为折扣中的%删除。这对该边缘案例进行了帐户。temp = temp ';结尾l = temp + log(gmm.componentproport)';结尾

G-PLDA得分

函数分数= gpldaScore (w1, gpldaModel wt)%集中数据w1 = w1 - gpldammodel .mu;wt = wt - gpldammodel .mu;%漂白数据= gpldaModel.WhiteningMatrix * 1;wt = gpldaModel.WhiteningMatrix * wt;%长度 - 标准化数据w1 = w1./vecnorm (w1);wt = wt./vecnorm (wt);%基于对数似然对i向量的相似性进行评分。vvt = gpldamodel.eigenvoices * gpldamodel.eigenvoices';svvt = gpldamodel.sigma + Vvt;Term1 = PINV([SVVT VVT; VVT SVVT]);Term2 = PINV(SVVT);w1wt = [w1; wt];得分= w1wt'* term1 * w1wt  -  w1'* term2 * w1  -  wt' * term2 * wt;结尾

参考

[1] Reynolds, Douglas A.等,“使用自适应高斯混合模型的说话人验证”。数字信号处理,第10卷,第5期。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.等,《说话人验证中说话人变异性的研究》。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。

Matejka, Pavel, Ondrej Glembek, Fabio Castaldo, m.j. Alam, Oldrich Plchot, Patrick Kenny, Lukas Burget, Jan cernoky。i-Vector Speaker验证中的全协方差UBM和重尾PLDA2011 IEEE声学、语音和信号处理国际会议(ICASSP),2011年。https://doi.org/10.1109/icassp.2011.5947436。

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

信号处理与语音通信实验室。已于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] verma,pulkit和pradip k. das。“语音处理应用中的I-Vectors:调查。”国际语音技术杂志第18卷第2期4, 2015年12月,第529-46页。DOI.org (Crossref), doi: 10.1007 / s10772 - 015 - 9295 - 3。

[11] D. Garcia-Romero和C. Espy-Wilson,“说话人识别系统中的i向量长度归一化分析”。interspeech., 2011, pp. 249-252。

[12]肯尼,帕特里克。带有重尾先验的贝叶斯说话人验证。奥德赛2010 -演讲者和语言识别研讨会,布尔诺,捷克共和国,2010年。

[13] Sizov,Aleksandr,Kong Aik Lee和Tomi Kinnunen。“统一的概率线性判别分析在生物识别身份验证中的变体。”《计算机科学结构、句法和统计模式识别》讲义, 2014, 464 - 75。https://doi.org/10.1007/978 - 3 - 662 - 44415 - 3 - _47。

[14] Rajan,Padmanabhan,Anton Afanasyev,VilleHautamäki和Tomi Kinnunen。“从单一到多个入学I-vorcors:扬声器验证的实用PLDA评分变体。”数字信号处理31日(8):93 - 101。https://doi.org/10.1016/j.dsp.2014.05.001。