主要内容

使用x向量

扬声器分区化是根据扬声器的身份将音频信号分割成段的过程。它在不事先知道说话人的情况下回答了“谁在什么时候说话”的问题,根据应用情况,也不事先知道说话人的数量。

说话者diarization有很多应用,包括:通过根据活动说话者构建文本来增强语音转录、视频字幕、内容检索(简说了什么?)和扬声器计数(有多少人出席了会议?).

在本例中,您使用预训练的x向量系统执行扬声器的离散化[1]来表征音频区域和聚集层次聚类(AHC)来对相似的音频区域进行分组[2].要了解如何定义和训练x向量系统,请参见使用x向量识别说话人

下载预训练扬声器扩频系统

下载预先训练的扬声器扩频系统和支持文件。金宝app总大小约为22 MB。

downloadFolder = matlab.internal.examples.download金宝appSupportFile(“音频”“SpeakerDiarization.zip”);dataFolder = tempdir;unzip(下载文件夹,数据文件夹)netFolder = fullfile(数据文件夹,数据文件夹)“SpeakerDiarization”);目录(netFolder)

加载一个音频信号和一个包含地面真相注释的表。这个信号由五个扬声器组成。听音频信号并绘制其时域波形。

[audioIn,fs] = audioread(“exampleconversation.flac”);负载(“exampleconversationlabels.mat”) audioIn = audioIn./max(abs(audioIn));sound(audioIn,fs) t = (0:size(audioIn,1)-1)/fs;图(1)plot(t,audioIn)“时间(s)”) ylabel (“振幅”)轴

提取x-vectors

在本例中,您使用了一个预先训练好的x向量系统[1].要了解如何定义和训练x向量系统,请参见使用x向量识别说话人

负载预训练x矢量系统

加载轻量级预训练的x矢量系统。x向量系统包括:

  • afe——一个audioFeatureExtractor目的提取mel频率倒谱系数(MFCCs)。

  • 因素-包含从代表性数据集确定的mfc的平均值和标准偏差的结构。这些因素被用来标准化MFCCs。

  • dlnet-受过训练的dlnetwork.该网络用于从mfc中提取x向量。

  • projMat-训练过的投影矩阵,以降低x向量的维数。

  • plda-训练PLDA模型评分x向量。

Xvecsys = load(“xvectorSystem.mat”);

提取标准化声学特征

从音频数据中提取标准化的MFCC特征。查看特征分布,以确认从单独的数据集中学习到的标准化因子大致标准化了本例中派生的特征。标准分布的均值为0,标准差为1。

features = single((extract(xvecsys.afe,audioIn)-xvecsys.factors.Mean')./xvecsys.factors.STD');图(2)直方图(特征)“标准化MFCC”

提取x-Vectors

每个声学特征向量代表大约0.01秒的音频数据。将特征分成大约2秒的片段,片段之间间隔0.1秒。

featureVectorHopDur = (numel(xvecsys.afe.Window) - xvecsys.afe.OverlapLength)/xvecsys.afe.SampleRate;segmentDur =2;segmentHopDur =0.1;segmentLength = round(segmentDur/featureVectorHopDur);segmentHop = round(segmentHopDur/featureVectorHopDur);idx = 1:segmentLength;featuresSegmented = [];idx(end) < size(features,1) featuressegented = cat(3, featuressegented,features(idx,:));idx = idx + segmentHop;结束

从每个线段中提取x向量。x向量对应于训练的x向量模型中第一个全连接层的输出使用x向量识别说话人.第一个全连接层是对时间膨胀帧级层进行统计计算后的第一个段级层。看一下x向量随时间的变化。

xvecs = 0 (512,size(featuressegented,3));sample = 1:size(featuressegented,3) dlX = dlarray(featuressegented (:,:,sample),“TCB”);xvecs(:,sample) = predict(xvecsys.dlnet,dlX,Outputs=“fc_1”);结束图(3)冲浪(xvecs EdgeColor =“没有”) view([90,-90]) axis([1 size(xvecs,1) 1 size(xvecs,2)])“特征”) ylabel (“段”

应用预训练的线性判别分析(LDA)投影矩阵来降低x向量的维数,然后对x向量随时间进行可视化。

x = xvecsys.projMat*xvecs;图(4)冲浪(x ', EdgeColor =“没有”)视图((90、-90))轴([1大小(x, 1) 1大小(x, 2)])包含(“特征”) ylabel (“段”

集群x-vectors

x向量系统学习提取扬声器的紧凑表示(x向量)。对x向量进行聚类,使用聚类分层聚类(clusterdata(统计和机器学习工具箱))或k-均值聚类(kmeans(统计和机器学习工具箱)).[2]建议采用聚类层次聚类与PLDA评分作为距离测度。使用余弦相似度评分的k -均值聚类也经常使用。假设事先知道音频中说话者的数量。将最大聚类设置为已知说话者的数量+ 1,以便将背景独立地聚类。

knownNumberOfSpeakers =数字(唯一(groundTruth.Label));maxclusters = knownNumberOfSpeakers + 1;clusterMethod =“凝聚- PLDA评分”开关clusterMethod情况下"凝聚- PLDA评分"T = clusterdata(x',Criterion=“距离”,距离= @ (a, b) helperPLDAScorer (a, b, xvecsys.plda),链接=“平均”maxclust = maxclusters);情况下“凝聚- CSS评分”T = clusterdata(x',Criterion=“距离”,距离=“余弦”链接=“平均”maxclust = maxclusters);情况下“kmeans - CSS评分”T = kmeans(x',maxclusters,Distance=“余弦”);结束

绘制随时间变化的集群决策。

图(5)tiledlayout(2,1) nexttile plot(t,audioIn)轴ylabel (“振幅”)包含(“时间(s)”) nexttile plot(T)轴ylabel (“集群指数”)包含(“段”

要分离出与聚类对应的语音片段,请将这些片段映射回音频样本。画出结果。

mask = 0 (size(audioIn,1),1);start = round((segmentDur/2)*fs);segmentHopSamples = round(segmentHopDur*fs);mask(1:start) = T(1);Start = Start + 1;ii = 1:数字(T)结束=开始+ segmentHopSamples;mask(start:start + segmentHopSamples) = T(ii);开始=结束+ 1;结束mask(finish:end) = T(end);图(6)tiledlayout(2,1) nexttile plot(t,audioIn)轴Nexttile plot(t,mask)“集群指数”)轴包含(“时间(s)”

使用detectSpeech确定语音区域。使用sigroi2binmask将语音区域转换为二进制语音活动检测(VAD)掩码。调用detectSpeech第二次不带任何参数来绘制检测到的语音区域。

mergeDuration =0.5;VADidx = detectSpeech(audioIn,fs,MergeDistance=fs*mergeDuration);VADmask = sigroi2binmask(VADidx,数字(audioIn));图(7)detectSpeech (fs, audioIn MergeDistance = f * mergeDuration)

将VAD掩码应用到扬声器掩码并绘制结果。聚类索引为0表示无语音区域。

*VADmask =掩码;图(8)tiledlayout(2,1) nexttile plot(t,audioIn)轴Nexttile plot(t,mask)“集群指数”)轴包含(“时间(s)”

在本例中,您假设每个检测到的语音区域都属于单个说话者。如果一个语音区域中存在两个以上的标签,则将它们合并为出现频率最高的标签。

maskLabels = 0 (size(VADidx,1),1);ii = 1:大小(VADidx,1) maskLabels(ii) =模式(掩码(VADidx(ii,1):VADidx(ii,2)),“所有”);mask(VADidx(ii,1):VADidx(ii,2)) = maskLabels(ii);结束图(9)tiledlayout(2,1) nexttile plot(t,audioIn)轴Nexttile plot(t,mask)“集群指数”)轴包含(“时间(s)”

计算剩余扬声器集群的数量。

uniqueSpeakerClusters = unique(maskLabels);numSpeakers = nummel (uniqueSpeakerClusters)
numSpeakers = 5

可视化缩放结果

创建一个signalMask对象,然后绘制扬声器集群。给情节贴上基本真相标签。聚类标签用图右侧的键进行颜色编码。真正的标签印在地块上方。

msk = signalMask(表(VADidx,分类(maskLabels)));图(10)plotsigroi(msk,audioIn,true) axis([0 numel(audioIn) -1 1]) trueLabel = groundTruth.Label;ii = 1:numel(trueLabel) text(VADidx(ii,1),1.1,trueLabel(ii),FontWeight=“大胆”结束

选择要检查然后使用的集群binmask孤立说话者。绘制孤立语音信号,监听扬声器集群。

speakerToInspect =2;cutOutSilenceFromAudio =真正的;bmsk = binmask(msk,数字(audioIn));audioToPlay = audioIn;如果cutOutSilenceFromAudio audioToPlay(~bmsk(:,speakerToInspect)) = [];结束sound(audioToPlay,fs)图(11)tiledlayout(2,1) nexttile plot(t,audioIn)轴ylabel (“振幅”) nexttile plot(t,audioIn.*bmsk(:,speakerToInspect))轴包含(“时间(s)”) ylabel (“振幅”)标题(“讲者组”+ speakerToInspect)

扩化系统评价

扬声器扩化系统的常用度量是扩化错误率(DER)。DER是误报率(将语音分类为非语音)、误报率(将非语音分类为语音)和说话者错误率(将一个说话者的语音误认为另一个说话者的语音)的总和。

在这个简单的例子中,漏报率和误报率都是微不足道的问题。你只评估说话者的错误率。

将每个真正的扬声器映射到相应的最佳拟合扬声器集群。为了确定说话人错误率,计算真实说话人与最拟合的说话人集群之间不匹配的数量,然后除以真实说话人区域的数量。

uniqueLabels = unique(trueLabel);guessLabels = maskLabels;uniqueGuessLabels = unique(guessLabels);totalNumErrors = 0;ii = 1:numel(uniqueLabels) isSpeaker = uniqueLabels(ii)==trueLabel;minNumErrors = inf;jj = 1:numel(uniqueGuessLabels) groupCandidate = uniqueGuessLabels(jj) == guessLabels;numErrors = nnz(isSpeaker - groupCandidate);如果numErrors < minNumErrors minNumErrors = numErrors;bestCandidate = jj;结束minNumErrors = min(minNumErrors,numErrors);结束uniqueGuessLabels(bestCandidate) = [];totalNumErrors = totalNumErrors + minNumErrors;如果isempty (uniqueGuessLabels)打破结束结束SpeakerErrorRate = totalNumErrors/numel(trueLabel)
SpeakerErrorRate = 0

参考文献

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

[2] Sell, G., Snyder, D., McCree, A., Garcia-Romero, D., Villalba, J., Maciejewski, M., Manohar, V., Dehak, N., Povey, D., Watanabe, S., Khudanpur, S. (2018) DIHARD挑战赛JHU团队的一些经验和教训。国际语言学报2018,2808-2812,DOI: 10.21437/国际语言学报。2018-1893。