Передайте отслеживание Используя несколько оценок тангажа и HMM

В этом примере показано, как выполнить отслеживание тангажа с помощью нескольких оценок тангажа, октавы и среднего сглаживания и скрытой модели Маркова (HMM).

Введение

Сделайте подачу обнаружение является основным базовым блоком в речевой обработке, речевом кодировании и музыкальном информационном поиске (MIR). В речи и распознавании динамика, тангаж используется в качестве функции в системе машинного обучения. Для колл-центров тангаж используется, чтобы указать на эмоциональное состояние и пол клиентов. В логопедии тангаж используется, чтобы указать и анализировать патологии и диагностировать физические дефекты. В MIR тангаж используется, чтобы категоризировать музыку для систем запроса гулом, и как первичная функция в идентификационных системах песни.

Сделайте подачу обнаружение для чистой речи в основном рассматривается решенная задача. Передайте обнаружение с шумом, и отслеживание мультитангажа остаются трудные проблемы. Существует много алгоритмов, относительно которых экстенсивно сообщили в литературе с известными компромиссами между вычислительной стоимостью и робастностью к различным типам шума.

Обычно, алгоритм обнаружения тангажа (PDA) оценивает тангаж в течение данного момента времени. Оценка тангажа затем подтверждена или откорректирована в системе слежения тангажа. Сделайте подачу системы слежения осуществляют непрерывность оценок тангажа в зависимости от времени.

Этот пример обеспечивает функцию, взятую в качестве примера, HelperPitchTracker, который реализует систему слежения тангажа. Пример идет через алгоритм, реализованный HelperPitchTracker функция.

Проблемные сводные данные

Загрузите звуковой файл и соответствующий ссылочный тангаж для звукового файла. О ссылочном тангаже сообщают каждые 10 мс и определили как в среднем несколько сторонних алгоритмов на чистом речевом файле. Области без речевой речи представлены как nan.

[x,fs] = audioread('Counting-16-44p1-mono-15secs.wav');
load TruePitch.mat truePitch

Используйте pitch функционируйте, чтобы оценивать тангаж аудио в зависимости от времени.

[f0,locs] = pitch(x,fs);

О двух метриках обычно сообщают при определении ошибки тангажа: грубая ошибка тангажа (GPE) и озвучивание ошибки решения (VDE). Поскольку алгоритмы тангажа в этом примере не обеспечивают решение озвучивания, только о GPE сообщают. В этом примере GPE вычисляется как процент оценок тангажа снаружи ±10% из ссылочного тангажа по промежутку речевых сегментов.

Вычислите GPE для областей речи и постройте результаты. Слушайте чистый звуковой сигнал.

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;
sound(x,fs)

figure(1)
tiledlayout(2,1)
nexttile
plot(t,x)
ylabel('Amplitude')
title('Pitch Estimation of Clean Signal')

nexttile
plot(t0,[truePitch,f0])
legend('Reference','Estimate','Location','NW')
ylabel('F0 (Hz)')
xlabel('Time (s)')
title(sprintf('GPE = %0.1f%%',GPE))

Смешайте речевой сигнал с шумом в -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;

sound(x,fs)

figure(2)
tiledlayout(2,1)

nexttile
plot(t,x)
ylabel('Amplitude')
title('Pitch Estimation of Noisy Signal')

nexttile
plot(t0,[truePitch,f0])
legend('Reference','Estimate','Location','NW')
ylabel('F0 (Hz)')
xlabel('Time (s)')
title(sprintf('GPE = %0.1f%%',GPE))

В этом примере показано, как улучшить оценку тангажа шумных речевых сигналов с помощью нескольких кандидата тангажа генерация, сглаживание октавы, сглаживание медианы и HMM.

Алгоритм, описанный в этом примере, реализован в функции, взятой в качестве примера, 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 contour 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 estimate 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 функция, взятая в качестве примера.

1. Сгенерируйте несколько кандидатов тангажа

В первой стадии системы слежения тангажа вы генерируете несколько кандидатов тангажа, использующих несколько алгоритмов обнаружения тангажа. Первичные кандидаты тангажа, которые обычно более точны, сгенерированы с помощью алгоритмов на основе Суммирования Остаточных Гармоник (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,x, ...
                                             params_SRH, ...
                                             multiCandidate_params_SRH);
figure(3)
tiledlayout(2,1)
nexttile
plot(t0,f0_SRH)
ylabel('F0 Candidates (Hz)')
title('Multiple Candidates from SRH Pitch Estimation')
nexttile
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)];

2. Определите долгосрочную медиану

Долгосрочная медиана кандидатов тангажа используется, чтобы сократить количество кандидатов тангажа. Чтобы вычислить долгосрочный средний тангаж, сначала вычислите гармоническое отношение. Сделайте подачу оценки только допустимы в областях речевой речи, где гармоническое отношение высоко.

hr = harmonicRatio(xBuff_PEF,fs, ...
                  'Window',hamming(size(xBuff_NCF,1),'periodic'), ...
                  'OverlapLength',0);

figure(4)
tiledlayout(2,1)
nexttile
plot(t,x)
ylabel('Amplitude')
nexttile
plot(t0,hr)
ylabel('Harmonic Ratio')
xlabel('Time (s)')

Используйте гармоническое отношение для порога области, которые не включают речевую речь в долгосрочной перспективе среднее вычисление. После определения долгосрочной медианы вычислите нижние и верхние границы для кандидатов тангажа. В этом примере нижние и верхние границы были определены опытным путем как 2/3 и 4/3 средний тангаж. Кандидаты за пределами этих границ оштрафованы на следующем этапе.

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)
tiledlayout(1,1)
nexttile
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')

3. Сокращение кандидата

По умолчанию кандидаты, возвращенные алгоритмом обнаружения тангажа, сортируются в порядке убывания доверия. Уменьшите доверие любого первичного кандидата вне нижних и верхних границ. Уменьшите доверие на коэффициент 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')

4. Сделайте отличительными

Если два или больше кандидата в данном промежутке на 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);

5. Передайте итерацию HMM со сглаживанием октавы

Теперь, когда кандидаты уменьшались, можно подать их в HMM, чтобы осуществить ограничения непрерывности. Сделайте подачу контуры обычно непрерывны для речевых сигналов, когда анализируется в транзитных участках на 10 мс. Вероятность тангажа, перемещающегося от одного состояния до другого через время, упоминается как вероятность эмиссии. Вероятности эмиссии могут инкапсулироваться в матрицу, которая описывает вероятность движения от любого значения тангажа в области значений набора любому другому в области значений набора. Матрица эмиссии, используемая в этом примере, была создана с помощью базы данных Граца. [1]

Загрузите матрицу эмиссии и сопоставленную область значений. Постройте функцию плотности вероятности (PDF) тангажа в состоянии на 150 Гц.

load EmissionMatrix.mat emissionMatrix emissionMatrixRange

currentState = 150;

фигура (7)
график (emissionMatrixRange (1): emissionMatrixRange (2), emissionMatrix (currentState - emissionMatrixRange (1)-1, :))
заголовок (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

6. Traceback HMM

Если прямая итерация 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

f0toPlot = f0;
f0toPlot(~isVoiced) = NaN;
GPE = mean( abs(f0toPlot(isVoiced) - truePitch(isVoiced)) > truePitch(isVoiced).*p).*100;
figure(8)
plot(t0,[truePitch,f0toPlot])
legend('Reference','Estimate')
ylabel('F0 (Hz)')
xlabel('Time (s)')
title(sprintf('GPE = %0.1f%%',GPE))

7. Движущийся средний фильтр

Как итоговый шаг последующей обработки, примените движущийся средний фильтр с длиной окна трех транзитных участков. Вычислите итоговый GPE и постройте итоговый контур тангажа и известный контур.

f0 = movmedian(f0,3);
f0(~isVoiced) = NaN;

GPE = mean(abs(f0(isVoiced) - truePitch(isVoiced)) > truePitch(isVoiced).*p).*100;
figure(9)
plot(t0,[truePitch,f0])
legend('Reference','Estimate')
ylabel('F0 (Hz)')
xlabel('Time (s)')
title(sprintf('GPE = %0.1f%%',GPE))

Оценка результатов деятельности

HelperPitchTracker функционируйте использует HMM, чтобы применить ограничения непрерывности, чтобы передать контуры. Матрица эмиссии HMM может быть установлена непосредственно. Лучше обучать матрицу эмиссии на источниках звука, похожих на тех, вы хотите отследить.

Этот пример использует Базу данных Отслеживания Тангажа из Технологического университета Граца (PTDB-TUG) [4]. Набор данных состоит из 20 английских носителей языка, читающих 2 342 фонетически богатых предложения из корпуса TIMIT. Загрузите и извлеките набор данных. В зависимости от вашей системы, загружая и извлекая набор данных может занять приблизительно 1,5 часа.

url = 'https://www2.spsc.tugraz.at/databases/PTDB-TUG/SPEECH_DATA_ZIPPED.zip';
downloadFolder = tempdir;
datasetFolder = fullfile(downloadFolder,'PTDB-TUG');

if ~exist(datasetFolder,'dir')
    disp('Downloading PTDB-TUG (3.9 G) ...')
    unzip(url,datasetFolder)
end

Создайте аудио datastore, который указывает на записи микрофона в базе данных. Установите метку, сопоставленную с каждым файлом к местоположению связанного известного файла тангажа. Набор данных содержит записи 10 розеток и 10 спикеров. Используйте subset изолировать 10-х женщин-спикеров и спикеров. Обучите матрицу эмиссии на основе ссылочных контуров тангажа и для спикеров и для женщин-спикеров 1 - 9.

ads = audioDatastore([fullfile(datasetFolder,"SPEECH DATA","FEMALE","MIC"),fullfile(datasetFolder,"SPEECH DATA","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 функционируйте чтения в значениях тангажа, если краткосрочная энергия выше порога. Порог был определен опытным путем в аудировании. HelperUpdateEmissionMatrix создает 2-мерную гистограмму на основе текущего состояния тангажа и следующего состояния тангажа. После того, как гистограмма создается, она нормирована, чтобы создать матрицу эмиссии.

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'};
numNoiseToTest = numel(noiseType);

desiredFs = 16e3;

whiteNoiseMaker = dsp.ColoredNoise('Color','white','SamplesPerFrame',40000,'RandomStream','mt19937ar with seed','BoundedOutput',true);
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-16-16-mono-12secs.wav');
noise{5} = resample(street,desiredFs,streetFs);

snrToTest = [10,5,0,-5,-10];
numSNRtoTest = numel(snrToTest);

Запустите алгоритм обнаружения тангажа для каждого ОСШ и шумовой тип для каждого файла. Вычислите средний GPE через речевые файлы. Этот пример сравнивает эффективность с популярным алгоритмом отслеживания тангажа: Пилообразная форма волны вдохновленное средство оценки тангажа (SWIPE). Реализация MATLAB® алгоритма может быть найдена в [5]. Чтобы запустить этот пример без по сравнению с другими алгоритмами, установите compare к false. Следующее сравнение занимает приблизительно 15 минут.

compare = true;
numFilesToTest = 20;
p = 0.1;
GPE_pitchTracker = нули (numSNRtoTest, numNoiseToTest, numFilesToTest);
if сравнение
    GPE_swipe = GPE_pitchTracker;
end
for i = 1:numFilesToTest
    [cleanSpeech, информация] = читала (ads1);
    cleanSpeech = передискретизируют (cleanSpeech, desiredFs, info.SampleRate);
    
    truePitch = getReferencePitch (info.Label {:});
    isVoiced = truePitch ~ = 0;
    truePitchInVoicedRegions = truePitch (isVoiced);
    
    for j = 1:numSNRtoTest
        for k = 1:numNoiseToTest
            noisySpeech = mixSNR (cleanSpeech, шум {k}, snrToTest (j));
            f0 = HelperPitchTracker (noisySpeech, desiredFs,'EmissionMatrix', emissionMatrix,'EmissionMatrixRange', emissionMatrixRange);
            f0 = [0; f0]; % manual alignment with database.
            GPE_pitchTracker (j, k, i) = среднее значение (abs (f0 (isVoiced) - truePitchInVoicedRegions)> truePitchInVoicedRegions. *p).*100;
            
            if сравнение
                f0 = swipep (noisySpeech, desiredFs, [50,400], 0.01);
                f0 = f0 (3:end); % manual alignment with database.
                GPE_swipe (j, k, i) = среднее значение (abs (f0 (isVoiced) - truePitchInVoicedRegions)> truePitchInVoicedRegions. *p).*100;
            end
        end
    end
end
GPE_pitchTracker = среднее значение (GPE_pitchTracker, 3);

if сравнение
    GPE_swipe = среднее значение (GPE_swipe, 3);
end

Постройте грубую ошибку тангажа для каждого шумового типа.

for ii = 1:numel(noise)
    figure(9+ii)
    plot(snrToTest,GPE_pitchTracker(:,ii),'b')
    hold on
    if compare
        plot(snrToTest,GPE_swipe(:,ii),'g')
    end
    plot(snrToTest,GPE_pitchTracker(:,ii),'bo')
    if compare
        plot(snrToTest,GPE_swipe(:,ii),'gv')
    end
    title(noiseType(ii))
    xlabel('SNR (dB)')
    ylabel(sprintf('Gross Pitch Error (p = %0.2f)',p))
    if compare
        legend('HelperPitchTracker','SWIPE')
    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/databases-and-tools/ptdb-tug-pitch-tracking-database-from-graz-university-of-technology.html.

[5] "Артуро Камачо". Полученный доступ 26 сентября 2018. https://www.cise.ufl.edu / ~ acamacho/english/.

[6] "Fxpefac". Описание Fxpefac. Полученный доступ 26 сентября 2018. http://www.ee.ic.ac.uk/hp/staff/dmb/voicebox/voicebox.html.