Частотно-временная маскировка для гармоническо-перкуссивного разделения источников

Частотно-временная маскировка - это процесс применения весов к интервалам представления временной частоты для улучшения, уменьшения или изоляции фрагментов звука.

Цель гармоническо-ударного разделения источника (HPSS) состоит в том, чтобы разложить аудиосигнал на гармонические и ударные компоненты. Приложения HPSS включают звуковое ремиксирование, улучшение качества функций цветности, оценку темпа и изменение шкалы времени [1]. Другое использование HPSS является параллельным представлением при создании системы глубокого обучения позднего слияния. Многие высокоэффективные системы обнаружения и классификации акустических сцен и событий (DCASE) 2017 и 2018 годов использовали HPSS по этой причине.

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

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

Создайте гармоническо-ударную смесь

Чтение в гармонических и ударных аудио файлов. Обе имеют частоту дискретизации 16 кГц.

[harmonicAudio,fs] = audioread("violin.wav");
percussiveAudio = audioread("drums.wav");

Прослушайте гармонический сигнал и постройте график спектрограммы. Обратите внимание, что вдоль горизонтальной (временной) оси имеется непрерывность.

sound(harmonicAudio,fs)

spectrogram(harmonicAudio,1024,512,1024,fs,"yaxis")
title("Harmonic Audio")

Figure contains an axes. The axes with title Harmonic Audio contains an object of type image.

Послушайте ударный сигнал и постройте график спектрограммы. Обратите внимание, что вдоль вертикальной (частотной) оси имеется непрерывность.

sound(percussiveAudio,fs)

spectrogram(percussiveAudio,1024,512,1024,fs,"yaxis")
title("Percussive Audio")

Figure contains an axes. The axes with title Percussive Audio contains an object of type image.

Смешайте гармонические и ударные сигналы. Слушайте гармоническо-ударный аудио и стройте график спектрограммы.

mix = harmonicAudio + percussiveAudio;

sound(mix,fs)

spectrogram(mix,1024,512,1024,fs,"yaxis")
title("Harmonic-Percussive Audio")

Figure contains an axes. The axes with title Harmonic-Percussive Audio contains an object of type image.

HPSS, предложенный [1], создает две улучшенные спектрограммы: спектрограмму с увеличенной гармоникой и спектрограмму с увеличенным ударным действием. Усиленная гармониками спектрограмма создается путем применения медианной фильтрации вдоль оси времени. Ударно-усиленную спектрограмму создают путем применения медианной фильтрации вдоль оси частоты. Затем улучшенные спектрограммы сравнивают, чтобы создать гармонические и ударные частотно-временные маски. В самой простой форме маски являются двоичными.

HPSS с использованием двоичной маски

Преобразуйте смешанный сигнал в полуслойное кратковременное преобразование Фурье (STFT).

win = sqrt(hann(1024,"periodic"));
overlapLength = floor(numel(win)/2);
fftLength = 2^nextpow2(numel(win) + 1);
y = stft(mix, ...
        "Window",win, ...
        "OverlapLength",overlapLength, ...
        "FFTLength",fftLength, ...
        "Centered",true);
halfIdx = 1:ceil(size(y,1)/2);
yhalf = y(halfIdx,:);
ymag = abs(yhalf);

Примените медианное сглаживание вдоль оси времени, чтобы улучшить гармоническое аудио и уменьшить ударное аудио. Используйте длину фильтра 200 мс, как предложено в [1]. Постройте график спектра степени усиленного гармониками аудио.

timeFilterLength = 0.2;
timeFilterLengthInSamples = timeFilterLength/((numel(win) - overlapLength)/fs);
ymagharm = movmedian(ymag,timeFilterLengthInSamples,2);

surf(flipud(log10(ymagharm.^2)),"EdgeColor","none")
title("Harmonic Enhanced Audio")
view([0,90])
axis tight

Figure contains an axes. The axes with title Harmonic Enhanced Audio contains an object of type surface.

Примените медианное сглаживание вдоль оси частоты, чтобы улучшить ударное аудио и уменьшить гармоническое аудио. Используйте длину фильтра 500 Гц, как предложено в [1]. Постройте график степени спектра усиленного ударом аудио.

frequencyFilterLength = 500;
frequencyFilterLengthInSamples = frequencyFilterLength/(fs/fftLength);
ymagperc = movmedian(ymag,frequencyFilterLengthInSamples,1);

surf(flipud(log10(ymagperc.^2)),"EdgeColor","none")
title("Percussive Enhanced Audio")
view([0,90])
axis tight

Figure contains an axes. The axes with title Percussive Enhanced Audio contains an object of type surface.

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

totalMagnitudePerBin = ymagharm + ymagperc;

Если на величину в данной усиленной гармоникой или усиленной ударными интервалами приходится более половины от общей величины этого интервала, присвойте этот интервал соответствующей маске.

harmonicMask = ymagharm > (totalMagnitudePerBin*0.5);
percussiveMask = ymagperc > (totalMagnitudePerBin*0.5);

Примените гармонические и ударные маски, а затем верните маскированный звук во временном интервале.

yharm = harmonicMask.*yhalf;
yperc = percussiveMask.*yhalf;

Зеркальное отражение полуфазного спектра для создания двустороннего сопряженного симметричного спектра.

yharm = cat(1,yharm,flipud(conj(yharm)));
yperc = cat(1,yperc,flipud(conj(yperc)));

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

h = istft(yharm, ...
    "Window",win, ...
    "OverlapLength",overlapLength, ...
    "FFTLength",fftLength, ...
    "ConjugateSymmetric",true);
p = istft(yperc, ...
    "Window",win, ...
    "OverlapLength",overlapLength, ...
    "FFTLength",fftLength, ...
    "ConjugateSymmetric",true);

Прослушайте восстановленный гармонический аудио и постройте график спектрограммы.

sound(h,fs)

spectrogram(h,1024,512,1024,fs,"yaxis")
title("Recovered Harmonic Audio")

Figure contains an axes. The axes with title Recovered Harmonic Audio contains an object of type image.

Прослушайте восстановленный ударный аудио и постройте график спектрограммы.

sound(p,fs)

spectrogram(p,1024,512,1024,fs,"yaxis")
title("Recovered Percussive Audio")

Figure contains an axes. The axes with title Recovered Percussive Audio contains an object of type image.

Постройте график комбинации восстановленной гармоники и ударной спектрограммы.

sound(h + p,fs)

spectrogram(h + p,1024,512,1024,fs,"yaxis")
title("Recovered Harmonic + Percussive Audio")

Figure contains an axes. The axes with title Recovered Harmonic + Percussive Audio contains an object of type image.

HPSS с использованием двоичной маски и невязки

Как предлагается в [1], разложение сигнала на гармонические и ударные звуки часто невозможно. Они предлагают добавить параметр порога: если интервал спектрограммы не является явно гармоническим или ударным, классифицируйте его как остаточный.

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

win = sqrt(hann(1024,"periodic"));
overlapLength = floor(numel(win)/2);
fftLength = 2^nextpow2(numel(win) + 1);
y = stft(mix, ...
    "Window",win, ...
    "OverlapLength",overlapLength, ...
    "FFTLength",fftLength, ...
    "Centered",true);
halfIdx = 1:ceil(size(y,1)/2);
yhalf = y(halfIdx,:);
ymag = abs(yhalf);

timeFilterLength = 0.2;
timeFilterLengthInSamples = timeFilterLength/((numel(win) - overlapLength)/fs);
ymagharm = movmedian(ymag,timeFilterLengthInSamples,2);

frequencyFilterLength = 500;
frequencyFilterLengthInSamples = frequencyFilterLength/(fs/fftLength);
ymagperc = movmedian(ymag,frequencyFilterLengthInSamples,1);

totalMagnitudePerBin = ymagharm + ymagperc;

Используя порог, создайте три бинарные маски: гармоническую, ударную и остаточную. Установите порог равным 0.65. Это означает, что если величина интервала спектрограммы с увеличенной гармоникой составляет 65% от общей величины для этого интервала, вы присваиваете это интервал гармонического фрагмента. Если величина интервала ударно-усиленной спектрограммы составляет 65% от общей величины для этого интервала, вы присваиваете этот интервал ударного фрагмента. В противном случае интервал присваивается остаточному фрагменту. Оптимальный параметр порога зависит от гармоническо-ударной смеси и вашего применения.

threshold = 0.65;
harmonicMask = ymagharm > (порог totalMagnitudePerBin *);
ударныйMask = ymagperc > (порог totalMagnitudePerBin *);
остаточная Маска = ~ (harmonicMask + ударная Маска);

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

yharm = harmonicMask.*yhalf;
yperc = percussiveMask.*yhalf;
yresi = residualMask.*yhalf;

yharm = cat(1,yharm,flipud(conj(yharm)));
yperc = cat(1,yperc,flipud(conj(yperc)));
yresi = cat(1,yresi,flipud(conj(yresi)));

h = istft(yharm, ...
    "Window",win, ...
    "OverlapLength",overlapLength, ...
    "FFTLength",fftLength, ...
    "ConjugateSymmetric",true);
p = istft(yperc, ...
    "Window",win, ...
    "OverlapLength",overlapLength, ...
    "FFTLength",fftLength, ...
    "ConjugateSymmetric",true);
r = istft(yresi, ...
    "Window",win, ...
    "OverlapLength",overlapLength, ...
    "FFTLength",fftLength, ...
    "ConjugateSymmetric",true);

Прослушайте восстановленный гармонический аудио и постройте график спектрограммы.

sound(h,fs)

spectrogram(h,1024,512,1024,fs,"yaxis")
title("Recovered Harmonic Audio")

Figure contains an axes. The axes with title Recovered Harmonic Audio contains an object of type image.

Прослушайте восстановленный ударный аудио и постройте график спектрограммы.

sound(p,fs)

spectrogram(p,1024,512,1024,fs,"yaxis")
title("Recovered Percussive Audio")

Figure contains an axes. The axes with title Recovered Percussive Audio contains an object of type image.

Прослушайте восстановленный остаточный аудио и постройте график спектрограммы.

sound(r,fs)

spectrogram(r,1024,512,1024,fs,"yaxis")
title("Recovered Residual Audio")

Figure contains an axes. The axes with title Recovered Residual Audio contains an object of type image.

Слушайте комбинацию гармонических, ударных и остаточных сигналов и стройте график спектрограммы.

sound(h + p + r,fs)

spectrogram(h + p + r,1024,512,1024,fs,"yaxis")
title("Recovered Harmonic + Percussive + Residual Audio")

Figure contains an axes. The axes with title Recovered Harmonic + Percussive + Residual Audio contains an object of type image.

HPSS с использованием мягкой маски

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

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

win = sqrt(hann(1024,"periodic"));
overlapLength = floor(numel(win)/2);
fftLength = 2^nextpow2(numel(win) + 1);
y = stft(mix, ...
    "Window",win, ...
    "OverlapLength",overlapLength, ...
    "FFTLength",fftLength, ...
    "Centered",true);
halfIdx = 1:ceil(size(y,1)/2);
yhalf = y(halfIdx,:);
ymag = abs(yhalf);

timeFilterLength = 0.2;
timeFilterLengthInSamples = timeFilterLength/((numel(win)-overlapLength)/fs);
ymagharm = movmedian(ymag,timeFilterLengthInSamples,2);

frequencyFilterLength = 500;
frequencyFilterLengthInSamples = frequencyFilterLength/(fs/fftLength);
ymagperc = movmedian(ymag,frequencyFilterLengthInSamples,1);

totalMagnitudePerBin = ymagharm + ymagperc;

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

harmonicMask = ymagharm ./ totalMagnitudePerBin;
percussiveMask = ymagperc ./ totalMagnitudePerBin;

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

yharm = harmonicMask.*yhalf;
yperc = percussiveMask.*yhalf;

yharm = cat(1,yharm,flipud(conj(yharm)));
yperc = cat(1,yperc,flipud(conj(yperc)));

h = istft(yharm, ...
    "Window",win, ...
    "OverlapLength",overlapLength, ...
    "FFTLength",fftLength, ...
    "ConjugateSymmetric",true);
p = istft(yperc, ...
    "Window",win, ...
    "OverlapLength",overlapLength, ...
    "FFTLength",fftLength, ...
    "ConjugateSymmetric",true);

Прослушайте восстановленный гармонический аудио и постройте график спектрограммы.

sound(h,fs)

spectrogram(h,1024,512,1024,fs,"yaxis")
title("Recovered Harmonic Audio")

Figure contains an axes. The axes with title Recovered Harmonic Audio contains an object of type image.

Прослушайте восстановленный ударный аудио и постройте график спектрограммы.

sound(p,fs)

spectrogram(p,1024,512,1024,fs,"yaxis")
title("Recovered Percussive Audio")

Figure contains an axes. The axes with title Recovered Percussive Audio contains an object of type image.

Функция , взятая в качестве примера,

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

help HelperHPSS
  [h,p] = HelperHPSS(x,fs) separates the input signal, x, into harmonic (h)
  and percussive (p) portions. If x is input as a multichannel signal, it
  is converted to mono before processing.
 
  [h,p] = HelperHPSS(...,'TimeFilterLength',TIMEFILTERLENGTH) specifies the
  median filter length along the time dimension of a spectrogram, in
  seconds. If unspecified, TIMEFILTERLENGTH defaults to 0.2 seconds.
 
  [h,p] = HelperHPSS(...,'FrequencyFilterLength',FREQUENCYFILTERLENGTH)
  specifies the median filter length along the frequency dimension of a
  spectrogram, in Hz. If unspecified, FREQUENCYFILTERLENGTH defaults to 500
  Hz.
 
  [h,p] = HelperHPSS(...,'MaskType',MASKTYPE) specifies the mask type as
  'binary' or 'soft'. If unspecified, MASKTYPE defaults to 'binary'.
  
  [h,p] = HelperHPSS(...,'Threshold',THRESHOLD) specifies the threshold of
  the total energy for declaring an element as harmonic, percussive, or
  residual. Specify THRESHOLD as a scalar in the range [0 1]. This
  parameter is only valid if MaskType is set to 'binary'. If unspecified,
  THRESHOLD defaults to 0.5.
 
  [h,p] = HelperHPSS(...,'Window',WINDOW) specifies the analysis window
  used in the STFT. If unspecified, WINDOW defaults to
  sqrt(hann(1024,'periodic')).
 
  [h,p] = HelperHPSS(...,'FFTLength',FFTLENGTH) specifies the number of
  points in the DFT for each analysis window. If unspecified, FFTLENGTH
  defaults to the number of elements in the WINDOW.
 
  [h,p] = HelperHPSS(...,'OverlapLength',OVERLAPLENGTH) specifies the
  overlap length of the analysis windows. If unspecified, OVERLAPLENGTH
  defaults to 512.
 
  [h,p,r] = HelperHPSS(...) returns the residual signal not classified as
  harmonic or percussive.
 
  Example:
    % Load a sound file and listen to it.
      [audio,fs] = audioread('Laughter-16-8-mono-4secs.wav');
      sound(audio,fs)
 
    % Call HelperHPSS to separate the audio into harmonic and percussive
    % portions. Listen to the portions separately.
      [h,p] = HelperHPSS(audio,fs);
      sound(h,fs)
      sound(p,fs)

HPSS, использующий итеративное маскирование

[1] заметил, что большой формат кадра в вычислении STFT смещает энергию к гармоническому компоненту, в то время как небольшой формат кадра смещает энергию к ударному компоненту. [1] предложил использовать итеративную процедуру, чтобы использовать это понимание. В итерационной процедуре:

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

  2. Суммируйте остаточные и ударные фрагменты.

  3. Выполните HPSS с использованием небольшого формата кадра, чтобы изолировать ударный компонент.

threshold1 = 0.7;
N1 = 4096;
[h1, p1, r1] = HelperHPSS (микс, fs,"Threshold", threshold1,"Window", sqrt (hann (N1,"periodic")),"OverlapLength", круглый (N1/2));

mix1 = p1 + r1;

threshold2 = 0.6;
N2 = 256;
[h2, p2, r2] = HelperHPSS (mix1, fs,"Threshold", threshold2,"Window", sqrt (hann (N2,"periodic")),"OverlapLength", раунд (N2/2));

h = h1;
p = p2;
r = h2 + r2;

Прослушайте восстановленный ударный аудио и постройте график спектрограммы.

sound(h,fs)

spectrogram(h,1024,512,1024,fs,"yaxis")
title("Recovered Harmonic Audio")

Figure contains an axes. The axes with title Recovered Harmonic Audio contains an object of type image.

Прослушайте восстановленный ударный аудио и постройте график спектрограммы.

sound(p,fs)

spectrogram(p,1024,512,1024,fs,"yaxis")
title("Recovered Percussive Audio")

Figure contains an axes. The axes with title Recovered Percussive Audio contains an object of type image.

Прослушайте восстановленный остаточный аудио и постройте график спектрограммы.

sound(r,fs)

spectrogram(r,1024,512,1024,fs,"yaxis")
title("Recovered Residual Audio")

Figure contains an axes. The axes with title Recovered Residual Audio contains an object of type image.

Слушайте комбинацию гармонических, ударных и остаточных сигналов и стройте график спектрограммы.

sound(h + p + r,fs)

spectrogram(h+p+r,1024,512,1024,fs,"yaxis")
title("Recovered Harmonic + Percussive + Residual Audio")

Figure contains an axes. The axes with title Recovered Harmonic + Percussive + Residual Audio contains an object of type image.

Расширенное изменение шкалы времени с использованием HPSS

[2] предлагает, что изменение шкалы времени (TSM) может быть улучшено путем сначала разделения сигнала на гармонические и ударные фрагменты, а затем применения оптимального для фрагмента алгоритма TSM. После TSM сигнал восстанавливается путем суммирования растянутого аудио.

Чтобы прослушать растянутый звук без HPSS, примените изменение шкалы времени с помощью stretchAudio по умолчанию функция. По умолчанию stretchAudio использует фазу алгоритм вокодера.

alpha = 1.5;
mixStretched = stretchAudio (mix, альфа);

звук (mixРастянутый, fs)

Разделите гармоническо-ударную смесь на гармонические и ударные фрагменты с помощью HelperHPSS. Как предложено в [2], используйте алгоритм вокодера по умолчанию, чтобы растянуть гармонический фрагмент и алгоритм WSOLA, чтобы растянуть ударный фрагмент. Суммируйте растянутые фрагменты и прослушайте результаты.

[h,p] = HelperHPSS(mix,fs);
hStretched = stretchAudio(h,alpha);
pStretched = stretchAudio(p,alpha,"Method","wsola");

mixStretched = hStretched + pStretched;
sound(mixStretched,fs);

Ссылки

[1] Driedger, J., M. Muller, and S. Disch. «Расширение гармоническо-ударного разделения аудиосигналов». Материалы Международной конференции по поиску информации о музыке. Том 15, 2014.

[2] Driedger, J., M. Muller, and S. Ewert. «Улучшение масштабной модификации музыкальных сигналов с использованием гармоническо-перкуссивного разделения». Буквы обработки сигналов IEEE. Том 21. Выпуск 1. с. 105-109, 2014.