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

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

Введение

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

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

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