基音跟踪使用多种基音估计和HMM

这个例子演示了如何使用多种基音估计、八度和中值平滑以及隐马尔可夫模型(HMM)来执行基音跟踪。

介绍

基音检测是在语音处理的基本构建块,语音编码,和音乐信息检索(MIR)。在语音和说话人识别,沥青被用作机器学习系统的特性。对于呼叫中心,沥青用于指示情绪状态和性别的客户。在言语治疗,沥青用于指示和分析病理诊断和身体上的缺陷。在MIR,沥青用于分类的音乐,用于查询通过哼唱系统,并在歌曲识别系统的主要功能。

干净语音的基音检测通常被认为是一个已解决的问题。噪声基音检测和多基音跟踪一直是基音检测的难题。有许多算法在文献中被广泛报道,它们在计算成本和对不同类型噪声的鲁棒性之间进行了已知的权衡。

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

该实施例提供的示例功能,HelperPitchTracker,它实现了一个音高跟踪系统。实例遍历由。实现的算法HelperPitchTracker功能。

问题总结

加载音频文件和音频文件相应的参考音高。参考音高每10毫秒报告一次,并被确定为干净语音文件上几种第三方算法的平均值。没有发声的区域表示为.

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

使用沥青函数估计音频的音高随时间的推移。

(f0、loc) =音高(x, fs);

在定义音高错误时,通常会报告两个度量:总音高错误(GPE)和语音决策错误(VDE)。因为本例中的音高算法不提供语音决策,所以只报告GPE。在这个例子中,GPE被计算为外部音高估计的百分比 ± 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;sound(x,fs) subplot(2,1,1) plot(t,x) ylabel(“振幅”)标题(“清洁信号的基音估计”) subplot(2,1,2) plot(t0,[truePitch,f0])图例(“参考”,“估计”,“位置”,“西北”)ylabel (“F0 (Hz)”)包含('时间(s)')标题(sprintf (“GPE = % 0.1 f % %”,GPE))

将语音信号与噪声混合 - 5 dB信噪比。

使用沥青功能在嘈杂的音频估计音调随着时间的推移。计算浊音语音区域的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;sound(x,fs) subplot(2,1,1) plot(t,x) ylabel(“振幅”)标题(“噪声信号的基音估计”) subplot(2,1,2) plot(t0,[truePitch,f0])图例(“参考”,“估计”,“位置”,“西北”)ylabel (“F0 (Hz)”)包含('时间(s)')标题(sprintf (“GPE = % 0.1 f % %”,GPE))

此示例示出了如何提高使用多个候选音调的生成,八度平滑,中值平滑,和一个HMM噪声的语音信号的基音估计。

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

帮助HelperPitchTracker
HelperPitchTracker轨道的音频信号f0的基频= HelperPitchTracker(AUDIOIN,FS)返回基频轮廓用于音频输入的估计值。输入的列被视为单个通道。所述HelperPitchTracker功能使用多个音调检测算法来生成候选音调,和用途倍频程平滑和隐马尔可夫模型返回的基本频率的估计。F0 = HelperPitchTracker(..., 'HopLength',HOPLENGTH)指定在每一跳的样本的数目。俯仰估计更新每一跳。指定HOPLENGTH作为一个标量整数。如果没有指定,HOPLENGTH默认为圆(0.01 * FS)。F0 = HelperPitchTracker(..., 'OctaveSmoothing',TF)指定是否应用倍频平滑。指定为true或false。如果没有指定,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.生成多个候选音高

在音高跟踪系统的第一阶段,使用多种音高检测算法生成多个候选音高。主要候选音高一般较为准确,它们是根据剩余谐波的总和(SRH)生成的[2]算法和振幅压缩基音估计滤波器(PEFAC) [3.]算法。

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

范围= [50400];HOPLENGTH =圆(fs。* 0.01);缓冲成所需的大小xBuff_SRH =缓冲区(x,圆(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);得到音高估计和信心[f0_SRH, conf_SRH] = audio.internal.pitch.SRH (xBuff_SRH,...params_SRH,...multiCandidate_params_SRH);次要情节(2,1,1)情节(t0, f0_SRH) ylabel (“F0候选人(Hz)”)标题("来自SRH音高估计的多个候选人") subplot(2,1,2) plot(t0,conf_SRH) ylabel(“相对的信心”)包含('时间(s)')

使用PEF算法生成一组附加的主候选音高和相关的置信度。使用归一化相关函数(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,圆(0.04 * fs),圆(0.03 * fs),“nodelay”);xBuff_NCF = xBuff_NCF(:,2:端-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 =结构('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);副区(2,1,1)情节(T,X)ylabel(“振幅”)副区(2,1,2)情节(T0,小时)ylabel(“谐波比率”)包含('时间(s)')

使用谐波比阈值的是不包括在长期中值计算浊音区。确定长期平均后,计算降低和用于候选音调的上限。在该示例中,上限和下限分别凭经验确定为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));情节(t0, [f0_PEF f0_SRH]);情节(t0, longTermMedian。*的(大小(f0_PEF, 1)),'R:',“线宽”3)图(t0,上。*的(大小(f0_PEF, 1)),“r”,“线宽”,2)情节(T0,降低。*酮(大小(f0_PEF,1)),“r”,“线宽”,2);保持包含('时间(s)')ylabel ('频率(Hz)')标题(长期平均的)

3.候选人减少

在默认情况下,基音检测算法返回的候选人是按照置信度降序排序的。降低任何主要候选人的信心以外的下界和上界。信心下降10倍。重新排序PEF和SRH算法的候选对象,使它们的置信度按降序排列。将候选项连接起来,每个算法只保留两个最自信的候选项。

标出减少的候选人。

无效= f0_PEF>下| f0_PEF>上;conf_PEF(无效)= conf_PEF(无效)/ 10;[conf_PEF,顺序]=排序(conf_PEF 2“下”);对于I = 1:尺寸(f0_PEF,1)f0_PEF(I,:) = f0_PEF(I,顺序(I,:));结束无效= f0_SRH>下层| f0_SRH下层>;conf_SRH(无效)= conf_SRH(无效)/ 10;[conf_SRH,顺序]=排序(conf_SRH 2“下”);对于i = 1:尺寸(f0_SRH, 1) f0_SRH(我:)= f0_SRH(我订单(我,:));结束候选人= [f0_PEF (:, 1:2), f0_SRH (: 1:2)];信心= [conf_PEF (:, 1:2), conf_SRH (: 1:2)];情节(t0,候选人)包含('时间(s)')ylabel ('频率(Hz)')标题(“减少候选人”)

4.让独特的

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

跨度= 5;confidenceFactor = 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进行前向迭代

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

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

负载EmissionMatrix.matemissionMatrixemissionMatrixRange现状后=150;plot(emissionMatrixRange(1):emissionMatrixRange(2),emissionMatrix(currentState - emissionMatrixRange(1)-1,:))'排放PDF for %d Hz'现状后))包含(“下一个音高值(Hz)”)ylabel (“概率”)

在这个例子中使用的HMM结合了发射概率和音高的相对置信度。在每一跳,发射概率与相对置信度相结合,形成一个置信度矩阵。每条路径的最佳选择确定为置信矩阵的最大值。本例中使用的HMM还假设只有一个路径可以分配给给定的状态(这是Viterbi算法的一个假设)。

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

%预先配置numPaths = 4;numHops =大小(候选人,1);日志= 0 (numHops 3 numPaths);suspectHops = 0 (numHops, 1);%使用八维平滑的前向迭代对于hopNumber = 1:numHops nowcandidate = candidate (hopNumber,:);nowConfidence =信心(hopNumber:);移除八度跳变如果hopNumber>100 numcandidate = numel(now candidate);加权短期中位数medianWindowLength = 50;aTemp =日志(MAX(hopNumber分钟(hopNumber,medianWindowLength),1):hopNumber-1,1,:);shortTermMedian =中间值(aTemp(:));previousM =平均值([longTermMedian,shortTermMedian]);lowerTight = MAX((4/3)* previousM,emissionMatrixRange(1));upperTight =分钟((2/3)* previousM,emissionMatrixRange(2));numCandidateOutside =总和([nowCandidates  upperTight]);如果在以…为中心的八度音程之外至少有一个候选%短期位数,添加在备份候选间距%由归一化相关函数和倒谱产生%间距确定算法作为潜在的候选人。如果numCandidateOutside> 0%应用备份间距估计nowCandidates = [nowCandidates BackupCandidates (hopNumber:)];%#确定nowConfidence = [nowConfidence repmat(意味着(nowConfidence), 1, 2)];%#确定%制作与众不同跨度= 10;confidenceFactor = 1.2;对于R = 1:尺寸(nowCandidates,1)对于c = 1:size(nowcandidate,2) tf = abs(nowcandidate (r,c)- nowcandidate (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 =南;结束对于candidateNumber = 1:元素个数(nowCandidates)如果hopNumber ~ = 1%获取当前的俯仰和转换为指数范围currentPitch = floor(nowcandidate (candidateNumber)) - emissionMatrixRange(1) + 1;confidenceMatrix (candidateNumber pageIdx) =...emissionMatrix (currentPitch pastPitch) *日志(hopNumber-1 2 pageIdx) * nowConfidence (candidateNumber);其他confidenceMatrix (candidateNumber pageIdx) = 1;结束结束结束为每条路径分配一个估计值对于pageIdx = 1:尺寸(日志,3)确定从过去到现在最自信的过渡[~,idx] = max (confidenceMatrix (:));%转换信心矩阵指数,以基音和日志页[chosenPitch, pastPitchIdx] = ind2sub([元素个数(nowCandidates),大小(日志,3)],idx);日志(hopNumber: pageIdx) =...[nowCandidates(chosenPitch),...confidenceMatrix (chosenPitch pastPitchIdx),...pastPitchIdx];从置信度矩阵中移除选定的当前音高confidenceMatrix (chosenPitch:) =南;结束%正常化的信心日志(hopNumber 2:) =日志(hopNumber 2:) /笔(日志(hopNumber 2:));结束

6. HMM的回溯

当HMM的前向迭代完成后,最终的基音轮廓被选为最可靠的路径。向后遍历日志以确定HMM输出的音高轮廓。计算GPE,绘制新的基音轮廓和已知的基音轮廓。

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

7.移动中值滤波

作为最后一个后处理步骤,应用一个窗口长度为3跳的移动中值过滤器。计算最终的GPE,绘制最终的音高轮廓和已知的轮廓。

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

绩效评估

HelperPitchTracker函数使用HMM将连续性约束应用于基音轮廓。隐马尔可夫模型的发射矩阵可以直接设置。最好是在声源上训练发射矩阵,使其与你想要跟踪的声源类似。

本例使用Graz理工大学(PTDB-TUG)的俯仰角跟踪数据库。[4].该数据集包括20个英文母语阅读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)结束

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

广告= audioDatastore ([fullfile (datasetFolder“语音数据”,“女性”,“麦克风”),fullfile (datasetFolder,“语音数据”,“男性”,“麦克风”)],...“IncludeSubfolders”,真的,...“FileExtensions”,'.WAV');wavFileNames = ads.Files;ads.Labels =取代(wavFileNames, {“麦克风”,“麦克风”,'WAV'},{'REF',“裁判”,“f0”});idxToRemove =含有(ads.Files,{F10的,'M10'});ADS1 =子集(广告,idxToRemove);ads9 =子集(广告,〜idxToRemove);

随机播放音频数据存储。

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

发射矩阵描述的从一个节距状态到另一个的概率。在下面的步骤中,创建基于扬声器1至9对男性和女性的发射矩阵。数据库存储基准音高值,短时能量,和其他信息的文本文件与文件扩展名f0.的getReferencePitch函数读取音高值,如果短期能量高于阈值。阈值是在听力测试中根据经验确定的。的HelperUpdateEmissionMatrix根据当前基音状态和下一个基音状态创建一个二维直方图。直方图创建之后,对其进行规范化,以创建一个排放矩阵。

emissionMatrixRange = [50400];emissionMatrix = [];对于i = 1:numel(ads9.Files) x = getReferencePitch(ads9. tags {i});emissionMatrix = HelperUpdateEmissionMatrix (x, emissionMatrixRange emissionMatrix);结束emissionMatrix = emissionMatrix + SQRT(EPS);emissionMatrix = emissionMatrix./norm(emissionMatrix);

定义不同类型的背景噪音:白色,环境,引擎,喷气式飞机和街道。重新采样到16khz,以帮助加快对数据库的测试。

将要测试的信噪比(dB)定义为10、5、0、-5和-10。

noiseType = {“白色”,“氛围”,“引擎”,“喷气机”,'街'};desiredFs = 16 e3;whiteNoiseMaker = dsp.ColoredNoise (“颜色”,“白色”,'SamplesPerFrame',40000,“RandomStream”,“与种子mt19937ar”);噪音{1}= whiteNoiseMaker ();[氛围,ambianceFs] = audioread (“氛围,16-44p1单 -  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 - 24 - 96立体声- 63 secs.wav”);噪声{5} =重采样(街道,desiredFs,streetFs);snrToTest = [10,5,0,-5,-10]。

运行每个SNR和噪声类型为每个文件的音高检测算法。计算跨越语音文件的平均GPE。本实施例比较与其他流行音调跟踪算法的性能:锯齿波启发音高估计器(刷取)中,用振幅压缩(PEFAC)节距估计滤波器。两种算法的MATLAB®实现可以在[找到5]和[6]。的HelperPitchTracker函数使用PEFAC算法的部分内容,如[3.],在内部。为了不比较其他算法运行这个例子,设置比较.下面的比较大约需要30分钟。

比较=真正的;numFilesToTest = 20;p = 0.1;GPE_pitchTracker = 0(元素个数(snrToTest),元素个数(noiseType));如果比较GPE_swipe = 0 (numel(snrToTest),numel(noiseType));GPE_pefac = 0(元素个数(snrToTest),元素个数(noiseType));结束对于I = 1:numFilesToTest [cleanSpeech,信息] =读(ADS1);cleanSpeech =重采样(cleanSpeech,desiredFs,info.SampleRate);truePitch = getReferencePitch(info.Label {:});isVoiced = truePitch〜= 0;truePitchInVoicedRegions = truePitch(isVoiced);对于J = 1:numel(snrToTest)对于K = 1:numel(噪声)noisySpeech = mixSNR(cleanSpeech,噪声{K},snrToTest(J));F0 = HelperPitchTracker(noisySpeech,desiredFs,“EmissionMatrix”emissionMatrix,“EmissionMatrixRange”,emissionMatrixRange);F0 = [0; F0];与数据库手动对齐。GPE_pitchTracker(j,k) = GPE_pitchTracker(j,k) +均值(abs(f0(is浊音)- truePitchInVoicedRegions) > truePitchInVoicedRegions.*p).*100;如果比较f0 = swipep(噪声语音,desiredFs,[50,400],0.01);f0 = f0(3:结束);与数据库手动对齐。GPE_swipe(j,k) = GPE_swipe(j,k) + mean(abs(f0(is浊音)- truePitchInVoicedRegions) > truePitchInVoicedRegions.*p).*100;f0 = fxpefac (noisySpeech desiredFs);GPE_pefac(j,k) = GPE_pefac(j,k) + mean(abs(f0(is浊音)- truePitchInVoicedRegions) > truePitchInVoicedRegions.*p).*100;结束结束结束结束GPE_pitchTracker = GPE_pitchTracker / numFilesToTest;如果比较GPE_swipe = GPE_swipe/numFilesToTest;GPE_pefac = GPE_pefac / numFilesToTest;结束

绘制每种噪声类型的总螺距误差。

对于figure plot(snrToTest,GPE_pitchTracker(:,ii),“b”)举行如果比较图(snrToTest GPE_swipe(:,(二),‘g’)情节(snrToTest GPE_pefac(:,(二),“c”)结束情节(snrToTest GPE_pitchTracker(:,(二),“波”)如果比较图(snrToTest GPE_swipe(:,(二),“全球之声”)情节(snrToTest GPE_pefac(:,(二),“cd”)结束标题(noiseType (ii))包含(“信噪比(dB)”)ylabel (sprintf (“总螺距误差(p = %0.2f)”,p))如果比较传奇(“HelperPitchTracker”,“刷”,“PEFAC”)其他传奇(“HelperPitchTracker”)结束网格持有结束

结论

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

参考文献

“音高追踪语料库在多音高追踪情境下的评估”,载于《国际语音》,2011年第1509-1512页。

[2] Drugman,托马斯和阿比尔Alwan的所在地。“联合强大的清浊检测和基音周期估计基于剩余谐波。”国际语音通信协会,INTERSPEECH 2004年年会论文集。2011年,第1973-1976。

[3]冈萨雷斯,西拉,和麦克布鲁克斯。“A节距估计滤波器健壮高水平噪声的(PEFAC)”。19欧洲信号处理会议。巴塞罗那,2011年,第451-455。

[4]信号处理与语音通信实验室。本文件于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 /英语/。

“Fxpefac”[6]。Description of Fxpefac. Accessed September 26, 2018. http://www.ee.ic.ac.uk/hp/staff/dmb/voicebox/voicebox.html.