Problem
音源定位の性能をパラメータの調節で改善したい。
Solution
音源定位で起こりうる問題ごとに,解決方法を示す.
DisplayLocalization で定位結果を表示すると, 定位方向がぐちゃぐちゃに表示されることがある. これは,パワーの低いものまで音源として定位してしまっているためである. 全く表示されない場合はその逆である.
SourceTracker の THRESH を変更する
音源方向の期待値の閾値を直接変更するパラメータであるので, うまく音源のみのピークをとらえるように調節を行う. 調節には,LocalizeMUSIC の DEBUG オプションを trueにすれば MUSIC スペ クトルが表示されるので,それを使うとよい.
LocalizeMUSIC の NUM_SOURCE を目的音の数に合わせる
MUSIC は NULL スペースを利用して目的音方向のピークをより大きくするため, NUM_SOURCE(音源数)の設定次第で引き立たせるピークの個数の設定が変わることになり, これを誤って設定すると,ノイズ方向にピークが立ったり, 目的音方向にうまくピークが立たなかったりと性能が劣化してしまう. (実際にはピークがなまるのみで,使用できる場合が多い.) 話者一人の場合は1と設定するのが,より性能が向上する.
たとえば2つの音源があるのにもかかわらず音源定位結果が1つしか結果が出ない ことがある.この原因は,音源同士が近すぎるか,音源数がネット ワークファイルのパラメータ (LocalizeMUSIC の NUM_SRC など) と合っていないからである.
SourceTracker のを MIN_SRC_INTERVAL 変更する
近いところに音源がある場合,例えば到来方向10度しか離れていない二音源に 対しては,パラメータ MIN_SRC_INTERVAL を10度以下に指定する必要がある.
LocalizeMUSIC の NUM_SOURCE を目的音の数に合わせる
A.1-2 と同様. ただし,音源の音量が十分で,40度程度離れていれば,経験的には ネットワークの音源数設定と異なっていてもうまく動くことが多い.
LocalizeMUSIC の LOWER_BOUND_FREQUENCY,UPPER_BOUND_FREQUENCY
音源定位はこの二つで指定される周波数の中で,相関行列を足し合わせて 平均を取る方法を用いているため,定位したい音源と全く異なる周波数を 設定していると,平均した時にピークがなまってしまう. 音源に合わせた周波数を用いる. 音声であればデフォルトの $500[Hz] \leq f \leq 2800[Hz]$ にしておけばよい.
LocalizeMUSIC の MIN_DEG,MAX_DEG
音源定位はこの二つの値で指定された方向の範囲内での定位のみしか行わない. 360度の定位を行いたい場合は180度と-180度に指定する.
Discussion
上記の Solution はノードのパラメータの調整による音源定位のチューニングである. しかし,音源定位を行う部屋の残響が伝達関数測定時と大きく異なる場合は, その部屋で伝達関数の再測定を行うとよい. 伝達関数の測定方法は動画を容易しているので HARK Web ページを参照.
音源定位のチューニング、具体的には SourceTracker ノードのチューニングには、 MUSIC スペクトルを可視化できると非常に便利である。 下記に Python のモジュールである matplotlib を用いた可視化サンプルを示す。
LocalizeMUSIC ノードの DEBUG プロパティを trueに設定したネットワークファイルを実行すると、 標準出力に下記のような MUSIC spectrum という行が現れる。 これが SourceTracker ノードが音源の追跡に使用している情報である。 音のあるフレーム、方向で大きな値をとるので、この情報を可視化することで、チューニングが用意になる。
reading A matrix done 0: 17.68 -130.00 0.95 27.71 MUSIC spectrum: 26.409233 26.342979 26.311218 26.389189 26.684574 26.641804 26.473591 26.429607 26.394157 26.390869 26.390436 26.384390 26.370937 26.349419 26.316311 26.370241 26.433401 26.504730 26.580458 26.637592 26.661583 26.718044 26.733950 26.621361 26.512089 26.413467 26.282846 26.145596 26.159269 26.168520 26.170301 26.167116 26.173601 26.252003 26.451721 26.356871 26.372644 26.414040 26.297329 26.550825 26.993820 26.333363 26.182224 26.307812 26.486645 26.660778 26.807833 26.925554 27.017572 27.087088 27.137403 27.152445 27.161753 27.167290 27.172033 27.181273 27.207413 27.254276 27.323790 27.464039 27.712482 27.138771 26.808626 26.621407 26.489784 26.495117 26.487270 26.436701 26.437685 26.331017 26.377909 26.405613 0: 17.68 -130.00 0.95 28.03 MUSIC spectrum: 26.710100 26.621223 26.543722 26.562099 26.749601 26.577915 26.392643 26.393244 26.414570 26.474314 26.538136 26.589392 26.624735 26.642746 26.643448 26.634501 26.615681 26.590319 26.574671 26.529377 26.471210 26.485714 26.483780 26.366249 26.233849 26.087498 25.920916 25.750576 25.754738 25.751417 25.738773 25.714027 25.678146 25.666941 25.741886 25.754898 25.834913 25.895306 25.755405 26.226192 26.879301 26.296440 26.137798 26.307751 26.503771 26.708920 26.896206 27.056938 27.192793 27.308073 27.400372 27.416704 27.418081 27.407339 27.390402 27.377577 27.391756 27.456150 27.579704 27.842340 28.030870 27.664623 27.385185 27.154327 26.954231 26.943329 26.903679 26.797655 26.923735 26.714609 26.734642 26.730547
matplotlib モジュールの imshow メソッドを使用すると簡単に可視化できる。 たとえば、ステップ 1 のログファイルを log.txt という名前で保存し、 下記のコードを showMusic.py という名前で保存する。
#!/usr/bin/env python import pylab import sys musicspec = [map(float, line.split()[2:]) for line in open(sys.argv[1]) if "MUSIC spectrum" in line] musicspec = pylab.array(musicspec).transpose() pylab.imshow(musicspec, interpolation="nearest", aspect="auto") pylab.colorbar() pylab.ylabel("Direction of Arrival") pylab.xlabel("Time [frame]") pylab.show()
次に、コマンドラインで次のように実行すると、 MUISC スペクトルを可視化した画像が表示される。
$ python showMusic.py log.txt
See Also
音源定位の具体的なアルゴリズムや, パラメータの具体的な説明については HARK ドキュメントの LocalizeMUSIC を参照.