Python + CoeFont CLOUDでリアルな音声合成を体験

CoeFont CLOUD を使おうと思った経緯

チャットボットとかアプリの音声ガイドとか作る時に、音声合成サービスを使うことってありますよね。

私はそういう時はWebアプリならブラウザ標準のもの、スマホアプリなら OS 標準のものを使うのですが、どうにも機械っぽい声が好きになれませんでした。

CoeFont CLOUD はそんな不満を払拭してくれる流暢な日本語を話してくれるAI音声合成サービスです。

ちなみに無料の CoeFont STUDIO もありますが、こちらは API が公開されてません。


CoeFont CLOUD の凄いところ

  • 自然な日本語。声の種類によってクオリティの差はあるものの、基本的にクオリティは高く、人の温かさを感じられる音声合成です。
  • 声の種類が豊富。というのも、 CoeFont CLOUD は自分の声を収録して音声合成として使うことが出来、さらにそれを公開して収益化も出来ます。
  • その為、色んな人の声が音声合成として登録されているわけです。


利用プランと料金

月ごとにポイントが付与されて、音声合成を使用する度にポイントが消費されるようです。

声の種類によりますが1文字5ポイント~100ポイントくらい消費され、無料のものもありました。

CoeFont Cloud API利用料金












利用登録

CoeFont CLOUD を開いてアカウント登録します。

登録にはクレジットカードの情報が必要です。

CoeFont Cloudアカウント登録







アカウント情報を入力します。

FireFoxでは↓の登録画面が表示されずに登録出来ませんでしたが、Chromeではうまくいきました。

CoeFont Cloud APIアカウント登録









Access key と Client Secret を生成する

画面右上のアカウント設定を開き、左メニューのAPI情報からAccess key と Client Secret を生成します。

CoeFont Cloud APIのAccess KeyとSecret Key生成

 

 

 

 



使用する CoeFont の ID を検索する

CoeFont CLOUD のWEBページから使いたい CoeFont を検索します。

使いたい CoeFont の画面URLの最後の UUID が CoeFont を使う為に必要な ID です。

今回は公式のアベルーニ(2b174967-1a8a-42e4-b1ae-5f6548cfa05d)を使ってみます。

CoeFont ID検索







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


実行結果