オープンソース、多言語対応の音声合成エンジン。 日本語には未対応。
ライセンスは GNU General Public License V3
http://espeak.sourceforge.net/
Ubuntu Linux には espeak パッケージが存在する。
ここではnvdajpのための技術調査について書く。
synthDrivers/_espeak.py が espeak DLL のラッパーである。
initialize() にて ctypes による DLL のロードが行われる。
espeakDLL.espeak_SetSynthCallback() でコールバックをセットする。
このコールバック関数は python で実装されている。
DLL側の仕様を確認すると
http://espeak.sourceforge.net/speak_lib.h
typedef int (t_espeak_callback)(short*, int, espeak_EVENT*);
void espeak_SetSynthCallback(t_espeak_callback* SynthCallback);
音声合成エンジン(espeak)は SynthCallback という関数ポインタを受け取り、 波形をある長さ生成したらこの関数を呼び出す。
コールバックを見てみる。
t_espeak_callback=CFUNCTYPE(c_int,POINTER(c_short),c_int,POINTER(espeak_EVENT)) @t_espeak_callback def callback(wav,numsamples,event): # 以下略
wav が空でなく、numsamples が0より大きければ、
player.feed(string_at(wav, numsamples * sizeof(c_short)))
でデータをオーディオ出力デバイスに送っている。
そして player オブジェクトは nvwave.py に実装されている nvwave.WavePlayer() のインスタンスである。
nvwave は ctypes を使って Win32 のオーディオ出力APIを叩いている。
WinMM のラッパークラス
nvwave.WavePlayer の主なメソッド