Pythonで音声合成の簡単実験

2011/01/11

AquesTalk2 Win 版を使って音声合成の実験をしてみた。PCが声を出して喋るという行為はおもしろい。2つの別の声で同時発声させるともっとおもしろい。何かに使えないかなあ。ということで、メモしておく。

実験に使う音声合成エンジンについて

AQUEST社のホームページより

テキスト音声合成ミドルウェア
AquesTalk2は、テキストを音声に変換する日本語の規則音声合成ライブラリです。
組み込みシステムに適したライブラリであり、音声データとプログラムコードを含めても50Kバイト程度(12秒程度の固定音声メッセージを用意するのと同等のサイズ*)という他に類を見ないコンパクトなエンジンに仕上がっています。

ライセンスのところもちゃんと目を通しておく

非営利の個人利用では無償でご利用できます。

なお、ダウンロードしたPhontデータを使うと、声の種類も変更できます。実験でもやってみました。

実験環境

  • Windows XP SP3
  • Python 2.6.5

音声合成エンジンAquesTalk2をダウンロードする。

AquesTalk2は以下URLのDownloadリンクからダウンロードする。
http://www.a-quest.com/products/index.html
Windows XPの環境で実験するので以下ファイルを選択した。

  • ソフト名: AquesTalk2 Win
  • バージョン: 2.0.0.4
  • パッケージ: aqtk2_100402.zip

音声合成に必要なファイルは、ダウンロードしたファイルを解凍してできるbinフォルダの中にある
AquesTalk2Da.dll
なので、これをこれから作るプログラムと同じディレクトリにコピーしておく。

同期タイプの音声合成

発声し終えるとプロンプトが戻ってくる。要するに、発声している間は何もできない。

#coding:cp932

from ctypes import windll

aqtalk_dll = windll.LoadLibrary("AquesTalk2Da.dll")
aq_playsync = aqtalk_dll.AquesTalk2Da_PlaySync
aq_playsync('こんにちわ', 100, 0)
  • aq_playsyncに渡す文字列の文字コードはcp932(Shift-JIS)でなければなりません。違う文字コードで渡すと何も発声しません。
  • 音声合成した音

非同期タイプの音声合成

発声させると終了を待たずに、プロンプトが戻ってきます。つまり、発声中に次の仕事をさせることができます。同時に発声することも可能になります。

#coding:cp932

import time
from ctypes import windll, byref

aqtalk_dll = windll.LoadLibrary("AquesTalk2Da.dll")
aq_create = aqtalk_dll.AquesTalk2Da_Create
aq_play = aqtalk_dll.AquesTalk2Da_Play
hdl = aq_create()
aq_play(hdl, 'こんにちわ', 100, 0, 0, 0, 0)
print 'Now Speaking'
time.sleep(1)
  • aq_createで音声合成エンジンのインスタンスを生成する
  • aq_playにインスタンス、音声記号列、発声速度と、その他のパラメータは0を指定して実行する
  • 1秒間スリープさせないと、発声する前にプログラムが終了してしまう。

2つの声を同時に発生させる

別の音声データ(aq_momo1.phont)を先ほどのダウンロードページからダウンロードし、解凍してプログラムと同じディレクトリに置く。

#coding:cp932

import time
from ctypes import windll

aqtalk_dll = windll.LoadLibrary("AquesTalk2Da.dll")
aq_create = aqtalk_dll.AquesTalk2Da_Create
aq_play = aqtalk_dll.AquesTalk2Da_Play
f = open("aq_momo1.phont","rb")
phont = f.read()
f.close()

hdl1 = aq_create()
aq_play(hdl1, 'こんにちわ', 100, 0, 0, 0, 0)
hdl2 = aq_create()
aq_play(hdl2, 'ゆっくりしていってね', 100, phont, 0, 0, 0)
print 'Now Speaking'
time.sleep(3)
  • 別の声で発声させるため、Phoneファイルをバイナリモードで読み込んでおく
  • デフォルトの音声で「こんにちわ」と発声させ、aq_momo1の音声で「ゆっくりしていってね」と同時に発声する
  • さきほどより長めにスリープさせて最後まで発声させる
  • 音声合成した音(2声を同時発声)

Python

Posted by skw