初音ミクに喋らせてみた(Perl版)
まだ、ハードコーディング段階ですが、とりあえず Perl スクリプトで .VSQ を自動生成してみました。
必要なものは ActivePerl 5.8.8 と MIDI-Perlだけです。ActivePerl をインストールしたのち、ppm-shell を起動して MIDI-Perl をインストールしてください。
こちらが、「みく」と喋るVSQファイルを生成する Perlスクリプトです。
「miku_talk001.zip」をダウンロード
こちらが、その生成されたVSQファイルです。
「test_miku.zip」をダウンロード
流石に「みく」の決めうちじゃあさびしいので、せめて任意の平仮名入力をVSQ変換したいと思い、VOCALOID2 の平仮名→発音記号テーブルをちょっと見てみたら、世の中にはもう調べ終わっている人がいるものですね。こちらの方です。
初心者になるための耳コピMIDI講座 マニュアル (VSTi)
VOCALOID2 Domino 定義ファイル
http://mimikopi.nomaki.jp/domino/vocaloid2/manual/index.html#HEADER
恥を忍んでソースをご紹介します。いや・・・、今日1時間ほどで作ったものなんで汚いのはご容赦ください。
#!/Perl
#
# miku_talk ver.0.0.1
#
# Programmed by Akira Izumi 6/Dec/2007
#
use MIDI;
use strict;
use warnings;
my $myTalk = "みく";
my $miku_talk_metatext = miku_phonetics($myTalk);
my @masterEvents = (
['text_event', 0, 'Master Track'],
['set_tempo', 0, 500_000], # 1qn = .50 seconds
['time_signature',0,4,2,24,8 ],
['end_track' , 0],
);
my @voice1Events = (
['text_event', 0, 'Voice1'],
);
my $i=0;
for($i=0; $i*119<length($miku_talk_metatext); $i++) {
push @voice1Events, ['text_event', 0, sprintf("DM:%04d:",$i).substr($miku_talk_metatext,$i*119,119) ];
}
push @voice1Events,['control_change' , 0, 0, 99, 96];
push @voice1Events,['control_change' , 0, 0, 98, 0];
push @voice1Events,['control_change' , 0, 0, 6, 0];
push @voice1Events,['control_change' , 0, 0, 38, 0];
push @voice1Events,['control_change' , 0, 0, 98, 1];
push @voice1Events,['control_change' , 0, 0, 6, 0];
push @voice1Events,['control_change' , 0, 0, 38, 0];
push @voice1Events,['control_change' , 0, 0, 98, 2];
push @voice1Events,['control_change' , 0, 0, 6, 0];
push @voice1Events,['control_change' , 0, 0, 99, 83];
push @voice1Events,['control_change' , 0, 0, 98, 2];
push @voice1Events,['control_change' , 0, 0, 6, 0];
push @voice1Events,['control_change', 5760, 0, 99, 80];
push @voice1Events,['control_change', 0, 0, 98, 0];
push @voice1Events,['control_change', 0, 0, 6, 0];
push @voice1Events,['control_change', 0, 0, 38, 0];
push @voice1Events,['control_change', 0, 0, 98, 1];
push @voice1Events,['control_change', 0, 0, 6, 15];
push @voice1Events,['control_change', 0, 0, 38, 80];
push @voice1Events,['control_change', 0, 0, 98, 2];
push @voice1Events,['control_change', 0, 0, 6, 64];
push @voice1Events,['control_change', 0, 0, 98, 3];
push @voice1Events,['control_change', 0, 0, 6, 64];
push @voice1Events,['control_change', 0, 0, 98, 4];
push @voice1Events,['control_change', 0, 0, 6, 1];
push @voice1Events,['control_change', 0, 0, 38, 122];
push @voice1Events,['control_change', 0, 0, 98, 5];
push @voice1Events,['control_change', 0, 0, 6, 1];
push @voice1Events,['control_change', 0, 0, 98, 18];
push @voice1Events,['control_change', 0, 0, 6, 3];
push @voice1Events,['control_change', 0, 0, 98, 19];
push @voice1Events,['control_change', 0, 0, 6, 109];
push @voice1Events,['control_change', 0, 0, 38, 64];
push @voice1Events,['control_change', 0, 0, 98, 20];
push @voice1Events,['control_change', 0, 0, 6, 39];
push @voice1Events,['control_change', 0, 0, 98, 21];
push @voice1Events,['control_change', 0, 0, 6, 105];
push @voice1Events,['control_change', 0, 0, 38, 0];
push @voice1Events,['control_change', 0, 0, 98, 79];
push @voice1Events,['control_change', 0, 0, 6, 127];
push @voice1Events,['control_change', 0, 0, 98, 80];
push @voice1Events,['control_change', 0, 0, 6, 12];
push @voice1Events,['control_change', 0, 0, 98, 81];
push @voice1Events,['control_change', 0, 0, 6, 8];
push @voice1Events,['control_change', 0, 0, 98, 82];
push @voice1Events,['control_change', 0, 0, 6, 20];
push @voice1Events,['control_change', 0, 0, 98, 83];
push @voice1Events,['control_change', 0, 0, 6, 28];
push @voice1Events,['control_change', 0, 0, 98, 84];
push @voice1Events,['control_change', 0, 0, 6, 24];
push @voice1Events,['control_change', 0, 0, 98, 85];
push @voice1Events,['control_change', 0, 0, 6, 10];
push @voice1Events,['control_change', 0, 0, 98, 86];
push @voice1Events,['control_change', 0, 0, 6, 12];
push @voice1Events,['control_change', 0, 0, 98, 87];
push @voice1Events,['control_change', 0, 0, 6, 12];
push @voice1Events,['control_change', 0, 0, 98, 88];
push @voice1Events,['control_change', 0, 0, 6, 0];
push @voice1Events,['control_change', 0, 0, 98, 89];
push @voice1Events,['control_change', 0, 0, 6, 50];
push @voice1Events,['control_change', 0, 0, 98, 90];
push @voice1Events,['control_change', 0, 0, 6, 50];
push @voice1Events,['control_change', 0, 0, 98, 127];
push @voice1Events,['control_change', 0, 0, 6, 127];
push @voice1Events,['end_track' , 2160];
my $master_track = MIDI::Track->new({ 'events' => \@masterEvents });
my $voice1_track = MIDI::Track->new({ 'events' => \@voice1Events });
my $opus = MIDI::Opus->new(
{ 'format' => 1, 'ticks' => 480, 'tracks' => [ $master_track, $voice1_track ] } );
$opus->write_to_file( 'test_miku.vsq' );
exit(0);
#-----------------------------------------------------------------------
#
# ミクの発音用メタテキスト
#
sub miku_phonetics {
my @myPhonetics=();
push @myPhonetics, "[Common]";
push @myPhonetics, "Version=DSB301";
push @myPhonetics, "Name=Voice1";
push @myPhonetics, "Color=181,162,123";
push @myPhonetics, "DynamicsMode=1";
push @myPhonetics, "PlayMode=1";
push @myPhonetics, "[Master]";
push @myPhonetics, "PreMeasure=4";
push @myPhonetics, "[Mixer]";
push @myPhonetics, "MasterFeder=0";
push @myPhonetics, "MasterPanpot=0";
push @myPhonetics, "MasterMute=0";
push @myPhonetics, "OutputMode=0";
push @myPhonetics, "Tracks=1";
push @myPhonetics, "Feder0=0";
push @myPhonetics, "Panpot0=0";
push @myPhonetics, "Mute0=0";
push @myPhonetics, "Solo0=0";
push @myPhonetics, "[EventList]";
push @myPhonetics, "0=ID#0000";
push @myPhonetics, "7680=ID#0001";
push @myPhonetics, "7920=ID#0002";
push @myPhonetics, "8160=EOS";
push @myPhonetics, "[ID#0000]";
push @myPhonetics, "Type=Singer";
push @myPhonetics, "IconHandle=h#0000";
push @myPhonetics, "[ID#0001]";
push @myPhonetics, "Type=Anote";
push @myPhonetics, "Length=240";
push @myPhonetics, "Note#=64";
push @myPhonetics, "Dynamics=64";
push @myPhonetics, "PMBendDepth=20";
push @myPhonetics, "PMBendLength=0";
push @myPhonetics, "PMbPortamentoUse=0";
push @myPhonetics, "DEMdecGainRate=50";
push @myPhonetics, "DEMaccent=50";
push @myPhonetics, "LyricHandle=h#0001";
push @myPhonetics, "[ID#0002]";
push @myPhonetics, "Type=Anote";
push @myPhonetics, "Length=240";
push @myPhonetics, "Note#=64";
push @myPhonetics, "Dynamics=64";
push @myPhonetics, "PMBendDepth=20";
push @myPhonetics, "PMBendLength=0";
push @myPhonetics, "PMbPortamentoUse=0";
push @myPhonetics, "DEMdecGainRate=50";
push @myPhonetics, "DEMaccent=50";
push @myPhonetics, "LyricHandle=h#0002";
push @myPhonetics, "[h#0000]";
push @myPhonetics, "IconID=\$07010000";
push @myPhonetics, "IDS=Miku";
push @myPhonetics, "Original=0";
push @myPhonetics, "Caption=";
push @myPhonetics, "Length=1";
push @myPhonetics, "Language=0";
push @myPhonetics, "Program=0";
push @myPhonetics, "[h#0001]";
push @myPhonetics, "L0=\"み\",\"m' i\",1.000000,64,0,0";
push @myPhonetics, "[h#0002]";
push @myPhonetics, "L0=\"く\",\"k M\",1.000000,64,0,0";
my $my_miku_phonetics="";
my $phonetic = "";
foreach $phonetic (@myPhonetics) {
$my_miku_phonetics = $my_miku_phonetics.$phonetic."\n";
}
return $my_miku_phonetics;
}
| 固定リンク
「初音ミク」カテゴリの記事
- MikuMikuTalk ver.0.2.1c(2012.04.20)
- MikuMikuTalk ver.0.2.1(2012.04.13)
- Tda式Appendミク・ver.βのMMM対応パッチ(2012.04.08)
- Tell Your World MMD-PV(2012.04.04)
- Tda式Appendミクさんの物理演算対応(2012.02.22)
この記事へのコメントは終了しました。
コメント
はじめまして,
いつも楽しく拝見させていただいております,zhuoと申します.
Perlスクリプトすばらしいです!参考にしてみたいです.
ところで,'Master Track' , 'Voice' というトラック名を書き込むには,text_event でなく,track_name とするとよいです.
これからもよろしくお願いいたします_o_
投稿: zhuo | 2007年12月 7日 (金) 01時28分
zhuoさん、書き込みありがとうございます。
zhuoware のWEBサイトも良く拝見させていただいています。そちらでご紹介いただいた mf2tを使って .vsq の出力チェックをおこないました。
あと、track_name のご指摘もありがとうございます。さっそくスクリプトの改良に入ります。
その前に、「.vsqのアップロードでは一般ユーザーはちんぷんかんぷん」という状態をなんとかせねば。(笑)
投稿: 和泉聡 | 2007年12月 7日 (金) 06時57分