🐥

VoiSona Talk APIで音声AI「梵そよぎ」ボイスを自動生成した話

に公開

はじめに

前回の記事では、Voisona Talkを使って梵そよぎのオリジナル音声を作成するための簡単な手順を書きました。

今回は、システムに組み込む場合などを想定し、GUIソフトではなく、「API経由でそよぎボイスを生成する!」をテーマに、Voisona Talk APIを使ってみた話を書きます。
主に開発者向け記事です。

この記事の内容は主に、公式マニュアルを参考にしています。

前提

  • VoiSona Talkと梵そよぎが導入済み(前回の記事参照)
  • pythonがインストール済み
  • requestsパッケージがインストール済み

Voisona Talk APIを使ってみる

REST APIの有効化

まずは、REST APIを有効化する必要があります。

  • VoiSona Talkを起動し、右上の三本線のアイコンから「編集」>「環境設定」を選択します。
  • APIタブを開きます。
  • REST APIを有効にするにチェックを入れます。
  • パスワード欄に、API実行用のパスワードを入力します。
    API

これでAPIが有効化されます。

API呼び出し

公式チュートリアルを参考に「梵そよぎ」用にシンプルに記載したコード全文(sample.py)を貼り付けます。

コード全文
import argparse
import json
import os
import sys
import time
import xml.etree.ElementTree as ET
import requests
parser = argparse.ArgumentParser()
parser.add_argument("--user", type=str, required=True, help="User name")
parser.add_argument("--password", type=str, required=True, help="API password")
parser.add_argument("--port", type=int, default=32766, help="Port number")
parser.add_argument("--output-wav", type=str, default="test.wav", help="WAV filename")
args = parser.parse_args()
auth = (args.user, args.password)
base_url = f"http://localhost:{args.port}/api/talk/v1/"

def synthesize_text():
    payload = {
        "text": "今日の朝ごはんはあたたかくないそばだよ",
        "language": "ja_JP",
        "voice_name": "soyogi-soyogi_ja_JP",
        "voice_version": "2.1.0",
        "force_enqueue": True,
        "global_parameters": { # ここでグローバルパラメータを設定
            "alp": 0.0,
            "huskiness": 0.0,
            "intonation": 1.0,
            "pitch": 1.0,
            "speed": 1.0,
            "style_weights": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0],
            "volume": 0.0,
        },
    }
    response = requests.post(base_url + "speech-syntheses", auth=auth, json=payload)
    response.raise_for_status()
    uuid = response.json()["uuid"]
    print("リクエストの送信が完了しました。")
    return uuid
def check_status(uuid, synth=True, timeout=30):
    start = time.time()
    endpoint = "speech-syntheses" if synth else "text-analyses"
    while True:
        response = requests.get(base_url + endpoint + "/" + uuid, auth=auth)
        response.raise_for_status()
        state = response.json()["state"]
        if state == "succeeded":
            break
        if time.time() - start > timeout:
            raise TimeoutError("処理に時間がかかり過ぎています。")
        time.sleep(0.1)
    print("リクエストの処理が完了しました。")
    return response
def delete_request(uuid):
    response = requests.delete(base_url + "speech-syntheses/" + uuid, auth=auth)
    response.raise_for_status()
    print("リクエストの削除が完了しました。")

try:
    uuid = synthesize_text()
    check_status(uuid)
    delete_request(uuid)
    print("エラーなく完了しました。")
except requests.exceptions.ConnectionError as e:
    print("接続に失敗しました。サーバの状態と設定を見直してください。")
    print(e)
except requests.exceptions.HTTPError as e:
    print("HTTPエラーが発生しました。")
    print(e)
except Exception as e:
    print("予期しないエラーです。")
    print(e)

実行コマンドは以下の通りです。問題なければ、実行するとスピーカーから音声が聞こえます!

python sample.py --user <username> --password <password>

重要なAPIは、http://localhost:{args.port}/api/talk/v1/speech-synthesesです。
ここに適切なリクエストを投げることで、音声を合成してくれます。
詳しいAPI仕様については、APIリファレンスをご覧ください。

パラメータの調整

グローバルパラメータ

グローバルパラメータの設定を行うには、以下のようにリクエストにパラメータを追加します。

    payload = {
        "text": "今日の朝ごはんはあたたかくないそばだよ",
        "language": "ja_JP",
        "voice_name": "soyogi-soyogi_ja_JP",
        "voice_version": "2.1.0",
        "force_enqueue": True,
        "global_parameters": { # ここでグローバルパラメータを設定
            "alp": 0.0,
            "huskiness": 0.0,
            "intonation": 1.0,
            "pitch": 1.0,
            "speed": 1.0,
            "style_weights": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0],
            "volume": 0.0,
        },
    }

以下の通り、パラメータによってデフォルト値と取りうる値が異なるので注意してください。
style_weightsについては後述します。

パラメータ名 意味 デフォルト 取りうる範囲
alp 年齢感 0 -1 .. 1
huskiness 息成分 0 -20 .. 20
intonation 抑揚 1 0 .. 2
pitch ピッチ 1 -600 .. 600
speed 話速 1 0.2 .. 5
style_weights スタイル係数 - -
volume 音量 0 -8 .. 8

スタイル(style_weights)

スタイルを調整することで感情表現を調整することが可能です。
梵そよぎ2.1.0で設定可能なスタイル及びデフォルト係数は以下です。
係数を指定するときは、下記の順番の係数の配列を作成します。

# スタイル名
  "style_names": [
    "Normal","Fine","Angry","Rage","Sad","Whisper","Happy", "Loud"
  ],
# デフォルト係数
  "default_style_weights": [
    1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0
  ],

今回は、以下のようにすることで、Happyのスタイルを設定しました。

"style_weights": [
    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0
]

さいごに

公式チュートリアルに沿って実行することで、比較的簡単に音声を再生するところまで実行できました。
例えば、その場で生成したテキストを読ませる場合などに、APIを使えば、事前生成の必要なく音声合成が可能です。APIを使うことによって梵そよぎを活用する場面が広がりそうだと感じました。

次の記事で、お天気をお知らせするデモシステムの構築についても書きました。

Discussion