主要内容

基于多基音估计和HMM的基音跟踪

此示例显示如何使用多个音高估计,octave和中位平滑和隐藏的马尔可夫模型(HMM)执行音调跟踪。

介绍

基音检测是语音处理、语音编码和音乐信息检索的基本组成部分。在语音和说话人识别中,基音是机器学习系统中的一个特征。对于呼叫中心来说,pitch用来表示客户的情绪状态和性别。在语言治疗中,音高被用来指示和分析病理和诊断身体缺陷。在MIR中,音高用于对音乐进行分类,用于按哼声查询系统,并作为歌曲识别系统的一个主要特征。

摘要洁净语音的基音检测是一个比较容易解决的问题。带噪声的基音检测和多基音跟踪一直是难点。有许多算法在文献中被广泛报道,它们在计算成本和对不同类型噪声的鲁棒性之间有已知的权衡。

通常,基音检测算法(PDA)估计给定时刻的基音。然后在基音跟踪系统中验证或校正基音估计。音高跟踪系统加强音高估计随时间的连续性。

这个例子提供了一个示例函数,HelperPitchTracker,它实现了一个音调跟踪系统。该示例走过所实现的算法HelperPitchTracker函数。

问题总结

加载音频文件和音频文件的相应参考音高。参考音高每10毫秒报告一次,并确定为几个第三方算法对干净语音文件的平均值。无语音区域表示为

[x, fs] = audioread ('Counting-16-44p1-mono-15secs.wav');加载TruePitch.mattruePitch

使用球场函数估计音频的音高随着时间的推移。

[f0,locs] =音调(x,fs);

在定义音高误差时,通常会报告两种指标:总音高误差(GPE)和语音决策误差(VDE)。因为本例中的基音算法不提供语音决策,所以只报告GPE。在本例中,GPE被计算为pitch估计值的百分比 ± 10 参考音高高于浊音段的音高。

计算语音区域的GPE并绘制结果。听干净的音频信号。

isVoiced = ~ isnan (truePitch);f0 (~ isVoiced) =南;p = 0.1;GPE = mean(abs(f0(is浊)-truePitch(is浊))> truePitch(is浊).*p).*100;t =(0:长度(x) 1) / fs;t0 = (locs-1) / fs;图(1)tiledlayout(2,1) nexttile plot(t,x) ylabel(“振幅”)标题(“洁净信号的基音估计”) nexttile plot(t0,[truePitch,f0]) legend(“参考”“估计”“位置”“西北”) ylabel (“F0 (Hz)”)包含(“时间(s)”)标题(sprintf ('GPE =%0.1f %%', GPE))

将语音信号与噪音混合在一起 - 5. db snr。

使用球场在嘈杂音频上的功能估计节距随着时间的推移。计算浊音地区的GPE并绘制结果。聆听嘈杂的音频信号。

desiredSNR = 5;x = mixSNR (x,兰德(大小(x)), desiredSNR);(f0、loc) =音高(x, fs);f0 (~ isVoiced) =南;GPE = mean(abs(f0(is浊)- truePitch(is浊))> truePitch(is浊).*p).*100;图(2)tiledlayout(2,1) nexttile plot(t,x) ylabel(“振幅”)标题(“噪音信号的音高估计”) nexttile plot(t0,[truePitch,f0]) legend(“参考”“估计”“位置”“西北”) ylabel (“F0 (Hz)”)包含(“时间(s)”)标题(sprintf ('GPE =%0.1f %%', GPE))

这个例子展示了如何使用多基音候选生成、倍频平滑、中值平滑和HMM来改进噪声语音信号的基音估计。

本示例中描述的算法在示例函数中实现HelperPitchTracker.来了解HelperPitchTracker函数,输入帮助HelperPitchTracker在命令行。

帮助HelperPitchTracker
f0 = HelperPitchTracker(audioIn,fs)返回音频输入的基频轮廓的估计值。输入的列被视为单独的通道。HelperPitchTracker函数使用多个基音检测算法生成基音候选,并使用倍频平滑和隐马尔可夫模型返回基频的估计值。f0 = HelperPitchTracker(…,'HopLength', HopLength)指定每一跳的样本个数。音调估计每跳更新一次。指定HOPLENGTH为标量整数。如果未指定,HOPLENGTH默认为舍入(0.01*fs)。f0 = HelperPitchTracker(…,'OctaveSmoothing',TF)指定是否应用倍频平滑。指定为真或假。如果未指定,TF默认为true。 f0 = HelperPitchTracker(...,'EmissionMatrix',EMISSIONMATRIX) specifies the emission matrix used for the HMM during the forward pass. The default emission matrix was trained on the Pitch Tracking Database from Graz University of Technology. The database consists of 4720 speech segments with corresponding pitch trajectories derived from laryngograph signals. The emission matrix corresponds to the probability that a speaker leaves one pitch state to another, in the range [50, 400] Hz. Specify the emission matrix such that rows correspond to the current state, columns correspond to the possible future state, and the values of the matrix correspond to the probability of moving from the current state to the future state. If you specify your own emission matrix, specify its corresponding EMISSIONMATRIXRANGE. EMISSIONMATRIX must be a real N-by-N matrix of integers. f0 = HelperPitchTracker(...,'EmissionMatrixRange',EMISSIONMATRIXRANGE) specifies how the EMISSIONMATRIX corresponds to Hz. If unspecified, EMISSIONMATRIXRANGE defaults to 50:400. [f0,loc] = HelperPitchTracker(...) returns the locations associated with each pitch decision. The locations correspond to the ceiling of the center of the analysis frames. [f0,loc,hr] = HelperPitchTracker(...) returns the harmonic ratio associated with each pitch decision. See also pitch, voiceActivityDetector

间距跟踪系统的描述

图形提供了在示例功能中实现的俯仰跟踪系统的概述。以下代码遍历内部工作HelperPitchTracker函数的例子。

1.生成多个Pitch候选

在基音跟踪系统的第一阶段,您使用多个基音检测算法生成多个基音候选。使用基于残差谐波和(SRH)的算法生成主要的基音候选,这些基音候选通常更准确[2]算法和带幅度压缩的基音估计滤波器(PEFAC) [3.)算法。

将噪声输入信号缓冲到重叠帧中,然后使用audio.internal.pitch.SRH为每只跳生成5个音高候选人。还返回每个音高候选人的相对置信度。绘制结果。

范围= [50,400];hoplength = round(fs。* 0.01);%缓冲区进入必需尺寸xbuff_srh =缓冲器(x,round(0.025 * fs),圆形(0.02 * fs),'nodelay');定义螺距参数params_SRH =结构(“方法”“SRH”...“范围”、范围、...“WindowLength”,圆形(FS * 0.06),...“OverlapLength”而圆(fs * 0.06 -hoplength),...“SampleRate”fs,...“NumChannels”、大小(x, 2),...“SamplesPerChannel”、大小(x, 1));multiCandidate_params_SRH =结构(“NumCandidates”,5,“MinPeakDistance”1);获得pitch估计和信心[f0_SRH, conf_SRH] = audio.internal.pitch.SRH (xBuff_SRH x,...params_SRH,...multicandidate_params_srh);
图(3)TileDlayout(2,1)NextTile Plot(T0,F0_SRH)Ylabel(“F0候选人(Hz)”)标题(“SRH基音估计的多个候选项”) nexttile plot(t0,conf_SRH) ylabel(“相对的信心”)包含(“时间(s)”

使用PEF算法生成一组额外的主要pitch候选者和相关的置信度。使用归一化相关函数(NCF)算法和倒频谱基音确定(CEP)算法生成备份候选项和相关置信度。只记录备份候选数据中最可信的估计。

xBuff_PEF =缓冲区(x,圆(0.06 * fs),圆(0.05 * fs),'nodelay');params_PEF =结构(“方法”'PEF'...“范围”、范围、...“WindowLength”,圆形(FS * 0.06),...“OverlapLength”而圆(fs * 0.06 -hoplength),...“SampleRate”fs,...“NumChannels”、大小(x, 2),...“SamplesPerChannel”、大小(x, 1));multiCandidate_params_PEF =结构(“NumCandidates”,5,“MinPeakDistance”5);[f0_PEF, conf_PEF] = audio.internal.pitch.PEF (xBuff_PEF,...params_PEF,...multicandidate_params_pef);xbuff_ncf =缓冲器(x,round(0.04 * fs),圆形(0.03 * fs),'nodelay');xBuff_NCF = xBuff_NCF (: 2: end-1);params_NCF =结构(“方法”'ncf'...“范围”、范围、...“WindowLength”而圆(fs * 0.04),...“OverlapLength”而圆(fs * 0.04 -hoplength),...“SampleRate”fs,...“NumChannels”、大小(x, 2),...“SamplesPerChannel”、大小(x, 1));multiCandidate_params_NCF =结构(“NumCandidates”,5,“MinPeakDistance”1);f0_NCF = audio.internal.pitch.NCF (xBuff_NCF,...params_NCF,...multiCandidate_params_NCF);xBuff_CEP =缓冲区(x,圆(0.04 * fs),圆(0.03 * fs),'nodelay');xBuff_CEP = xBuff_CEP (: 2: end-1);params_CEP =结构(“方法”'cep'...“范围”、范围、...“WindowLength”而圆(fs * 0.04),...“OverlapLength”而圆(fs * 0.04 -hoplength),...“SampleRate”fs,...“NumChannels”、大小(x, 2),...“SamplesPerChannel”、大小(x, 1));multicandidate_params_cep = struct(“NumCandidates”,5,“MinPeakDistance”1);f0_CEP = audio.internal.pitch.CEP (xBuff_CEP,...params_CEP,...multicandidate_params_cep);backupcandidates = [f0_ncf(:,1),f0_cep(:,1)];

2.确定长期的中位数

间距候选者的长期中值用于减少音高候选者的数量。为了计算长期中值沥青,首先计算谐波比。音高估计仅适用于谐波比的谐波言论。

hr = harmonicRatio (xBuff_PEF fs,...“窗口”1)、汉明(大小(xBuff_NCF,'定期'),...“OverlapLength”, 0);图(4)tiledlayout(2,1) nexttile plot(t,x) ylabel(“振幅”) nexttile plot(t0,hr) ylabel(“谐波比率”)包含(“时间(s)”

在长期中值计算中,使用谐波比阈值排除不包括发声语音的区域。确定长期中值后,计算pitch候选人的下限和上限。在这个例子中,下界和上界根据经验确定为中位数的2/3和4/3。超出这些范围的候选人将在下一阶段被处罚。

idxToKeep =逻辑(movmedian(人力资源>((3/4)*马克斯(人力资源),3));longTermMedian =值([f0_PEF (idxToKeep 1); f0_SRH (idxToKeep 1)]);低= max ((2/3) * longTermMedian范围(1));上= min ((4/3) * longTermMedian范围(2));图(5)tiledlayout(1,1) nexttile plot(t0,[f0_PEF,f0_SRH]) hold情节(t0, longTermMedian。*的(大小(f0_PEF, 1)),“:”“线宽”3)图(t0,上。*的(大小(f0_PEF, 1)),'r'“线宽”2)图(t0低。*的(大小(f0_PEF, 1)),'r'“线宽”, 2)包含(“时间(s)”) ylabel (的频率(赫兹))标题('长期中位'

3.候选人减少

缺省情况下,音高检测算法返回的候选者以下降的信心顺序排序。减少任何初级候选者在下限和上限之外的置信度。减少置信度量为10.重新对PEF和SRH算法重新排序候选者,以便他们处于置信度的下降。串联候选人,只能从每种算法中保持两个最自信的候选者。

绘制减少的候选。

无效= f0_PEF>lower | f0_PEF>upper;conf_PEF(无效)= conf_PEF(无效)/ 10;[conf_PEF,顺序]=排序(conf_PEF 2“下”);i = 1:尺寸(f0_PEF, 1) f0_PEF(我:)= f0_PEF(我订单(我,:));结束无效= f0_SRH>lower | f0_SRH>upper;conf_SRH(无效)= conf_SRH(无效)/ 10;[conf_SRH,顺序]=排序(conf_SRH 2“下”);i = 1:尺寸(f0_srh,1)f0_srh(i,:) = f0_srh(i,订单(i,i :));结束候选人= [f0_PEF (:, 1:2), f0_SRH (: 1:2)];信心= [conf_PEF (:, 1:2), conf_SRH (: 1:2)];图(6)情节(t0,候选人)包含(“时间(s)”) ylabel (的频率(赫兹))标题(“减少候选人”

4.做出独特

如果两个或两个以上的候选人在一个给定的5hz范围内,将候选人设置为他们的平均值并和他们的信心。

跨度= 5;紧密炉= 1;r = 1:尺寸(候选人,1)C = 1:size(候选人,2)tf = abs(候选人(r, C)-候选人(r,)) < span;候选人(r、c) =意味着(候选人(r, tf));信心(r、c) =总和(信心(r, tf)) * confidenceFactor;结束结束候选人= max (min(候选人,400),50);

5.用八度平滑的肝脏前进迭代

现在候选项已经减少了,您可以将它们输入HMM以执行连续性约束。在分析10毫秒跳数的语音信号时,音调轮廓通常是连续的。音高随时间从一种状态移动到另一种状态的概率称为发射概率.发射概率可以封装到一个矩阵中,描述从一个集合范围内的任何音调值到另一个集合范围内的任何音调值的概率。本例中使用的发射矩阵是使用Graz数据库创建的。[1]

加载发射矩阵和相关的范围。绘制150赫兹状态下pitch的概率密度函数(PDF)。

加载EmissionMatrix.matEmissionMatrix.emissionMatrixRangeCurrentState =.150;图(7)绘图(EmissionMatrixRange(1):EmissionMatrixRange(2),EmissionMatrix(CurrentState  -  EmissionMatrixRange(1)-1,:))标题(Sprintf(“%d Hz的发射PDF”,currentstate))xlabel('下一个音高值(Hz)') ylabel (“概率”

在该示例中使用的HMM结合了发射概率,从而强制连续性,以及间距的相对置信度。在每跳时,排放概率与创造置信矩阵的相对置信度相结合。每个路径的最佳选择被确定为置信矩阵的最大值。在该示例中使用的HMM还假定只能将一个路径分配给给定状态(维特比算法的假设)。

除了HMM之外,本示例还监视相对于音调路径的短期中值的八度跳变。如果检测到一个八度跳变,那么备用候选音调将作为HMM的选项添加。

%preallocation.numpaths = 4;numhops =尺寸(候选人,1);logbook =零(numhops,3,numpaths);Suspecthops = Zeros(Numhops,1);正迭代与倍频平滑hopNumber = 1:numHops nowCandidates =候选人(hopNumber,:);nowConfidence =信心(hopNumber:);%删除八度跳频如果hopNumber > 100 numCandidates = nummel (nowCandidates);加权短期中位数medianWindowLength = 50;aTemp =日志(max (hopNumber-min hopNumber medianWindowLength) (1): hopNumber-1, 1:);shortTermMedian =值(aTemp (:));previousM =意味着([longTermMedian shortTermMedian]);lowerTight = max ((4/3) * previousM emissionMatrixRange (1));upperTight = min ((2/3) * previousM emissionMatrixRange (2));numCandidateOutside = sum([nowCandidates < lowerTight, nowCandidates > upperTight]);如果在以。为中心的八度音阶之外至少有一个候选音%短期中值,添加候补的提案候选人由归一化相关函数和骨灰节生成的%%音高确定算法作为潜在候选者。如果numCandidateOutside > 0%应用备用音高估计器nowCandidates = [nowCandidates BackupCandidates (hopNumber:)];% #好< AGROW >nowConfidence = [nowConfidence repmat(意味着(nowConfidence), 1, 2)];% #好< AGROW >%使独特的跨度= 10;confidenceFactor = 1.2;r = 1:尺寸(nowCandidates, 1)c = 1:size(nowCandidates,2) tf = abs(nowCandidates(r,c)-nowCandidates(r,)) < span;nowCandidates (r、c) =意味着(nowCandidates (r, tf));nowConfidence (r、c) =总和(nowConfidence (r, tf)) * confidenceFactor;结束结束结束结束创建置信矩阵confidenceMatrix = 0(元素个数(nowCandidates),大小(日志,3));PageIdx = 1:大小(日志,3)如果hopNumber ~= 1 pastPitch = floor(logbook(hopNumber-1,1,pageIdx)) - emissionMatrixRange(1) + 1;其他的Pastpitch = nan;结束CandidateNumber = 1:Numel(现为加工)如果hopnumber〜= 1获取当前音高并转换为范围内的索引CurrentPitch =楼层(现为纳米迪亚特(念珠子)) -  emissismatrixrange(1)+ 1;ConcidenceMatrix(CandidateNumber,PageIdx)=...emissionMatrix (currentPitch pastPitch) *日志(hopNumber-1 2 pageIdx) * nowConfidence (candidateNumber);其他的ConcidenceMatrix(CandidateNumber,PageIdx)= 1;结束结束结束%分配了每个路径的估计PageIdx = 1:大小(日志,3)确定从过去到现在最自信的转换[~, idx] = max (confidenceMatrix (:));%转换置信矩阵指数到pitch和日志页[chosenPitch, pastPitchIdx] = ind2sub([元素个数(nowCandidates),大小(日志,3)],idx);日志(hopNumber: pageIdx) =...[nowCandidates (chosenPitch),...confidenceMatrix (chosenPitch pastPitchIdx),...pastPitchIdx];%从置信矩阵中取出所选的电流音调confidenceMatrix (chosenPitch:) =南;结束%正常化的信心日志(hopNumber 2:) =日志(hopNumber 2:) /笔(日志(hopNumber 2:));结束

6.回溯的嗯

当隐马尔可夫模型的前向迭代完成后,最终的基音轮廓被选为最自信的路径。通过日志往回走,确定HMM输出的基音轮廓。计算GPE并绘制新的基音轮廓和已知的基音轮廓。

numhops = size(logbook,1);keeplooking = true;索引= numhops + 1;keelooking index = index - 1;如果abs(max(logbook(index,2,:))-min(logbook(index,2,:)))~=0 keelooking = false;结束结束[~, bestPathIdx] = max(日志(指数2:));bestIndices = 0 (numHops, 1);bestIndices(指数)= bestPathIdx;ii = index:-1:2 bestIndices(ii-1) = logbook(ii,3,bestIndices(ii));结束BestInce(BestInce == 0)= 1;f0 =零(numhops,1);II =(NUMHOPS): -  1:2 F0(II)=日志(II,1,BESTINCES(II));结束f0toPlot = f0;f0toPlot (~ isVoiced) =南;GPE = mean(abs(f0toPlot(is浊)- truePitch(is浊))> truePitch(is浊).*p).*100;图(8)情节(t0, [truePitch f0toPlot])传说(“参考”“估计”) ylabel (“F0 (Hz)”)包含(“时间(s)”)标题(sprintf ('GPE =%0.1f %%', GPE))

7.移动中值滤波器

作为最终的后处理步骤,将移动中值滤波器应用于三跳的窗口长度。计算最终的GPE并绘制最终的间距轮廓和已知轮廓。

f0 = movmedian (f0, 3);f0 (~ isVoiced) =南;GPE = mean(abs(f0(is浊)- truePitch(is浊))> truePitch(is浊).*p).*100;图(9)情节(t0, [truePitch, f0])传说(“参考”“估计”) ylabel (“F0 (Hz)”)包含(“时间(s)”)标题(sprintf ('GPE =%0.1f %%', GPE))

绩效评估

HelperPitchTracker函数使用HMM对音高轮廓应用连续性约束。HMM的发射矩阵可以直接设置。最好在声源上训练发射矩阵,使其与你想要追踪的声源相似。

此示例使用来自格拉茨技术大学(PTDB-TUG)的音高跟踪数据库[4].该数据集由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)结束

创建一个音频数据存储,指向数据库中的麦克风录制。将与每个文件关联的标签设置为关联的已知音高文件的位置。数据集包含10名女性和10名男性扬声器的录音。用子集把第十名女发言者和男发言者分开。训练一个基于参考音高轮廓的发射矩阵,适用于男性和女性演讲者1到9。

广告= audiodataStore([fullfile(datasetfolder,“语音数据”“女性”“麦克风”),fullfile(DataSetFolder,“语音数据”“男性”“麦克风”)),...“IncludeSubfolders”,真的,...'fileextensions'“wav”);wavFileNames = ads.Files;ads.Labels =取代(wavFileNames, {“麦克风”“麦克风”“wav”}, {“REF”'ref'“f0”});idxToRemove =包含(广告。文件,{F10的“M10”});ads1 =子集(广告,idxToRemove);ads9 =子集(广告,~ idxToRemove);

洗牌音频数据存储。

ads1 = shuffle (ads1);ads9 = shuffle (ads9);

发射矩阵描述了从一个基音态到另一个基音态的概率。在接下来的步骤中,您将为男性和女性创建一个基于扬声器1到9的发射矩阵。数据库将参考音高值、短期能量和其他信息存储在带有文件扩展名的文本文件中F0..这getReferencePitch函数在短期能量高于阈值时读取音调值。阈值是在听力测试中根据经验确定的。这HelperUpdateEmissionMatrix基于当前音调状态和下一个音调状态创建一个二维直方图。在创建了直方图之后,将其归一化以创建一个发射矩阵。

EmissionMatrixRange = [50,400];EmissionMatrix = [];i = 1:numel(ads9.Files) x = getReferencePitch(ads9.Labels{i});emissionMatrix = HelperUpdateEmissionMatrix (x, emissionMatrixRange emissionMatrix);结束emissionMatrix = emissionMatrix + sqrt(eps);emissionMatrix = emissionMatrix. /规范(emissionMatrix);

定义不同类型的背景噪音:白色,氛围,发动机,喷气式飞机和街道。将它们重新相框到16 kHz以帮助加速测试数据库。

定义测试的信噪比,以dB为单位,为10、5、0、-5和-10。

noiseType = {'白色的'“氛围”'引擎'“喷气机”“街道”};numNoiseToTest =元素个数(noiseType);desiredFs = 16 e3;whiteNoiseMaker = dsp。ColoredNoise ('颜色''白色的'“SamplesPerFrame”,40000,“RandomStream”“与种子mt19937ar”'bandedOutput',真正的);噪音{1}= whiteNoiseMaker ();[氛围,ambianceFs] = audioread ('Ambiance-16-44p1-mono-12secs.wav');噪音{2}=重新取样(氛围、desiredFs ambianceFs);(引擎,engineFs) = audioread (“Engine-16-44p1-stereo-20sec.wav”);噪音{3}=重新取样(引擎、desiredFs engineFs);(飞机,jetFs) = audioread (“JetAirplane-16-11p025-mono-16secs.wav”);噪音{4}=重新取样(飞机,desiredFs jetFs);[街,streetFs] = audioread (“MainStreetOne-16-16-mono-12secs.wav”);噪音{5}=重新取样(街道、desiredFs streetFs);snrToTest = [10 5 0, -10);numSNRtoTest =元素个数(snrToTest);

为每个文件运行每个SNR和噪声类型的音高检测算法。计算跨语音文件的平均GPE。此示例将性能与流行音高跟踪算法进行比较:锯齿波形启发音高估计器(滑动)。可以在[中的算法的MATLAB®实现5.].若要运行此示例而不与其他算法进行比较,请设置相比.下面的对比大约需要15分钟。

比较=真正的;numfilestotest = 20;p = 0.1;gpe_pitchtracker = zeros(numsnrtotest,numnoisetotest,numfilestotest);如果比较GPE_swipe = GPE_pitchTracker;结束i = 1:numFilesToTest [cleanSpeech,info] = read(ads1);cleanSpeech =重新取样(cleanSpeech desiredFs info.SampleRate);truePitch = getReferencePitch (info.Label {:});isVoiced = truePitch ~ = 0;truePitchInVoicedRegions = truePitch (isVoiced);j = 1: numSNRtoTestk = 1:numNoiseToTest noisySpeech = mixSNR(cleanSpeech,noise{k},snrToTest(j));f0 = HelperPitchTracker (noisySpeech desiredFs,“EmissionMatrix”,emissionmatrix,“EmissionMatrixRange”, emissionMatrixRange);f0 = [0; f0];%手动与数据库对齐。gpe_pitchtracker(j,k,i)=平均值(abs(f0(isvoiced) -  truepitchvoiceRegogions)> TruepitchinvoiceRegions。* P)。* 100;如果compare f0 = swipep(noisySpeech,desiredFs,[50,400],0.01);f0 = f0(3:结束);%手动与数据库对齐。GPE_swipe(j,k,i) = mean(abs(f0(is浊)- truePitchInVoicedRegions) > truePitchInVoicedRegions.*p).*100;结束结束结束结束GPE_pitchTracker =意味着(GPE_pitchTracker, 3);如果比较GPE_swipe = mean(GPE_swipe,3);结束

绘制每种噪声类型的总音高误差。

ii = 1:numel(noise) figure(9+ii) plot(snrToTest,GPE_pitchTracker(:,ii),)“b”)举行如果比较图(SNRTOTEST,GPE_SWIPE(:,II),‘g’结束情节(snrToTest GPE_pitchTracker(:,(二),'博'如果比较图(SNRTOTEST,GPE_SWIPE(:,II),“全球之声”结束标题(noiseType (ii))包含(“信噪比(dB)”) ylabel (sprintf (总音高误差(p = %0.2f), p))如果比较传奇(“HelperPitchTracker”“刷”其他的传奇(“HelperPitchTracker”结束网格抓住结束

结论

您可以使用HelperPitchTracker作为评估音高跟踪系统的GPE性能的基线,或者将此示例调整到您的应用程序。

参考

[1] G. Pirker,M.Wohlmayr,S.Petrik和F. Pernkopf,“具有评估的音高跟踪语料库”,“多点跟踪场景评估”,Interspeech,PP .1509-1512,2011。

药剂师托马斯和比尔·阿尔万。基于残差谐波的联合鲁棒语音检测与基音估计。国际言语传播协会年会论文集。2011年,页1973 - 1976。

[3] Gonzalez,Sira和Mike Brookes。“音高估计过滤器鲁棒到高噪声(PEFAC)。”第19届欧洲信号处理会议。巴塞罗那,2011年,第451-455页。

信号处理与语音通信实验室。2018年9月26日生效。https://www.spsc.tugraz.at/databases-and-tools/ptdb-tug-pitch-tracking-database-from-graz-university-of-technology.html

[5]“Arturo卡马乔。”2018年9月26日生效。https://www.cise.ufl.edu/ acamacho /英语/。

[6]“FXPEFAC”。FXPEFAC的描述。访问2018年9月26日。http://www.ee.ic.ac.uk/hp/staff/dmb/voicebox/voicebox.html。