AquesTalk
『AquesTalk - テキスト音声合成ミドルウェア』
http://www.a-quest.com/aquestalk/index_win.html
フリーの音声合成エンジン AquesTalk というのを見つけたので、拾ってきて、Pathの通ったディレクトリにDLLを置いてみた。
ドキュメント見て、以下のコードで女性声で喋ってくれるのを確認。
#include <stdio.h> #include "AquesTalk.h" #include <windows.h> #include <mmsystem.h> int main(int ac, char **av) { int size; unsigned char *wav = AquesTalk_Synthe("ごしゅ'じんさま、、おかえり/なさい/ま'せ、、", 120, &size); if(wav==0){ fprintf(stderr, "ERR:%d\n",size); return -1; } sndPlaySoundA((LPCSTR)wav, /*SD_ASYNC|*/SND_MEMORY); AquesTalk_FreeWave(wav); return 0; }
静的ライブラリじゃなくて DLL なんで、ひょっとしてそのまま Ruby から呼べるんじゃね? と思い試してみる。
#!/usr/bin/ruby -Ks # -*- coding: shift_jis -*- require 'Win32API' aqtk_synt = Win32API.new('AquesTalk', 'AquesTalk_Synthe', 'PLP', 'L'); aqtk_free = Win32API.new('AquesTalk', 'AquesTalk_FreeWave', 'L', 'V'); sndPlay = Win32API.new('winmm', 'sndPlaySoundA', 'LL','L'); size = '1234' wav = aqtk_synt.call("おに'ーーちゃ/ん'、、;だ'いすき。", 150, size) exit if wav == 0 sndPlay.call(wav, 4) # 4==SND_MEMORY aqtk_free.call(wav)
おお、ちゃんと喋ってくれるよ。
kakasiと組み合わせて、アクセントと区切りを調整すればそれなりに使えそうな。
…
…んんん?
よく見たら、文字列指定で直接音声再生してくれるAPIがあるな。わざわざ wav を synthe して sndPlay して free とかしなくても良いじゃん。
#!/usr/bin/ruby -Ks # -*- coding: shift_jis -*- require 'Win32API' aqtk_play = Win32API.new('AquesTalkDa', 'AquesTalkDa_PlaySync', 'PL', 'L') aqtk_play.call("も'ーー、、おに'ーーちゃん、、いもーーとの/おっ'ぱいー、、さわ'りすぎー。", 120)
何だ。これだけで良いのか。