Это, которое показывают примеры, как выполнить отслеживание подачи с помощью нескольких оценок подачи, октавы и среднего сглаживания и Скрытой модели Маркова (HMM).
Сделайте подачу обнаружение является основным стандартным блоком в речевой обработке, речевом кодировании и музыкальном информационном поиске (MIR). В речи и распознавании динамика, подача используется в качестве функции в системе машинного обучения. Для колл-центров подача используется, чтобы указать на эмоциональное состояние и пол клиентов. В логопедии подача используется, чтобы указать и анализировать патологии и диагностировать физические дефекты. В MIR подача используется, чтобы категоризировать музыку для систем запроса гулом, и как первичная функция в идентификационных системах песни.
Сделайте подачу обнаружение для чистой речи в основном рассматривается решенной проблемой. Передайте обнаружение с шумом, и отслеживание мультиподачи остаются трудные проблемы. Существует много алгоритмов, относительно которых экстенсивно сообщили в литературе с известными компромиссами между вычислительной стоимостью и робастностью к различным типам шума.
Обычно, алгоритм обнаружения подачи (PDA) оценивает подачу в течение данного момента времени. Оценка подачи затем подтверждена или исправлена в системе слежения подачи. Сделайте подачу системы слежения осуществляют непрерывность оценок подачи в зависимости от времени.
Этот пример обеспечивает функцию, взятую в качестве примера, HelperPitchTracker
, который реализует систему слежения подачи. Пример идет через алгоритм, реализованный функцией HelperPitchTracker
.
Загрузите звуковой файл и соответствующую ссылочную подачу для звукового файла. О ссылочной подаче сообщают каждые 10 мс и определили как в среднем несколько сторонних алгоритмов на чистом речевом файле. Области без речевой речи представлены как nan
.
Используйте функцию pitch
, чтобы оценивать подачу аудио в зависимости от времени. О двух метриках обычно сообщают при определении ошибки подачи: Грубая ошибка подачи (GPE) и Озвучивание ошибки решения (VDE). Поскольку алгоритмы подачи в этом примере не обеспечивают решение озвучивания, только о GPE сообщают. GPE вычисляется по промежутку известных озвученных сегментов. GPE вычисляется как процент оценок подачи снаружи +/-10% ссылочной подачи. Вычислите GPE для областей речи и постройте результаты. Слушайте чистый звуковой сигнал.
[x,fs] = audioread('Counting-16-44p1-mono-15secs.wav'); load TruePitch.mat truePitch [f0,locs] = pitch(x,fs); isVoiced = ~isnan(truePitch); f0(~isVoiced) = nan; p = 0.1; GPE = mean(abs(f0(isVoiced)-truePitch(isVoiced)) > truePitch(isVoiced).*p).*100; t = (0:length(x)-1)/fs; t0 = (locs-1)/fs; figure(1) subplot(2,1,1) plot(t,x) ylabel('Amplitude') title('Pitch Estimation of Clean Signal') subplot(2,1,2) plot(t0,[truePitch,f0]) legend('Reference','Estimate','Location','NW') ylabel('F0 (Hz)') xlabel('Time (s)') title(sprintf('GPE = %0.1f%%',GPE)) sound(x,fs)
Смешайте речевой сигнал с шумом в ОСШ на-5 дБ.
Используйте функцию pitch
на шумном аудио, чтобы оценивать подачу в зависимости от времени. Вычислите GPE для областей речевой речи и постройте результаты. Слушайте шумный звуковой сигнал.
desiredSNR = -5; x = mixSNR(x,rand(size(x)),desiredSNR); [f0,locs] = pitch(x,fs); f0(~isVoiced) = nan; GPE = mean(abs(f0(isVoiced) - truePitch(isVoiced)) > truePitch(isVoiced).*p).*100; figure(2) subplot(2,1,1) plot(t,x) ylabel('Amplitude') title('Pitch Estimation of Noisy Signal') subplot(2,1,2) plot(t0,[truePitch,f0]) legend('Reference','Estimate','Location','NW') ylabel('F0 (Hz)') xlabel('Time (s)') title(sprintf('GPE = %0.1f%%',GPE)) sound(x,fs)
Этот пример показывает, как улучшить оценку подачи шумных речевых сигналов с помощью нескольких кандидата подачи генерация, сглаживание октавы, сглаживание медианы и Скрытая Модель Маркова.
Алгоритм, описанный в этом примере, реализован в функции, взятой в качестве примера, HelperPitchTracker
. Чтобы узнать о функции HelperPitchTracker
, введите help HelperPitchTracker
в командной строке.
help HelperPitchTracker
HelperPitchTracker Track the fundamental frequency of audio signal f0 = HelperPitchTracker(audioIn,fs) returns an estimate of the fundamental frequency countour for the audio input. Columns of the input are treated as individual channels. The HelperPitchTracker function uses multiple pitch detection algorithms to generate pitch candidates, and uses octave smoothing and a Hidden Markov Model to return an estimate of the fundamental frequency. f0 = HelperPitchTracker(...,'HopLength',HOPLENGTH) specifies the number of samples in each hop. The pitch esitmate is updated every hop. Specify HOPLENGTH as a scalar integer. If unspecified, HOPLENGTH defaults to round(0.01*fs). f0 = HelperPitchTracker(...,'OctaveSmoothing',TF) specifies whether or not to apply octave smoothing. Specify as true or false. If unspecified, TF defaults to 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
.
В первой стадии системы слежения подачи вы генерируете несколько кандидатов подачи, использующих несколько алгоритмов обнаружения подачи. Первичные кандидаты подачи, те, которые мы "доверяем" больше, сгенерированы с помощью алгоритмов на основе Суммирования Остаточных Гармоник (SRH) [2] алгоритм и Фильтр Оценки Подачи с Амплитудным Сжатием (PEFAC) [3] алгоритм.
Буферизуйте шумный входной сигнал в перекрытые кадры, и затем используйте audio.internal.pitch.SRH
, чтобы сгенерировать 5 кандидатов подачи на каждый транзитный участок. Также возвратите относительную уверенность каждого кандидата подачи. Постройте график результатов.
RANGE = [50,400]; HOPLENGTH = round(fs.*0.01); % Buffer into required sizes xBuff_SRH = buffer(x,round(0.025*fs),round(0.02*fs),'nodelay'); % Define pitch parameters params_SRH = struct('Method','SRH', ... 'Range',RANGE, ... 'WindowLength',round(fs*0.06), ... 'OverlapLength',round(fs*0.06-HOPLENGTH), ... 'SampleRate',fs, ... 'NumChannels',size(x,2), ... 'SamplesPerChannel',size(x,1)); multiCandidate_params_SRH = struct('NumCandidates',5,'MinPeakDistance',1); % Get pitch estimate and confidence [f0_SRH,conf_SRH] = audio.internal.pitch.SRH(xBuff_SRH, ... params_SRH, ... multiCandidate_params_SRH); figure(3) subplot(2,1,1) plot(t0,f0_SRH) ylabel('F0 Candidates (Hz)') title('Multiple Candidates from SRH Pitch Estimation') subplot(2,1,2) plot(t0,conf_SRH) ylabel('Relative Confidence') xlabel('Time (s)')
Сгенерируйте дополнительную группу первичных кандидатов подачи и сопоставленной уверенности с помощью алгоритма PEF. Сгенерируйте резервных кандидатов и сопоставленную уверенность с помощью алгоритма нормированной функции корреляции (NCF) и определения подачи кепстра (CEP) алгоритм. Регистрируйте только самую уверенную оценку от резервных кандидатов.
xBuff_PEF = buffer(x,round(0.06*fs),round(0.05*fs),'nodelay'); params_PEF = struct('Method','PEF', ... 'Range',RANGE, ... 'WindowLength',round(fs*0.06), ... 'OverlapLength',round(fs*0.06-HOPLENGTH), ... 'SampleRate',fs, ... 'NumChannels',size(x,2), ... 'SamplesPerChannel',size(x,1)); multiCandidate_params_PEF = struct('NumCandidates',5,'MinPeakDistance',5); [f0_PEF,conf_PEF] = audio.internal.pitch.PEF(xBuff_PEF, ... params_PEF, ... multiCandidate_params_PEF); xBuff_NCF = buffer(x,round(0.04*fs),round(0.03*fs),'nodelay'); xBuff_NCF = xBuff_NCF(:,2:end-1); params_NCF = struct('Method','NCF', ... 'Range',RANGE, ... 'WindowLength',round(fs*0.04), ... 'OverlapLength',round(fs*0.04-HOPLENGTH), ... 'SampleRate',fs, ... 'NumChannels',size(x,2), ... 'SamplesPerChannel',size(x,1)); multiCandidate_params_NCF = struct('NumCandidates',5,'MinPeakDistance',1); f0_NCF = audio.internal.pitch.NCF(xBuff_NCF, ... params_NCF, ... multiCandidate_params_NCF); xBuff_CEP = buffer(x,round(0.04*fs),round(0.03*fs),'nodelay'); xBuff_CEP = xBuff_CEP(:,2:end-1); params_CEP = struct('Method','CEP', ... 'Range',RANGE, ... 'WindowLength',round(fs*0.04), ... 'OverlapLength',round(fs*0.04-HOPLENGTH), ... 'SampleRate',fs, ... 'NumChannels',size(x,2), ... 'SamplesPerChannel',size(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)];
Долгосрочная медиана кандидатов подачи используется, чтобы сократить количество кандидатов подачи. Чтобы вычислить долгосрочную среднюю подачу, сначала вычислите гармоническое отношение. Сделайте подачу оценки только допустимы в областях речевой речи, где гармоническое отношение высоко.
hr = harmonicRatio(xBuff_PEF,fs, ... 'Window',hamming(size(xBuff_NCF,1),'periodic'), ... 'OverlapLength',0); figure(4) subplot(2,1,1) plot(t,x) ylabel('Amplitude') subplot(2,1,2) plot(t0,hr) ylabel('Harmonic Ratio') xlabel('Time (s)')
Используйте гармоническое отношение для порога области, которые не включают речевую речь в долгосрочной перспективе среднее вычисление. После определения долгосрочной медианы вычислите разумные нижние и верхние границы для кандидатов подачи. Кандидаты за пределами этих границ оштрафованы на следующем этапе.
idxToKeep = logical(movmedian(hr>((3/4)*max(hr)),3)); longTermMedian = median([f0_PEF(idxToKeep,1);f0_SRH(idxToKeep,1)]); lower = max((2/3)*longTermMedian,RANGE(1)); upper = min((4/3)*longTermMedian,RANGE(2)); figure(5) plot(t0,[f0_PEF,f0_SRH]);hold on plot(t0,longTermMedian.*ones(size(f0_PEF,1)),'r:','LineWidth',3) plot(t0,upper.*ones(size(f0_PEF,1)),'r','LineWidth',2) plot(t0,lower.*ones(size(f0_PEF,1)),'r','LineWidth',2);hold off xlabel('Time (s)') ylabel('Frequency (Hz)') title('Long Term Median')
По умолчанию кандидаты, возвращенные алгоритмом обнаружения подачи, сортируются в порядке убывания уверенности. Уменьшите уверенность любого первичного кандидата вне нижних и верхних границ. Уменьшите уверенность фактором 10. Обращаются кандидаты и на PEF и на алгоритмы SRH, таким образом это, таким образом, они имеют в порядке убывания уверенность. Конкатенация кандидатов, сохраняя только двух самых уверенных кандидатов от каждого алгоритма.
Постройте уменьшаемых кандидатов.
invalid = f0_PEF>lower | f0_PEF>upper; conf_PEF(invalid) = conf_PEF(invalid)/10; [conf_PEF,order] = sort(conf_PEF,2,'descend'); for i = 1:size(f0_PEF,1) f0_PEF(i,:) = f0_PEF(i,order(i,:)); end invalid = f0_SRH>lower | f0_SRH>upper; conf_SRH(invalid) = conf_SRH(invalid)/10; [conf_SRH,order] = sort(conf_SRH,2,'descend'); for i = 1:size(f0_SRH,1) f0_SRH(i,:) = f0_SRH(i,order(i,:)); end candidates = [f0_PEF(:,1:2),f0_SRH(:,1:2)]; confidence = [conf_PEF(:,1:2),conf_SRH(:,1:2)]; figure(6) plot(t0,candidates) xlabel('Time (s)') ylabel('Frequency (Hz)') title('Reduced Candidates')
Если два или больше кандидата в данном промежутке на 5 Гц, устанавливают кандидатов на свое среднее значение и суммируют свою уверенность.
span = 5; confidenceFactor = 1; for r = 1:size(candidates,1) for c = 1:size(candidates,2) tf = abs(candidates(r,c)-candidates(r,:)) < span; candidates(r,c) = mean(candidates(r,tf)); confidence(r,c) = sum(confidence(r,tf))*confidenceFactor; end end candidates = max(min(candidates,400),50);
Теперь, когда кандидаты уменьшались, можно подать их в скрытую модель Маркова (HMM), чтобы осуществить ограничения непрерывности. Сделайте подачу контуры обычно непрерывны для речевых сигналов, когда анализируется в транзитных участках на 10 мс. Вероятность подачи, перемещающейся от одного состояния до другого через время, упоминается как вероятность эмиссии. Вероятности эмиссии могут инкапсулироваться в матрицу, которая описывает вероятность движения от любого значения подачи в области значений набора любому другому в области значений набора. Матрица эмиссии, используемая в этом примере, была создана с помощью базы данных Граца. [1]
Загрузите матрицу эмиссии и сопоставленную область значений. Постройте функцию плотности вероятности (PDF) подачи в состоянии на 150 Гц.
load EmissionMatrix.mat emissionMatrix emissionMatrixRange currentState = 150; figure(7) plot(emissionMatrixRange(1):emissionMatrixRange(2),emissionMatrix(currentState - emissionMatrixRange(1)-1,:)) title(sprintf('Emission PDF for %d Hz',currentState)) xlabel('Next Pitch Value (Hz)') ylabel('Probability')
HMM, используемый в этом примере, комбинирует вероятности эмиссии, которые осуществляют непрерывность и относительную уверенность подачи. В каждом транзитном участке вероятности эмиссии объединены с относительной уверенностью, чтобы создать матрицу уверенности. Лучший выбор для каждого пути определяется как макс. из матрицы уверенности. HMM, используемый в этом примере также, принимает, что только один путь может быть присвоен данному состоянию (предположение об алгоритме Viterbi).
В дополнение к HMM этот пример контролирует для скачков октавы относительно краткосрочной медианы путей к подаче. Если скачок октавы обнаруживается, то резервные кандидаты подачи добавляются как опции для HMM.
% Preallocation numPaths = 4; numHops = size(candidates,1); logbook = zeros(numHops,3,numPaths); suspectHops = zeros(numHops,1); % Forward iteration with octave-smoothing for hopNumber = 1:numHops nowCandidates = candidates(hopNumber,:); nowConfidence = confidence(hopNumber,:); % Remove octave jumps if hopNumber>100 numCandidates = numel(nowCandidates); % Weighted short term median medianWindowLength = 50; aTemp = logbook(max(hopNumber-min(hopNumber,medianWindowLength),1):hopNumber-1,1,:); shortTermMedian = median(aTemp(:)); previousM = mean([longTermMedian,shortTermMedian]); lowerTight = max((4/3)*previousM,emissionMatrixRange(1)); upperTight = min((2/3)*previousM,emissionMatrixRange(2)); numCandidateOutside = sum([nowCandidates < lowerTight, nowCandidates > upperTight]); % If at least 1 candidate is outside the octave centered on the % short-term median, add the backup pitch candidates that were % generated by the normalized correlation function and cepstrum % pitch determination algorithms as potential candidates. if numCandidateOutside > 0 % Apply the backup pitch estimators nowCandidates = [nowCandidates,BackupCandidates(hopNumber,:)]; %#ok<AGROW> nowConfidence = [nowConfidence,repmat(mean(nowConfidence),1,2)];%#ok<AGROW> % Make Distinctive span = 10; confidenceFactor = 1.2; for r = 1:size(nowCandidates,1) for c = 1:size(nowCandidates,2) tf = abs(nowCandidates(r,c)-nowCandidates(r,:)) < span; nowCandidates(r,c) = mean(nowCandidates(r,tf)); nowConfidence(r,c) = sum(nowConfidence(r,tf))*confidenceFactor; end end end end % Create confidence matrix confidenceMatrix = zeros(numel(nowCandidates),size(logbook,3)); for pageIdx = 1:size(logbook,3) if hopNumber ~= 1 pastPitch = floor(logbook(hopNumber-1,1,pageIdx)) - emissionMatrixRange(1) + 1; else pastPitch = nan; end for candidateNumber = 1:numel(nowCandidates) if hopNumber ~= 1 % Get the current pitch and convert to an index in the range currentPitch = floor(nowCandidates(candidateNumber)) - emissionMatrixRange(1) + 1; confidenceMatrix(candidateNumber,pageIdx) = ... emissionMatrix(currentPitch,pastPitch)*logbook(hopNumber-1,2,pageIdx)*nowConfidence(candidateNumber); else confidenceMatrix(candidateNumber,pageIdx) = 1; end end end % Assign an estimate for each path for pageIdx = 1:size(logbook,3) % Determine most confident transition from past to current pitch [~,idx] = max(confidenceMatrix(:)); % Convert confidence matrix index to pitch and logbook page [chosenPitch,pastPitchIdx] = ind2sub([numel(nowCandidates),size(logbook,3)],idx); logbook(hopNumber,:,pageIdx) = ... [nowCandidates(chosenPitch), ... confidenceMatrix(chosenPitch,pastPitchIdx), ... pastPitchIdx]; % Remove the chosen current pitch from the confidence matrix confidenceMatrix(chosenPitch,:) = nan; end % Normalize confidence logbook(hopNumber,2,:) = logbook(hopNumber,2,:)/sum(logbook(hopNumber,2,:)); end
Если прямая итерация HMM завершена, итоговый контур подачи выбран в качестве самого уверенного пути. Идите назад через журнал учета, чтобы определить контур подачи, выведенный HMM. Вычислите GPE и постройте новый контур подачи и известный контур.
numHops = size(logbook,1); keepLooking = true; index = numHops + 1; while keepLooking index = index - 1; if abs(max(logbook(index,2,:))-min(logbook(index,2,:)))~=0 keepLooking = false; end end [~,bestPathIdx] = max(logbook(index,2,:)); bestIndices = zeros(numHops,1); bestIndices(index) = bestPathIdx; for ii = index:-1:2 bestIndices(ii-1) = logbook(ii,3,bestIndices(ii)); end bestIndices(bestIndices==0) = 1; f0 = zeros(numHops,1); for ii = (numHops):-1:2 f0(ii) = logbook(ii,1,bestIndices(ii)); end figure(8) f0toPlot = f0; f0toPlot(~isVoiced) = nan; GPE = mean( abs(f0toPlot(isVoiced) - truePitch(isVoiced)) > truePitch(isVoiced).*p).*100; plot(t0,[truePitch,f0toPlot]) legend('Reference','Estimate') ylabel('F0 (Hz)') xlabel('Time (s)') title(sprintf('GPE = %0.1f%%',GPE))
Как итоговый шаг последующей обработки, примените движущийся средний фильтр с длиной окна трех транзитных участков. Вычислите итоговый GPE и постройте итоговый контур подачи и известный контур.
f0 = movmedian(f0,3); f0(~isVoiced) = nan; figure(9) GPE = mean( abs(f0(isVoiced) - truePitch(isVoiced)) > truePitch(isVoiced).*p).*100; plot(t0,[truePitch,f0]) legend('Reference','Estimate') ylabel('F0 (Hz)') xlabel('Time (s)') title(sprintf('GPE = %0.1f%%',GPE))
Функция HelperPitchTracker
использует Скрытую Модель Маркова, чтобы применить ограничения непрерывности, чтобы передать контуры. Матрица эмиссии Скрытой Модели Маркова может быть установлена непосредственно. Лучше обучать матрицу эмиссии на источниках звука, подобных тем, вы хотите отследить.
Загрузите набор данных с файлов https://www.spsc.tugraz.at/tools/ptdb-tug. Установите datafolder
на местоположение данных.
datafolder = PathToDatabase;
Создайте аудио datastore, который указывает на записи микрофона в базе данных. Установите метку, сопоставленную с каждым файлом к местоположению связанного известного файла подачи. Набор данных содержит записи 10 розеток и 10 спикеров. Используйте subset
, чтобы изолировать 10-х женщин-спикеров и спикеров. Вы обучите матрицу эмиссии на основе ссылочных контуров подачи и для спикеров и для женщин-спикеров 1 - 9.
ads = audioDatastore([strcat(datafolder,"\FEMALE\MIC"),strcat(datafolder,"\MALE\MIC")], ... 'IncludeSubfolders',true, ... 'FileExtensions','.wav'); wavFileNames = ads.Files; ads.Labels = replace(wavFileNames,{'MIC','mic','wav'},{'REF','ref','f0'}); idxToRemove = contains(ads.Files,{'F10','M10'}); ads1 = subset(ads,idxToRemove); ads9 = subset(ads,~idxToRemove);
Переставьте аудио хранилища данных.
ads1 = shuffle(ads1); ads9 = shuffle(ads9);
Матрица эмиссии описывает вероятность движения от одного состояния подачи до другого. В следующем шаге вы создаете матрицу эмиссии на основе динамиков 1-9 и для штекера и для розетки. База данных хранит ссылочные значения подачи, краткосрочную энергию и дополнительную информацию в текстовых файлах с расширением файлов f0
. Функция getReferencePitch
читает в значениях подачи, если краткосрочная энергия выше порога. Порог был определен опытным путем в аудировании. HelperUpdateEmisionMatrix
создает 2-dimensionsal гистограмму на основе текущего состояния подачи и следующего состояния подачи. После того, как гистограмма создается, она нормирована, чтобы создать матрицу эмиссии.
emissionMatrixRange = [50,400]; emissionMatrix = []; for i = 1:numel(ads9.Files) x = getReferencePitch(ads9.Labels{i}); emissionMatrix = HelperUpdateEmissionMatrix(x,emissionMatrixRange,emissionMatrix); end emissionMatrix = emissionMatrix + sqrt(eps); emissionMatrix = emissionMatrix./norm(emissionMatrix);
Задайте различные типы фонового шума: белый, окружение, механизм, струя и улица. Передискретизируйте их к 16 кГц, чтобы помочь ускорить тестирование базы данных.
Задайте ОСШ, чтобы протестировать, в дБ, как 10, 5, 0,-5, и-10.
noiseType = {'white','ambiance','engine','jet','street'}; desiredFs = 16e3; whiteNoiseMaker = dsp.ColoredNoise('Color','white','SamplesPerFrame',40000,'RandomStream','mt19937ar with seed'); noise{1} = whiteNoiseMaker(); [ambiance,ambianceFs] = audioread('Ambiance-16-44p1-mono-12secs.wav'); noise{2} = resample(ambiance,desiredFs,ambianceFs); [engine,engineFs] = audioread('Engine-16-44p1-stereo-20sec.wav'); noise{3} = resample(engine,desiredFs,engineFs); [jet,jetFs] = audioread('JetAirplane-16-11p025-mono-16secs.wav'); noise{4} = resample(jet,desiredFs,jetFs); [street,streetFs] = audioread('MainStreetOne-24-96-stereo-63secs.wav'); noise{5} = resample(street,desiredFs,streetFs); snrToTest = [10,5,0,-5,-10];
Запустите алгоритм обнаружения подачи для каждого ОСШ и шумовой тип для каждого файла. Вычислите средний GPE через речевые файлы. Этот пример сравнивает производительность с другими популярными алгоритмами отслеживания подачи: Суммирование Остаточных Гармоник (SRH), Пилообразной формы волны вдохновленного средства оценки подачи (SWIPE) и Фильтра Оценки Подачи с Амплитудным Сжатием (PEFAC). Реализации MATLAB® всех трех алгоритмов могут быть найдены в [5], [6], и [7]. Функция HelperPitchTracker
использует части SRH и алгоритмов PEFAC, как описано в [2] и [3], внутренне. Чтобы запустить этот пример без по сравнению с другими алгоритмами, установите, выдерживают сравнение с false
. На машине работает этот пример, следующее сравнение занимает приблизительно 30 минут.
compare = true; numFilesToTest = 20; p = 0.1; GPE_pitchTracker = zeros(numel(snrToTest),numel(noiseType)); if compare GPE_swipe = zeros(numel(snrToTest),numel(noiseType)); GPE_srh = zeros(numel(snrToTest),numel(noiseType)); GPE_pefac = zeros(numel(snrToTest),numel(noiseType)); end for i = 1:numFilesToTest [cleanSpeech,info] = read(ads1); cleanSpeech = resample(cleanSpeech,desiredFs,info.SampleRate); truePitch = getReferencePitch(info.Label{:}); isVoiced = truePitch~=0; for j = 1:numel(snrToTest) for k = 1:numel(noise) noisySpeech = mixSNR(cleanSpeech,noise{k},snrToTest(j)); f0 = HelperPitchTracker(noisySpeech,desiredFs,'EmissionMatrix',emissionMatrix,'EmissionMatrixRange',emissionMatrixRange); f0 = [0;f0];%#ok<AGROW> % manual alignment with database. GPE_pitchTracker(j,k) = GPE_pitchTracker(j,k) + mean(abs(f0(isVoiced) - truePitch(isVoiced)) > truePitch(isVoiced).*p).*100; if compare f0 = swipep(noisySpeech,desiredFs,[50,400],0.01); f0 = f0(3:end);% manual alignment with database. GPE_swipe(j,k) = GPE_swipe(j,k) + mean(abs(f0(isVoiced) - truePitch(isVoiced)) > truePitch(isVoiced).*p).*100; f0 = fxpefac(noisySpeech,desiredFs); GPE_pefac(j,k) = GPE_pefac(j,k) + mean(abs(f0(isVoiced) - truePitch(isVoiced)) > truePitch(isVoiced).*p).*100; f0 = SRH_PitchTracking(noisySpeech,desiredFs,50,400); f0 = f0(2:end)'; % manual alignment GPE_srh(j,k) = GPE_srh(j,k) + mean(abs(f0(isVoiced) - truePitch(isVoiced)) > truePitch(isVoiced).*p).*100; end end end end GPE_pitchTracker = GPE_pitchTracker/numFilesToTest; if compare GPE_swipe = GPE_swipe/numFilesToTest; GPE_srh = GPE_srh/numFilesToTest; GPE_pefac = GPE_pefac/numFilesToTest; end % Plot the gross pitch error for each noise type. for ii = 1:numel(noise) figure plot(snrToTest,GPE_pitchTracker(:,ii),'b');hold on if compare plot(snrToTest,GPE_swipe(:,ii),'g') plot(snrToTest,GPE_srh(:,ii),'r') plot(snrToTest,GPE_pefac(:,ii),'c') end plot(snrToTest,GPE_pitchTracker(:,ii),'bo') if compare plot(snrToTest,GPE_swipe(:,ii),'gv') plot(snrToTest,GPE_srh(:,ii),'rs') plot(snrToTest,GPE_pefac(:,ii),'cd') end title(noiseType(ii)) xlabel('SNR (dB)') ylabel(sprintf('Gross Pitch Error (p = %0.2f)',p)) if compare legend('HelperPitchTracker','SWIPE','SRH','PEFAC') else legend('HelperPitchTracker') end grid on hold off end
Можно использовать HelperPitchTracker
в качестве базовой линии для оценки производительности GPE системы слежения подачи или адаптировать этот пример к приложению.
[1] Г. Пиркер, М. Уохлмэр, С. Петрик и Ф. Пернкопф, "Корпус Отслеживания Подачи с Оценкой на Сценарии Отслеживания Мультиподачи", Межречь, стр 1509-1512, 2011.
[2] Другмен, Томас и Абир Алван. "Соедините Устойчивую Оценку Обнаружения и Подачи Озвучивания На основе Остаточных Гармоник". Продолжения Ежегодной конференции Международной Речевой Коммуникационной Ассоциации, INTERSPEECH. 2011, стр 1973-1976.
[3] Гонсалес, Сира и Майк Брукес. "Фильтр Оценки Подачи, устойчивый к высокому уровню шума (PEFAC)". 19-я европейская Конференция по Обработке сигналов. Барселона, 2011, стр 451-455.
[4] Обработка сигналов и речевая коммуникационная лаборатория. Полученный доступ 26 сентября 2018. https://www.spsc.tugraz.at/tools/ptdb-tug.
[5] "Артуро Камачо". Полученный доступ 26 сентября 2018. https://www.cise.ufl.edu/~acamacho/english/.
[6] "Fxpefac". Описание Fxpefac. Полученный доступ 26 сентября 2018. https://www.ee.ic.ac.uk/hp/staff/dmb/voicebox/doc/voicebox/fxpefac.html.
[7] Домашняя страница Томаса Другмена. Полученный доступ 26 сентября 2018. https://tcts.fpms.ac.be/~drugman/Toolbox/.