Этот пример показывает, как изолировать речевой сигнал использование нейронной сети для глубокого обучения.
Эффект приема относится к способности мозга фокусироваться на одном динамике при отфильтровывании другой речи и фонового шума. Люди выполняют очень хорошо в проблеме приема. Этот пример показывает, как использовать нейронную сеть для глубокого обучения, чтобы разделить отдельные динамики от речевого соединения, где один штекер и одна розетка говорят одновременно.
Загрузите звуковые файлы, содержащие штекерную и розеточную речь, выбранную на уровне 4 кГц. Слушайте звуковые файлы индивидуально для ссылки.
[mSpeech,Fs] = audioread("MaleSpeech-16-4-mono-20secs.wav");
sound(mSpeech,Fs)
[fSpeech] = audioread("FemaleSpeech-16-4-mono-20secs.wav");
sound(fSpeech,Fs)
Объедините два речевых источника. Гарантируйте, что источники имеют равную силу в соединении. Нормируйте соединение так, чтобы его макс. амплитуда была той.
mSpeech = mSpeech/norm(mSpeech); fSpeech = fSpeech/norm(fSpeech); ampAdj = max(abs([mSpeech;fSpeech])); mSpeech = mSpeech/ampAdj; fSpeech = fSpeech/ampAdj; mix = mSpeech + fSpeech; mix = mix ./ max(abs(mix));
Визуализируйте исходные сигналы и сигналы соединения. Слушайте смешанный речевой сигнал. Этот пример показывает исходную разделительную схему, которая извлекает штекерные и розеточные источники от речевого соединения.
t = (0:numel(mix)-1)*(1/Fs); figure(1) subplot(3,1,1) plot(t,mSpeech) title("Male Speech") grid on subplot(3,1,2) plot(t,fSpeech) title("Female Speech") grid on subplot(3,1,3) plot(t,mix) title("Speech Mix") xlabel("Time (s)") grid on
Слушайте аудио соединения.
sound(mix,Fs)
Используйте stft
, чтобы визуализировать представление частоты времени (TF) штекера, розетки и речевых сигналов соединения. Используйте окно Hann длины 128, длины БПФ 128 и длины перекрытия 96.
WindowLength = 128; FFTLength = 128; OverlapLength = 96; win = hann(WindowLength,"periodic"); figure(2) subplot(3,1,1) stft(mSpeech,Fs,'Window',win,'OverlapLength',OverlapLength,'FFTLength',FFTLength) title("Male Speech") subplot(3,1,2) stft(fSpeech,Fs,'Window',win,'OverlapLength',OverlapLength,'FFTLength',FFTLength) title("Female Speech") subplot(3,1,3) stft(mix,Fs,'Window',win,'OverlapLength',OverlapLength,'FFTLength',FFTLength) title("Mix Speech")
Приложение маски TF, как показывали, было эффективным методом для разделения желаемых звуковых сигналов от конкурирующих звуков. Маска TF является матрицей, одного размера как базовый STFT. Маска умножается поэлементно с базовым STFT, чтобы изолировать желаемый источник. Маска TF может быть двоичным файлом или мягкий.
Исходное разделение Используя идеальные бинарные маски
В идеальной бинарной маске значения ячеек маски или 0 или 1. Если степень желаемого источника больше, чем cуммарная мощность других источников в конкретной ячейке TF, то та ячейка установлена в 1. В противном случае ячейка установлена в 0.
Вычислите идеальную бинарную маску для спикера и затем визуализируйте ее.
P_M = stft(mSpeech,'Window',win,'OverlapLength',OverlapLength,'FFTLength',FFTLength); P_F = stft(fSpeech,'Window',win,'OverlapLength',OverlapLength,'FFTLength',FFTLength); [P_mix,F] = stft(mix,'Window',win,'OverlapLength',OverlapLength,'FFTLength',FFTLength); binaryMask = abs(P_M) >= abs(P_F); figure(3) plotMask(binaryMask,WindowLength - OverlapLength,F,Fs)
Оцените штекерную речь STFT путем умножения соединения STFT на бинарную маску спикера. Оцените розеточную речь STFT путем умножения соединения STFT на инверсию бинарной маски спикера.
P_M_Hard = P_mix .* binaryMask; P_F_Hard = P_mix .* (1-binaryMask);
Оцените штекерные и розеточные звуковые сигналы с помощью обратного кратковременного БПФ (ISTFT). Визуализируйте предполагаемые и исходные сигналы. Слушайте предполагаемые штекерные и розеточные речевые сигналы.
mSpeech_Hard = istft(P_M_Hard ,'Window',win,'OverlapLength',OverlapLength,'FFTLength',FFTLength); fSpeech_Hard = istft(P_F_Hard,'Window',win,'OverlapLength',OverlapLength,'FFTLength',FFTLength); figure(4) subplot(2,2,1) plot(t,mSpeech) axis([t(1) t(end) -1 1]) title("Original Male Speech") grid on subplot(2,2,3) plot(t,mSpeech_Hard) axis([t(1) t(end) -1 1]) xlabel("Time (s)") title("Estimated Male Speech") grid on subplot(2,2,2) plot(t,fSpeech) axis([t(1) t(end) -1 1]) title("Original Female Speech") grid on subplot(2,2,4) plot(t,fSpeech_Hard) axis([t(1) t(end) -1 1]) title("Estimated Female Speech") xlabel("Time (s)") grid on
sound(mSpeech_Hard,Fs)
sound(fSpeech_Hard,Fs)
Исходное разделение Используя идеальные мягкие маски
В мягкой маске значение ячейки маски TF равно отношению желаемой исходной степени к общей степени соединения. Ячейки TF имеют значения в области значений [0,1].
Вычислите мягкую маску для спикера. Оцените STFT спикера путем умножения соединения STFT на мягкую маску спикера. Оцените STFT женщины-спикера путем умножения соединения STFT на мягкую маску женщины-спикера.
Оцените штекерные и розеточные звуковые сигналы с помощью ISTFT.
softMask = abs(P_M) ./ (abs(P_F) + abs(P_M) + eps); P_M_Soft = P_mix .* softMask; P_F_Soft = P_mix .* (1-softMask); mSpeech_Soft = istft(P_M_Soft,'Window',win,'OverlapLength',OverlapLength,'FFTLength',FFTLength); fSpeech_Soft = istft(P_F_Soft,'Window',win,'OverlapLength',OverlapLength,'FFTLength',FFTLength);
Визуализируйте предполагаемые и исходные сигналы. Слушайте предполагаемые штекерные и розеточные речевые сигналы. Обратите внимание на то, что результаты очень хороши, потому что маска создается с полным знанием разделенных штекерных и розеточных сигналов.
figure(5) subplot(2,2,1) plot(t,mSpeech) axis([t(1) t(end) -1 1]) title("Original Male Speech") grid on subplot(2,2,3) plot(t,mSpeech_Soft) axis([t(1) t(end) -1 1]) title("Estimated Male Speech") grid on subplot(2,2,2) plot(t,fSpeech) axis([t(1) t(end) -1 1]) xlabel("Time (s)") title("Original Female Speech") grid on subplot(2,2,4) plot(t,fSpeech_Soft) axis([t(1) t(end) -1 1]) xlabel("Time (s)") title("Estimated Female Speech") grid on
sound(mSpeech_Soft,Fs)
sound(fSpeech_Soft,Fs)
Цель нейронной сети для глубокого обучения в этом примере состоит в том, чтобы оценить идеальную мягкую маску, описанную выше. Сеть оценивает маску, соответствующую спикеру. Маска женщины-спикера выведена непосредственно от штекерной маски.
Основной план подготовки глубокого обучения показывают ниже. Предиктор является спектрами значения смешанного (штекер + розетка) аудио. Цель является идеальными мягкими масками, соответствующими спикеру. Сеть регрессии использует вход предиктора, чтобы минимизировать среднеквадратичную погрешность между ее выводом и входной целью. При выводе аудио STFT преобразован назад в область времени использование выходного спектра значения и фазы сигнала соединения.
Вы преобразовываете аудио к частотному диапазону с помощью Кратковременного преобразования Фурье (STFT), с продолжительностью окна 128 выборок, перекрытием 127, и окно Hann. Вы уменьшаете размер спектрального вектора к 65 путем отбрасывания выборок частоты, соответствующих отрицательным частотам (потому что речевой сигнал временного интервала действителен, это не приводит ни к какой информационной потере). Вход предиктора состоит из 20 последовательных векторов STFT. Вывод является 65 20 мягкой маской.
Вы используете обучивший сеть, чтобы оценить штекерную речь. Вход к обучившему сеть является смесью (штекер + розетка) речевое аудио.
Цели STFT и предикторы
Этот раздел иллюстрирует, как сгенерировать цель и сигналы предиктора от обучающего набора данных.
Читайте в учебных сигналах, состоящих приблизительно из 400 секунд речи от спикеров и женщин-спикеров, соответственно, выбранный на уровне 4 кГц. Низкая частота дискретизации используется, чтобы ускорить обучение. Обрежьте учебные сигналы так, чтобы они были той же длиной.
maleTrainingAudioFile = "MaleSpeech-16-4-mono-405secs.wav"; femaleTrainingAudioFile = "FemaleSpeech-16-4-mono-405secs.wav"; maleSpeechTrain = audioread(maleTrainingAudioFile); femaleSpeechTrain = audioread(femaleTrainingAudioFile); L = min(length(maleSpeechTrain),length(femaleSpeechTrain)); maleSpeechTrain = maleSpeechTrain(1:L); femaleSpeechTrain = femaleSpeechTrain(1:L);
Читайте в сигналах валидации, состоящих приблизительно из 20 секунд речи от спикеров и женщин-спикеров, соответственно, выбранный на уровне 4 кГц. Обрежьте сигналы валидации так, чтобы они были той же длиной
maleValidationAudioFile = "MaleSpeech-16-4-mono-20secs.wav"; femaleValidationAudioFile = "FemaleSpeech-16-4-mono-20secs.wav"; maleSpeechValidate = audioread(maleValidationAudioFile); femaleSpeechValidate = audioread(femaleValidationAudioFile); L = min(length(maleSpeechValidate),length(femaleSpeechValidate)); maleSpeechValidate = maleSpeechValidate(1:L); femaleSpeechValidate = femaleSpeechValidate(1:L);
Масштабируйте учебные сигналы к той же степени. Масштабируйте сигналы валидации к той же степени.
maleSpeechTrain = maleSpeechTrain/norm(maleSpeechTrain); femaleSpeechTrain = femaleSpeechTrain/norm(femaleSpeechTrain); ampAdj = max(abs([maleSpeechTrain;femaleSpeechTrain])); maleSpeechTrain = maleSpeechTrain/ampAdj; femaleSpeechTrain = femaleSpeechTrain/ampAdj; maleSpeechValidate = maleSpeechValidate/norm(maleSpeechValidate); femaleSpeechValidate = femaleSpeechValidate/norm(femaleSpeechValidate); ampAdj = max(abs([maleSpeechValidate;femaleSpeechValidate])); maleSpeechValidate = maleSpeechValidate/ampAdj; femaleSpeechValidate = femaleSpeechValidate/ampAdj;
Создайте смеси "приема" обучения и валидации.
mixTrain = maleSpeechTrain + femaleSpeechTrain; mixTrain = mixTrain / max(mixTrain); mixValidate = maleSpeechValidate + femaleSpeechValidate; mixValidate = mixValidate / max(mixValidate);
Сгенерируйте учебный STFTs.
WindowLength = 128; FFTLength = 128; OverlapLength = 128-1; Fs = 4000; win = hann(WindowLength,"periodic"); P_mix0 = stft(mixTrain,'Window',win,'OverlapLength',OverlapLength,'FFTLength',FFTLength); P_M = abs(stft(maleSpeechTrain,'Window',win,'OverlapLength',OverlapLength,'FFTLength',FFTLength)); P_F = abs(stft(femaleSpeechTrain,'Window',win,'OverlapLength',OverlapLength,'FFTLength',FFTLength));
Поскольку вход stft действителен, stfts сопряжены симметричный. Уменьшайте stfts до их уникальных выборок.
N = 1 + FFTLength/2; P_mix0 = P_mix0(N-1:end,:); P_M = P_M(N-1:end,:); P_F = P_F(N-1:end,:);
Возьмите журнал соединения STFT. Нормируйте значения их средним и стандартным отклонением.
P_mix = log(abs(P_mix0) + eps); MP = mean(P_mix(:)); SP = std(P_mix(:)); P_mix = (P_mix - MP) / SP;
Сгенерируйте валидацию STFTs. Возьмите журнал соединения STFT. Нормируйте значения их средним и стандартным отклонением.
P_Val_mix0 = stft(mixValidate,'Window',win,'OverlapLength',OverlapLength,'FFTLength',FFTLength); P_Val_M = abs(stft(maleSpeechValidate,'Window',win,'OverlapLength',OverlapLength,'FFTLength',FFTLength)); P_Val_F = abs(stft(femaleSpeechValidate,'Window',win,'OverlapLength',OverlapLength,'FFTLength',FFTLength)); P_Val_mix0 = P_Val_mix0(N-1:end,:); P_Val_M = P_Val_M(N-1:end,:); P_Val_F = P_Val_F(N-1:end,:); P_Val_mix = log(abs(P_Val_mix0) + eps); MP = mean(P_Val_mix(:)); SP = std(P_Val_mix(:)); P_Val_mix = (P_Val_mix - MP) / SP;
Обучение нейронных сетей является самым легким, когда входные параметры к сети имеют довольно сглаженное распределение и нормированы. Чтобы проверять, что распределение данных сглаженно, постройте гистограмму значений STFT данных тренировки.
figure(6) histogram(P_mix,"EdgeColor","none","Normalization","pdf") xlabel("Input Value") ylabel("Probability Density")
Вычислите учебную мягкую маску. Используйте эту маску в качестве целевого сигнала при обучении сети.
maskTrain = P_M ./ (P_M + P_F + eps);
Вычислите валидацию мягкая маска. Используйте эту маску, чтобы оценить маску, испускаемую обучившим сеть.
maskValidate = P_Val_M ./ (P_Val_M + P_Val_F + eps);
Чтобы проверять, что целевое распределение данных сглаженно, постройте гистограмму значений маски данных тренировки.
figure(7) histogram(maskTrain,"EdgeColor","none","Normalization","pdf") xlabel("Input Value") ylabel("Probability Density")
Создайте фрагменты размера (65,20) от предиктора и предназначайтесь для сигналов. В порядке получить больше учебных выборок, используйте перекрытие 10 сегментов между последовательными фрагментами.
seqLen = 20; seqOverlap = 10; mixSequences = zeros(1 + FFTLength/2,seqLen,1,0); maskSequences = zeros(1 + FFTLength/2,seqLen,1,0); loc = 1; while loc < size(P_mix,2) - seqLen mixSequences(:,:,:,end+1) = P_mix(:,loc:loc+seqLen-1); %#ok maskSequences(:,:,:,end+1) = maskTrain(:,loc:loc+seqLen-1); %#ok loc = loc + seqOverlap; end
Создайте фрагменты размера (65,20) от предиктора валидации и предназначайтесь для сигналов.
mixValSequences = zeros(1 + FFTLength/2,seqLen,1,0); maskValSequences = zeros(1 + FFTLength/2,seqLen,1,0); seqOverlap = seqLen; loc = 1; while loc < size(P_Val_mix,2) - seqLen mixValSequences(:,:,:,end+1) = P_Val_mix(:,loc:loc+seqLen-1); %#ok maskValSequences(:,:,:,end+1) = maskValidate(:,loc:loc+seqLen-1); %#ok loc = loc + seqOverlap; end
Измените сигналы обучения и валидации.
mixSequencesT = reshape(mixSequences, [1 1 (1 + FFTLength/2) * seqLen size(mixSequences,4)]); mixSequencesV = reshape(mixValSequences, [1 1 (1 + FFTLength/2) * seqLen size(mixValSequences,4)]); maskSequencesT = reshape(maskSequences, [1 1 (1 + FFTLength/2) * seqLen size(maskSequences,4)]); maskSequencesV = reshape(maskValSequences,[1 1 (1 + FFTLength/2) * seqLen size(maskValSequences,4)]);
Задайте нейронную сеть для глубокого обучения
Задайте слои сети. Задайте входной размер, чтобы быть изображениями размера 1 1 1 300. Задайте два скрытых полносвязных слоя, каждого с 1 300 нейронами. Следуйте за каждым скрытым полносвязным слоем с сигмоидальным слоем. Пакетные слои нормализации нормируют средние значения и стандартные отклонения выходных параметров. Добавьте полносвязный слой с 1 300 нейронами, сопровождаемыми слоем регрессии.
numNodes = (1 + FFTLength/2) * seqLen; layers = [ ... imageInputLayer([1 1 (1 + FFTLength/2)*seqLen],"Normalization","None") fullyConnectedLayer(numNodes) BiasedSigmoidLayer(6) batchNormalizationLayer dropoutLayer(0.1) fullyConnectedLayer(numNodes) BiasedSigmoidLayer(6) batchNormalizationLayer dropoutLayer(0.1) fullyConnectedLayer(numNodes) BiasedSigmoidLayer(0) regressionLayer ];
Задайте опции обучения для сети. Установите MaxEpochs
на 3
так, чтобы сеть сделала три, проходит через данные тренировки. Установите MiniBatchSize
на 64
так, чтобы сеть посмотрела на сигналы обучения 64
за один раз. Установите Plots
на training-progress
генерировать графики, которые показывают учебный прогресс количеством увеличений итераций. Установите Verbose
на false
отключать печать таблицы вывод, который соответствует данным, показанным в графике в окно командной строки. Установите Shuffle
на every-epoch
переставлять обучающие последовательности в начале каждой эпохи. Установите LearnRateSchedule
на piecewise
уменьшать темп обучения заданным фактором (0.1) каждый раз, когда определенное число эпох (1) передало. Установите ValidationData
на предикторы валидации и цели. Установите ValidationFrequency
, таким образом, что среднеквадратичная погрешность валидации вычисляется однажды в эпоху. Этот пример использует адаптивную оценку момента (ADAM) решатель.
maxEpochs = 3; miniBatchSize = 64; options = trainingOptions("adam", ... "MaxEpochs",maxEpochs, ... "MiniBatchSize",miniBatchSize, ... "SequenceLength","longest", ... "Shuffle","every-epoch",... "Verbose",0, ... "Plots","training-progress",... "ValidationFrequency",floor(size(mixSequencesT,4)/miniBatchSize),... "ValidationData",{mixSequencesV,maskSequencesV},... "LearnRateSchedule","piecewise",... "LearnRateDropFactor",0.9, ... "LearnRateDropPeriod",1);
Обучите нейронную сеть для глубокого обучения
Обучите сеть с заданными опциями обучения и архитектурой слоя с помощью trainNetwork
. Поскольку набор обучающих данных является большим, учебный процесс может занять несколько минут. Чтобы загрузить предварительно обученную сеть, установите doTraining
на false
.
doTraining = true; if doTraining CocktailPartyNet = trainNetwork(mixSequencesT,maskSequencesT,layers,options); else s = load("CocktailPartyNet.mat"); CocktailPartyNet = s.CocktailPartyNet; end
Передайте предикторы валидации сети. Вывод является предполагаемой маской. Измените предполагаемую маску.
estimatedMasks0 = predict(CocktailPartyNet,mixSequencesV); estimatedMasks0 = estimatedMasks0.'; estimatedMasks0 = reshape(estimatedMasks0,1 + FFTLength/2,numel(estimatedMasks0)/(1 + FFTLength/2));
Оцените нейронную сеть для глубокого обучения
Постройте гистограмму ошибки между фактической и ожидаемой маской.
figure(8) histogram(maskValSequences(:) - estimatedMasks0(:),"EdgeColor","none","Normalization","pdf") xlabel("Mask Error") ylabel("Probability Density")
Оцените мягкую оценку маски
Оцените штекерные и розеточные мягкие маски. Оцените штекерные и розеточные бинарные маски пороговой обработкой мягкие маски.
SoftMaleMask = estimatedMasks0; SoftFemaleMask = 1 - SoftMaleMask;
Сократите соединение STFT, чтобы совпадать с размером предполагаемой маски.
P_Val_mix0 = P_Val_mix0(:,1:size(SoftMaleMask,2));
Умножьте соединение STFT на штекерную мягкую маску, чтобы получить предполагаемую штекерную речь STFT.
P_Male = P_Val_mix0 .* SoftMaleMask;
Преобразуйте односторонний STFT в STFT в центре.
P_Male = [conj(P_Male(end-1:-1:2,:)) ; P_Male ];
Используйте ISTFT, чтобы получить предполагаемый штекерный звуковой сигнал. Масштабируйте аудио.
maleSpeech_est_soft = istft(P_Male, 'Window',win,'OverlapLength',OverlapLength,'FFTLength',FFTLength,'ConjugateSymmetric',true); maleSpeech_est_soft = maleSpeech_est_soft / max(abs(maleSpeech_est_soft));
Визуализируйте предполагаемые и исходные штекерные речевые сигналы. Слушайте предполагаемую мягкую штекерную речь маски.
range = (numel(win):numel(maleSpeech_est_soft)-numel(win)); t = range * (1/Fs); figure(9) subplot(2,1,1) plot(t,maleSpeechValidate(range)) title("Original Male Speech") xlabel("Time (s)") grid on subplot(2,1,2) plot(t,maleSpeech_est_soft(range)) xlabel("Time (s)") title("Estimated Male Speech (Soft Mask)") grid on
sound(maleSpeech_est_soft(range),Fs)
Умножьте соединение STFT на розеточную мягкую маску, чтобы получить предполагаемую розеточную речь STFT. Используйте ISTFT, чтобы получить предполагаемый штекерный звуковой сигнал. Масштабируйте аудио.
P_Female = P_Val_mix0 .* SoftFemaleMask; P_Female = [conj(P_Female(end-1:-1:2,:)) ; P_Female ]; femaleSpeech_est_soft = istft(P_Female, 'Window',win,'OverlapLength',OverlapLength,'FFTLength',FFTLength,'ConjugateSymmetric',true); femaleSpeech_est_soft = femaleSpeech_est_soft / max(femaleSpeech_est_soft);
Визуализируйте предполагаемые и исходные розеточные сигналы. Слушайте предполагаемую розеточную речь.
range = (numel(win):numel(maleSpeech_est_soft)-numel(win)); t = range * (1/Fs); figure(10) subplot(2,1,1) plot(t,femaleSpeechValidate(range)) title("Original Female Speech") grid on subplot(2,1,2) plot(t,femaleSpeech_est_soft(range)) xlabel("Time (s)") title("Estimated Female Speech (Soft Mask)") grid on
sound(femaleSpeech_est_soft(range),Fs)
Оцените бинарную оценку маски
Оцените штекерные и розеточные бинарные маски пороговой обработкой мягкие маски.
HardMaleMask = (SoftMaleMask >= 0.5); HardFemaleMask = (SoftMaleMask < 0.5);
Умножьте соединение STFT на штекерную бинарную маску, чтобы получить предполагаемую штекерную речь STFT. Используйте ISTFT, чтобы получить предполагаемый штекерный звуковой сигнал. Масштабируйте аудио.
P_Male = P_Val_mix0 .* HardMaleMask; P_Male = [conj(P_Male(end-1:-1:2,:)) ; P_Male ]; maleSpeech_est_hard = istft(P_Male,'Window',win,'OverlapLength',OverlapLength,'FFTLength',FFTLength,'ConjugateSymmetric',true); maleSpeech_est_hard = maleSpeech_est_hard / max(maleSpeech_est_hard);
Визуализируйте предполагаемые и исходные штекерные речевые сигналы. Слушайте предполагаемую бинарную штекерную речь маски.
range = (numel(win):numel(maleSpeech_est_soft)-numel(win)); t = range * (1/Fs); figure(11) subplot(2,1,1) plot(t,maleSpeechValidate(range)) title("Original Male Speech") grid on subplot(2,1,2) plot(t,maleSpeech_est_hard(range)) xlabel("Time (s)") title("Estimated Male Speech (Binary Mask)") grid on
sound(maleSpeech_est_hard(range),Fs)
Умножьте соединение STFT на розеточную бинарную маску, чтобы получить предполагаемую штекерную речь STFT. Используйте ISTFT, чтобы получить предполагаемый штекерный звуковой сигнал. Масштабируйте аудио.
P_Female = P_Val_mix0 .* HardFemaleMask; P_Female = [conj(P_Female(end-1:-1:2,:)) ; P_Female ]; femaleSpeech_est_hard = istft(P_Female, 'Window',win,'OverlapLength',OverlapLength,'FFTLength',FFTLength,'ConjugateSymmetric',true); femaleSpeech_est_hard = femaleSpeech_est_hard / max(femaleSpeech_est_hard);
Визуализируйте предполагаемые и исходные розеточные речевые сигналы. Слушайте предполагаемую розеточную речь.
range = (numel(win):numel(maleSpeech_est_soft)-numel(win)); t = range * (1/Fs); figure(12) subplot(2,1,1) plot(t,femaleSpeechValidate(range)) title("Original Female Speech") grid on subplot(2,1,2) plot(t,femaleSpeech_est_hard(range)) title("Estimated Female Speech (Binary Mask)") grid on
sound(femaleSpeech_est_hard(range),Fs)
Сравните STFTs одного второго сегмента для соединения, исходной розетки и штекера, и оцененной розетки и штекера, соответственно.
range = 7e4:7.4e4; figure(13) stft(mixValidate(range),Fs,'Window',win,'OverlapLength',64,'FFTLength',FFTLength) title("Mix STFT")
figure(14) subplot(3,1,1) stft(maleSpeechValidate(range),Fs,'Window',win,'OverlapLength',64,'FFTLength',FFTLength) title("Male STFT (Actual)") subplot(3,1,2) stft(maleSpeech_est_soft(range),Fs,'Window',win,'OverlapLength',64,'FFTLength',FFTLength) title("Male STFT (Estimated - Soft Mask)") subplot(3,1,3) stft(maleSpeech_est_hard(range),Fs,'Window',win,'OverlapLength',64,'FFTLength',FFTLength) title("Male STFT (Estimated - Binary Mask)");
figure(15) subplot(3,1,1) stft(femaleSpeechValidate(range),Fs,'Window',win,'OverlapLength',64,'FFTLength',FFTLength) title("Female STFT (Actual)") subplot(3,1,2) stft(femaleSpeech_est_soft(range),Fs,'Window',win,'OverlapLength',64,'FFTLength',FFTLength) title("Female STFT (Estimated - Soft Mask)") subplot(3,1,3) stft(femaleSpeech_est_hard(range),Fs,'Window',win,'OverlapLength',64,'FFTLength',FFTLength) title("Female STFT (Estimated - Binary Mask)")
[1] "Вероятностное исходное разделение приема Бинарной Маски в сверточной глубокой нейронной сети", Эндрю Дж.Р. Симпсон, 2015.