図 3.4 に FlowDesigner の概観を示す. 以下の作業で FlowDesigner を起動できる.
> flowdesigner
ノードは,データを処理する処理単位である.最初に ノードの例を図 3.5 に示す. 長方形で囲まれた緑色の部分が,ノードである. このノードの中央には,ノード名が表示される. この例では,PostFilter である.ノード下に表示 される名前 node_Postfilter_1 は,ノードの インスタンス名である.同種のノードが複数ある場合には, ノードのインスタンスを生成した順番に node_Postfilter_2, node_Postfilter_3 と名付けられる. 個々のノードを区別するのに役立つ.
ノードは,処理するデータの入力と出力の口になる ターミナルをそれぞれ複数もつことが可能である. ノードの左右にある黒い点がターミナルである. 左側のターミナルが入力ターミナルで,右側のターミナルが出力 ターミナルである.ターミナルには名前が付けられている場合と 名前が付けられていない場合がある.この例では, 全てのターミナルに名前が付けられている. ノードは,少なくとも1つの出力ターミナルがある. 入力ターミナルは1つも無いこともある.例えば FlowDesigner に 標準で含まれる constant ノードは, 入力がなく出力ターミナルを 1 つ持つ.
複数のノードを配置し,ノードのターミナル同士を接続する ことによって,データの処理の流れを定義する. 接続されてた一連のノードをネットワーク呼ぶ. ネットワークを作成すること自体が,プログラム作成になっている. ネットワークは,ファイルの保存メニューから保存できる. 一度保存すれば,いつでも FlowDesigner でロードできる. 保存したファイルをテキストエディタで開くと XML ライクな記述を 確認できる.慣れればテキストエディタで直接ネットワークを編集する こともできるようになる.
ノードには,プロパティをもつものがあり, プロパティ値を設定することでノードの処理を詳細に指定可能である. プロパティ値の設定には,ノード上にマウスカーソルを移動させ, 左ダブルクリックする.設定ダイアログウィンドウが開き,各種 プロパティ値をキーボードで入力あるいは選択できる.
プロパティ値には値のデータ型あり,データ型と値をペアで設定する必要がある. データ型の詳細は,データ型の章を参考のこと. データ型は,プルダウンメニュー形式の中から選択する. 値は,キーボードから値を入力する場合と,プルダウンメニュー形式で 値を選択する場合がある.
以下では,具体的なノードの操作方法,ターミナルの接続方法,プロパティの 設定方法を述べる.
ノードの作成
ネットワーク構築タブでマウスの右ボタンをクリックすると,ノードのカテゴリ一覧が表示される. 目的のカテゴリ名の上にマウスカーソルを移動させると,ノードが表示される. そのまま,目的のノード名の上にマウスカーソルを移動させ,左ボタンをクリックすると,ノードが作成される. カテゴリ一覧や,ノード一覧が表示された状態から,ノードの配置を中止する場合には,ネットワーク構築タブ 内の地の部分を(左右どちらのボタンでも可)クリックする.
ノードの再配置
一度配置したノードを見やすい位置に再配置するには,ノードの上にマウスカーソルを移動し, 左ボタンでドラッグする.
ノードの削除
ノードの上にマウスカーソルを移動し,右ボタンをクリックすると,ノードに対する操作メニューが表示される. Delete と表示された部分にマウスカーソルを移動し,左クリックするとノードを削除できる.
ノードの複製
Shift キーを押下したまま,ノード上で左クリックすると,そのノードを複製できる. 属性値を含め,複製ノードが生成できるため,同様の処理を並列・並行して処理するネトワークを 構築する場合に便利な機能である.
ノードの接続
ノード同士は,ターミナルを矢線で結線し,接続する.接続元のターミナル上で左ボタンを押下し, ドラッグして接続先のターミナルでボタンを放すとターミナル間が矢線で結線される.これで,ノードの 接続が完了である.
入力と出力ターミナルの接続が可能で,入力ターミナル同士や出力ターミナル同士を 接続することはできない.1つの出力ターミナルから複数の接続を引出すことが可能である. ノードの処理結果が,複数のノードに送られる.一方,1つの入力ターミナルで複数の 接続を受け入れることはできない.入力と出力ターミナルの接続でも,接続できないことがある. ターミナルが処理できるデータ型に対応していない場合は接続できず,矢線が赤色に表示される. ターミナルが処理できるデータ型の自動判定に失敗し,矢線が黒色であるにもかかわらず, プログラム実行時にエラーが起る場合もある.データ型の自動判定は,補助的なものと考え, 正確な接続には,ノードリファレンスで,対応するデータ型を確認する方がよい.
ノードの切断
切断したい接続の矢線の始点または終点で,Shift キーを押下しながら,左クリックすることで 接続を切断できる.
ノード接続線の再配置
ノードを移動させると,接続を維持したままノードが移動する.多数のノードを 配置すると,ノードと接続線が重なり,見ずらいネットワークになる.そこで,線を曲, 重なりの少い見やすいネットワークにするとよい.接続線の途中の部分の上にマウスカーソルを 移動させ,そこでマウス左ボタンでドラッグすると,接続線がその点で折れ曲る.曲げた点上で マウス左ボタンでドラッグすると,点を移動できる.
プロパティ値の設定
ノードの上にマウスカーソルを移動し,右ボタンをクリックすると,ノードに対する 操作メニューが表示される.Properties と表示された部分にマウスカーソルを移動し, 左クリックするとプロパティ値の設定ダイアログが開く.ノードリファレンスを参考にして 値とそのデータ型を入力する.Apply ボタンをクリックすれば設定が反映される. OK ボタンを クリックすれば設定が反映され,かつダイアログが閉じる.
以上で,ノードの基本操作の説明を終え,実際に音源定位ネットッワークを構築しながら, ネットワーク構築に必要な基本操作を述べる.
はじめてネットワークを作成する人を対象に, 音源定位ネットワークを構築する例を示す. メインネットワークタブの他に Iteration 用のサブネットワークタブが必要になる. まず,メインタブで音源波形読込部分を構築し,続いて,サブネットワークを作成し, サブネットワーク内に,音源定位部,結果表示部を構築する.
音源波形読込部分のノード配置,接続,プロパティの設定について解説する. FlowDesigner を起動すると,ウィンドウ内右側に MAIN (subnet) というタブが現れる. 始めに,このタブの中で作業を進める. Constant ノードと, InputStream ノードを 図 3.7 のように配置する. タブ内の地の部分を右クリックすると,プルダウンメニューが現れる. その中の New Node 上にマウスカーソルを移動すると, FlowDesigner に 登録されているノード一覧が表示される.ここでは, General カテゴリを 選ぶ.マウスカーソルをそのまま General という表示の上まで移動さる. ここで,プルダウンメニューが 1 段展開され,General カテゴリに登録 されているノードの一覧が表示される.この中に Constant ノードがある. マウスカーソルをそのまま Constant という表示の上まで移動させると, MAIN (subnet) タブに Constant ノードを配置できる. 以後,この様にプルダウンメニューからノードを選択する操作を, 簡略化して,「New Node $\rightarrow $ General $\rightarrow $ Constant」と表記する. 同様に,InputStream ノードを New Node $\rightarrow $ IO $\rightarrow $ InputStream と 辿り,ノードを配置する.
次に Constant ノードと, InputStream ノードを 図 3.8 のように接続する.
次に ノードのプロパティの設定を行う. ここでは, Constant ノードのみ設定する. InputStream ノードには設定可能なプロパティ値がない.
Constant ノードを右クリックすると,プルダウンメニューが現れる. Properties という表示の上にマウスカーソルを移動させ Properties を 左クリックすると,プロパティ設定ダイアログが開く. ダイアログには, Parameters タブ,Comments タブ, Inputs/Ouptuts タブが ある.デフォルトでは Parameters タブが開かれている. Comments タブ, Inputs/Ouptuts タブを使用するこはない.
Parameters タブ内には,NAME,Type,Value という3つの項目がある. NAME は,プロパティ名であり, Type は,そこに設定する値の データ型を表す,Value は,属性に指定する値である. Constant ノードには,設定できるプロパティは1つしかない. VALUE という属性名である. このノードで,ファイル名を表したいので,プロパティの値に ファイル名を tutorial1.wav とする.データ型は string である. 最後にプロパティウンドウの適用を押すことで設定が反映される. 閉じるを押すと設定内容が破棄される. OK を押すと適用を押した後に,閉じると押した動作と等価な処理が 行われる. プロパティウィンドウ表示中は,FlowDesigner の別のウィンドウの操作が 無効状態になっているので,操作へ復帰するには,プロパティ設定を 終える必要がある. 以上でプロパティの設定は完了である. これで音源波形読込部分のネットワークが完成した.
続いて,サブネットワーク作成について述べる. サブネットワークは, FlowDesigner のウィンドウメニュー,Networks から add Iterator を選択して作成する. add Iterator を選択すると,ダイアログウィンドウが起動し, 追加する Iterator タブの名前の入力が促される. デフォルトの LOOP0 でよければ OK ボタンを押す. キャンセルボタンを押すとサブネットワーク作成を中止する.
LOOP0 で OK すると,MAIN (subnet) タブの隣に,LOOP0 という タブが現れ, LOOP0 タブがアクティブになる. このタブの中に音源定位部と結果表示部を構築する.
音源定位部を,ファイルの読込,FFT,MUSIC 法による音源定位,音源追従,定位結果の表示 のためのノードで構築する.以下の手順でノードを配置すると, 図 3.9 のようになる.
New Node -> HARK -> AudioIO -> AudioStreamFromWave New Node -> HARK -> MISC -> MultiFFT New Node -> HARK -> Localization -> LocalizeMUSIC New Node -> HARK -> Localization -> SourceTracker New Node -> HARK -> Localization -> DisplayLocalization
これらのノードを図 3.10 の様に接続する.
接続が終ったら,ノードのプロパティを設定する. 処理する音声ファイルが16000 [Hz] であることを前提に設定する. AudioStreamFromWave ノードには,LENGTH,ADVANCE,USE_WAIT の3個所のプロパティ値の設定場所がある.LENGTH と ADVANCE は, 音声の分析フレーム長とフレームシフト長を単位サンプルで表している. データ型は int である.デフォルト値 512,160 が設定されており, それぞれ 32 msec, 10 msec に対応している.変更する必要はない. データ型 bool の USE_WAIT にもデフォルト値が設定されており, falseが設定されている.変更する必要はない.
MultiFFT ノードには,LENGTH,WINDOW,WINDOW_LENGTH の 3個所のプロパティ値の設定場所がある.音声の分析フレーム長と 窓関数の種類,窓の長さを単位サンプルで表している. デフォルト値 512,CONJ,512 が設定されており, LENGTH と WINDOW_LENGTH は, 32 msec に対応し, データ型は, int である.CONJ は,分析窓に CONJ 窓を 使うことを指定している.データ型は,string である. これらの値を変更する必要はない.
LocalizeMUSIC ノードは, MUSIC_ALGORITHM, TF_CHANNEL_SELECTION, LENGTH, SAMPLING_RATE, A_MATRIX, ELEVATION, WINDOW, PERIOD, NUM_SOURCE, MIN_DEG, MAX_DEG, LOWER_BOUND_FREQUENCY, UPPER_BOUND_FREQUENCY, SPECTRUM_WEIGHT_TYPE, A_CHAR_SCALING, MANUAL_WEIGHT_SPLINE, MANUAL_WEIGHT_SQUARE, ENABLE_EIGENVALUE_WEIGHT, DEBUG の19個所の プロパティ値の設定場所がある.各パラメータの詳細は LocalizeMUSIC のパラメータの項を参照されたい. 以下は各パラメータの設定例を示す.
MUSIC_ALGORITHM : SEVD
TF_CHANNEL_SELECTION : <Vector<int> 0 1 2 3 4 5 6 7>
LENGTH : 512[samples]
SAMPLING_RATE : 16000[Hz]
A_MATRIX : 用意した伝達関数のファイル名
ELEVATION : 16.7[deg]
WINDOW : 50[frames]
PERIOD : 50[frames]
NUM_SOURCE : 2[sources]
MIN_DEG : -180[deg]
MAX_DEG : 180[deg]
LOWER_BOUND_FREQUENCY : 500[Hz]
UPPER_BOUND_FREQUENCY : 2800[Hz]
SPECTRUM_WEIGHT_TYPE : Uniform
A_CHAR_SCALING : 非表示
MANUAL_WEIGHT_SPLINE : 非表示
MANUAL_WEIGHT_SQUARE : 非表示
ENABLE_EIGENVALUE_WEIGHT : true
DEBUG : false
SourceTracker ノードは,THRESH,PAUSE_LENGTH,MIN_SOURCE_INTERVAL,DEBUG の 4個所のプロパティ値の設定場所がある.
THRESH
音源のパワーが THRESH より大きい間,音源を検出する. データ型は, float であり,デフォルト値はない. ここでは,とりあえず 25 を設定する. 値のチューニング方法は,ノードリファレンスを参照のこと.
PAUSE_LENGTH
発話中のポーズ区間で,音源のパワーが一時的に THRESH を下回る場合がある. その都度,音源検出が途絶えては,検出後の処理が困難である. ポーズと見倣される時間内であれば一時的に THRESH を下回っても 音源追従を継続し,音源があるとみなす方が都合がよい. データ型は float であり,デフォルト値は, 800 である. これを変更する必要はない.
PAUSE_LENGTH を長くとると,音源検出が継続しやすい傾向になるが, 発話終了時刻が PAUSE_LENGTH 分延長される.次の発話開始と オーバーラップし,2つの発話が1つの発話に見えるという問題が発生する. 短過ぎると,1つの発話と看倣してほしい発話が,時間的に 細切れに検出される傾向が強くなる.
MIN_SOURCE_INTERVAL
音源を追従する上で,同一音源が常に同一方向に検出され続けることは稀である. 検出方向がゆらぐため,揺らぎ幅内であれば同一音源みなさなす必要がある. 許容する揺らぎ幅を角度で指定する.データ型は,float で,デフォルト値が 20 である. これを変更する必要はない.
DisplayLocalization ノードは,LOG_IS_PROVIDED,1個所の プロパティ値設定場所がある.
音源位置のログが欲しいときに, trueにする.データ型は, bool で デフォルト値は falseである. これを変更する必要はない. 以上で,音源定位部のプロパティ設定が完了である.
続いて,Iterator の設定を行う. Iterator は,MAIN (subnet) からサブルーチンのように 使用される.以下の設定を行い MAIN (subnet) との関係を 設定する必要がある.
Iterator に必須な項目は,ネットワークに INPUT と OUTPUT と CONDITION があることである.INPUT はデータの入力部分で, OUTPUT は,データの出力部分である.サブルーチンの入力と 出力と対応付けて考えると理解しやすい.Iterator は,サブルーチン でありながら繰り返し処理を行う構造になっている. そのため,CONDITION つまり繰り返し処理の停止条件を記述 する必要がある.
図 3.11 のように設定する. INPUT の設定は,入力ターミナル部分で Shift を押下しながら, 左クリックすると,ダイアログが現れ,名前を変更することができる. OK を押すと,設定され,入力部分に赤字で INPUT と表示される. OUTPUT の設定は,出力ターミナル部分で Shift を押下しながら, 左クリックすると,ダイアログが現れ,名前を変更することができる. OK を押すと,設定され,入力部分に青字で OUTPUT と表示される. CONDITION の設定は,出力ターミナル部分で Control を押下しながら, 左クリックすると,設定される.紫色で CONDITION と表示される.
意図しない場所に INPUT,OUTPUT,CONDITION を設定した場合は, これらの文字の上で Shift を押下しながら,左クリックすると, 解除できる.
最後に,subnet と iterator を統合する. MAIN (subnet) タブを押し,MAIN (subnet) のネットワーク表示に戻る. 地を左クリックし, New Node 上にマウスカーソル移動させると, ノードカテゴリ名に新しく subnet という項目ができている. subnet カテゴリ上にマウスカーソル移動させると, LOOP0 という 項目が現れる.ノードを配置するのと同様に LOOP0 上で 左クリックすると, LOOP0 という 1 入力,1 出力のノードが 配置される.つまり,これまでの作業で,LOOP0 (iterator) 内に 記述したサブネットワークを仮想的なノードにしたことになる.
図 3.12 の様に, InputStream と LOOP0 を接続し, LOOP0 に OUTPUT を設定し, 音源定位ネットワークの完成である.