VoiceText Web APIをPythonで使ってみる

音声合成のWeb APIがあったので、Pythonで使ってみます。このサービスはベータ版ということですが、HOYAサービス株式会社が提供しています。もしかして「Misakiという女性の音声合成で有名だったんじゃないだろうか」と思って調べたら、サンプル音声 | HOYA音声合成ソフトウェア VoiceTextにありました。

さっそく、VoiceText Web API (β版)から利用登録してAPIキーを入手しました。

実験環境

  • ThinkPad X200
  • Windows7 Professional 64bit
  • Python 2.7.3

プログラムを書く

最近慣れてきたrequestsモジュールで音声データをダウンロードするプログラムを書きましたが…、

#coding:utf-8

import requests

url = 'https://api.voicetext.jp/v1/tts'
API_KEY = 'YOUR API KEY'

payload = {
    'text': 'おはようございます',
    'speaker': 'hikari',
    }

r = requests.post(url, params=payload, auth=(API_KEY,''))

f = open("test.wav", 'wb')
f.write(r.content)
f.close()

実行するとエラーが発生しました。

requests.exceptions.SSLError: [Errno 1] _ssl.c:504: error:1407742E:SSL routines:
SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version

これはもしかしての”はまり”の予感的中です。

requestsモジュールのバージョンが低いからではないかと思い、pip でupgradeして

Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win
32
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
>>> requests.__version__
'2.3.0'
>>>

最新バージョンになったにもかかわらず、同じエラーが発生します。

requestsモジュールをやめ、昔ながらのurllibとurllib2でプログラムを書いてあげても、エラーメッセージが発生しました。

urllib2.URLError: <urlopen error [Errno 1] _ssl.c:504: error:1407742E:SSL routin
es:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version>

これは何かのバグなのかも、同じエラーで悩んでいる人がいるに違いないと思い、ネットで検索して回避策を見つけました。

requests_toolbelt 0.1.0 documentation

サーバー側のOpenSSLのバージョンによっては、SSLバージョンのネゴシエーションがうまく動作できないのが原因のようです。requests_toolbeletモジュールをインストールし、SSLAdapterでSSLに使うバージョンを指定することで動作するになりました。

> pip install requests_toolbelet

プログラムを書き直す

#coding:utf-8

from requests_toolbelt import SSLAdapter
import requests
import ssl
import sys

url = 'https://api.voicetext.jp/v1/tts'
API_KEY = 'YOUR API KEY'

payload = {
    'text': 'おはようございます',
    'speaker': 'hikari',
    }

s = requests.Session()
s.mount(url, SSLAdapter(ssl.PROTOCOL_TLSv1))
r = s.post(url, params=payload, auth=(API_KEY,''))

print "status code:", r.status_code
if r.status_code != 200:
    print "error:", r.json()['error']['message']
    sys.exit()

f = open("test.wav", 'wb')
f.write(r.content)
f.close()

プログラムを実行して得たwavファイルは下記で再生できます。VoiceText Web API (β版)に反するようなので音声再生をやめます。ちょっと残念。

(2)当社のサーバーから出力された音声データは、本サービスを利用したアプリケーション内のみで使用すること
(3)当社のサーバーから出力された音声データを、直接的または間接的に配布しないこと(但し、当社の事前の書面による承諾がある場合はこの限りではありません)

VoiceText WEB APIの音声品質は抜群に良いです。ベータ版ということですが、このまま無償でサービスを続けてほしいですね。そして無償の利用範囲を広げていただけるとありがたいです。