реалізація SVD коктейльної вечірки ... в один рядок коду?


88

У слайді в рамках вступної лекції про машинне навчання Ендрю Нґ з Стенфорда на Coursera він подає наступне однострочне рішення проблеми коктейлю, враховуючи аудіоджерела, записані двома просторово розділеними мікрофонами:

[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 на смартфоні


1
Я маю неясні спогади про цю лекцію, але не можу згадати, що xє; це спектрограма сигналу, чи що?
Ісаак

Професор Нг, при t = 5: 30 у вступному відео 4 про навчання без нагляду, схоже, припускає, що х - вектор звукових зразків. Можливо, цей розділ повторення в аргументі svd реалізує якусь нормалізацію потужності сигналу.
gregS

Відповіді:


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);

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


1
Чи можете ви знайти посилання, яке більш чітко пояснює обґрунтування цього рядка коду?
Ганс,

Не могли б ви пояснити, як працює змішування сигналу всередині посилання, яке ви надали? Використовуючи свій код, добре витягти два джерела звуку з двох змішаних файлів, завантажених з сайту. Однак, коли я намагаюся сам змішати два окремі сигнали, здається, алгоритм не може вивести правильний результат. Я використовую наївний спосіб отримання змішаних сигналів: mic1 = 0,3 * track1 + 0,5 * track2, mic2 = 0,5 * track1 + 0,3 * track2. Це сигнал, який я намагався подати в алгоритм. Дуже дякую!
yc2986

Я щось нове з Matlab. У мене трапляються помилки в рядку 3, говорячи про проблему об’єднання 2 матриці різних вимірів. Як мені вирішити цю проблему?
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 компоненти потрапляють у подібні ортогональні вектори, які, сподіваюся, кластеризуються за допомогою неконтрольованого навчання. Скажімо, якщо перші 2 діагональні величини від s згруповані, тоді u*s_new*v'буде сформований голос однієї особи, де s_newоднаковий, за sвинятком усіх елементів в (3:end,3:end).

Дві статті про звукову матрицю та SVD - для довідки.


1
gregS, математично матриця n-на-2 x все ще може утворювати X за допомогою операції повторного перетворення. Однак спектрограма може показати канал лише кожного разу. Тому я вважаю, що має сенс використовувати n-by-1 x кожного разу і розглядати проблему як лінійну регресію (два матричні рівняння). Ще два можливі підходи: (i) усереднювати два канали як n-на-2 x; або (ii) зв’язування їх між собою для побудови 2 * n-на-2 x.
lennon310

2
gregS, я переглянув ваше запитання. Це може спрацювати, якщо ви реалізуєте переформатування на n-by-2 x. Фізично це можна розглядати як середнє значення потужності від двох каналів за раз і для кожної частоти.
lennon310

Я знайшов цю публікацію після перегляду вступного відео про машинне навчання (курс щойно розпочався знову). Мені було цікаво, чи вдалося вам відтворити аудіоподіл, показаний у відео, чи це було розроблено під час курсу.
siritinga

@siritinga, будь ласка, пошукайте публікацію Ендрю Нга про безконтрольне / глибоке навчання аудіо, дякую
lennon310

1
Чому $ X $ дорівнює потужності спектра $ x $? Також згідно з відповіддю Джека Z, $ x $ - це не оригінальний голос із запису, а якась оброблена взаємна відповідність власного значення коваріації вихідного голосу.
Ганс,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.