कोर्टेरा में स्टैनफोर्ड के एंड्रयू एनजी द्वारा मशीन सीखने पर परिचयात्मक व्याख्यान के भीतर एक स्लाइड में, वह कॉकटेल पार्टी की समस्या के लिए निम्नलिखित एक पंक्ति ऑक्टेव समाधान देता है, जिसे दिए गए ऑडियो स्रोत दो स्थानिक रूप से अलग किए गए माइक्रोफोन द्वारा रिकॉर्ड किए जाते हैं:
[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 मिनट के निष्पादन के बाद, अनुकार निम्नलिखित तीन आंकड़े उत्पन्न करता है जो दो अलग-अलग टोन को दिखाता है जिसमें सही आवृत्तियां होती हैं।
हालाँकि, माइक्रोफ़ोन को अलग करने की दूरी को शून्य पर सेट करना (यानी, dMic = 0) इसके बजाय सिमुलेशन का कारण बनता है जिससे निम्नलिखित तीन आंकड़े उत्पन्न होते हैं, जिससे यह स्पष्ट होता है कि सिमुलेशन एक दूसरे टोन को अलग नहीं कर सकता है (जो कि svd के मैट्रिक्स में लौटे एकल महत्वपूर्ण विकर्ण शब्द द्वारा पुष्टि की गई है)।
मैं उम्मीद कर रहा था कि स्मार्टफ़ोन पर माइक्रोफ़ोन सेपरेशन डिस्टेंस अच्छे परिणाम देने के लिए काफी बड़ा होगा लेकिन 5.25 इंच (यानी, dMic = 0.1333 मीटर) पर माइक्रोफ़ोन सेपरेटिंग डिस्टेंस सेट करने से सिचुएशन उत्पन्न होती है, जो उत्साहजनक से कम होती है, आंकड़े अधिक होते हैं। पहले पृथक स्वर में आवृत्ति घटक।
x
है; क्या यह तरंग का तमाशा है, या क्या?