Pythonに日本語を喋らすだけのプログラミングです。というよりはほぼlinuxパソコンの設定となっています。
環境:ubuntu、open-jtalk
open jtalkのインストール
sudo apt-get install open-jtalk open-jtalk-mecab-naist-jdic htsengine libhtsengine-dev hts-voice-nitech-jp-atr503-m001
hts-voice-niteck-jp-atr503-m001が入らない方はリポジトリのmultiverseが有効になっていない可能性があります。私はここで少しつまづきました。色々設定しているうちにmultiverseがオフになっていたようです。 そしてデフォルトの音声が怖いと言うことで音声ファイルを追加し使えるようにします
wget https://sourceforge.net/projects/mmdagent/files/MMDAgent_Example/MMDAgent_Example-1.6/MMDAgent_Example-1.6.zip/download -O MMDAgent_Example-1.6.zip
unzip MMDAgent_Example-1.6.zip MMDAgent_Example-1.6/Voice/*<br><br>sudo cp -r MMDAgent_Example-1.6/Voice/mei/ /usr/share/hts-voice
Pythonコードです。このコードにより喋ります。よく理解できてないですが、おそらくパイプ等を使い、jtalkのコマンドを呼び出していると思われます。音声再生はaplayを使っているらしい。
#coding: utf-8
import subprocess
from datetime import datetime
def jtalk(t):
open_jtalk=['open_jtalk']
mech=['-x','/var/lib/mecab/dic/open-jtalk/naist-jdic']
htsvoice=['-m','/usr/share/hts-voice/mei/mei_normal.htsvoice']
speed=['-r','1.0']
outwav=['-ow','open_jtalk.wav']
cmd=open_jtalk+mech+htsvoice+speed+outwav
c = subprocess.Popen(cmd,stdin=subprocess.PIPE)
c.stdin.write(t.encode())
c.stdin.close()
c.wait()
aplay = ['aplay','-q','open_jtalk.wav']
wr = subprocess.Popen(aplay)
def say_datetime():
d = datetime.now()
text = '%s月%s日、%s時%s分%s秒' % (d.month, d.day, d.hour, d.minute, d.second)
jtalk(text)
if __name__ == '__main__':
say_datetime()
以上のコードをjtalk.py
として保存します。同じディレクトリで
#coding: utf-8
import jtalk
jtalk.jtalk('会話のテスト')
と別ファイルから呼び出しすると発話します。jtalk.pyをそのまま実行しても時刻を喋るはずなのですが、エンコーディングの問題がでて喋らない場合があります。(UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe6 in position 2: ordinal not in range(128))エンコードを指定しているのに喋らないので何故かわからないですが以下を先頭に置くことにより機能しました
import sys
# sysモジュールをリロードする
reload(sys)
# デフォルトの文字コードを変更する.
sys.setdefaultencoding('utf-8')
他のファイルからjtalk.pyを呼び出す場合には問題が起こらなかったので他ファイルから呼び出せばよいでしょう。
以上で好きな言葉を喋らせる事ができます。色々喋らせられるのでプログラミングが楽しくなるでしょう。それではまたお会いしましょう。
参考サイト:
http://web.wakayama-u.ac.jp/~kazama/lab/python/i18n.html
https://qiita.com/kkoba84/items/b828229c374a249965a9