Python + CoeFont CLOUDでリアルな音声合成を体験
CoeFont CLOUD を使おうと思った経緯
チャットボットとかアプリの音声ガイドとか作る時に、音声合成サービスを使うことってありますよね。
私はそういう時はWebアプリならブラウザ標準のもの、スマホアプリなら OS 標準のものを使うのですが、どうにも機械っぽい声が好きになれませんでした。
CoeFont CLOUD はそんな不満を払拭してくれる流暢な日本語を話してくれるAI音声合成サービスです。
ちなみに無料の CoeFont STUDIO もありますが、こちらは API が公開されてません。
CoeFont CLOUD の凄いところ
- 自然な日本語。声の種類によってクオリティの差はあるものの、基本的にクオリティは高く、人の温かさを感じられる音声合成です。
- 声の種類が豊富。というのも、 CoeFont CLOUD は自分の声を収録して音声合成として使うことが出来、さらにそれを公開して収益化も出来ます。
- その為、色んな人の声が音声合成として登録されているわけです。
利用プランと料金
月ごとにポイントが付与されて、音声合成を使用する度にポイントが消費されるようです。
声の種類によりますが1文字5ポイント~100ポイントくらい消費され、無料のものもありました。
利用登録
CoeFont CLOUD を開いてアカウント登録します。
登録にはクレジットカードの情報が必要です。
アカウント情報を入力します。
FireFoxでは↓の登録画面が表示されずに登録出来ませんでしたが、Chromeではうまくいきました。
Access key と Client Secret を生成する
画面右上のアカウント設定を開き、左メニューのAPI情報からAccess key と Client Secret を生成します。
使用する CoeFont の ID を検索する
CoeFont CLOUD のWEBページから使いたい CoeFont を検索します。
使いたい CoeFont の画面URLの最後の UUID が CoeFont を使う為に必要な ID です。
今回は公式のアベルーニ(2b174967-1a8a-42e4-b1ae-5f6548cfa05d)を使ってみます。
Python で CoeFont CLOUD の音声合成を使用する
HTTP通信とオーディオ再生用のライブラリをインストール。
$ pip install requests $ pip install simpleaudio
作成したPython [coefont.py]
音声合成のパラメタは APIドキュメント を見ると色々ありますが、今回は pitch と speed だけ設定します。
import argparse import hashlib import hmac import json import os import requests import simpleaudio import sys import tempfile from datetime import datetime, timezone access_key = os.environ.get('coefont_access_key') access_secret = os.environ.get('coefont_access_secret') # CoeFont CLOUDのtext2speechを実行 def text2speech(text, speed, pitch, mode): if mode not in ['play', 'save']: print('modeは play or save を指定してください') sys.exit(1) # UNIX時間(UTC) date = str(int(datetime.utcnow().replace(tzinfo=timezone.utc).timestamp())) # リクエストボディ data = json.dumps({ 'coefont': '2b174967-1a8a-42e4-b1ae-5f6548cfa05d', 'text': text, 'speed': speed, 'pitch': pitch }) # UNIX時間+リクエストボディをHMAC-SHA256でハッシュ化 signature = hmac.new(bytes(access_secret, 'utf-8'), (date+data).encode('utf-8'), hashlib.sha256).hexdigest() # リクエストヘッダ headers = { 'Content-Type': 'application/json', 'Authorization': access_key, 'X-Coefont-Date': date, 'X-Coefont-Content': signature } # API実行 response = requests.post('https://api.coefont.cloud/v1/text2speech', data=data, headers=headers) # API実行成功 if response.status_code == 200: # 再生 if mode == 'play': with tempfile.TemporaryDirectory() as tmp: save(tmp, response.content) wav_obj = simpleaudio.WaveObject.from_wave_file(f'{tmp}/audio.wav') play_obj = wav_obj.play() play_obj.wait_done() # ファイル出力 else: save('./', response.content) # API実行失敗 else: print(response.json()) sys.exit(1) # APIの結果(音声ファイルのバイナリ)をファイルに出力 def save(path, content): with open(f'{path}/audio.wav', 'wb') as f: f.write(content) if __name__ == '__main__': # CLI的に使う為の引数を定義 if not access_key: print('環境変数[coefont_access_key]にアクセスキーを設定してください。') sys.exit(1) if not access_secret: print('環境変数[coefont_access_secret]にシークレットを設定してください。') sys.exit(1) parser = argparse.ArgumentParser(prog='coefont.py', usage='python3 coefont.py --text 音声合成するテキスト', add_help=True) parser.add_argument('-t', '--text', help='音声合成するテキスト', type=str, required=True) parser.add_argument('-s', '--speed', help='音声の速度。1.0で通常速度。0.5で半速。2.0で2倍速', type=float, default=1.0, required=False) parser.add_argument('-p', '--pitch', help='音声のピッチ。±1200で1オクターブ変化', type=int, default=0, required=False) parser.add_argument('-m', '--mode', help='[play]=再生,[save]=ファイル出力', type=str, default='play', required=False) args = parser.parse_args() text2speech(args.text, args.speed, args.pitch, args.mode)
実行コマンド
# 環境変数に Access key と Client Secret を設定 $ export coefont_access_key=XXX $ export coefont_access_secret=XXX # Pythonを実行 $ python coefont.py --text こんにちは。なんちゃってSEの足跡です。よろしくおねがいします。 --pitch 100 --speed 1.1 --mode save