Алгоритм коктейльной вечеринки реализация СВД… в одной строчке кода?

88

На слайде вводной лекции по машинному обучению Эндрю Нга из Стэнфорда на Coursera он дает следующее однострочное решение Octave для проблемы коктейльной вечеринки, учитывая, что источники звука записываются двумя пространственно разделенными микрофонами:

[W,s,v]=svd((repmat(sum(x.*x,1),size(x,1),1).*x)*x');

Внизу слайда «Источник: Сэм Роуис, Яир Вайс, Ээро Симончелли», а внизу предыдущего слайда - «Аудиоклипы любезно предоставлены Те-Вон Ли». В видео профессор Нг говорит:

«Итак, вы можете взглянуть на обучение без учителя вот так и спросить:« Насколько сложно это реализовать? » Похоже, что для создания этого приложения, похоже, нужно выполнить эту обработку звука, вы должны написать тонну кода или, возможно, связать кучу библиотек C ++ или Java, которые обрабатывают звук. Похоже, что это было бы действительно сложная программа для создания этого звука: разделение звука и т. д. Оказывается, алгоритм делает то, что вы только что слышали, это можно сделать с помощью всего одной строчки кода ... показано прямо здесь. Исследователям потребовалось много времени чтобы придумать эту строку кода. Я не говорю, что это легкая проблема. Но оказывается, что при использовании правильной среды программирования многие алгоритмы обучения будут действительно короткими программами ».

Разделенные аудио результаты, воспроизводимые в видеолекции, не идеальны, но, на мой взгляд, потрясающи. Есть ли у кого-нибудь представление о том, как эта одна строка кода работает так хорошо? В частности, знает ли кто-нибудь ссылку, которая объясняет работу Те-Вона Ли, Сэма Роуиса, Яира Вайса и Ээро Симончелли в отношении этой единственной строчки кода?

ОБНОВИТЬ

Чтобы продемонстрировать чувствительность алгоритма к расстоянию разделения микрофонов, следующее моделирование (в октаве) разделяет тона от двух пространственно разделенных генераторов тона.

% define model 
f1 = 1100;              % frequency of tone generator 1; unit: Hz 
f2 = 2900;              % frequency of tone generator 2; unit: Hz 
Ts = 1/(40*max(f1,f2)); % sampling period; unit: s 
dMic = 1;               % distance between microphones centered about origin; unit: m 
dSrc = 10;              % distance between tone generators centered about origin; unit: m 
c = 340.29;             % speed of sound; unit: m / s 

% generate tones
figure(1);
t = [0:Ts:0.025];
tone1 = sin(2*pi*f1*t);
tone2 = sin(2*pi*f2*t);
plot(t,tone1); 
hold on;
plot(t,tone2,'r'); xlabel('time'); ylabel('amplitude'); axis([0 0.005 -1 1]); legend('tone 1', 'tone 2');
hold off;

% mix tones at microphones
% assume inverse square attenuation of sound intensity (i.e., inverse linear attenuation of sound amplitude)
figure(2);
dNear = (dSrc - dMic)/2;
dFar = (dSrc + dMic)/2;
mic1 = 1/dNear*sin(2*pi*f1*(t-dNear/c)) + \
       1/dFar*sin(2*pi*f2*(t-dFar/c));
mic2 = 1/dNear*sin(2*pi*f2*(t-dNear/c)) + \
       1/dFar*sin(2*pi*f1*(t-dFar/c));
plot(t,mic1);
hold on;
plot(t,mic2,'r'); xlabel('time'); ylabel('amplitude'); axis([0 0.005 -1 1]); legend('mic 1', 'mic 2');
hold off;

% use svd to isolate sound sources
figure(3);
x = [mic1' mic2'];
[W,s,v]=svd((repmat(sum(x.*x,1),size(x,1),1).*x)*x');
plot(t,v(:,1));
hold on;
maxAmp = max(v(:,1));
plot(t,v(:,2),'r'); xlabel('time'); ylabel('amplitude'); axis([0 0.005 -maxAmp maxAmp]); legend('isolated tone 1', 'isolated tone 2');
hold off;

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

фигура 1 фигура 2 Рисунок 3

Однако установка расстояния разделения микрофонов на ноль (т.е. dMic = 0) заставляет моделирование вместо этого генерировать следующие три цифры, иллюстрирующие, что моделирование не могло выделить второй тон (подтверждается единственным значимым диагональным членом, возвращенным в матрице svd).

Рисунок 1 без разделения микрофонов Рисунок 2 без разделения микрофонов Рисунок 3 без разделения микрофонов

Я надеялся, что расстояние разделения микрофонов на смартфоне будет достаточно большим для получения хороших результатов, но установка расстояния разделения микрофонов на 5,25 дюйма (т.е. dMic = 0,1333 метра) заставляет моделирование генерировать следующие, менее чем обнадеживающие, цифры, иллюстрирующие более высокие частотные составляющие в первом изолированном тоне.

Рисунок 1 на смартфоне Рисунок 2 на смартфоне Рисунок 3 на смартфоне

gregS
источник
1
Я смутно помню эту лекцию, но не могу вспомнить, что xименно; это спектрограмма сигнала, что ли?
Isaac
Профессор Нг в t = 5:30 во вводном видео 4 об обучении без учителя, кажется, предполагает, что x - это вектор аудиосэмплов. Возможно, этот раздел repmat в аргументе svd реализует какую-то нормализацию мощности сигнала.
gregS 06

Ответы:

28

Я тоже пытался понять это 2 года спустя. Но я получил свои ответы; надеюсь, это кому-то поможет.

Вам нужно 2 аудиозаписи. Вы можете получить примеры аудио на http://research.ics.aalto.fi/ica/cocktail/cocktail_en.cgi .

ссылка для реализации: http://www.cs.nyu.edu/~roweis/kica.html

хорошо, вот код -

[x1, Fs1] = audioread('mix1.wav');
[x2, Fs2] = audioread('mix2.wav');
xx = [x1, x2]';
yy = sqrtm(inv(cov(xx')))*(xx-repmat(mean(xx,2),1,size(xx,2)));
[W,s,v] = svd((repmat(sum(yy.*yy,1),size(yy,1),1).*yy)*yy');

a = W*xx; %W is unmixing matrix
subplot(2,2,1); plot(x1); title('mixed audio - mic 1');
subplot(2,2,2); plot(x2); title('mixed audio - mic 2');
subplot(2,2,3); plot(a(1,:), 'g'); title('unmixed wave 1');
subplot(2,2,4); plot(a(2,:),'r'); title('unmixed wave 2');

audiowrite('unmixed1.wav', a(1,:), Fs1);
audiowrite('unmixed2.wav', a(2,:), Fs1);

введите описание изображения здесь

Джек Z
источник
1
Сможете ли вы найти ссылку, которая более подробно объясняет логику этой строки кода?
Hans
Не могли бы вы объяснить, как работает микширование сигналов по указанной вами ссылке? Используя ваш код, можно извлечь два источника звука из двух смешанных файлов, загруженных с сайта. Однако когда я сам пытаюсь смешать два отдельных сигнала, кажется, что алгоритм не может выдать правильный результат. Я использую наивный способ получения смешанных сигналов: mic1 = 0,3 * track1 + 0,5 * track2, mic2 = 0,5 * track1 + 0.3 * track2. Это сигнал, который я пытался передать алгоритму. Большое спасибо!
yc2986
Я новичок в Matlab. У меня есть ошибки в строке 3, в которой говорится, что у меня проблема с объединением двух матриц разных размеров. Как мне справиться с этой проблемой?
mshrestha
1
Я пробовал этот код, но он не очень хорошо работает ... (не
виню
17

x(t) исходный голос с одного канала / микрофона.

X = repmat(sum(x.*x,1),size(x,1),1).*x)*x'оценка спектра мощности x(t). Хотя X' = Xинтервалы между строками и столбцами совсем не одинаковые. Каждая строка представляет время сигнала, а каждый столбец - частоту. Я предполагаю, что это оценка и упрощение более строгого выражения, называемого спектрограммой .

Разложение по сингулярным значениям на спектрограмме используется для разделения сигнала на различные компоненты на основе информации о спектре. Диагональные значения в s- это величина различных компонент спектра. Строки uи столбцы v'- это ортогональные векторы, которые отображают частотную составляющую с соответствующей величиной в Xпространство.

У меня нет голосовых данных для тестирования, но, как я понимаю, с помощью SVD компоненты попадают в аналогичные ортогональные векторы, которые, надеюсь, будут сгруппированы с помощью неконтролируемого обучения. Скажем, если первые две диагональные величины из s сгруппированы, тогда u*s_new*v'будет формироваться голос одного человека, где s_newто же самое, за sисключением того, что все элементы в (3:end,3:end)удаляются.

Для справки - две статьи о звукоформированной матрице и СВД .

lennon310
источник
1
gregS, математически матрица x размером n на 2 может сформировать X с помощью операции repmat. Однако спектрограмма может каждый раз отображать только канал. Поэтому я думаю, что имеет смысл использовать каждый раз размер n на 1 x и рассматривать проблему как линейную регрессию (два матричных уравнения). Еще два возможных подхода: (i) усреднение двух каналов как n на 2 x; или (ii) связывание их вместе, чтобы построить x 2 * n на 2.
lennon310 07
2
gregS, я пересмотрел ваш вопрос. Это может сработать, если вы реализуете repmat для размера n-2 x. Физически это можно рассматривать как среднюю мощность двух каналов в каждый момент времени и на каждой частоте.
lennon310 07
Я нашел этот пост после просмотра вводного видео о машинном обучении (курс только что начался). Мне было интересно, удалось ли вам воспроизвести разделение звука, показанное в видео, или оно было проявлено в ходе курса.
siritinga 04
@siritinga, пожалуйста, поищите в публикации Эндрю Нг о неконтролируемом / глубоком обучении аудио, спасибо
lennon310
1
Почему $ X $ - это мощность спектра $ x $? Также согласно ответу Джека Z, $ x $ - это не исходный голос из записи, а какая-то обработанная величина, обратная собственному значению ковариации исходного голоса.
Hans