algorithme de cocktail mise en œuvre SVD… dans une ligne de code?

Dans une diapositive du cours d’introduction à l’apprentissage par ordinateur de Andrew Ng, de Stanford, à Coursera, il donne la solution Octave suivante au problème du cocktail, étant donné que les sources audio sont enregistrées par deux microphones séparés:

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

Au bas de la diapositive se trouve “source: Sam Roweis, Yair Weiss, Eero Simoncelli” et, au bas d’une diapositive précédente, “Audio clips de Te-Won Lee”. Dans la vidéo, le professeur Ng dit:

“Donc, vous pourriez regarder l’apprentissage non supervisé comme celui-ci et demander:” Dans quelle mesure est-il compliqué de l’implémenter? ” Il semble que pour construire cette application, il semble que ce traitement audio soit fait, que vous écriviez une tonne de code, ou que vous créiez un lien vers un tas de librairies C ++ ou Java traitant de l’audio. programme compliqué pour faire cet audio: séparer l’audio et ainsi de suite.Il s’avère que l’algorithme fait ce que vous venez d’entendre, cela peut être fait avec une seule ligne de code … affichée ici, il a fallu longtemps aux chercheurs pour arriver à cette ligne de code. Donc je ne dis pas que c’est un problème facile, mais il s’avère que lorsque vous utilisez le bon environnement de programmation, de nombreux algorithmes d’apprentissage seront vraiment des programmes courts. ”

Les résultats audio séparés joués dans la conférence vidéo ne sont pas parfaits mais, à mon avis, étonnants. Quelqu’un a-t-il une idée de la performance de cette ligne de code? En particulier, est-ce que quelqu’un connaît une référence qui explique le travail de Te-Won Lee, Sam Roweis, Yair Weiss et Eero Simoncelli en ce qui concerne cette ligne de code?

METTRE À JOUR

Pour démontrer la sensibilité de l’algorithme à la distance de séparation du microphone, la simulation suivante (en octave) sépare les tonalités de deux générateurs de ton spatialement séparés.

 % 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: mc = 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 (ie, 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; 

Après environ 10 minutes d’exécution sur mon ordinateur portable, la simulation génère les trois chiffres suivants, illustrant que les deux sons isolés ont les fréquences correctes.

Figure 1Figure 2figure 3

Cependant, si vous définissez la distance de séparation du microphone sur zéro (dMic = 0), la simulation génère plutôt les trois chiffres suivants, illustrant que la simulation ne peut pas isoler un second signal (confirmé par le seul terme diagonal significatif renvoyé dans la masortingce de svd).

Figure 1 sans séparation de microFigure 2 sans séparation de microFigure 3 sans séparation de micro

J’espérais que la distance de séparation du microphone sur un smartphone serait suffisamment grande pour produire de bons résultats, mais si la distance de séparation du microphone était de 5,25 pouces (dMic = 0,1333 mètres), la simulation produirait des résultats moins encourageants composantes de fréquence sur le premier ton isolé.

Figure 1 sur smartphoneFigure 2 sur smartphoneFigure 3 sur smartphone

J’essayais aussi de comprendre cela, 2 ans plus tard. Mais j’ai mes réponses. J’espère que cela aidera quelqu’un.

Vous avez besoin de 2 enregistrements audio. Vous pouvez obtenir des exemples audio sur http://research.ics.aalto.fi/ica/cocktail/cocktail_en.cgi .

la référence pour la mise en œuvre est http://www.cs.nyu.edu/~roweis/kica.html

ok, voici le code –

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

entrer la description de l'image ici

x(t) est la voix d’origine d’un canal / microphone.

X = repmat(sum(x.*x,1),size(x,1),1).*x)*x' est une estimation du spectre de puissance de x(t) . Bien que X' = X , les intervalles entre les lignes et les colonnes ne sont pas identiques. Chaque ligne représente l’heure du signal, tandis que chaque colonne est la fréquence. Je suppose que c’est une estimation et une simplification d’une expression plus ssortingcte appelée spectrogramme .

Valeur singulière La décomposition sur le spectrogramme est utilisée pour factoriser le signal en différentes composantes sur la base des informations de spectre. Les valeurs diagonales de s correspondent à la magnitude des différentes composantes du spectre. Les lignes dans u et les colonnes dans v' sont les vecteurs orthogonaux qui mappent la composante de fréquence avec la magnitude correspondante à l’espace X

Je n’ai pas de données vocales à tester, mais d’après ce que je sais, grâce à la méthode SVD, les composants devraient être regroupés avec l’aide d’un apprentissage non supervisé. Disons que si les 2 premières grandeurs diagonales de s sont groupées, alors u*s_new*v' formera la voix à une personne, où s_new est la même que s sauf tous les éléments à (3:end,3:end) sont éliminés.

Deux articles sur la masortingce formée par le son et SVD sont pour votre référence.