irodori-TTS for 読み分けちゃん / アプリ開発者の方へ

自分のアプリから、この読み上げを使う

アプリを開くと、パソコンの中に OpenAI 互換の読み上げ API が立ちます。Python の知識は要りません。

このアプリの目的

Aratako 氏の音声合成 Irodori-TTS は、日本語の声を参照音声とキャプション(演技指示)から作れる、とてもよくできたモデルです。 ただ、そのまま使うには Python や CUDA の準備が要り、配信ソフトの利用者には敷居が高いものでした。

このアプリは、その敷居を無くすためのものです。インストールして開くだけで、Irodori-TTS がパソコンの中で動き、 配信ソフト 読み分けちゃん2 から読み上げに使えます。そして同じ口を、ほかのアプリからも使えるように開けてあります

Irodori-TTS の開発趣旨(MIT ライセンスと Ethical Restrictions)に沿って使う方には、機能を開放します。 読み分けちゃん2 だけのための口ではありません。自分のツール・ゲーム・配信の仕掛けから、どうぞ呼んでください。

このアプリは非公式です。Aratako 氏とは関係がありません。API についての質問や不具合は、Aratako 氏ではなく X の @yomiwakechan へお願いします。

しくみ

最短の例

本文を送ると、wav(48 kHz・モノラル)が返ります。

curl

curl -X POST http://127.0.0.1:18088/v1/audio/speech ^
  -H "Content-Type: application/json" ^
  -d "{\"model\":\"irodori-tts\",\"input\":\"こんにちは。\",\"voice\":\"デフォルト\",\"response_format\":\"wav\"}" ^
  -o out.wav

PowerShell

$body = @{
  model = "irodori-tts"; input = "こんにちは。"; voice = "デフォルト"; response_format = "wav"
  irodori = @{ caption = "明るく"; num_steps = 40 }
} | ConvertTo-Json
Invoke-WebRequest -Uri "http://127.0.0.1:18088/v1/audio/speech" -Method Post `
  -ContentType "application/json; charset=utf-8" -Body ([Text.Encoding]::UTF8.GetBytes($body)) `
  -OutFile out.wav

Python(標準ライブラリだけ)

import json, urllib.request

body = {"model": "irodori-tts", "input": "こんにちは。", "voice": "デフォルト",
        "response_format": "wav", "irodori": {"caption": "明るく", "num_steps": 40}}
req = urllib.request.Request(
    "http://127.0.0.1:18088/v1/audio/speech",
    data=json.dumps(body, ensure_ascii=False).encode("utf-8"),
    headers={"Content-Type": "application/json"})
with urllib.request.urlopen(req, timeout=120) as res, open("out.wav", "wb") as f:
    f.write(res.read())

C#

using var http = new HttpClient { BaseAddress = new Uri("http://127.0.0.1:18088/") };
var json = """{"model":"irodori-tts","input":"こんにちは。","voice":"デフォルト","response_format":"wav"}""";
using var res = await http.PostAsync("v1/audio/speech",
    new StringContent(json, Encoding.UTF8, "application/json"));
res.EnsureSuccessStatusCode();
await File.WriteAllBytesAsync("out.wav", await res.Content.ReadAsByteArrayAsync());

OpenAI の公式クライアントも使えます。base_urlhttp://127.0.0.1:18088/v1 に向け、api_key は何でもよく、 model="irodori-tts"response_format="wav" を必ず指定してください(既定の mp3 は 400 になります)。

口の一覧

何をするか
GET /health生きているか。モデルを読み込む前でも 200 を返します(下の「作法」を参照)。
GET /ywk/statusこのアプリの版・読み込みの状態(runtime.loaded)・実際に動いている GPU(device)・声の数・いま走っている合成の数(requests.in_flight)・GPU メモリ。 このアプリかどうかは、この口が 200 を返すかで見分けます(もとの Irodori-TTS-Server には無い口です)。
GET /params指定できる全パラメータの一覧=既定値・範囲・型・説明。固定表を持たず、これを読んで組んでください。モデルを読み込む前でも 200 です。
GET /v1/audio/voices声の一覧(OpenAI 互換の形)。「デフォルト」が必ず先頭にあります。
GET /ywk/voices同じ一覧に、表示名・件数・一覧が壊れているときの理由(error)を添えたもの。
POST /v1/audio/speech読み上げ。本文と声を送ると wav が 1 本返ります。

/ywk/warmup/ywk/voices/precompute はアプリの内部が使う口です。呼ばないでください。 声の登録・削除の口(POST/PUT/DELETE /v1/audio/voices)は、この配布では閉じてあります(下の「声」を参照)。 /docs(Swagger UI)はもとの Irodori-TTS-Server のまま開けます。

作法

1. 起動を待つ

2. 読み上げの本文

{"model": "irodori-tts",
 "input": "本文(1〜4096 字)",
 "voice": "声の名前(一覧の id)",
 "response_format": "wav",
 "speed": 1.0,
 "irodori": {"caption": "明るく", "num_steps": 40, "seed": 1234}}

3. 間違いは 400 で止まる

もとの Irodori-TTS-Server は、知らない項目名や範囲外の値を黙って無視します(綴りを間違えると「なぜか効かない」になります)。 このアプリはそれを 400 で止めます。エラーの本文は必ずこの形で、code で機械的に見分けられます。

{"error": {"message": "unknown field: num_step",
           "type": "invalid_request_error",
           "param": "num_step",
           "code": "ywk_unknown_field"}}
code意味
ywk_unknown_field知らない項目名(トップレベルでも irodori の中でも)
ywk_out_of_range範囲外(範囲は /paramsminmax と同じ)
ywk_type_errorywk_invalid_enum型違い・選択肢に無い値
ywk_literal_top_levelt_schedule_modedecode_modecfg_guidance_modeirodori の中にだけ置けます
ywk_voice_and_no_refywk_voice_and_referencevoice と、参照音声を直接指す項目(no_refref_wav など)を同時に送った
ywk_unsupported_response_formatwav 以外を求めた
ywk_unknown_voice一覧に無い声の名前
ywk_unknown_modelywk_empty_inputmodel が違う・本文が空白だけ
ywk_runtime_unavailable(503)読み込み中に待ちきれなかった・読み込みに失敗している
ywk_upstream_errorywk_server_errorそのほかの失敗(GPU のメモリ不足など)

エラーの本文に、利用者のパソコンのパスは入りません。message はそのまま記録に残して構いませんが、利用者に見せる文は code から組んでください。

4. 同時に 1 つずつ

パラメータの探し方

GET /params が、指定できる項目を既定値・範囲・説明つきで返します。既定値はアプリの設定を反映した「いま効いている値」なので、 固定表を持たず、この応答から画面を組んでください。よく使うのはこのあたりです。

項目(irodori の中)意味既定
captionキャプション(演技指示)。「明るく」「落ち着いて」など自由文。空なら未指定。""
num_steps品質。少ないほど速く、多いほど丁寧(アプリの「低品質(高速)」は 10・「高品質」は 40)。40
cfg_scale_text本文への追従の強さ(発音・滑舌が弱いときに少し上げる)。3.0
cfg_scale_captionキャプションの効きの強さ。3.0
cfg_scale_speaker参照音声(声の似せ方)の強さ。/params を参照
seed乱数の種。同じ種=同じ音。省くと毎回変わる。なし
speed(トップレベル)速さ 0.25〜4.0。1.0

応答の schema(いまは 1)は、項目を消したり意味を変えたりするときにだけ上げます。項目が増えるだけなら上げません。知らない項目は無視してください。 このアプリの版は GET /ywk/statusversion で分かります。

声の扱い

利用条件

この読み上げで作った音声は、Aratako 氏の Irodori-TTS-v4.1-Small の利用条件に従います。 コードとモデルは MIT ライセンスで、加えて次の Ethical Restrictions があります(原文はモデルカードにあります)。

  1. なりすまし禁止=実在する人(声優・有名人・公人など)の声を、本人の明示の同意なく複製・模倣しないこと。
  2. 偽情報禁止=人をだます目的のディープフェイクや合成音声を作らないこと。
  3. 偶然の類似=参照音声なしで作った声が、たまたま実在の人に似ることがあります。特定の人を再現する意図で学習されたものではありません。
  4. 免責=生成した内容が法令に沿うかは、使う人の責任です。開発者は誤用の責任を負いません。

もっと詳しく