主要内容

使用x向量的扬声器diization

说话人划分是根据说话人身份将音频信号划分为多个片段的过程。它回答了“谁在什么时候说话”的问题,而不事先知道说话人,而且根据应用程序的不同,不事先知道说话人的数量。

说话人dialize有许多应用,包括:根据活跃的说话人组织文本以增强语音转录、视频字幕、内容检索(简说了什么?)和扬声器计数(有多少人出席了会议?).

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

下载预先训练过的扬声器区分系统

下载预先训练过的扬声器识别系统和支持文件。总大小大约为22 MB。

downloadFolder = matlab.internal.examples.downloadSupportFile (“音频”“SpeakerDiarization.zip”);dataFolder = tempdir;unzip(downloadFolder,dataFolder) netFolder = fullfile(dataFolder,“SpeakerDiarization”);目录(netFolder)

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

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

提取x-vectors

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

负载预训练x向量系统

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

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

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

  • dlnet——一个训练dlnetwork.该网络用于从mfcc中提取x向量。

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

  • plda-一个训练有素的PLDA模型,用于评分x向量。

xvecsys =负载(“xvectorSystem.mat”);

提取标准化声学特征

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

特性=单((提取(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 =圆(segmentDur / featureVectorHopDur);segmentHop =圆(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年,大小(featuresSegmented, 3));sample = 1:size(featuressegments,3) dlX = dlarray(featuressegments (:,:,sample),“TCB”);xvecs(:,示例)=预测(xvecsys.dlnet dlX,输出=“fc_1”);结束图(3)冲浪(xvecs EdgeColor =“没有”view([90,-90]) axis([1 size(xvecs,1) 1 size(xvecs,2)]) xlabel([90,-90])“特征”) 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-means聚类(kmeans(统计和机器学习工具箱)).[2]建议使用聚集的层次聚类与PLDA评分作为距离测量。使用余弦相似度评分的k -均值聚类也常用。假设预先知道音频中说话人的数量。将最大集群设置为已知说话者的数量+ 1,这样背景就可以独立集群。

knownNumberOfSpeakers =元素个数(独特(groundTruth.Label));maxclusters = knownNumberOfSpeakers + 1;clusterMethod =“凝聚性- PLDA评分”开关clusterMethod情况下“凝聚- PLDA评分”T = clusterdata (x ',则=“距离”,距离= @ (a, b) helperPLDAScorer (a, b, xvecsys.plda),链接=“平均”maxclust = maxclusters);情况下“凝聚- CSS评分”T = clusterdata (x ',则=“距离”,距离=“余弦”链接=“平均”maxclust = maxclusters);情况下“kmeans - CSS评分”T = kmeans (x ' maxclusters,距离=“余弦”);结束

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

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

要分离出与集群对应的语音片段,请将这些片段映射回音频样本。策划的结果。

掩码= 0(大小(audioIn, 1), 1);开始=圆((segmentDur / 2) * fs);segmentHopSamples =圆(segmentHopDur * fs);面具(1:开始)= T (1);Start = Start + 1;ii = 1:numel(T) finish = start + segmentHopSamples;mask(start:start + segmentHopSamples) = T(ii);开始=结束+ 1;结束面具(完成:结束)= T(结束);图(6)tiledlayout(2,1) nexttile plot(t,audioIn)轴nexttile情节(t,面具)ylabel (“集群指数”)轴包含(“时间(s)”

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

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

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

掩码=面具。* VADmask;图(8)tiledlayout(2,1) nexttile plot(t,audioIn)轴nexttile情节(t,面具)ylabel (“集群指数”)轴包含(“时间(s)”

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

maskLabels = 0(大小(VADidx, 1), 1);i = 1:size(VADidx,1) maskLabels(ii) = mode(mask(VADidx(ii,1):VADidx(ii,2)),“所有”);面具(VADidx (2, 1): VADidx (2, 2)) = maskLabels (ii);结束图(9)tiledlayout(2,1) nexttile plot(t,audioIn)轴nexttile情节(t,面具)ylabel (“集群指数”)轴包含(“时间(s)”

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

uniqueSpeakerClusters =独特(maskLabels);numSpeakers =元素个数(uniqueSpeakerClusters)
numSpeakers = 5

可视化Diarization结果

创建一个signalMask(信号处理工具箱)对象,然后绘制说话者集群。给情节贴上事实的标签。集群标签用图形右侧的键进行颜色编码。真正的标签印在情节上面。

msk = signalMask(表(VADidx分类(maskLabels)));图(10)plotsigroi(msk,audioIn,true) axis([0 numel(audioIn) -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) figure(11) tiledlayout(2,1) nexttile plot(t,audioIn)轴ylabel (“振幅”) nexttile plot(t,audioIn.*bmsk(:,speakerToInspect))轴包含(“时间(s)”) ylabel (“振幅”)标题(“议长集团”+ speakerToInspect)

Diarization系统评估

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

在这个简单的例子中,漏报率和误报率都是无关紧要的问题。你只评估说话人的错误率。

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

uniqueLabels =独特(trueLabel);guessLabels = maskLabels;uniqueGuessLabels =独特(guessLabels);totalNumErrors = 0;1:numel(uniqueLabels) isSpeaker = uniqueLabels(ii)==trueLabel;minNumErrors =正;jj = 1:numel(uniqueGuessLabels) groupCandidate = uniqueGuessLabels(jj) == guessLabels;numErrors = nnz(isSpeaker - groupCandidate);如果minNumErrors < minNumErrors;bestCandidate = jj;结束minNumErrors = min (minNumErrors numErrors);结束uniqueGuessLabels (bestCandidate) = [];totalNumErrors = totalNumErrors + minNumErrors;如果isempty (uniqueGuessLabels)打破结束结束SpeakerErrorRate = totalNumErrors /元素个数(trueLabel)
SpeakerErrorRate = 0

参考文献

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

[2] Sell, G., Snyder, D., McCree, A., garia - romero, D., Villalba, J., Maciejewski, M., Manohar, V., Dehak, N., Povey, D., Watanabe, S., Khudanpur, S. (2018) Diarization是困难的:JHU团队在首届DIHARD挑战中的一些经验和教训。2018, 2808-2812, DOI: 10.21437/Interspeech.2018-1893。

Baidu
map