JSON
python3
rospeex
Pyaudio

Pythonを使ってRospeexで音声合成してみた

この記事を書いたきっかけ

アニメ声のような音声合成がPython3で使えるということなので、Rospeexを使おうとしたのですがいくつか情報が少ないと感じたので記事にしてみます。

Rospeexとは

・NICTが開発している音声合成エンジン
・クラウドのためhttpで送ると音声が返ってくる
・アニメのような声が特徴
[公式サイト]http://rospeex.org/top-ja/

実行環境

・Windows10
・Python 3.6.5

はじめの一歩

まず、Googleで検索しRospeexの情報を探し、見つけたのがこちら
http://blog.maqua.tech/entry/2013/12/14/024807
このページにあるPythonのプログラムをちょっと変えて実行してみると・・・
urllib2でエラーが返ってきます

バージョンが違うことに気が付く

urllib2というものが何をするのか、調べると・・・
Python 2時代のものでした
ということは・・・
Python 3用にもあるはず
調べてみると・・・ありました!
https://teratail.com/questions/47744
ですが変えることが多く大変なのでさらに情報を求め、調べてみると
http://blog.livedoor.jp/katsuooo_l/archives/47217002.html
プログラムを作っている先人がいらっしゃいました。
早速、プログラムを少し変えて実行してみると・・・
Pythonから宛先のURLを確認してと言われました (´;ω;`)
本当かどうか怪しかったため他のツールでURLへアクセスしてみるも・・・
IPアドレスが存在しませんと返ってくる
本当だ・・・

実はURLが変わっていた

もしかするとURLが変わっただけかもしれないと思い再び調べてみると・・・
http://komeisugiura.jp/software/software_jp.html
なんと見つかりました
ということでURLだけを書き換えることに・・・

実行しよう

今度こそ動くはずと期待を込め実行・・・
無事に動きました
漢字等読めない文字も多いですが、イントネーションが思ったよりしっかりしていてビックリしました。

今回使用したプログラム

お待たせしました。以下がプログラムとなります。

rospeex.py
import sys
import string
import base64
import urllib.request
import urllib.response
import urllib.error
import urllib.parse
import json
import wave
import pyaudio

#音声合成する言葉を入力
n = input(">>>")

#URL
tts_url ="http://rospeex.nict.go.jp/nauth_json/jsServices/VoiceTraSS"

#音声合成
tts_command = { 'method':'speak',
'params':['1.1',
 {'language':'ja','text':n,'voiceType':"*",'audioType':"audio/x-wav"}]}

obj_command = json.dumps(tts_command)     # string to json object
obj_command = obj_command.encode('utf-8')        
req = urllib.request.Request(tts_url, obj_command)
response = urllib.request.urlopen(req)
received = response.read().decode('utf-8')  # conv bytes to str by decode()
# extract wav file 
obj_received = json.loads(received)
tmp = obj_received['result']['audio'] # extract result->audio
speech = base64.decodestring(tmp.encode('utf-8'))

#.waveで出力
f = open ("out.wav",'wb')
f.write(speech)
f.close

#音声合成の音声データを再生
input_filename = 'out.wav'
buffer_size = 4096
wav_file = wave.open ( input_filename , 'rb' )
p = pyaudio.PyAudio ()
stream = p.open (
                 format = p.get_format_from_width ( wav_file . getsampwidth ()) ,
                 channels = wav_file.getnchannels () ,
                 rate = wav_file.getframerate () ,
                 output = True
                 )
remain = wav_file.getnframes ()
while remain > 0:
buf = wav_file.readframes ( min ( buffer_size , remain ))
stream.write ( buf )
remain -= buffer_size

stream.close ()
p.terminate ()
wav_file.close ()

コンソール上に>>>を出力し、ユーザーからの値を受け取ったら音声合成エンジンへ送り返ってきた音声を再生する流れです。
このプラグラムをWhile文を使い無限ループさせてもいいかもしれません。

最後まで読んでいただきありがとうございます。