kokteyl partisi algoritması SVD uygulaması… tek satır kodda mı?


89

Stanford'dan Andrew Ng tarafından Coursera'daki makine öğrenimi üzerine giriş dersinde yer alan bir slaytta, ses kaynaklarının mekansal olarak ayrılmış iki mikrofon tarafından kaydedildiği göz önüne alındığında, kokteyl partisi sorununa aşağıdaki tek satır Octave çözümünü veriyor:

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

Slaydın altında "kaynak: Sam Roweis, Yair Weiss, Eero Simoncelli" ve daha önceki bir slaydın altında "Te-Won Lee'nin ses klipleri" yer almaktadır. Videoda Profesör Ng,

"Öyleyse, bunun gibi denetimsiz öğrenmeye bakabilir ve 'Bunu uygulamak ne kadar karmaşık?' Diye sorabilirsiniz. Görünüşe göre bu uygulamayı inşa etmek için, bu ses işlemeyi yapmak gibi görünüyor, bir ton kod yazarsınız ya da belki sesi işleyen bir grup C ++ veya Java kitaplığına bağlanırsınız. Bu sesi yapmak için karmaşık bir program: sesi ayırmak vb. Az önce duyduğunuz şeyi yapmak için algoritma ortaya çıktı, bu sadece bir satır kodla yapılabilir ... tam burada gösteriliyor. Araştırmacılar uzun zaman aldı bu kod satırını bulmak için. Bu yüzden bunun kolay bir problem olduğunu söylemiyorum. Ama doğru programlama ortamını kullandığınızda birçok öğrenme algoritmasının gerçekten kısa programlar olacağı ortaya çıkıyor. "

Video dersinde oynatılan ayrılmış ses sonuçları mükemmel değil ama bence harika. Bu kod satırının nasıl bu kadar iyi performans gösterdiğine dair herhangi bir fikri olan var mı? Özellikle, Te-Won Lee, Sam Roweis, Yair Weiss ve Eero Simoncelli'nin bu tek satır kodla ilgili çalışmalarını açıklayan bir referans bilen var mı?

GÜNCELLEME

Algoritmanın mikrofon ayırma mesafesine olan hassasiyetini göstermek için, aşağıdaki simülasyon (Oktav cinsinden) tonları uzamsal olarak ayrılmış iki ton üretecinden ayırır.

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

Dizüstü bilgisayarımda yaklaşık 10 dakikalık yürütmeden sonra simülasyon, iki izole tonun doğru frekanslara sahip olduğunu gösteren aşağıdaki üç şekli oluşturur.

Şekil 1 şekil 2 Figür 3

Bununla birlikte, mikrofon ayırma mesafesinin sıfıra ayarlanması (yani, dMic = 0), simülasyonun bunun yerine, ikinci bir tonu izole edemediğini gösteren aşağıdaki üç şekli oluşturmasına neden olur (svd'nin matrisinde döndürülen tek anlamlı köşegen terim tarafından onaylanır).

Mikrofon ayırması olmayan Şekil 1 Mikrofon ayrımı olmayan şekil 2 Mikrofon ayırması olmayan Şekil 3

Bir akıllı telefondaki mikrofon ayırma mesafesinin iyi sonuçlar üretecek kadar büyük olacağını umuyordum, ancak mikrofon ayırma mesafesini 5,25 inç (yani, dMic = 0,1333 metre) olarak ayarlamak, simülasyonun, cesaret verici olmaktan çok daha yüksek rakamları gösteren aşağıdaki rakamları oluşturmasına neden oluyor. ilk izole edilmiş tondaki frekans bileşenleri.

Akıllı telefondaki Şekil 1 Akıllı telefondaki Şekil 2 Akıllı telefondaki Şekil 3


1
Bu dersle ilgili belirsiz hatıralarım var ama ne xolduğunu hatırlayamıyorum ; dalga formunun spektrogramı mı yoksa ne?
Isaac

Denetimsiz öğrenmeye ilişkin giriş videosunda 4 t = 5: 30'da Profesör Ng, x'in ses örneklerinin bir vektörü olduğunu öne sürüyor gibi görünüyor. Belki de svd argümanındaki repmat bölümü, sinyalin bir tür güç normalizasyonu uyguluyor.
gregS

Yanıtlar:


30

Ben de bunu 2 yıl sonra anlamaya çalışıyordum. Ama cevaplarımı aldım; umarım birine yardımcı olur.

2 ses kaydına ihtiyacınız var. Sen ses örneklerini alabilirsiniz http://research.ics.aalto.fi/ica/cocktail/cocktail_en.cgi .

uygulama referansı http://www.cs.nyu.edu/~roweis/kica.html

tamam, işte kod -

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

görüntü açıklamasını buraya girin


1
Bu kod satırının mantığını daha açık bir şekilde açıklayan bir referans bulabiliyor musunuz?
Hans

Sağladığınız bağlantı içinde sinyal karıştırmanın nasıl çalıştığını açıklar mısınız? Kodunuzu kullanarak, siteden indirilen iki karma dosyadan iki ses kaynağı çıkarmak iyidir. Bununla birlikte, iki ayrı sinyali kendim karıştırmaya çalıştığımda, algoritma doğru sonucu veremiyor gibi görünüyor. Karışık sinyalleri elde etmek için saf bir yol kullanıyorum: mic1 = 0.3 * track1 + 0.5 * track2, mic2 = 0.5 * track1 + 0.3 * track2. Algoritmaya beslemeye çalıştığım sinyaller bunlar. Çok teşekkür ederim!
yc2986

Matlab'da yeniyim. 3. satırda, farklı boyutlardaki 2 matrisi birleştirmede sorun yaşadığını söyleyen hatalar alıyorum. Bu sorunu nasıl çözmeliyim?
mshrestha

1
Bu kodu denedim ama çok iyi çalışmıyor ... (seni suçlamıyorum !!)
18'de 1

17

x(t) tek kanaldan / mikrofondan gelen orijinal sestir.

X = repmat(sum(x.*x,1),size(x,1),1).*x)*x'güç spektrumunun bir tahminidir x(t). Bununla birlikte X' = X, satırlar ve sütunlar arasındaki aralıklar hiç aynı değildir. Her satır, sinyalin zamanını temsil ederken, her sütun frekanstır. Sanırım bu, adı verilen daha katı bir ifadenin tahmini ve basitleştirilmesidir. spektrogram .

Spektrogramdaki Tekil Değer Ayrışımı , sinyali spektrum bilgisine dayalı olarak farklı bileşenlere ayırmak için kullanılır. Çapraz değerler s, farklı spektrum bileşenlerinin büyüklüğüdür. İçerideki satırlar uve içindeki sütunlar v', frekans bileşenini karşılık gelen büyüklükle eşleyen ortogonal vektörlerdir.X uzaya .

Test edilecek ses verilerim yok, ancak benim anlayışıma göre, SVD aracılığıyla, bileşenler benzer ortogonal vektörlere düşüyor, umarım denetimsiz öğrenme yardımıyla kümelenir. S ilk 2 diyagonal büyüklükleri kümelenmiş eğer ki, daha sonra u*s_new*v'bir şahıs ses, oluşturacaktır s_newaynıdır sde elemanlar hariç tüm(3:end,3:end) ortadan kaldırılması .

Sesle biçimlendirilmiş matris ve SVD hakkında iki makale referans amaçlıdır .


1
gregS, matematiksel olarak n'ye 2 matris x, repmat işlemi ile hala bir X oluşturabilir. Ancak, spektrogram her seferinde yalnızca kanalı gösterebilir. Bu yüzden her seferinde n'ye 1 x kullanmanın ve problemi doğrusal bir regresyon (iki matris denklemi) olarak ele almanın daha mantıklı olduğunu düşünüyorum. Diğer iki olası yaklaşım (i) iki kanalı n'ye 2 x olarak ortalamak; veya (ii) 2 * n'ye 2 x oluşturmak için bunları birbirine bağlamak.
lennon310

2
gregS, sorunuzu tekrar değerlendirdim. Bir n'ye 2 x üzerine repmat uygularsanız işe yarayabilir. Fiziksel olarak, her seferinde iki kanaldan ve her frekanstan gelen ortalama güç olarak görülebilir.
lennon310

Bu yazıyı Makine Öğreniminin tanıtım videosunu izledikten sonra buldum (kurs yeni başladı). Videoda gösterilen ses ayrımını yeniden oluşturup oluşturmadığınızı veya kurs sırasında geliştirilip geliştirilmediğini merak ediyordum.
siritinga

@siritinga lütfen Andrew Ng'nin seste denetimsiz / derin öğrenme hakkındaki yayınını arayın, teşekkürler
lennon310

1
X $ neden x $ spektrumunun gücüdür? Ayrıca Jack Z'nin cevabına göre, $ x $ kayıttaki orijinal ses değil, orijinal sesin kovaryansının öz değerinin bir tür işlenmiş karşılığıdır.
Hans
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.