« CV02「鏡音リン・レン」 | トップページ | サクラサク »

初音ミクに喋らせてみた(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;
}


|

« CV02「鏡音リン・レン」 | トップページ | サクラサク »

初音ミク」カテゴリの記事

コメント

はじめまして,
いつも楽しく拝見させていただいております,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分

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/110295/17285936

この記事へのトラックバック一覧です: 初音ミクに喋らせてみた(Perl版):

» ミクタイピング [ミクタイピング (PukiWiki/TrackBack 0.3)]
お知らせ 2007-12-07 初音ミクをしゃべらせるスクリプトがあるようです。[a:[http://akira-izumi.cocolog-nifty.com/patent/2007/12/perl_887f.html]] 2007-12-06 早速ですが,ガイドラインでゲームが禁止になっています。ミクラッシャーは一体どうなっているのでしょ... [続きを読む]

受信: 2007年12月 7日 (金) 18時20分

« CV02「鏡音リン・レン」 | トップページ | サクラサク »