कोड की एक पंक्ति में कॉकटेल पार्टी एल्गोरिथ्म SVD कार्यान्वयन ...?


88

कोर्टेरा में स्टैनफोर्ड के एंड्रयू एनजी द्वारा मशीन सीखने पर परिचयात्मक व्याख्यान के भीतर एक स्लाइड में, वह कॉकटेल पार्टी की समस्या के लिए निम्नलिखित एक पंक्ति ऑक्टेव समाधान देता है, जिसे दिए गए ऑडियो स्रोत दो स्थानिक रूप से अलग किए गए माइक्रोफोन द्वारा रिकॉर्ड किए जाते हैं:

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

स्लाइड के निचले भाग में "स्रोत: सैम रोविस, येयर वीस, ईरो सिमोनसेलि" और पहले की स्लाइड के नीचे "ऑडियो क्लिप ते-वोन ली के सौजन्य से" है। वीडियो में, प्रोफेसर एनजी कहते हैं,

"तो आप इस तरह से अप्रशिक्षित सीखने को देख सकते हैं और पूछ सकते हैं, 'इसे लागू करना कितना जटिल है?" ऐसा लगता है कि इस एप्लिकेशन को बनाने के लिए, ऐसा लगता है कि यह ऑडियो प्रोसेसिंग करना है, आप एक टन कोड लिखेंगे, या शायद सी ++ या जावा लाइब्रेरी के एक समूह में लिंक करेंगे जो ऑडियो प्रोसेस करते हैं। ऐसा लगता है कि यह वास्तव में होगा। इस ऑडियो को करने के लिए जटिल कार्यक्रम: ऑडियो और इतने पर अलग करना। यह एल्गोरिथ्म को करने के लिए बाहर निकलता है जो आपने अभी सुना है, जो कि कोड की सिर्फ एक पंक्ति के साथ किया जा सकता है ... यहीं दिखाया गया। इसमें शोधकर्ताओं को एक लंबा समय लगा। कोड की इस लाइन के साथ आने के लिए। इसलिए मैं यह नहीं कह रहा हूं कि यह एक आसान समस्या है। लेकिन यह पता चला है कि जब आप सही प्रोग्रामिंग वातावरण का उपयोग करते हैं तो बहुत से लर्निंग एल्गोरिदम वास्तव में कम प्रोग्राम होंगे। "

वीडियो व्याख्यान में खेले गए अलग-अलग ऑडियो परिणाम सही नहीं हैं, लेकिन मेरी राय में, अद्भुत है। क्या किसी को इस बारे में कोई जानकारी नहीं है कि कोड की एक पंक्ति इतनी अच्छी तरह से कैसे निष्पादित करती है? विशेष रूप से, क्या किसी को उस संदर्भ के बारे में पता है जो कि कोड की एक पंक्ति के संबंध में टी-वोन ली, सैम रोविस, यायर वीस और ईरो सिमोनसी के काम की व्याख्या करता है?

अपडेट करें

एल्गोरिथ्म की संवेदनशीलता को माइक्रोफोन से अलग करने की दूरी को प्रदर्शित करने के लिए, निम्नलिखित सिमुलेशन (ऑक्टेव में) टोन को दो स्थानिक रूप से अलग टोन जनरेटर से अलग करता है।

% 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 चित्र तीन

हालाँकि, माइक्रोफ़ोन को अलग करने की दूरी को शून्य पर सेट करना (यानी, dMic = 0) इसके बजाय सिमुलेशन का कारण बनता है जिससे निम्नलिखित तीन आंकड़े उत्पन्न होते हैं, जिससे यह स्पष्ट होता है कि सिमुलेशन एक दूसरे टोन को अलग नहीं कर सकता है (जो कि svd के मैट्रिक्स में लौटे एकल महत्वपूर्ण विकर्ण शब्द द्वारा पुष्टि की गई है)।

चित्रा 1 कोई mic जुदाई के साथ चित्रा 2 कोई mic जुदाई के साथ चित्रा 3 कोई mic जुदाई के साथ

मैं उम्मीद कर रहा था कि स्मार्टफ़ोन पर माइक्रोफ़ोन सेपरेशन डिस्टेंस अच्छे परिणाम देने के लिए काफी बड़ा होगा लेकिन 5.25 इंच (यानी, dMic = 0.1333 मीटर) पर माइक्रोफ़ोन सेपरेटिंग डिस्टेंस सेट करने से सिचुएशन उत्पन्न होती है, जो उत्साहजनक से कम होती है, आंकड़े अधिक होते हैं। पहले पृथक स्वर में आवृत्ति घटक।

स्मार्टफोन पर चित्र 1 स्मार्टफोन पर चित्र 2 स्मार्टफोन पर चित्र 3


1
मेरे पास इस व्याख्यान की अस्पष्ट यादें हैं, लेकिन याद नहीं कर सकते कि क्या xहै; क्या यह तरंग का तमाशा है, या क्या?
इसहाक

प्रोफ़ेसर एनजी, टी: 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। ये वह संकेत हैं जो मैंने एल्गोरिथम को खिलाने की कोशिश की थी। आपका बहुत बहुत धन्यवाद!
1929 में yc2986

मैं मतलूब के लिए नया हूँ। मुझे यह कहते हुए लाइन 3 में त्रुटियां हो रही हैं कि इसमें विभिन्न आयामों के 2 मैट्रिक्स को समवर्ती करने में समस्या है। मुझे इस समस्या को कैसे संभालना चाहिए?
मृगशिरा

1
मैंने उस कोड की कोशिश की, लेकिन यह बहुत अच्छी तरह से काम नहीं करता है ... (आपको दोष नहीं दे रहा है !!)
anderstood

17

x(t) एक चैनल / माइक्रोफोन से मूल आवाज है।

X = repmat(sum(x.*x,1),size(x,1),1).*x)*x'की शक्ति स्पेक्ट्रम का एक अनुमान है x(t)। हालाँकि X' = X, पंक्तियों और स्तंभों के बीच का अंतराल समान नहीं है। प्रत्येक पंक्ति सिग्नल के समय का प्रतिनिधित्व करती है, जबकि प्रत्येक कॉलम आवृत्ति है। मुझे लगता है कि यह एक अधिक सख्त अभिव्यक्ति का एक अनुमान और सरलीकरण है जिसे स्पेक्ट्रोग्राम कहा जाता है ।

वर्णक्रमीय सूचना पर आधारित विभिन्न घटकों में सिग्नल को फैक्टर करने के लिए स्पेक्ट्रोग्राम पर एकवचन मान अपघटन का उपयोग किया जाता है। विकर्ण मान sविभिन्न स्पेक्ट्रम घटकों के परिमाण हैं। uऔर स्तंभों की पंक्तियाँ v'ऑर्थोगोनल वैक्टर हैं जो Xअंतरिक्ष के अनुरूप परिमाण के साथ आवृत्ति घटक का नक्शा बनाते हैं।

परीक्षण करने के लिए मेरे पास वॉयस डेटा नहीं है, लेकिन मेरी समझ में, एसवीडी के माध्यम से, घटक समान ओर्थोगोनल वैक्टर में आते हैं, उम्मीद है कि अनपेक्षित शिक्षण की मदद से क्लस्टर किया जाएगा। कहते हैं, अगर एस से पहले 2 विकर्ण परिमाण को क्लस्टर किया जाता है, तो u*s_new*v'एक व्यक्ति-व्यक्ति की आवाज बनेगी, जहां सभी तत्वों को समाप्त करने s_newके sअलावा एक ही है (3:end,3:end)

ध्वनि-निर्मित मैट्रिक्स और एसवीडी के बारे में दो लेख आपके संदर्भ के लिए हैं।


1
gregS, गणितीय रूप से एक n-by-2 मैट्रिक्स x अभी भी एक X का रिपाॅट ऑपरेशन कर सकता है। हालाँकि, स्पेक्ट्रोग्राम केवल हर बार चैनल दिखा सकता है। इसलिए मुझे लगता है कि यह प्रत्येक बार n-by-1 x का उपयोग करने के लिए अधिक समझ में आता है, और समस्या को रैखिक प्रतिगमन (दो मैट्रिक्स समीकरण) के रूप में मानता है। एक और दो संभावित दृष्टिकोण हैं (i) दो चैनलों को n-by-2 x के रूप में औसत करने के लिए; या (ii) 2 * n-by-2 x के निर्माण के लिए उन्हें एक साथ बांधना।
lennon310

2
gregS, मैंने आपके प्रश्न पर पुनर्विचार किया। यदि आप n-by-2 x पर repmat लागू करते हैं तो यह काम कर सकता है। शारीरिक रूप से इसे हर समय दो चैनलों से औसत शक्ति के रूप में देखा जा सकता है, और प्रत्येक आवृत्ति।
lennon310 20

मशीन लर्निंग का परिचय वीडियो (कोर्स अभी फिर से शुरू हुआ है) देखने के बाद मुझे यह पोस्ट मिला। मैं सोच रहा था कि क्या आप वीडियो में दिखाए गए ऑडियो पृथक्करण को पुन: उत्पन्न करने में कामयाब रहे, या यदि यह पाठ्यक्रम के दौरान विकसित किया गया था।
सरिटिंगा

@siritinga कृपया ऑडियो पर
अनचाहे

1
$ X $ $ X के स्पेक्ट्रम की शक्ति क्यों है? इसके अलावा, जैक जेड के उत्तर के अनुसार, $ x $ रिकॉर्डिंग से मूल आवाज नहीं है, लेकिन मूल आवाज के सहसंयोजक के आइजनवायु के कुछ प्रकार के संसाधित पारस्परिक हैं।
हंस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.