主要内容

演讲者验证使用i-Vectors

演讲者验证或认证,确认演讲者的身份的任务就是他们声称。演讲者验证多年来一直是一个活跃的研究领域。早期的性能突破是使用高斯混合模型和通用背景模型(GMM-UBM)[1](通常在声学特性mfcc)。例如,看到的演讲者使用高斯混合模型验证。的一个主要困难GMM-UBM系统涉及intersession可变性。联合因子分析(时装周)分别提出了弥补这种可变性建模inter-speaker可变性和通道或会话的变化[2][3]。然而,[4]日本足球协会也发现通道因素包含关于扬声器的信息,并提出结合通道和扬声器空间总变化空间。Intersession可变性当时补偿利用后台程序,如线性判别分析(LDA)和在类协方差归一化(WCCN),后跟一个评分,如余弦相似性得分。[5]提出更换的余弦相似性得分概率LDA (PLDA)模型。[11][12]提出了一种方法来Gaussianize i-vectors PLDA因此做高斯假设,称为G-PLDA或简化PLDA。虽然i-vectors最初提出了议长验证,他们已经应用于很多问题,如语言识别,演讲者diarization,情感识别,年龄估计,和欺骗[10]。最近,深度学习技术提出了i-vectors替换d-vectorsx-vectors[8][6]

使用一个矢量i系统

音频工具箱提供了ivectorSystem封装能力训练的一个矢量i系统,招收扬声器或其他音频标签,评估系统决定阈值,并确定或验证使用者或其他音频标签。看到ivectorSystem使用这个特性的例子和应用到多个应用程序。

学习更多的关于一个矢量i系统是如何工作的,继续的例子。

开发一个矢量i系统

在本例中,您开发一个标准矢量i扬声器系统验证,使用一个LDA-WCCN后端与余弦相似性得分或G-PLDA得分。

在这个例子中,你会发现生活控制可调参数。改变控制不重新运行的例子。如果你改变一个控制,您必须重新运行的例子。

数据集管理

下面的例子使用了球场跟踪数据库从格拉茨工业大学(PTDB-TUG)[7]。数据集由英语母语阅读2342 TIMIT语料库的语音学上丰富的句子。下载并提取数据集,取决于您的系统,下载和提取数据集可以大约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对象指向数据集的数据集。最初是用于pitch-tracking培训和评估,包括喉动描记器读数和基线距决定。只使用原始的录音。

广告= audioDatastore ([fullfile (datasetFolder“语音数据”,“女性”,“麦克风”),fullfile (datasetFolder,“语音数据”,“男性”,“麦克风”)),“IncludeSubfolders”,真的,“FileExtensions”,“wav”);文件名= 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人。评价组包含四个扬声器和进一步分为一组注册和一组评估检测错误的折衷训练矢量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);

显示标签分布产生的audioDatastore对象。

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

从训练数据集读取一个音频文件,听它,情节。重置数据存储。

[音频、audioInfo] =阅读(adsTrain);fs = audioInfo.SampleRate;t =(0:大小(音频,1)1)/ fs;声音(音频、fs)情节(t)、音频)包含(“时间(s)”)ylabel (“振幅”1)轴([0 t(结束)1])标题(“从训练集样本话语”)

重置(adsTrain)

可以减少使用的数据集和参数的数量在这个例子中加速运行时性能为代价的。一般来说,减少数据集开发和调试是一个很好的实践。

speedUpExample =;如果speedUpExample adsTrain = splitEachLabel (adsTrain 30);adsDET = splitEachLabel (adsDET 21);结束

特征提取

创建一个audioFeatureExtractor对象提取20 MFCCs 20 delta-MFCCs, 20δMFCCs。使用一个δ窗口长度为9。提取特征从25 ms损害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系统计算昂贵和耗时。如果你有并行计算工具箱™,您可以跨多个核心加快传播工作的例子。确定系统的最优数量的分区。如果你没有并行计算工具箱™,使用单个分区。

如果~ isempty(版本(“平行”)& & ~ speedUpExample池=质量;numPar = numpartitions (adsTrain、池);其他的numPar = 1;结束
开始平行池(parpool)使用“本地”概要文件…连接到平行池(工人数量:6)。

特征归一化因子

使用helper函数,helperFeatureExtraction从数据集合中提取所有功能。helperFeatureExtraction函数从区域提取MFCC的演讲音频。语音检测执行的detectSpeech函数。

featuresAll = {};抽搐parfor2 = 1:numPar adsPart =分区(adsTrain、numPar ii);featuresPart =细胞(0,元素个数(adsPart.Files));3 = 1:元素个数(adsPart.Files) audioData =阅读(adsPart);featuresPart {3} = helperFeatureExtraction (afe audioData, []);结束featuresAll = [featuresAll, featuresPart];结束allFeatures =猫(2,featuresAll {:});流(训练集的特征提取完整(f % 0.0秒)。toc)
从训练集完成特征提取(58秒)。

计算每个特性的全球平均值和标准偏差。您将使用这些在以后调用helperFeatureExtraction规范化的特性函数。

normFactors。米ean = mean(allFeatures,2,“omitnan”);normFactors。年代TD = std(allFeatures,[],2,“omitnan”);

通用背景模型(UBM)

初始化高斯混合模型(GMM)将通用背景模型(UBM)矢量i系统。初始化组件的重量均匀分布。系统训练TIMIT数据集通常包含大约2048个组件。

numComponents =64年;如果speedUpExample numComponents = 32;结束numComponentsα= 1 (1)/ numComponents;μ= randn (numFeatures numComponents);变化=兰德(numFeatures numComponents) +每股收益;于是=结构(“ComponentProportion”α,“亩”亩,“σ”、变化);

训练UBM使用采用(EM)算法。

麦克斯特=10;如果speedUpExample麦克斯特= 2;结束抽搐iter = 1:麦克斯特抽搐%的期望N = 0 (1、numComponents);F = 0 (numFeatures numComponents);S = 0 (numFeatures numComponents);L = 0;parfor2 = 1:numPar adsPart =分区(adsTrain、numPar ii);hasdata (adsPart) audioData =阅读(adsPart);%提取特征afe, Y = helperFeatureExtraction (audioData normFactors);%计算后验log-liklihoodlogLikelihood = helperGMMLogLikelihood (Y, ubm);%计算后验概率归一化amax = max (logLikelihood [], 1);logLikelihoodSum = amax +日志(sum (exp (logLikelihood-amax), 1));γ= exp (logLikelihood - logLikelihoodSum) ';%计算Baum-Welch统计n =总和(γ1);f = Y *伽马;s = (Y * Y) *伽马;%更新充分统计话语N = N + N;= F + F;S = S + S;%更新对数似L = L +总和(logLikelihoodSum);结束结束%打印当前对数似流(“培训UBM: % d / % d完成(f % 0.0秒),对数似= % 0.0 f \ n 'iter,麦克斯特、toc、L)%最大化N = max (N, eps);于是。ComponentProportion = max(N/sum(N),eps); ubm.ComponentProportion = ubm.ComponentProportion/sum(ubm.ComponentProportion); ubm.mu = F./N; ubm.sigma = max(S./N - ubm.mu.^2,eps);结束
培训UBM: 1/10完成(59秒),对数似= -162907120培训UBM: 2/10完成(53秒),对数似= -82282814培训UBM: 3/10完成(54秒),对数似= -78667384培训UBM: 4/10完成(55秒),对数似= -77041863培训UBM: 5/10完成(54秒),对数似= -76338342培训UBM: 6/10完成(52秒),对数似= -75958218培训UBM: 7/10完成(52秒),对数似= -75724712培训UBM: 8/10完成(53秒),对数似= -75561701培训UBM: 9/10完成(54秒),对数似= -75417170培训UBM: 10/10完成(55秒),对数似= -75275185

计算Baum-Welch统计

Baum-Welch统计的N(零级)和F(一阶)统计中使用EM算法,计算最终于是。

N c ( 年代 ) = t γ t ( c )

F c ( 年代 ) = t γ t ( c ) Y t

  • Y t 特征向量在时间吗 t

  • 年代 { 年代 1 , 年代 2 , , 年代 N } ,在那里 N 是扬声器的数量。为了训练总变化空间,每个音频文件被认为是一个单独的发言人(是否属于物理单扬声器)。

  • γ t ( c ) 的后验概率UBM组件 c 占特征向量 Y t

计算第0和一阶Baum-Welch统计训练集。

numSpeakers =元素个数(adsTrain.Files);数控= {};Fc = {};抽搐parfor2 = 1:numPar adsPart =分区(adsTrain、numPar ii);numFiles =元素个数(adsPart.Files);Npart =细胞(1、numFiles);Fpart =细胞(1、numFiles);jj = 1: numFiles audioData =阅读(adsPart);%提取特征afe, Y = helperFeatureExtraction (audioData normFactors);%计算后验对数似logLikelihood = helperGMMLogLikelihood (Y, ubm);%计算后验概率归一化amax = max (logLikelihood [], 1);logLikelihoodSum = amax +日志(sum (exp (logLikelihood-amax), 1));γ= exp (logLikelihood - logLikelihoodSum) ';%计算Baum-Welch统计n =总和(γ1);f = Y *伽马;Npart {jj} =重塑(n, 1, 1, numComponents);Fpart {jj} =重塑(f, numFeatures 1 numComponents);结束数控=(数控,Npart);Fc = (Fc, Fpart);结束流(“Baum-Welch统计完成(f % 0.0秒)。\ n”toc)
Baum-Welch统计完成(54秒)。

统计数据扩展到矩阵和中心 F ( 年代 ) 描述的一样,[3],这样

  • N ( 年代 ) 是一个 C F × C F 对角矩阵的块 N c ( 年代 ) ( c = 1 , C )

  • F ( 年代 ) 是一个 C F × 1 supervector通过连接 F c ( 年代 ) ( c = 1 , C )

  • C 于是是组件的数量。

  • F 特征的数量在一个特征向量。

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

因为这个例子假定于是对角协方差矩阵,N也对角矩阵,保存作为高效计算的向量。

总可变性空间

i矢量模型,理想的议长supervector由与说话者不相关的组件和一个特定人组件。人依赖组件由总变异的空间模型和议长的矢量i。

= + 太瓦

  • 说话者话语supervector吗

  • 演讲者,channel-independent supervector,可以采取于是supervector。

  • T 是一个低秩矩形矩阵和代表总变异子空间。

  • w 是演讲者的矢量i

i矢量的维数, w ,通常远低于C F维说话者话语supervector矢量i,或i-vectors更加紧凑和易于管教的表示。

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

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

l T ( 年代 ) = + T × Σ - - - - - - 1 × N ( 年代 ) × T

2。积累统计整个扬声器。

Κ = 年代 F ( 年代 ) × ( l T - - - - - - 1 ( 年代 ) × T × Σ - - - - - - 1 × F ( 年代 ) )

一个 c = 年代 N c ( 年代 ) l T - - - - - - 1 ( 年代 )

3所示。更新总变化空间。

T c = 一个 c - - - - - - 1 × Κ

T = ( T 1 T 2 T C ]

[3]提出初始化 Σ 于是方差,然后更新 Σ 根据方程:

Σ = ( 年代 N ( 年代 ) ) - - - - - - 1 ( ( 年代 年代 ( 年代 ) ) - - - - - - 诊断接头 ( Κ × T ) )

S (S)为中心的二阶Baum-Welch统计。然而,更新 Σ 通常是下降在实践中影响不大。这个例子不更新 Σ

创建σ变量。

σ= ubm.sigma (:);

指定总变化空间的维数。一个典型的值用于TIMIT数据集1000。

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

初始化T单位矩阵,preallocate细胞阵列。

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

设置迭代次数进行训练。典型值是20。

numIterations =5;

训练循环运行。

iterIdx = 1: numIterations抽搐% 1。计算隐藏变量的后验分布TtimesInverseSSdiag = (t /σ)';parfors = 1: numSpeakers L = (I + TtimesInverseSSdiag。* N{年代}* T);Linv{年代}= pinv (L);是{年代}= Linv{年代}* TtimesInverseSSdiag * F{年代};Eyy{年代}= Linv{年代}+迪士尼{年代}*是{年代}';结束% 2。Accumlate统计整个扬声器Eymat =猫(2哦,是吧{:});FFmat =猫(2 F {:});Kt = FFmat * Eymat ';K = mat2cell (Kt、numTdim repelem (numFeatures numComponents));纽特=细胞(numComponents, 1);c = 1: numComponents AcLocal = 0 (numTdim);s = 1: numSpeakers AcLocal = AcLocal + Nc{年代}(:,:,c) * Eyy{年代};结束% 3。更新总变化空间纽特·c {} = (pinv (AcLocal) * K c {}) ';结束猫(T = 1,纽特{:});流(培训总可变性空间:% d / % d完成(f % 0.0秒)。\ n”,numIterations iterIdx toc)结束
培训总可变性空间:1/5完成(2秒)。培训总可变性空间:2/5完成(2秒)。培训总可变性空间:3/5完成(2秒)。培训总可变性空间:4/5完成(1秒)。培训总可变性空间:5/5完成(1秒)。

i矢量提取

计算总可变性空间之后,就可以计算出i-vectors[4]:

w = ( + T Σ - - - - - - 1 NT ) T Σ - - - - - - 1 F

在这一点上,你还是考虑每个培训文件作为一个单独的演说家。然而,在下一步,当你训练一个投影矩阵来降低维数,增加inter-speaker差异,i-vectors必须用适当的标记,不同的扬声器id。

创建一个单元阵列的单元数组,每个元素包含一个矩阵的i-vectors文件特定的演讲者。

演讲者=独特(adsTrain.Labels);numSpeakers =元素个数(扬声器);ivectorPerSpeaker =细胞(numSpeakers, 1);TS = t /σ;TSi = TS ';ubmMu = ubm.mu;抽搐parforspeakerIdx = 1: numSpeakers%子集演讲者你适应的数据存储。adsPart =子集(adsTrain adsTrain.Labels = =扬声器(speakerIdx));numFiles =元素个数(adsPart.Files);ivectorPerFile = 0 (numTdim numFiles);fileIdx = 1: numFiles audioData =阅读(adsPart);%提取特征afe, Y = helperFeatureExtraction (audioData normFactors);%计算后验对数似logLikelihood = helperGMMLogLikelihood (Y, ubm);%计算后验概率归一化amax = max (logLikelihood [], 1);logLikelihoodSum = amax +日志(sum (exp (logLikelihood-amax), 1));γ= exp (logLikelihood - logLikelihoodSum) ';%计算Baum-Welch统计n =总和(γ1);f = Y *γ- n。* (ubmMu);ivectorPerFile (:, fileIdx) = pinv (I + (TS。* repelem (n (:), numFeatures))的f * T * TSi * (:);结束ivectorPerSpeaker {speakerIdx} = ivectorPerFile;结束流(“I-vectors从训练集(f % 0.0秒)。\ n”toc)
I-vectors从训练集(60秒)。

投影矩阵

提出了许多不同的后端i-vectors。最直接的,仍然表现良好的一个是线性判别分析(LDA)和在类协方差归一化(WCCN)。

创建一个矩阵矢量i的训练向量和地图显示对应的演说家。初始化投影矩阵是一个单位矩阵。

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

LDA试图最小化之间的内部类方差和方差最大化扬声器。它可以计算中概述[4]:

鉴于:

年代 b = 年代 = 1 年代 ( w 年代 - - - - - - w ) ( w 年代 - - - - - - w )

年代 w = 年代 = 1 年代 1 n 年代 = 1 n 年代 ( w 年代 - - - - - - w 年代 ) ( w 年代 - - - - - - w 年代 )

在哪里

  • w 年代 = ( 1 n 年代 ) = 1 n 年代 w 年代 为每个演讲者是i-vectors的意思。

  • w = 1 N 年代 = 1 年代 = 1 n 年代 w 年代 在所有扬声器是均值矢量i。

  • n 年代 为每个演讲者是话语的数量。

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

年代 b v = λ 年代 w v

最好的特征向量是最高的特征值。

performLDA =真正的;如果performLDA抽搐numEigenvectors =16;Sw = 0(大小(projectionMatrix, 1));某人= 0(大小(projectionMatrix, 1));wbar =意味着(猫(2 w {:}), 2);2 = 1:元素个数(w) ws = w {2};wsbar =意味着(ws, 2);某人= + (wsbar - wbar) * (wsbar - wbar) ';Sw = Sw + x (ws ', 1);结束(~)= eigs(某人,西南,numEigenvectors);= (A / vecnorm (A)) ';ivectorsTrain = * ivectorsTrain;w = mat2cell (ivectorsTrain、大小(ivectorsTrain, 1), utterancePerSpeaker);projectionMatrix = * projectionMatrix;流(“LDA投影矩阵计算(f % 0.2秒)。toc)结束
LDA投影矩阵计算(0.22秒)。

WCCN试图规模与课堂反向i矢量空间协方差,这方向矢量i intra-speaker高变异性方面的重要性的比较[9]

鉴于在类的协方差矩阵:

W = 1 年代 年代 = 1 年代 1 n 年代 = 1 n 年代 ( w 年代 - - - - - - w 年代 ) ( w 年代 - - - - - - w 年代 )

在哪里

  • w 年代 = ( 1 n 年代 ) = 1 n 年代 w 年代 为每个演讲者是i-vectors的意思。

  • n 年代 为每个演讲者是话语的数量。

解决B使用柯列斯基分解:

W - - - - - - 1 = BB

performWCCN =真正的;如果performWCCN抽搐α=0.9;W = 0(大小(projectionMatrix, 1));2 = 1:元素个数(w) w = w + x (w {2} ', 1);结束W = W /元素个数(W);W =(1 -α)* W +α*眼(大小(W, 1));B =胆固醇(pinv (W),“低”);projectionMatrix = B * projectionMatrix;流(“WCCN投影矩阵计算(f % 0.4秒)。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-vectors的意思, Λ 是一个完整的噪声项的精度矩阵 ε ij , V 因子载荷矩阵,也称为eigenvoices。

指定要使用eigenvoices的数量。通常数字介于10到400之间。

numEigenVoices =16;

确定的数量不相交的人,特征向量的维数,每个演讲者和话语的数量。

K =元素个数(ivectors);D =大小(ivectors {1}, 1);utterancePerSpeaker = cellfun (@ (x)大小(x, 2), ivectors);

发现样品的总数和中心i-vectors。

N = = 1 K n

μ = 1 N , j ϕ , j

φ ij = ϕ ij - - - - - - μ

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

确定一个美白从培训i-vectors矩阵,然后i-vectors美白。指定ZCA美白,PCA美白,美白。

whiteningType =“ZCA”;如果strcmpi (whiteningType“ZCA”)S = x (ivectorsMatrix ');[~,sD, sV] =圣言(年代);W =诊断接头(1. /(√诊断接头(sD)) + eps)) * sV ';ivectorsMatrix = W * ivectorsMatrix;elseifstrcmpi (whiteningType主成分分析的)S = x (ivectorsMatrix ');(sV, sD) = eig(年代);W =诊断接头(1. /(√诊断接头(sD)) + eps)) * sV ';ivectorsMatrix = W * ivectorsMatrix;其他的W =眼睛(大小(ivectorsMatrix, 1));结束

适用于长度归一化,然后训练矢量i矩阵转换回一个细胞数组。

ivectorsMatrix = ivectorsMatrix. / vecnorm (ivectorsMatrix);

计算全球二阶矩

年代 = ij φ ij φ ij T

S = ivectorsMatrix * ivectorsMatrix ';

培训i矢量矩阵转换回一个细胞数组。

ivectors = mat2cell (ivectorsMatrix D utterancePerSpeaker);

那种人根据样本的数量,然后组i-vectors每个说话人的话语数量。Precalculate的一阶矩 届人

f = j = 1 n φ ij

uniqueLengths =独特(utterancePerSpeaker);numUniqueLengths =元素个数(uniqueLengths);speakerIdx = 1;f = 0 (D、K);uniqueLengthIdx = 1: numUniqueLengths idx =找到(utterancePerSpeaker = = uniqueLengths (uniqueLengthIdx));temp = {};speakerIdxWithinUniqueLength = 1:元素个数(idx)ρ= ivectors (idx (speakerIdxWithinUniqueLength));temp =(临时;ρ);% #好< AGROW >f (:, speakerIdx) =(ρ{:},2)总和;speakerIdx = speakerIdx + 1;结束ivectorsSorted {uniqueLengthIdx} = temp;% #好< SAGROW >结束

初始化eigenvoices矩阵,V,逆噪声方差, Λ

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

指定EM算法和迭代的数量是否适用最低散度。

numIter =5;minimumDivergence =真正的;

火车G-PLDA模型中描述使用EM算法[13]

iter = 1: numIter%的期望γ= 0 (numEigenVoices numEigenVoices);EyTotal = 0 (numEigenVoices K);R = 0 (numEigenVoices numEigenVoices);idx = 1;lengthIndex = 1: numUniqueLengths ivectorLength = uniqueLengths (lengthIndex);%隔离i-vectors相同的长度4 = ivectorsSorted {lengthIndex};%计算MM = pinv (ivectorLength * (V *(λ* V)) +眼(numEigenVoices));%方程(A.7) [13]%循环遍历每个演讲者对当前i矢量长度speakerIndex = 1:元素个数(iv)% V的潜变量的第一时刻嗯= M * V ' *λ* f (:, idx);%方程(如系)[13]%计算二阶矩。Eyy =莎莉莎莉';%更新RyyR = R + ivectorLength * (M + Eyy);%方程(A.13) [13]%附加EyTotalEyTotal (:, idx) =等等;idx = idx + 1;%如果使用最低发散,更新γ。如果minimumDivergenceγ=伽马+ (M + Eyy);%方程(A.18) [13]结束结束结束%计算TTT = EyTotal * f ';%方程(A.12) [13]%最大化V = TT ' * pinv (R);%方程(A.16) [13]λ= pinv ((S - V * TT) / N);%方程(A.17) [13]%最小差异如果minimumDivergenceγ=γ/ K;%方程(A.18) [13]V = V *胆固醇(γ,“低”);%方程(A.22) [13]结束结束

一旦你训练G-PLDA模型,您可以使用它来计算得分中描述基于对数似然比[14]。给定两个i-vectors已集中、增白和length-normalized,分数计算为:

分数 ( 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 是eigenvoice矩阵。的 C 术语是提出作,在实践中可以删除。

speakerIdx =2;utteranceIdx =1;w1 = ivectors {speakerIdx} (:, utteranceIdx);speakerIdx =1;utteranceIdx =10;wt = ivectors {speakerIdx} (:, utteranceIdx);VVt = V *”;SigmaPlusVVt = pinv(λ)+ 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-vectors,取决于您的系统,入学率ivectors,不用于G-PLDA模型的训练。在以下评估部分中,您使用前所未有的登记和验证数据。支持函数金宝app,gpldaScore封装了上面得分步骤,而且执行定心,美白和规范化。保存培训G-PLDA模型作为struct使用支持功能金宝appgpldaScore

gpldaModel =结构(“亩”亩,“WhiteningMatrix”W,“EigenVoices”V,“σ”pinv(λ));

招收

招收新的扬声器没有训练数据集。

为每个文件创建i-vectors招收设置使用这个序列中的每个扬声器的步骤:

  1. 特征提取

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

  3. i矢量提取

  4. Intersession补偿

然后平均i-vectors跨文件创建一个演讲者i矢量模型。为每个演讲者重复。

演讲者=独特(adsEnroll.Labels);numSpeakers =元素个数(扬声器);enrolledSpeakersByIdx =细胞(numSpeakers, 1);抽搐parforspeakerIdx = 1: numSpeakers%子集演讲者你适应的数据存储。adsPart =子集(adsEnroll adsEnroll.Labels = =扬声器(speakerIdx));numFiles =元素个数(adsPart.Files);ivectorMat = 0(大小(projectionMatrix, 1), numFiles);fileIdx = 1: numFiles audioData =阅读(adsPart);%提取特征afe, Y = helperFeatureExtraction (audioData normFactors);%计算后验对数似logLikelihood = helperGMMLogLikelihood (Y, ubm);%计算后验概率归一化amax = max (logLikelihood [], 1);logLikelihoodSum = amax +日志(sum (exp (logLikelihood-amax), 1));γ= exp (logLikelihood - logLikelihoodSum) ';%计算Baum-Welch统计n =总和(γ1);f = Y *γ- 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);结束流(的扬声器(f % 0.0秒)。\ n”toc)
扬声器(0秒)。

用于记账,i-vectors单元阵列的转换为一个结构,与演讲者id字段和i-vectors值

enrolledSpeakers =结构;s = 1: numSpeakers enrolledSpeakers。(string(扬声器(s))) = enrolledSpeakersByIdx{年代};结束

验证

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

scoringMethod =“GPLDA”;

假废品率(FRR)

演讲者错误拒绝率(FRR)是率给定的演讲者是错误地拒绝。创建一个数组的分数录取议长i-vectors和i-vectors相同的演说家。

speakersToTest =独特(adsDET.Labels);numSpeakers =元素个数(speakersToTest);scoreFRR =细胞(numSpeakers, 1);抽搐parforspeakerIdx = 1: numSpeakers adsPart =子集(adsDET adsDET.Labels = = speakersToTest (speakerIdx));numFiles =元素个数(adsPart.Files);ivectorToTest = enrolledSpeakers。(string (speakersToTest (speakerIdx)));% #好< PFBNS >分数= 0 (numFiles, 1);fileIdx = 1: numFiles audioData =阅读(adsPart);%提取特征afe, Y = helperFeatureExtraction (audioData normFactors);%计算后验对数似logLikelihood = helperGMMLogLikelihood (Y, ubm);%计算后验概率归一化amax = max (logLikelihood [], 1);logLikelihoodSum = amax +日志(sum (exp (logLikelihood-amax), 1));γ= exp (logLikelihood - logLikelihoodSum) ';%计算Baum-Welch统计n =总和(γ1);f = Y *γ- n。* (ubmMu);%提取矢量iw = pinv (I + (TS。* repelem (n (:), numFeatures))的f * T * TSi * (:);% Intersession补偿w = projectionMatrix * w;%的分数如果strcmpi (scoringMethod“CSS”)得分(fileIdx) =点(ivectorToTest w) /(规范(w) *规范(ivectorToTest));其他的分数(fileIdx) = gpldaScore (gpldaModel w ivectorToTest);结束结束scoreFRR {speakerIdx} =分数;结束流(“FRR计算(f % 0.0秒)。\ n”toc)
FRR计算(17秒)。

错误接受率(远)

演讲者错误接受率(远)率,话语不属于一个入学的人错误地接受属于了议长。创建一个数组的分数录取扬声器和i-vectors不同的扬声器。

speakersToTest =独特(adsDET.Labels);numSpeakers =元素个数(speakersToTest);scoreFAR =细胞(numSpeakers, 1);抽搐parforspeakerIdx = 1: numSpeakers adsPart =子集(adsDET adsDET.Labels ~ = speakersToTest (speakerIdx));numFiles =元素个数(adsPart.Files);ivectorToTest = enrolledSpeakers。(string (speakersToTest (speakerIdx)));% #好< PFBNS >分数= 0 (numFiles, 1);fileIdx = 1: numFiles audioData =阅读(adsPart);%提取特征afe, Y = helperFeatureExtraction (audioData normFactors);%计算后验对数似logLikelihood = helperGMMLogLikelihood (Y, ubm);%计算后验概率归一化amax = max (logLikelihood [], 1);logLikelihoodSum = amax +日志(sum (exp (logLikelihood-amax), 1));γ= exp (logLikelihood - logLikelihoodSum) ';%计算Baum-Welch统计n =总和(γ1);f = Y *γ- n。* (ubmMu);%提取矢量iw = pinv (I + (TS。* repelem (n (:), numFeatures))的f * T * TSi * (:);% Intersession补偿w = projectionMatrix * w;%的分数如果strcmpi (scoringMethod“CSS”)得分(fileIdx) =点(ivectorToTest w) /(规范(w) *规范(ivectorToTest));其他的分数(fileIdx) = gpldaScore (gpldaModel w ivectorToTest);结束结束scoreFAR {speakerIdx} =分数;结束流(“远计算(f % 0.0秒)。\ n”toc)
计算(17秒)。

平等的错误率(曾经)

比较多个系统,你需要一个度量相结合和FRR性能。为此,您确定平等错误率(曾经),即阈值远和FRR曲线相遇的地方。在实践中,无论何时阈值可能不是最好的选择。例如,如果演讲者验证用作multi-authentication电汇方法的一部分,目前最有可能会比FRR权重。

阿明= min(猫(scoreFRR {:}, scoreFAR {:}));amax = max(猫(scoreFRR {:}, scoreFAR {:}));thresholdsToTest = linspace (amin amax, 1000);%计算FRR和远的阈值。如果strcmpi (scoringMethod“CSS”)%在CSS中,一个更大的分数表明注册和测试ivectors%相似。FRR =意味着(猫(scoreFRR {}): < thresholdsToTest);远=意味着(猫(scoreFAR {:}) > thresholdsToTest);其他的G-PLDA %,一个更小的分数表明注册和测试ivectors%相似。FRR =意味着(猫(scoreFRR {:}) > thresholdsToTest);远=意味着(猫(scoreFAR {}): < thresholdsToTest);结束[~,EERThresholdIdx] = min (abs(远- FRR));EERThreshold = thresholdsToTest (EERThresholdIdx);无论何时=意味着([(EERThresholdIdx), FRR (EERThresholdIdx)]);图绘制(thresholdsToTest,,“k”,thresholdsToTest FRR,“b”,EERThreshold,无论何时,“罗”,“MarkerFaceColor”,“r”)标题(sprintf (“平等错误率= % 0.4 f,阈值= % 0.4 f '无论何时,EERThreshold)包含(“阈值”)ylabel (的错误率)传说(的错误接受率(远),“错误拒绝率(FRR)”,“平等的错误率(曾经)”,“位置”,“最佳”网格)

金宝app支持功能

特征提取和标准化

函数(特性,numFrames) = helperFeatureExtraction (afe audioData, normFactors)%的输入:% audioData——列向量的音频数据% afe——audioFeatureExtractor对象% normFactors -平均值和标准偏差的特性用于规范化。%如果normFactors是空的,没有规范化。%%输出%特征矩阵的特征提取% numFrames的帧数(特征向量)返回%正常化audioData = audioData / max (abs (audioData (:)));%防止nanaudioData (isnan (audioData)) = 0;%隔离段演讲idx = detectSpeech (audioData afe.SampleRate);特点= [];2 = 1:尺寸(idx, 1) f =提取(afe, audioData (idx (2, 1): idx (2, 2)));特点=[功能;f];% #好< AGROW >结束%功能正常化如果= ~ isempty (normFactors)特性(features-normFactors.Mean”)。/ normFactors.STD ';结束特点=功能”;% Cepstral意味着减法(信道噪声)如果~ isempty (normFactors)特性=特征——意味着(特性,“所有”);结束numFrames =大小(功能,2);结束

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

函数L = helperGMMLogLikelihood (x, gmm) xMinusMu = repmat (x, 1, 1,元素个数(gmm.ComponentProportion))——交换(gmm.mu [1、3、2]);permuteSigma =排列(gmm.sigma [1、3、2]);Lunweighted = -0.5 *(和(日志(permuteSigma), 1) +总和(xMinusMu。* (xMinusMu. / permuteSigma), 1) +大小(gmm.mu, 1) *日志(2 *π));temp =挤压(排列(Lunweighted (1、3、2)));如果尺寸(temp, 1) = = 1%如果只有一个帧,落后于单维度%在交换中删除。这占边缘情况。temp = temp ';结束L = temp +日志(gmm.ComponentProportion) ';结束

G-PLDA得分

函数分数= gpldaScore (w1, gpldaModel wt)%的数据中心w1 = w1 - gpldaModel.mu;wt = wt - gpldaModel.mu;%美白的数据= gpldaModel.WhiteningMatrix * 1;wt = gpldaModel.WhiteningMatrix * wt;% Length-normalize数据w1 = w1. / vecnorm (w1);wt = wt. / vecnorm (wt);%的相似性得分i-vectors基于对数似。VVt = gpldaModel。EigenVoices * gpldaModel.EigenVoices ';SVVt = gpldaModel。σ+ VVt;term1 = pinv ([SVVt VVt; VVt SVVt]);term2 = pinv (SVVt);w1wt = (w1; wt);分数= w1wt ' * term1 * w1wt——w1 * term2 * w1 - wt的* term2 * wt;结束

引用

[1]雷诺兹,道格拉斯。,et al. “Speaker Verification Using Adapted Gaussian Mixture Models.”数字信号处理,10卷,不。2000年1月1 - 3,19-41页。DOI.org (Crossref),doi: 10.1006 / dspr.1999.0361。

[2]肯尼,帕特里克,et al。“联合因子分析与Eigenchannels在说话人识别。”IEEE音频、语音和语言处理,15卷,不。2007年5月4日,页。1435 - 47。DOI.org (Crossref),doi: 10.1109 / TASL.2006.881693。

[3]肯尼,P。,et al. “A Study of Interspeaker Variability in Speaker Verification.”IEEE音频、语音和语言处理,16卷,不。5,2008年7月,页980 - 88。DOI.org (Crossref),doi: 10.1109 / TASL.2008.925147。

[4]Dehak Najim, et al。“议长前端因素分析验证。”IEEE音频、语音和语言处理,19卷,不。4,2011年5月,页788 - 98。DOI.org (Crossref),doi: 10.1109 / TASL.2010.2064307。

帕维尔,[5]Matejka Ondrej Glembek,法比奥Castaldo, M.j。阿拉姆,Oldrich Plchot,帕特里克·肯尼·卢卡斯Burget, Jan Cernocky。“Full-Covariance UBM和重尾PLDA矢量i议长验证。”2011年IEEE国际会议音响、演讲和信号处理(ICASSP),2011年。https://doi.org/10.1109/icassp.2011.5947436。

[6]斯奈德,大卫,et al . " X-Vectors:健壮款嵌入的说话人识别。”2018年IEEE国际会议音响、演讲和信号处理(ICASSP),2018岁的IEEE 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,伊桑·等。“深层神经网络对小足迹Text-Dependent议长验证。”2014年IEEE国际会议音响、演讲和信号处理(ICASSP),2014岁的IEEE 4052 - 56页。DOI.org (Crossref),doi: 10.1109 / ICASSP.2014.6854363。

[9]Dehak、Najim Reda Dehak,詹姆斯·r .玻璃、道格拉斯·a·雷诺兹和帕特里克·肯尼。“余弦相似性得分没有分数归一化技术。”奥德赛(2010)。

[10]Verma Pulkit, Pradip Das。“I-Vectors语音处理的应用:一项调查。”国际语音识别技术杂志》上,18卷,不。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年,页249 - 252。

[12]肯尼,帕特里克。“重尾分布先验贝叶斯议长验证”。奥德赛2010 -演讲者和语言识别车间布尔诺,捷克共和国,2010年。

[13]斯、亚历山大、香港李Aik队效力,托米- Kinnunen。“统一概率线性判别分析变异生物认证。”课堂讲稿在计算机科学结构、句法和统计模式识别,2014,464 - 75。https://doi.org/10.1007/978 - 3 - 662 - 44415 - 3 - _47。

[14]Rajan Padmanabhan,安东gleb stolyarov城镇某某先生,托米- Kinnunen。2014。“从单一到多招生I-Vectors:实际PLDA得分变体议长验证。”数字信号处理31日(8):93 - 101。https://doi.org/10.1016/j.dsp.2014.05.001。