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.
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).
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.
x
itu; apakah itu spektogram dari bentuk gelombang, atau apa?Jawaban:
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);
sumber
x(t)
adalah suara asli dari satu saluran / mikrofon.X = repmat(sum(x.*x,1),size(x,1),1).*x)*x'
adalah perkiraan spektrum dayax(t)
. MeskipunX' = 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
s
adalah besarnya komponen spektrum yang berbeda. Baris dalamu
dan kolom dalamv'
adalah vektor ortogonal yang memetakan komponen frekuensi dengan besaran yang sesuai keX
ruang.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 manas_new
samas
kecuali semua elemen di(3:end,3:end)
dieliminasi.Dua artikel tentang matriks bentukan suara dan SVD adalah untuk referensi Anda.
sumber