-------------------------------------------------------------------------

	UTAU用原音設定自動化ツール

	utau_lib_analyze    Ver 1.10

-------------------------------------------------------------------------


１．概要

このツールは歌声合成ツールUTAUの原音ファイルを解析して原音設定を自動化するツールです。


歌声合成ツールUTAUは原音ファイルセットを用意すれば複数の歌声で歌わせることができます。
しかし各原音ごとに設定が必要であり、それらの設定は原音ファイルセットのあるフォルダに
oto.iniというファイル名で保存されます。
原音ファイルセットの中にはoto.iniを一緒に配布しているケースもありますが、必ずしもoto.iniを
一緒に配布しているわけではありません。
また、自分で新しい原音ファイルセットを作った場合は当然自分で設定する必要があります。
原音を1音ずつ設定するのはものすごく面倒です。
そこでこのツールの出番となります。

UTAUには隠し機能として「原音設定」画面で文章等が表示されていないところをダブルクリックすると
「パラメータの推定を行う」機能が起動します。
しかし私は比較的最近までこの隠し機能があることを知りませんでしたのでこのツールを作りました。
今となっては不必要かも知れませんが一応完成したので公開することにします。



２．背景

このようなツールを最初に欲しいと思ったのは2008年6月くらいのことです。

最近はUTAU用の音声ファイルがたくさん公開されるようになりましたが、そのころはまだ公開されているものが
多くありませんでした。

そこでUTAUを盛り上げるためにはいろいろなUTAU用の原音ファイルセットはあったほうがいいだろうと
考えてGalatea Talkという音声合成ソフトを元に原音ファイルセットを作ろうとしました。

Galatea Talkのデモページのから50音を1音ずつ発音させダウンロードすることで原音ファイルセットは作れました。
しかし私は比較的最近までUTAUの隠し機能で原音設定のパラメータの推定する機能があることを知りませんでしたので
原音設定で原音を1音ずつ設定したのですが、すぐに1音ずつ設定するのが面倒になり挫折しました。

元々Galatea Talkの1音ずつダウンロードした音は音量が小さめでUTAU付属の原音設定エディタでは子音部分の
音量がほとんど0で無音部分と区別がつかず原音設定エディタ上での原音設定は無理でした。
そこでwavesurferというツールで波形を表示させながら原音設定したのですがUTAUとwavesurferを行ったり来たり
しながらやるという状況がものすごく面倒で途中で挫折してしました。

このころはUTAUのパラメータの推定する隠し機能のことは知らなかったので、自分で原音設定を自動化できないか
試してみることにしました。
プロトタイプとしてWindows操作自動化ソフトのUWSC(Free版)でwavesurferを操作して各音ごとにPitch解析させ、
その結果をUWSCで解析してUTAUの原音設定の各パラメータを決定していくというスクリプトを作りました。

プロトタイプは紆余曲折があって最終的には作り始めてから3ヶ月ほどかかってしまいましたが
そこそこ満足のいく結果になったのでニコニコ動画にプロトタイプの動作結果をうｐしてみました。
(http://www.nicovideo.jp/watch/nm4772637)

このUWSCスクリプトは原音ファイルセットのあるディレクトリの指定などはUWSCスクリプトを直接書き換える必要が
あるため、このまま公開するのは乱暴だと考えたので動画をうｐするときに希望者がいるようならTcl/Tkに
移植して公開しようと考えていると書いたところ一応希望者がいるようなのでTcl/Tkに移植することにしました。
そこから公開までさらに半年ほどかかりましたが･･･



３．使用方法

インストールはアーカイブを適当なディレクトリに解凍してください。

utau_lib_analyze.exeをダブルクリックすると起動します。
起動したらディレクトリ選択のボタンを押して解析したい原音ファイルセットがあるディレクトリを選択してください。
ディレクトリ選択後、開始ボタンを押すと解析を開始します。
解析結果の保存先ファイルがすでにある場合は上書き確認のダイアログが表示されますのでOKボタンを押すと上書きされます。
開始ボタンが再び押せる状態になったら解析終了です。
解析結果の保存先はOUTFILEで指定した場所になります。
本体のデフォルト値および添付の初期化ファイルを使用した場合は先ほど選択したディレクトリのanalyzeresult.iniに保存されます。
サブディレクトリがある原音ファイルセットには対応していませんので各サブディレクトリを個別に指定して解析してください。


動作環境

とりあえずWindows-XPでは動作するようですが、それ以外の環境では試していません。


アーカイブの構成

utau_lib_analyze.txt			説明(本ファイル)
utau_lib_analyze.exe			本体
utau_lib_analyze_init.tcl		初期化ファイル
example_setting_init.tcl		スクリプト追加機能やaliasの設定を行う初期化ファイルの例です。

初期化ファイル

初期化ファイルは本体の.exeファイルと同じディレクトリに置いて下さい。
初期化ファイルが無い場合は本体内のデフォルト値が使われます。

初期化ファイルの名前は本体の.exeファイルの.exeの無い名前に_init.tclを付けた名前になります。
本体の.exeファイルの名前の変更した場合、初期化ファイルの名前も同様に変更する必要があります。
たとえば本体の.exeファイルの名前を「りぶあん.exe」にした場合、初期化ファイルの名前は
「りぶあん_init.tcl」になります。



４．動作原理

たとえば「か」の音の波形を表示させると、最初に小さめのノイズ状の波形があり、
その後に周期的な振幅がある波形になります。
最初の小さめのノイズ状の部分が子音の「K」にあたり、その後の周期的な部分が母音の「A」にあたります。

wavesurferや本プログラムなどのようにsnackライブラリを使ってPitch解析をした場合、基本周波数(F0)を
検出できるのは上記の例では母音部分のみになります。ノイズ状の子音部分ではPitch検出できません。

よって最初のノイズ状の部分が始まるまでをオフセットとして設定し、そこからPitchを検出できない部分を子音として
設定すればよいということになります。

ただしPitchが検出できる部分でも子音から母音へ変化する部分にも子音の音が残っているので母音の先頭の1/4部分も子音に含めることにします。
これにより「な」の音などの子音部でもPitchを検出できる音に対してもかなりいいかげんですが子音部の設定をすることになります。

また母音の終わりの部分も音量が小さかったり安定しない場合が多いので母音の後ろの1/4部分をカットします。

先行発声やオーバーラップに関してはUTAU作者の飴屋氏のブログに書かれていた設定方法(http://utau2008.blog47.fc2.com/blog-entry-39.html)を
参考にファイル名から何の音かを判断して設定します。

このツールではこうして解析した結果をoto.iniと同様のフォーマットで出力します。

ここまでの説明で判るとおりこのツールでの設定はかなりいいかげんです。
基本的にはこのツールで大体の設定をした後に変な部分を手動で微修正することを前提にしたツールだと考えて過度な期待はしないでください。

文章だけで説明するより図があったほうがわかりやすいと思いますのでプロトタイプの動作結果(http://www.nicovideo.jp/watch/nm4772637)も
参照して下さい。



５．初期化ファイルの内容

初期化ファイルはこのプログラムで使う各種パラメータを変更するため用意されています。
初期化ファイルが無い場合は本体内のデフォルト値が使われます。
拡張子が.tclになっていることから分かるようにこのファイルはTclコマンドで書かれています。
単に本体からsourceコマンドで呼び出されて実行しているだけです。
このファイル内で各種パラメータを再設定することでパラメータを変更します。
ちなみにTclではコマンドの先頭が#で始まるのはコメントです。

パラメータの内容については以下のとおりです。

(1)dirValue
最初に選択されるディレクトリ名。デイレクトリの区切り記号には"/"または"\\"を使うこと。
デイレクトリ名に"$[]{}"の文字がある場合はその文字の直前に"\"を入れること。

(2)OUTFILE
解析結果の保存先。デイレクトリの区切り記号には"/"または"\\"を使うこと。
ファイル名に"$[]{}"の文字がある場合はその文字の直前に"\"を入れること。
このパラメータは開始ボタンを押された後でsubstコマンドで評価されるのでファイル名に$dirValueを
指定すると選択したディレクトリになる(ただしファイル名は'""'ではなく'{}'で囲むこと)。
下記のように書くと選択したディレクトリのoto.iniを直接指定することになる(上書きされるので注意)。

set OUTFILE {$dirValue/oto.ini}

(3)DISDIRNAME
1を指定すると解析結果の先頭に原音ファイルのあるディレクトリ名を記録しない。
解析結果ファイルには先頭にどの原音ファイルの解析結果か分かるように原音ファイルのあるディレクトリ名を
記録している。しかしoto.iniでは不要な部分なのでOUTFILEでoto.iniを指定したときなどに1を指定する。

(4)DISPVER
1を指定すると起動時にこのプログラムのバージョンを表示する。

(5)DISPFILE
1を指定すると処理したファイル名を表示する。

(6)ENFILTER
1を指定すると解析時にフィルタを使用する。
過去との互換性のためにある。フィルタを使用しないと解析精度が低下するので基本的に1を指定すること。

(7)FILTERDELAY
1を指定するとフィルタの遅延を考慮したパラメータになる。フィルタのTAP数をよほど大きくしない限り
遅延の考慮は不要。(FRAMEINTERVALに対してフィルターの遅延が十分小さいため)

(8)OUTFORM
FILTERDELAYに1を指定すると小数点以下の桁が大きくなるので出力桁数の制限を加える場合に指定する。
C言語のsprintfと同じフォーマット文字列で指定する。
""を指定すると出力桁数の制限なしで出力する。

(9)RELTRIMLEVEL1
音の開始時に無音と判断する最大音量からの倍率。
最大音量からの相対値で判断することで音量の小さい音に対応する。
UTAUのオフセットパラメータの判断に使用する。

(10)RELTRIMLEVEL2
音の終了時に無音と判断する最大音量からの倍率。
最大音量からの相対値で判断することで音量の小さい音に対応する。
UTAUのブランクパラメータの判断に使用する。

(11)MINTRIMLEVEL1
音の開始時に無音と判断する基準値の最低値。
最大音量からの相対値だけで判断すると音量の小さい音でノイズを子音部と誤認するため最低値を設定する。

(12)MINTRIMLEVEL2
音の終了時に無音と判断する基準値の最低値。
最大音量からの相対値だけで判断すると音量の小さい音でノイズを子音部と誤認するため最低値を設定する。

(13)PROBLEVEL1
母音と判断するf0の自己相関係数。
snackの解析結果でf0の自己相関係数が1に近い値であるほど周期的で自己相関が強いことを表しているようなので
自己相関係数を母音と判断する基準に用いている。ここで母音と判断する値を指定する。
UTAUの子音部パラメータの判断に使用する。

(14)FILTERDMINTRIMCOEFF
フィルタを使用すると音量が下がるため、ここで指定する係数を掛けて判断させる。

(15)FILTERDPROBLEVEL
フィルタを使用した場合、自己相関が弱くなるためかf0の自己相関係数が下がる。
ここでフィルタを使用した場合に母音と判断する自己相関係数を指定する。

(16)tap2
FIRフィルタのTAP数の指定に用いる値。TAP数が大きいほどフィルタが急峻になる。
ここで指定する値は(タップ数-1)/2の値。この値の倍の値がフィルタの次数。フィルタ長はこの値の倍+1。

(17)fs
フィルタの計算に用いるサンプリング周波数。
UTAUの原音ファイルはサンプリング周波数44.1kHzのみを用いるので44100を指定する。

(18)fc1
このプログラムで使用しているFIRフィルタはバンドパスフィルタを用いている。
ここではバンドパスフィルタの低い側の遮断周波数を指定する。ローパスフィルタにしたい場合はfc1の値を0にする

(19)fc2
このプログラムで使用しているFIRフィルタはバンドパスフィルタを用いている。
ここではバンドパスフィルタの高い側の遮断周波数を指定する。ハイパスフィルタにしたい場合はfc2の値をfs/2にする

(20)MAXPITCH
snackのPitch検出で指定する最大周波数

(21)MINPITCH
snackのPitch検出で指定する最小周波数

(22)FRAMEINTERVAL
snackのPitch検出で指定するFrame間隔 (秒で指定する)

(23)LOWPWRTYPE
ここで子音部の音量が小さい音を指定する。子音部の先頭が削られて発音が変わることを防ぐ。
ここで指定することでLOWPWRCOEFFを掛けた値を判断値に用いる。

(24)LOWPWRCOEFF
LOWPWRTYPEで指定した音に対して判断値に掛ける係数を指定する。

(25)TYPE1
UTAUの先行発声、オーバーラップパラメータの判断に使用する。
先行発声・オーバラップ共に設定しない音を指定する。
ファイル名の.wavを取った部分で指定する。各音は","(半角カンマ)で区切る。
2文字以上の場合でTYPE1〜6のいずれにも該当しなかった場合は後ろの方から1文字ずつ削っていって
一致する文字があるかを判断します。
つまり"きゃ"の場合でTYPE1〜6のいずれにも"きゃ"の指定がなければ"き"で再検索します。

(26)TYPE2
UTAUの先行発声、オーバーラップパラメータの判断に使用する。
頭にブランクを残してその分先行発声を設定する音を指定する。
ブランクを残す秒数はTYPE2ADDBLANKで指定する。
TYPE2ADDBLANKで指定する長さよりもブランクの長さが短ければブランクの長さ分だけが先行発声に設定される。
音の指定方法はTYPE1と同様

(27)TYPE3
先行発声の値を子音部分の途中に設定し、オーバーラップを先行発声から一定時間左に設定する音を指定する。
先行発声の値は子音部分の長さからTYPE3SENKORATEで指定した割合を設定する。
オーバーラップから先行発声までの長さはTYPE3OVERLAPで指定する。
ただし子音の開始よりも前になる場合は子音の開始までとなる。
音の指定方法はTYPE1と同様

(28)TYPE4
先行発声の値を子音部分の途中に設定し、オーバーラップを設定しない音を指定する。
先行発声の値は子音部分の長さからTYPE4SENKORATEで指定した割合を設定する。
音の指定方法はTYPE1と同様

(29)TYPE5
先行発声は頭から一定時間のところに設定し、オーバーラップは頭から一定時間のところに設定する音を指定する。
先行発声の頭からの時間はTYPE5SENKOで指定し、オーバーラップの頭からの時間はTYPE5OVERLAPで指定する。
音の指定方法はTYPE1と同様

(30)TYPE6
先行発声の値を子音部分の途中に設定し、オーバーラップを先行発声から一定時間左に設定する音を指定する。
TYPE3と似ているが長さがTYPE3と異なる。
先行発声の値は子音部分の長さからTYPE6SENKORATEで指定した割合を設定する。
オーバーラップから先行発声までの長さはTYPE6OVERLAPで指定する。
ただし子音の開始よりも前になる場合は子音の開始までとなる。
音の指定方法はTYPE1と同様

(31)TYPE2ADDBLANK
TYPE2で頭にブランクを残してその分先行発声を設定する場合のブランクを残す秒数を指定する。

(32)TYPE3SENKORATE
TYPE3で検出した子音部の先行発声に割り当てる割合を指定する。


(33)TYPE3OVERLAP
TYPE3で設定するオーバーラップから先行発声までの秒数の最大値を指定する。

(34)TYPE4SENKORATE
TYPE4で検出した子音部の先行発声に割り当てる割合を指定する。

(35)TYPE5SENKO
TYPE5で設定する先行発声の秒数を指定する。

(36)TYPE5OVERLAP
TYPE5で設定するオーバーラップの秒数を指定する。

(37)TYPE6SENKORATE
TYPE6で検出した子音部の先行発声に割り当てる割合を指定する。


(38)TYPE6OVERLAP
TYPE6で設定するオーバーラップから先行発声までの秒数の最大値を指定する。

(39)startscript
解析処理開始前に1回だけ実行させるTclスクリプトを指定する。

(40)repeatscript
各wavファイルの処理前に毎回実行させるTclスクリプトを指定する。

(41)endscript
すべてのファイルの解析処理終了時に1回だけ実行させるTclスクリプトを指定する。

(42)aliaslist
aliasを指定する。ファイル名とaliasを1組にして並べる。
ファイル名は大文字・小文字を区別する。(.wavと.WAVは別物として扱うので注意)



６．エラー

エラーにはRuntimeが出すエラー、このプログラム自体が出すエラーと解析結果のエラーがあります。
Runtimeが出すエラーはこちらが意図していないエラーです。
原因が分かれば次回のバージョンアップで対処されるかも知れません。
このプログラムが出すエラーとしては.wavファイルが1つもないディレクトリで実行した場合などで発生します。
解析結果のエラーは各音の解析した結果に矛盾があった場合に発生します。
エラーが発生した原音の解析結果をそのままUTAUに適用するとまともな発音は望めません。設定を適宜修正してください。
また解析結果のワーニングは対応する音節が見つからないため先行発声、オーバーラップの設定ができなかった場合に発生します。
発音自体はするはずですが先行発声、オーバーラップの設定は適宜修正してください。



７．その他

このプログラムはTcl/Tk8.4+snack2.2をStarpackで.exe化したものです。

背景のところでも書きましたが、このプログラムは元々wavesurfer+UWSCスクリプトで作ったものをTcl/Tkに移植したものです。
私自身、元々のUWSCスクリプトで高速化のために使ったwavesurferのコンソールコマンドがそうとは知らずに使った初めてのTclです。
Tkについてはこのプログラムを作るまで使ったことはありません。
よってこのプログラムでは通常のTcl/Tkの作法とは違うプログラミングがされている可能性があります。
少々の動作の怪しいところは目をつぶってください。



８．ＦＡＱ

Q1.ソースを取り出すためには具体的にどうすればよいのですか？
A1."Tcl","Starpack"をキーワードにしてググってみて下さい。

Q2.テキスト表示されたエラー等が表示範囲をオーバーしているのにスクロールバーが無効状態で下にスクロールできません。
A2.起動直後はそのような状態になるようです。既知のバグですが対処方法が分かりません。マウスのホイールを使って
   スクロールさせるなどするとスクロールバーが有効になるようですのでそのように対処してください。

Q3.テキスト表示されたエラー等のコピペができません。
A3.テキストウィジェットではマウスの右クリックが効かないようです。キーボードからCtrl-Cでコピーしてください。

Q4.このツールで設定するとブレスとかまともに出なくなりますが・・・
A4.仕様です。このツールでの解析対象は母音のみまたは子音+母音で構成される1音節を想定しています。
   子音のみ、ブレス、ささやき声、2音節以上で構成されたファイルなどは想定していません。
   このような音に対しては手動で原音設定を修正してください。

Q5.全部の音に対して「WARNING 対応する音節がない」と出るのですが・・・
A5.先行発声やオーバーラップの設定はファイル名で音節を判断して設定を変えています。
   どの音節をどのように設定するかはTYPExで区別します。
   TYPExに設定されている値が実際のファイル名と対応していないとそのような状態になります。
   デフォルトの設定値ではファイル名が音節に対応した全角のひらがなで始まっていることを前提にしています。
   例えば「C4_あ.wav」などのファイル名ではデフォルトの設定値では音節を区別できません。
   逆に「あ_C4.wav」などのファイル名の場合はデフォルトの設定値では「あ」という音節だと区別ができ、TYPE1の設定を行います。
   よってファイル名が対応していない場合はTYPExの設定値を変えるか、ファイル名を変えるかしてください。
   ただし「C4_あ.wav」「C5_あ.wav」などのファイル名であった場合はTYPExに全てのファイル名を設定する必要があります。
   現実問題としてそのような設定をするのは難しいので「あ_C4.wav」などのようにファイル名を変更してください。
   そうするとデフォルトの設定値でも音節を区別できます。
   TYPExの設定値を変えるならファイル名がローマ字でも問題ありません。
   ただし「ka_C4.wav」のようにファイル名が音節を区別できる文字で始まっていることが前提です。
   このツールは基本的にファイル名が音節に対応した文字で始まっている事を前提にしていると考えてください。

Q6.TYPEって増やせないの？
A6.TYPExは先行発声やオーバーラップをどう設定するかの区別に使っています。TYPExは増やせますがどのように設定させたいのか分からないと増やせません。
   そこでVer 1.10からスクリプト追加機能を入れています。TYPExを増やすのと同等以上のことができますので活用してみてください。
   詳しい情報なしでスクリプトなんか作れるかという方へのアドバイス　→「ソースを使え、ルーク」 
   突っ込みは無用に願います。自分でもひどいアドバイスだと十分わかっていますから・・・

Q7.英語子音のため左右ブランクだけ設定するまたは処理を無視するTYPEを追加してほしい。
A7.別の項目で説明していますが子音のみの音節はこのツールの想定外です。
   TYPExは先行発声やオーバーラップの設定だけに使っています。オフセット,子音部,ブランクの設定はTYPExで区別していません。
   もともとオフセット,子音部,ブランクの設定だけを行っていたものに先行発声やオーバーラップの設定を入れるためにTYPExを後から追加しました。
   TYPExで処理する部分はオフセット,子音部,ブランクの設定が既に決まっていることを前提にしています。
   よってTYPExでの切り分けは難しく別パラメータを導入する必要があります。次期バージョン(もしあるなら)以降で対処するか考えます。
   ただしファイル名で区別して処理しないということでしたらスクリプト追加機能で実現できます。
   添付の初期化ファイルの例(example_setting_init.tcl)を参考にしてください。


９．配布

とりあえず自由に配布してかまいません。
改造したい方は自由に改造してください。
もっときちんとした設定にできるように改良するのは大歓迎です。
また他のツールにこのツールの機能を組み込むのも自由です。

ソースは添付しませんが、unwrapすれば取り出せます。
取り出せないような人に公開してもしょうがないでしょうから･･･



１０．履歴

ver 1.00	UWSCスクリプトをTcl/Tkに移植してStarpackで.exe化した最初のバージョン
ver 1.10	スクリプト追加機能を追加。内部変数の一部名称変更。本体のOUTFILEのデフォルト値をanalyzeresult.txtからanalyzeresult.iniに変更。
