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)

何だ。これだけで良いのか。