Исходное разделение приема Используя нейронные сети для глубокого обучения

Этот пример показывает, как изолировать речевой сигнал использование нейронной сети для глубокого обучения.

Введение

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

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

Загрузите звуковые файлы, содержащие штекерную и розеточную речь, выбранную на уровне 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.

Смотрите также

|

Похожие темы