exponenta event banner

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

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

Введение

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

Загрузить обязательные файлы

Перед подробным изучением примера необходимо загрузить предварительно обученную сеть и 4 аудиофайла.

url = 'http://ssd.mathworks.com/supportfiles/audio/CocktailPartySourceSeparation.zip';

downloadNetFolder = tempdir;
netFolder = fullfile(downloadNetFolder,'CocktailPartySourceSeparation');

if ~exist(netFolder,'dir')
    disp('Downloading pretrained network and audio files (5 files - 24.5 MB) ...')
    unzip(url,downloadNetFolder)
end

Сводка проблем

Загрузка аудиофайлов, содержащих мужскую и женскую речь, дискретизированную на частоте 4 кГц. Прослушайте аудиофайлы отдельно для справки.

[mSpeech,Fs] = audioread(fullfile(netFolder,"MaleSpeech-16-4-mono-20secs.wav"));
sound(mSpeech,Fs)
[fSpeech] = audioread(fullfile(netFolder,"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) представление мужских, женских и смешанных речевых сигналов. Используйте окно Ганна длиной 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, 'FrequencyRange', 'onesided');
title("Male Speech")
subplot(3,1,2)
stft(fSpeech, Fs, 'Window', win, 'OverlapLength', OverlapLength,...
     'FFTLength', FFTLength, 'FrequencyRange', 'onesided');
title("Female Speech")
subplot(3,1,3)
stft(mix, Fs, 'Window', win, 'OverlapLength', OverlapLength,...
    'FFTLength', FFTLength, 'FrequencyRange', 'onesided');
title("Mix Speech")

Разделение источников с использованием идеальных масок временной частоты

Было показано, что применение TF-маски является эффективным способом отделения требуемых звуковых сигналов от конкурирующих звуков. TF-маска является матрицей того же размера, что и базовая STFT. Маска умножается поэлементно на нижележащий STFT для выделения требуемого источника. TF-маска может быть двоичной или мягкой.

Разделение источников с использованием идеальных двоичных масок

В идеальной двоичной маске значения ячейки маски равны 0 или 1. Если мощность требуемого источника больше, чем совокупная мощность других источников в конкретной TF ячейке, то эта ячейка устанавливается в 1. В противном случае для ячейки устанавливается значение 0.

Вычислите идеальную двоичную маску для мужского динамика, а затем визуализируйте ее.

P_M        = stft(mSpeech, 'Window', win, 'OverlapLength', OverlapLength,...
                 'FFTLength', FFTLength, 'FrequencyRange', 'onesided');
P_F        = stft(fSpeech, 'Window', win, 'OverlapLength', OverlapLength,...
                 'FFTLength', FFTLength, 'FrequencyRange', 'onesided');
[P_mix,F]  = stft(mix, 'Window', win, 'OverlapLength', OverlapLength,...
                  'FFTLength', FFTLength, 'FrequencyRange', 'onesided');
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, 'FrequencyRange', 'onesided');
fSpeech_Hard = istft(P_F_Hard , 'Window', win, 'OverlapLength', OverlapLength,...
                     'FFTLength', FFTLength, 'FrequencyRange', 'onesided');
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-клетки имеют значения в диапазоне [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, 'FrequencyRange', 'onesided');
fSpeech_Soft = istft(P_F_Soft, 'Window', win, 'OverlapLength', OverlapLength,...
                     'FFTLength', FFTLength, 'FrequencyRange', 'onesided');

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

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 и окном Ганна. Вы уменьшаете размер спектрального вектора до 65, отбрасывая частотные выборки, соответствующие отрицательным частотам (поскольку речевой сигнал временной области является реальным, это не приводит к какой-либо потере информации). Вход предиктора состоит из 20 последовательных векторов STFT. Выходной сигнал - мягкая маска 65 на 20.

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

Цели и предикторы STFT

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

Считывание в обучающих сигналах, состоящих из около 400 секунд речи от самцов и самок, соответственно, отобранных на частоте 4 кГц. Низкая частота выборки используется для ускорения обучения. Обрезать обучающие сигналы так, чтобы они были одинаковой длины.

maleTrainingAudioFile   = "MaleSpeech-16-4-mono-405secs.wav";
femaleTrainingAudioFile = "FemaleSpeech-16-4-mono-405secs.wav";

maleSpeechTrain   = audioread(fullfile(netFolder,maleTrainingAudioFile));
femaleSpeechTrain = audioread(fullfile(netFolder,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(fullfile(netFolder,maleValidationAudioFile));
femaleSpeechValidate = audioread(fullfile(netFolder,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);

Создание учебных STFT.

WindowLength  = 128;
FFTLength     = 128;
OverlapLength = 128-1;
Fs            = 4000;
win           = hann(WindowLength,"periodic");

P_mix0 = stft(mixTrain, 'Window', win, 'OverlapLength', OverlapLength,...
              'FFTLength', FFTLength, 'FrequencyRange', 'onesided');
P_M    = abs(stft(maleSpeechTrain, 'Window', win, 'OverlapLength', OverlapLength,...
              'FFTLength', FFTLength, 'FrequencyRange', 'onesided'));
P_F    = abs(stft(femaleSpeechTrain, 'Window', win, 'OverlapLength', OverlapLength,...
              'FFTLength', FFTLength, 'FrequencyRange', 'onesided'));

Возьмите журнал смешения STFT. Нормализуйте значения по их среднему и стандартному отклонению.

P_mix = log(abs(P_mix0) + eps);
MP    = mean(P_mix(:));
SP    = std(P_mix(:));
P_mix = (P_mix - MP) / SP;

Создание STFT проверки. Возьмите журнал смешения STFT. Нормализуйте значения по их среднему и стандартному отклонению.

P_Val_mix0 = stft(mixValidate, 'Window', win, 'OverlapLength', OverlapLength,...
                 'FFTLength', FFTLength, 'FrequencyRange', 'onesided');
P_Val_M    = abs(stft(maleSpeechValidate, 'Window', win, 'OverlapLength', OverlapLength,...
                 'FFTLength', FFTLength, 'FrequencyRange', 'onesided'));
P_Val_F    = abs(stft(femaleSpeechValidate, 'Window', win, 'OverlapLength', OverlapLength,...
                 'FFTLength', FFTLength, 'FrequencyRange', 'onesided'));

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 к 1300. Определите два скрытых полностью соединенных слоя, каждый с 1300 нейронами. Следите за каждым скрытым полностью соединенным слоем с сигмоидальным слоем. Уровни пакетной нормализации нормализуют средние и стандартные отклонения выходных данных. Добавьте полностью связанный слой с 1300 нейронами, а затем регрессионный слой.

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;

Используйте ISTFT для получения расчетного мужского звукового сигнала. Масштабируйте звук.

maleSpeech_est_soft = istft(P_Male, 'Window', win, 'OverlapLength', OverlapLength,...
                           'FFTLength', FFTLength, 'ConjugateSymmetric', true,...
                           'FrequencyRange', 'onesided');
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;

femaleSpeech_est_soft = istft(P_Female, 'Window', win, 'OverlapLength', OverlapLength,...
                              'FFTLength',FFTLength, 'ConjugateSymmetric',true,...
                              'FrequencyRange', 'onesided');
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;

maleSpeech_est_hard = istft(P_Male, 'Window', win, 'OverlapLength', OverlapLength,...
                            'FFTLength', FFTLength, 'ConjugateSymmetric', true,...
                            'FrequencyRange', 'onesided');
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;

femaleSpeech_est_hard = istft(P_Female, 'Window', win, 'OverlapLength', OverlapLength,...
                              'FFTLength', FFTLength, 'ConjugateSymmetric', true,...
                              'FrequencyRange', 'onesided');
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)

Сравните STFT односекундного сегмента для смешанного, оригинального женского и мужского, и расчетного женского и мужского соответственно.

range = 7e4:7.4e4;

figure(13)
stft(mixValidate(range), Fs, 'Window', win, 'OverlapLength', 64,...
    'FFTLength', FFTLength, 'FrequencyRange', 'onesided');
title("Mix STFT")

figure(14)
subplot(3,1,1)
stft(maleSpeechValidate(range),Fs, 'Window', win, 'OverlapLength', 64,...
    'FFTLength', FFTLength, 'FrequencyRange', 'onesided');
title("Male STFT (Actual)")
subplot(3,1,2)
stft(maleSpeech_est_soft(range),Fs, 'Window', win, 'OverlapLength', 64,...
    'FFTLength', FFTLength, 'FrequencyRange', 'onesided');
subplot(3,1,3)
stft(maleSpeech_est_hard(range),Fs, 'Window', win, 'OverlapLength', 64,...
    'FFTLength', FFTLength, 'FrequencyRange', 'onesided');
title("Male STFT (Estimated - Binary Mask)");

figure(15)
subplot(3,1,1)
stft(femaleSpeechValidate(range),Fs, 'Window', win, 'OverlapLength', 64,...
    'FFTLength', FFTLength, 'FrequencyRange', 'onesided');
title("Female STFT (Actual)")
subplot(3,1,2)
stft(femaleSpeech_est_soft(range),Fs, 'Window', win, 'OverlapLength', 64,...
    'FFTLength', FFTLength, 'FrequencyRange', 'onesided');
title("Female STFT (Estimated - Soft Mask)")
subplot(3,1,3)
stft(femaleSpeech_est_hard(range),Fs, 'Window', win, 'OverlapLength', 64,...
    'FFTLength', FFTLength, 'FrequencyRange', 'onesided');
title("Female STFT (Estimated - Binary Mask)")

Ссылки

[1] «Вероятностное разделение источников бинарных масок в сверточной глубокой нейронной сети», Эндрю Дж. Р. Симпсон, 2015.

См. также

|

Связанные темы