На слайде вводной лекции по машинному обучению Эндрю Нга из Стэнфорда на 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 минут работы на моем портативном компьютере симуляция генерирует следующие три рисунка, показывающие, что два изолированных тона имеют правильные частоты.
Однако установка расстояния разделения микрофонов на ноль (т.е. dMic = 0) заставляет моделирование вместо этого генерировать следующие три цифры, иллюстрирующие, что моделирование не могло выделить второй тон (подтверждается единственным значимым диагональным членом, возвращенным в матрице svd).
Я надеялся, что расстояние разделения микрофонов на смартфоне будет достаточно большим для получения хороших результатов, но установка расстояния разделения микрофонов на 5,25 дюйма (т.е. dMic = 0,1333 метра) заставляет моделирование генерировать следующие, менее чем обнадеживающие, цифры, иллюстрирующие более высокие частотные составляющие в первом изолированном тоне.
x
именно; это спектрограмма сигнала, что ли?