スタンフォード大学のAndrewNgによるCourseraでの機械学習の入門講義のスライドで、オーディオソースが2つの空間的に分離されたマイクで録音されている場合、カクテルパーティーの問題に対する次の1行のオクターブソリューションを示します。
[W,s,v]=svd((repmat(sum(x.*x,1),size(x,1),1).*x)*x');
スライドの下部には「出典:Sam Roweis、Yair Weiss、Eero Simoncelli」があり、前のスライドの下部には「Te-WonLeeの好意によるオーディオクリップ」があります。ビデオの中で、Ng教授は次のように述べています。
「それで、あなたはこのような教師なし学習を見て、 『これを実装するのはどれほど複雑ですか?』と尋ねるかもしれません。このアプリケーションを構築するために、このオーディオ処理を行うように思われます。大量のコードを記述するか、オーディオを処理するC ++またはJavaライブラリの束にリンクする可能性があります。本当にそうだと思われます。このオーディオを実行するための複雑なプログラム:オーディオの分離など。今聞いたことを実行するアルゴリズムが判明しました。これは、ここに示す1行のコードで実行できます。研究者には長い時間がかかりました。このコード行を思い付くために。だから、これが簡単な問題だと言っているわけではありません。しかし、適切なプログラミング環境を使用すると、多くの学習アルゴリズムが本当に短いプログラムになることがわかります。」
ビデオ講義で再生された個別のオーディオ結果は完璧ではありませんが、私の意見では驚くべきものです。その1行のコードがどのようにうまく機能するかについて誰かが何か洞察を持っていますか?特に、その1行のコードに関して、Te-Won Lee、Sam Roweis、Yair Weiss、およびEero Simoncelliの作業を説明するリファレンスを知っている人はいますか?
更新
マイク分離距離に対するアルゴリズムの感度を示すために、次のシミュレーション(Octave)は、2つの空間的に分離されたトーンジェネレーターからトーンを分離します。
% 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分間実行した後、シミュレーションにより、2つの分離されたトーンが正しい周波数を持っていることを示す次の3つの図が生成されます。
ただし、マイクの分離距離をゼロ(つまり、dMic = 0)に設定すると、シミュレーションは代わりに次の3つの図を生成し、シミュレーションが2番目のトーンを分離できなかったことを示します(svdのs行列で返される単一の有意な対角項によって確認されます)。
スマートフォンのマイク分離距離が十分に大きくて良い結果が得られることを期待していましたが、マイク分離距離を5.25インチ(つまり、dMic = 0.1333メートル)に設定すると、シミュレーションで次のように生成されます。最初の孤立したトーンの周波数成分。
x
が、何なのか思い出せません。それは波形のスペクトログラムですか、それとも何ですか?