RPGツクールの住人を合成音声で喋らせてみた

RPGツクールXP + AquesTalk で、RPGツクールの登場人物にしゃべらせてみる。
・・・というようなものをやってみてPostしてみる予定。

つくったどーー!

簡単にできると思ったが、思わぬところで苦戦。

[RPGツクール][RGSS][memo]NKFとかiconvとかkconvとかが搭載されていない!

RPGツクールXP(RGSS Version 1.0)だとNKFがないみたい。*1
しかも、*.soを読み込ませようとすると、*2読み込めないので

rbuconvというpurerubyな文字コード変換ライブラリを利用する羽目になりました。

この辺でかなり苦戦*3。。。

[RPGツクール][RGSS][memo]Win32APIはmainでincludeされている!

実は、今回はこいつを利用する気まんまんでした*4

実は、Windowsでの音声合成方法は既に確立しているので、その方法をRGSSに応用するだけだから
はっは〜ん♪朝飯前だぜ!?・・・などと思っていたのですが。

うっわ!Win32API使い難っ!!
DL::importとかと同じもんだろと思っていたのですが、Win32APIって、より関数チックなんですね。。
LL言語しか使ったことのない僕にはもうかなりの障壁でした。。

前置きが長くなってしまいました。
それでは、本題に参りましょう。

準備。

Kakasiを用意する

{RPGツクールXPのプロジェクト(以下、Project1)}ディレクトリに、{lib,dict}というディレクトリを作ります。
Project1\lib\kakasi.dll
Project1\dict\kanwadict
Project1\dict\itaijidict
という感じになるように、Kakasiという日本語解析器をおきましょう。
取得先:http://kakasi.namazu.org/index.html.ja
 >Win32用 バイナリパッケージという所から、zip形式のファイルを拾ってきて展開してください。

AquesTalkを用意する

同じく、libディレクトリに合成音声エンジンをおきましょう。
Project1\lib\AquesTalkDa.dll*5
取得先:http://www.a-quest.com/aquestalk/index_win.html
 >AquesTalk Win版という所から、同じくzip形式のファイルを拾ってきて展開してください。

rbuconvを用意する

次は、文字コード変換ライブラリを拾ってきましょう。
Project1\lib\rbuconv.rb
という感じで配置します。
取得先:http://www.yoshidam.net/Ruby_ja.html#rbuconv
 > version 0.1.2 ダウンロードという所に、tar.gz形式で固められています。

さぁ、これで前置きは整いました。

いよいよお待ちかねのコードです。
次のコードを、RPGツクールXPスクリプトエディタで最上位のスクリプトとして挿入してください。
スクリプト名は「Text_to_Speech」とかにしておいたらいいんじゃないでしょうか。

$LOAD_PATH.unshift('./lib/')

# Set AquesTalkModules
require 'rbuconv'
$aques = Win32API.new('./lib/AquesTalkDa.dll', 'AquesTalkDa_PlaySync', 'pi', 'i')
def aques(str)
  $aques.call(Uconv.u8tosjis(str), 100)
end

# Set KakasiModules
system('set KANWADICTPATH=..\dict\kanwadict')
system('set ITAIJIDICTPATH=..\dict\itaijidict')

$kakasi_init = Win32API.new('./lib/kakasi.dll', 'kakasi_getopt_argv', 'ip', 'i')
$kakasi_do = Win32API.new('./lib/kakasi.dll', 'kakasi_do', 'p', 'p')
$kakasi_close = Win32API.new('./lib/kakasi.dll', 'kakasi_close_kanwadict', 'v', 'i')
$kakasi_free = Win32API.new('./lib/kakasi.dll', 'kakasi_free', 'cp', 'i')

def kanji_to_hiragana(str)
  params = ["kakasi", "-JH", "-isjis", "-osjis"]
  result = $kakasi_init.call(4, params.pack("p4"))
  exit! if result == 1
  result =  $kakasi_do.call(Uconv.u8tosjis(str))
  exit! if $kakasi_close.call() == 1
  return Uconv.sjistou8(result)
end

# Set Text to Speech
def text_to_speech(str)
  str = kanji_to_hiragana(str)
  aques(str)
end

これで、RPGツクール上のイベントエディタからスクリプト命令で『text_to_speech("獲ったどー!!")』というイベントを書けば、RPGツクール上のイベントがイカした合成ボイスで喋ってくれます。

あー。。でも、よくよく考えたらこんな機能はRPGで使えませんねぇ。。。(ちゃんちゃん)*6

*1:RPGツクールVXには搭載されている。こっちはRGSS Version 2.0らしい

*2:たぶん、dlが無いからじゃないかな

*3:実は、これは序章に過ぎなかったり

*4:それがそもそもの落とし穴だったり・・・

*5:注意、間違えてAquesTalk.dllを置かないように気をつけて!

*6:このエントリは明け方に書いたので若干おかしいです