penerapan SVD algoritma pesta koktail… dalam satu baris kode?

89

Dalam slide dalam kuliah pengantar tentang pembelajaran mesin oleh Andrew Ng dari Stanford di Coursera, dia memberikan solusi Oktaf satu baris berikut untuk masalah pesta koktail mengingat sumber audio direkam oleh dua mikrofon yang terpisah secara spasial:

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

Di bagian bawah slide adalah "sumber: Sam Roweis, Yair Weiss, Eero Simoncelli" dan di bagian bawah slide sebelumnya adalah "Klip audio milik Te-Won Lee". Dalam video tersebut, Profesor Ng berkata,

"Jadi, Anda mungkin melihat pembelajaran tanpa pengawasan seperti ini dan bertanya, 'Seberapa rumit menerapkan ini?' Sepertinya untuk membangun aplikasi ini, sepertinya melakukan pemrosesan audio ini, Anda akan menulis banyak kode, atau mungkin menautkan ke sekumpulan pustaka C ++ atau Java yang memproses audio. Sepertinya itu akan menjadi program rumit untuk melakukan audio ini: memisahkan audio dan sebagainya. Ternyata algoritme untuk melakukan apa yang baru saja Anda dengar, yang dapat dilakukan hanya dengan satu baris kode ... ditampilkan di sini. Butuh waktu lama bagi peneliti untuk menghasilkan baris kode ini. Jadi, saya tidak mengatakan ini adalah masalah yang mudah. ​​Tetapi ternyata ketika Anda menggunakan lingkungan pemrograman yang tepat, banyak algoritme pembelajaran akan menjadi program yang sangat pendek. "

Hasil audio terpisah yang diputar di video ceramah memang tidak sempurna tapi menurut saya luar biasa. Adakah yang punya wawasan tentang bagaimana satu baris kode itu bekerja dengan baik? Secara khusus, adakah yang mengetahui referensi yang menjelaskan karya Te-Won Lee, Sam Roweis, Yair Weiss, dan Eero Simoncelli sehubungan dengan satu baris kode tersebut?

MEMPERBARUI

Untuk mendemonstrasikan kepekaan algoritme terhadap jarak pemisahan mikrofon, simulasi berikut (dalam Oktaf) memisahkan nada dari dua generator nada yang dipisahkan secara spasial.

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

Setelah sekitar 10 menit eksekusi di komputer laptop saya, simulasi menghasilkan tiga angka berikut yang menggambarkan dua nada terisolasi memiliki frekuensi yang benar.

Gambar 1 Gambar 2 Gambar 3

Namun, pengaturan jarak pemisah mikrofon ke nol (yaitu, dMic = 0) menyebabkan simulasi malah menghasilkan tiga gambar berikut yang mengilustrasikan simulasi tidak dapat mengisolasi nada kedua (dikonfirmasi oleh istilah diagonal signifikan tunggal yang dikembalikan dalam matriks svd).

Gambar 1 tanpa pemisahan mic Gambar 2 tanpa pemisahan mic Gambar 3 tanpa pemisahan mic

Saya berharap jarak pemisahan mikrofon pada smartphone akan cukup besar untuk menghasilkan hasil yang baik, tetapi pengaturan jarak pemisahan mikrofon menjadi 5,25 inci (yaitu, dMic = 0,1333 meter) menyebabkan simulasi menghasilkan yang berikut, kurang dari menggembirakan, gambaran yang menggambarkan lebih tinggi komponen frekuensi dalam nada terisolasi pertama.

Gambar 1 di smartphone Gambar 2 di smartphone Gambar 3 di smartphone

gregS
sumber
1
Saya memiliki ingatan yang kabur tentang ceramah ini, tetapi tidak dapat mengingat apa xitu; apakah itu spektogram dari bentuk gelombang, atau apa?
Isaac
Profesor Ng, pada t = 5: 30 dalam video pengantar 4 tentang pembelajaran tanpa pengawasan, tampaknya menyarankan bahwa x adalah vektor sampel audio. Mungkin bagian repmat dalam argumen svd sedang menerapkan semacam normalisasi daya sinyal.
gregS

Jawaban:

30

Saya mencoba mencari tahu juga, 2 tahun kemudian. Tapi saya mendapatkan jawaban saya; semoga itu akan membantu seseorang.

Anda membutuhkan 2 rekaman audio. Anda bisa mendapatkan contoh audio dari http://research.ics.aalto.fi/ica/cocktail/cocktail_en.cgi .

referensi untuk implementasi adalah http://www.cs.nyu.edu/~roweis/kica.html

ok, ini kodenya -

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

masukkan deskripsi gambar di sini

Jack Z
sumber
1
Apakah Anda dapat menemukan referensi yang menjelaskan secara lebih eksplisit alasan untuk baris kode tersebut?
Hans
Bisakah Anda menjelaskan cara kerja pencampuran sinyal di dalam tautan yang Anda berikan? Menggunakan kode Anda, sebaiknya mengekstrak dua sumber suara dari dua file campuran yang diunduh dari situs. Namun, ketika saya mencoba mencampur dua sinyal terpisah bersama-sama, tampaknya algoritme tidak dapat menghasilkan hasil yang benar. Saya menggunakan cara naif untuk mendapatkan sinyal campuran: mic1 = 0.3 * track1 + 0.5 * track2, mic2 = 0.5 * track1 + 0.3 * track2. Ini adalah sinyal yang saya coba berikan ke algoritme. Terima kasih banyak!
yc2986
Saya agak baru mengenal Matlab. Saya mengalami kesalahan dalam baris 3 mengatakan itu memiliki masalah menggabungkan 2 matriks dari dimensi yang berbeda. Bagaimana saya harus menangani masalah ini?
mshrestha
1
Saya mencoba kode itu tetapi tidak berfungsi dengan baik ... (tidak menyalahkan Anda !!)
mulai
17

x(t) adalah suara asli dari satu saluran / mikrofon.

X = repmat(sum(x.*x,1),size(x,1),1).*x)*x'adalah perkiraan spektrum daya x(t). Meskipun X' = X, interval antara baris dan kolom tidak sama sama sekali. Setiap baris mewakili waktu sinyal, sedangkan setiap kolom adalah frekuensi. Saya kira ini adalah perkiraan dan penyederhanaan dari ekspresi yang lebih ketat yang disebut spektrogram .

Dekomposisi Nilai Singular pada spektrogram digunakan untuk memfaktorkan sinyal menjadi komponen yang berbeda berdasarkan informasi spektrum. Nilai diagonal sadalah besarnya komponen spektrum yang berbeda. Baris dalam udan kolom dalam v'adalah vektor ortogonal yang memetakan komponen frekuensi dengan besaran yang sesuai ke Xruang.

Saya tidak memiliki data suara untuk diuji, tetapi dalam pemahaman saya, dengan menggunakan SVD, komponen yang termasuk dalam vektor ortogonal serupa diharapkan dapat dikelompokkan dengan bantuan pembelajaran tanpa pengawasan. Katakanlah, jika 2 besar diagonal pertama dari s dikelompokkan, maka u*s_new*v'akan membentuk suara satu orang, di mana s_newsama skecuali semua elemen di (3:end,3:end)dieliminasi.

Dua artikel tentang matriks bentukan suara dan SVD adalah untuk referensi Anda.

lennon310.dll
sumber
1
gregS, secara matematis matriks n-by-2 x masih dapat membentuk X dengan operasi repmat. Namun, spektrogram hanya dapat menampilkan saluran setiap saat. Jadi saya pikir lebih masuk akal untuk menggunakan n-by-1 x setiap kali, dan memperlakukan masalah sebagai regresi linier (dua persamaan matriks). Dua pendekatan lain yang mungkin adalah (i) rata-rata dua saluran sebagai n-by-2 x; atau (ii) mengikat mereka bersama-sama untuk membangun 2 * n-oleh-2 x.
lennon310
2
gregS, saya mempertimbangkan kembali pertanyaan Anda. Ini mungkin berhasil jika Anda mengimplementasikan repmat pada n-by-2 x. Secara fisik itu dapat dilihat sebagai rata-rata daya dari dua saluran pada setiap waktu, dan setiap frekuensi.
lennon310
Saya menemukan postingan ini setelah menonton video pengenalan Machine Learning (kursus baru saja dimulai lagi). Saya ingin tahu apakah Anda berhasil mereproduksi pemisahan audio yang ditampilkan dalam video, atau dikembangkan selama kursus.
siritinga
@siritinga silahkan cari publikasi Andrew Ng tentang unsupervised / deep learning pada audio, terima kasih
lennon310
1
Mengapa $ X $ kekuatan spektrum $ x $? Juga menurut jawaban Jack Z, $ x $ bukanlah suara asli dari rekaman tetapi semacam proses timbal balik dari nilai eigen dari kovarian suara asli.
Hans