ZHUOWARE BACKYARD TOP|ZHUOWARE表ページ
VSQ to MusicXML Conversion
Jan. 3, 2010, Jan. 8, 2010, Mar. 2, 2010
by: zhuo http://zhuoware.blog110.fc2.com/
はじめに
開発のきっかけ
2010年1月2日9PM, 「Sinsyのサイトがオープンしました!MusicXMLファイルを送信すると歌唱音声を合成して返してくれるようです!」という情報をキャッチしました.
Sinsyサイト
Sinsyとは,2009年12月下旬以来,HMMベースの歌唱合成システムとして話題になっているものです.さて,これを試すには,MusicXMLファイルが必要.どうやって用意したものでしょうか.VSQファイルから変換できれば一番いいのですが...
そこではたと気がつきました.「Vocalipsの出力であるtab区切りのテキストから変換するスクリプトなら,簡単に書けるのでは...」
というわけで以後5時間,他の方が,ustや,SMFからの変換ツールをつぎつぎと公開されるなか,ひさびさのPerlに singin', いえ呻吟しながら(ぇ),ようやく,Sinsyの音をきくことができました.まだまだバラック状態ですが,コマンドラインツールでもいいから!という方のため,仮に公開いたします....
と,いうのが,開発のきっかけです.
Disclaimer
- 本ツールは個人的な実験の結果をご紹介するものにすぎません.ドキュメントは最小限であり,テストもほとんどしていません.ご使用は,パッケージ内容をご理解できる方のみ,at your own riskでお願いいたします.ツールのご使用により生じた結果については一切責任を負いません.
- 各種法令および製品使用許諾条項の遵守をお願いいたします.
- Vocaloid製品に関係される各社様および関係各方面から,本ツール,ないし関連情報の公開について中止の要請があった場合には,ただちに公開を中止いたします.その場合には,このページで告知いたします.
|
実験の説明
vocalips2musicxml Rev. 0.4 (2010年3月2日)
※ 0.2, 0.3は欠番です
改訂点
- Rev.0.1以前で問題となっていた,時刻のまるめ誤差を回避しました. Vocalips 0.43 で実装した,tick単位の時刻表現を利用することによって実現しています.
- Rev.0.1で課題となっていた,音の開始/終了位置のクォンタイズを実装しました.
- Rev.0.1に対していただいていた示唆に従い,一小節ずつ区切った構成のMusicXMLを出力するようにしました.小節をまたぐ音に対しては tie を付与します.
- Rev.0.1まではテンプレートとして別ファイルに持っていた内容を,スクリプトの中に埋め込んでみました.
メモ
Rev.0.4で,コードはほぼすべて書き直しました.
ひとつの工夫は'lolxml.pm'です.MusicXMLの生成を楽にできないかという試みです.'lol'(List of List, listの入れ子)の形で必要な情報を渡せば,一括してxmlのテクストにして書き出してくれるというものです.
xmlを扱うPerl moduleなんてたくさんあるわけですが,大規模だったり,なぜか連想配列ベースだったりして,私の目的には合わなかったので,ちょっと作ってみました.素人考えですが,xmlは完全に木構造なので,それを写すにはlolが自然なはず,と思って試してみた次第です.今後,xmlテクストからlolを生成するコードも書いてclassにまとめればいい感じになるかも...とは思うものの,私にとっては時間のかかる課題なので,当分,放置!放置!です.
実験環境
- Windows XP Professional Version 2002 SP3 です.
- Vocalips 0.43 (← 前回用いたものからひとつ版あげています.必須です.)
- こちらよりどうぞ.Vocalips
- Perl処理系
- 適宜ご用意ください.
- mf2t
- 「各種ツールのメモがき」にて言及しています.
2011年9月25日追記:今まで,VECTORで入手できるDOS版をお勧めしていましたが,64bit環境で動かないという問題があり,このたび自前でビルドしたバイナリの提供を始めました.詳しくは上記をご覧ください.
- shift-jisのテキストをUTF-8に変換するツール
- 適宜ご用意ください.私は windows版のnkfでうまくいきました.
- 変換スクリプト
- 今回制作したPerlスクリプトです.ここからダウンロードしたのち,名前を直してください.
実験のながれ
- 手元のVSQファイルをテキスト形式に変換します. これは次のコマンドで行ないます.
- これを1音1行のtab区切りテキストにします.そのためには,Vocalips 0.43を展開しbinフォルダ内のvsqtxt2lipsync_052.plをもってきて,次のコマンドを実行します.
- % perl vsqtxt2lipsync_052.pl -i -t 0 -m e3 < a_vsq.txt > a_eventlist.txt
- 得られたeventlistを,いよいよmusicxml形式にします.それには,次のようなコマンド(一例)を実行します.
- % perl vocalips2musicxml_04.pl -b 120 -r 960 -q 120 < a_eventlist.txt > a_musicxml.xml
上のコマンド行で,-b はBPM(テンポ指定)です.全体を通してこのBPMが使用されます.-r は,これより短い無音を,前の音の終わりを伸ばすことで埋めます.-q は,音の始まりと終わりの時刻をこの tick 刻みにまるめます.
ほかに,次のようなオプションがあります(vocalips2musicxml_04.plの冒頭部分にコメントとして書いたもののコピペです)
# perl vocalips2musicxml_04.pl \
# [-b bpm] [-u tpq] [-n numer] [-d denom] [-m length] [-o offset] \
# [-p pitch_offset] [-q q_unit] [-r gap] < vocalips_txt > musicxml.xml
#
# -b bpm : the number of beats in a single minute. 120.0 by default.
# -u tpq : the length of a quarter note (a beat), in tick. 480 by default.
# -n numer : The upper number of the meter. 4 by default.
# -d denom : The lower number of the meter. 4 by default.
# -m length : The length of a measure, in tick. tpq * numer by default.
# -o offset : The measure/quantize offset, in tick. 0 by default.
# offset must be within [0, length).
# -p pitch_o : The pitch in output is shifted by this semitone-value.
# -q q_unit : on/off time is quantized by this amount. in tick.
# -r gap : remove the rests shorter than this gap (in ticks) by
# making the preceding note longer.
- できた!とあわてず,まだshiftjis形式であるこのmusicxmlファイルを,UTF-8形式に変換します(コマンドライン省略...nkf -w でいけたと思います)
- Sinsyのサイトに行き,できたxmlファイルを送信してみてください.うまくゆけば,歌唱音声の合成結果が聞こえるかとおもいます.
vocalips2musicxml Rev.0.0 / Rev. 0.1 (2010年1月3日/8日)
最初の版です. Rev. 0.1は,0.0に対し,「短い無音の除去」を追加したものです.それ以外は同じなので,まとめて説明しています.
実験環境
- Windows XP Professional Version 2002 SP3 です.
- Vocalips 0.42
- こちらよりどうぞ.Vocalips
- Perl処理系
- 適宜ご用意ください.
- mf2t
- 「各種ツールのメモがき」にて言及しています.
- shift-jisのテキストをUTF-8に変換するツール
- 適宜ご用意ください.
- musicxmlテンプレートファイル
- b2ox氏が用意してくださったforSinsy2.xml をベースに制作したものです.
ここからダウンロードしてください:
musicxml_template03.txt
- 変換スクリプト
- 今回制作したPerlスクリプトです.ここからダウンロードしたのち,"vocalips2musicxml_01.pl"と名前を直してください.
実験のながれ
次の通りです.
- 手元のVSQファイルをテキスト形式に変換します. これは次のコマンドで行ないます.
- これを1音1行のtab区切りテキストにします.そのためには,Vocalips 0.42を展開しbinフォルダ内のvsqtxt2lipsync_051.plをもってきて,次のコマンドを実行します.
- % perl vsqtxt2lipsync_051.pl -t 0 -m e2 < a_vsq.txt > a_eventlist.txt
- 得られたeventlistを,いよいよmusicxml形式にします.それには,次のコマンドを実行します.
- % perl vocalips2musicxml_01.pl -b 120 -r 0.5 -t musicxml_template03.txt < a_eventlist.txt > a_musicxml.xml
上のコマンド行で,-b はBPM(テンポ指定)で,-t はテンプレートファイルの指定です.現時点ではBPMはきめうちです.
Rev. 0.1以降では,-r オプションが使えます; 上のように-r 0.5とすると,0.5秒未満の無音は,前の音を伸ばす形で解消されます.-r 0.0 (default)とすると,Rev. 0.0と同じになります.
- できた!とあわてず,まだshiftjis形式であるこのファイルをUTF-8形式に変換します (コマンドライン省略... nkf -w でいけたと思います)
- Sinsyのサイトに行き,できたxmlファイルを送信してみてください.うまくゆけば,歌唱音声の合成結果が聞こえるかとおもいます.