Pregunta algoritmo de cóctel SVD implementación ... en una línea de código?


En una presentación dentro de la conferencia introductoria sobre aprendizaje automático realizada por Andrew Ng de Stanford en Coursera, ofrece la siguiente solución Octave de una línea para el problema del cóctel dado que las fuentes de audio están grabadas por dos micrófonos espacialmente separados:

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

En la parte inferior de la diapositiva está "fuente: Sam Roweis, Yair Weiss, Eero Simoncelli" y en la parte inferior de una diapositiva anterior se encuentra "Clips de audio cortesía de Te-Won Lee". En el video, el profesor Ng dice:

"Entonces podrías mirar el aprendizaje no supervisado de esta manera y preguntar: '¿Qué tan complicado es implementar esto?' Parece que para construir esta aplicación, parece que se debe hacer este procesamiento de audio, se escribiría un montón de código, o tal vez se vincularía a un grupo de librerías C ++ o Java que procesan audio. Parece que sería realmente programa complicado para hacer este audio: separar el audio, etc. Resulta que el algoritmo hace lo que acaba de escuchar, que se puede hacer con una sola línea de código ... se muestra aquí. Los investigadores tardaron mucho tiempo para llegar a esta línea de código. Así que no estoy diciendo que este sea un problema fácil. Pero resulta que cuando se utiliza el entorno de programación correcto, muchos algoritmos de aprendizaje serán programas realmente cortos ".

Los resultados de audio separados reproducidos en la conferencia de video no son perfectos pero, en mi opinión, sorprendentes. ¿Alguien tiene alguna idea de cómo esa línea de código funciona tan bien? En particular, ¿alguien sabe de una referencia que explique el trabajo de Te-Won Lee, Sam Roweis, Yair Weiss y Eero Simoncelli con respecto a esa línea de código?

ACTUALIZAR

Para demostrar la sensibilidad del algoritmo a la distancia de separación del micrófono, la siguiente simulación (en Octave) separa los tonos de dos generadores de tonos espacialmente separados.

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

Después de aproximadamente 10 minutos de ejecución en mi computadora portátil, la simulación genera las siguientes tres figuras que ilustran que los dos tonos aislados tienen las frecuencias correctas.

Figure 1 Figure 2 Figure 3

Sin embargo, establecer la distancia de separación del micrófono a cero (es decir, dMic = 0) hace que la simulación genere las siguientes tres figuras que ilustran que la simulación no pudo aislar un segundo tono (confirmado por el único término diagonal significativo devuelto en la matriz de svd).

Figure 1 with no mic separation Figure 2 with no mic separation Figure 3 with no mic separation

Esperaba que la distancia de separación del micrófono en un teléfono inteligente fuera lo suficientemente grande para producir buenos resultados pero establecer la distancia de separación del micrófono a 5.25 pulgadas (dMic = 0.1333 metros) hace que la simulación genere las siguientes, menos que alentadoras, cifras que componentes de frecuencia en el primer tono aislado.

Figure 1 on smartphone Figure 2 on smartphone Figure 3 on smartphone


69
2017-12-06 02:11


origen


Respuestas:


Estuve tratando de resolver esto también, 2 años después. Pero obtuve mis respuestas; con suerte, ayudará a alguien.

Necesitas 2 grabaciones de audio. Puedes obtener ejemplos de audio de http://research.ics.aalto.fi/ica/cocktail/cocktail_en.cgi.

referencia para la implementación es http://www.cs.nyu.edu/~roweis/kica.html

ok, aquí está el código -

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

enter image description here


18
2017-11-09 19:39



x(t) es la voz original de un canal / micrófono.

X = repmat(sum(x.*x,1),size(x,1),1).*x)*x' es una estimación del espectro de potencia de x(t). A pesar de que X' = X, los intervalos entre filas y columnas no son los mismos en absoluto. Cada fila representa el tiempo de la señal, mientras que cada columna es frecuencia. Supongo que esto es una estimación y simplificación de una expresión más estricta llamada espectrograma.

Valor singular de descomposición en el espectrograma se usa para factorizar la señal en diferentes componentes según la información del espectro. Valores diagonales en s son la magnitud de los diferentes componentes del espectro Las filas en u y columnas en v' son los vectores ortogonales que mapean el componente de frecuencia con la magnitud correspondiente a X espacio.

No tengo datos de voz para probar, pero en mi comprensión, mediante SVD, los componentes que caen en los vectores ortogonales similares se agrupan con la ayuda del aprendizaje no supervisado. Digamos, si las primeras 2 magnitudes diagonales de s están agrupadas, entonces u*s_new*v' formará la voz de una sola persona, donde s_new es lo mismo de s excepto todos los elementos en (3:end,3:end) son eliminados

Dos artículos sobre el matriz formada por sonido y SVD son para su referencia.


14
2017-12-06 19:29