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




