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.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スクリプトです.ここからダウンロードしたのち,名前を直してください.

実験のながれ

  1. 手元のVSQファイルをテキスト形式に変換します. これは次のコマンドで行ないます.
  2. これを1音1行のtab区切りテキストにします.そのためには,Vocalips 0.43を展開しbinフォルダ内のvsqtxt2lipsync_052.plをもってきて,次のコマンドを実行します.
  3. 得られたeventlistを,いよいよmusicxml形式にします.それには,次のようなコマンド(一例)を実行します. 上のコマンド行で,-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.
    
    
  4. できた!とあわてず,まだshiftjis形式であるこのmusicxmlファイルを,UTF-8形式に変換します(コマンドライン省略...nkf -w でいけたと思います)
  5. 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"と名前を直してください.

実験のながれ

次の通りです.
  1. 手元のVSQファイルをテキスト形式に変換します. これは次のコマンドで行ないます.
  2. これを1音1行のtab区切りテキストにします.そのためには,Vocalips 0.42を展開しbinフォルダ内のvsqtxt2lipsync_051.plをもってきて,次のコマンドを実行します.
  3. 得られたeventlistを,いよいよmusicxml形式にします.それには,次のコマンドを実行します. 上のコマンド行で,-b はBPM(テンポ指定)で,-t はテンプレートファイルの指定です.現時点ではBPMはきめうちです.
    Rev. 0.1以降では,-r オプションが使えます; 上のように-r 0.5とすると,0.5秒未満の無音は,前の音を伸ばす形で解消されます.-r 0.0 (default)とすると,Rev. 0.0と同じになります.
  4. できた!とあわてず,まだshiftjis形式であるこのファイルをUTF-8形式に変換します (コマンドライン省略... nkf -w でいけたと思います)
  5. Sinsyのサイトに行き,できたxmlファイルを送信してみてください.うまくゆけば,歌唱音声の合成結果が聞こえるかとおもいます.