この記事を書いたわけ

アニメ声のような音声合成が使えるということで、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アドレスが存在しません omg
本当だった (´;ω;`)

実は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文を使い無限ループさせてもいいかもしれません。

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

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.