На слайде вводной лекции по машинному обучению Эндрю Нга из Стэнфорда на 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
именно; это спектрограмма сигнала, что ли?Ответы:
Я тоже пытался понять это 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);
источник
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)
удаляются.Для справки - две статьи о звукоформированной матрице и СВД .
источник