In una diapositiva all'interno della lezione introduttiva sull'apprendimento automatico di Andrew Ng di Stanford a Coursera, fornisce la seguente soluzione di una riga in ottava al problema del cocktail party dato che le sorgenti audio sono registrate da due microfoni spazialmente separati:
[W,s,v]=svd((repmat(sum(x.*x,1),size(x,1),1).*x)*x');
In fondo alla diapositiva c'è "fonte: Sam Roweis, Yair Weiss, Eero Simoncelli" e in fondo a una diapositiva precedente c'è "Clip audio per gentile concessione di Te-Won Lee". Nel video, dice il professor Ng,
"Quindi potresti considerare l'apprendimento non supervisionato in questo modo e chiederti: 'Quanto è complicato implementarlo?' Sembra che per costruire questa applicazione, sembra che si debba fare questa elaborazione audio, si scriverà un sacco di codice, o magari si collegherà a un mucchio di librerie C ++ o Java che elaborano l'audio. Sembra che sarebbe davvero un programma complicato per fare questo audio: separare l'audio e così via. Si scopre che l'algoritmo fa quello che hai appena sentito, che può essere fatto con una sola riga di codice ... mostrato qui. Ci è voluto molto tempo per i ricercatori inventare questa riga di codice. Quindi non sto dicendo che sia un problema facile. Ma risulta che quando si utilizza l'ambiente di programmazione giusto molti algoritmi di apprendimento saranno programmi davvero brevi.
I risultati audio separati riprodotti nella videoconferenza non sono perfetti ma, a mio parere, sorprendenti. Qualcuno ha qualche idea su come quella riga di codice funzioni così bene? In particolare, qualcuno conosce un riferimento che spieghi il lavoro di Te-Won Lee, Sam Roweis, Yair Weiss ed Eero Simoncelli rispetto a quella riga di codice?
AGGIORNARE
Per dimostrare la sensibilità dell'algoritmo alla distanza di separazione del microfono, la seguente simulazione (in Octave) separa i toni da due generatori di toni separati spazialmente.
% 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;
Dopo circa 10 minuti di esecuzione sul mio computer portatile, la simulazione genera le seguenti tre figure che illustrano che i due toni isolati hanno le frequenze corrette.
Tuttavia, impostando la distanza di separazione del microfono su zero (cioè, dMic = 0), la simulazione genera invece le seguenti tre figure che illustrano che la simulazione non poteva isolare un secondo tono (confermato dal singolo termine diagonale significativo restituito nella matrice di svd).
Speravo che la distanza di separazione del microfono su uno smartphone fosse abbastanza grande da produrre buoni risultati, ma impostando la distanza di separazione del microfono a 5,25 pollici (cioè, dMic = 0,1333 metri) la simulazione genera le seguenti cifre, meno che incoraggianti, che illustrano maggiori componenti di frequenza nel primo tono isolato.
x
sia; è lo spettrogramma della forma d'onda o cosa?