日本語TTSを使いこなす
日本語の音声合成には、英語では起きにくい2つのつまずきがあります。
- 読み間違い — 「入口」が「にゅうこう」、社名が綴りどおりに読まれる
- 抑揚の崩れ — 文字は合っているのに、疑問文が平板に落ちる
このページは、その2つをどう直すかを 実測にもとづいて まとめたものです。 公式ドキュメントに載っていない「声ごとの効き方の違い」も含みます。
:::tip 結論から
- 読みは、送信前にかな書きへ置換するのが最も確実(発音辞書より安定)
- 抑揚は
eleven_v3の audio tag でしか触れない(発音辞書では不可能) - タグの効き方は声ごとに違う。使う声で必ず実測する :::
0. まず 1 回呼んでみる
よくある誤読は、ゲートウェイ側で先に直しています。日本語を含むテキストは合成の前にサーバー側の読み辞書を通る (「AICU」→「アイキュー」、「ChatGPT」→「チャットジーピーティー」…)ので、下の 2 本の curl は クライアント側で何もしなくても製品名を正しく読みます。
# Multilingual v2(既定): 読みはサーバー側の辞書が直す
curl -X POST https://api.aicu.ai/v1/audio/speech \
-H "Authorization: Bearer $AICU_API_KEY" \
-H "Content-Type: application/json" \
-d '{"input": "AICU API の入口はこちらです", "voice": "nao"}' \
--output v2.mp3
# v3: 同じ文に抑揚のオーディオタグを足す(タグを解釈するのは eleven_v3 だけ)
curl -X POST https://api.aicu.ai/v1/el/tts \
-H "Authorization: Bearer $AICU_API_KEY" \
-H "Content-Type: application/json" \
-d '{"text": "[excited] AICU API の入口はこちらです!", "voice": "nao", "model": "eleven_v3"}' \
--output v3.mp3
辞書は小さく、プロジェクト固有です(ゲートウェイ側の yomi 辞書)。
かな・漢字を含むテキストにだけ効き、長い語から先に置換します。辞書に無い固有名詞は、送る前に自分でかな書きに
置き換えてください。それが発音辞書より確実な理由を、このページの残りで説明します。
1. 読みを直す
発音辞書(Pronunciation Dictionary)という公式の手段
ElevenLabs は W3C の標準仕様 PLS(Pronunciation Lexicon Specification) に対応しています。
.pls ファイルをアップロードすると辞書IDが返り、合成時に指定できます。
- W3C PLS 仕様: https://www.w3.org/TR/pronunciation-lexicon/
- ElevenLabs 発音ガイド: https://elevenlabs.io/docs/best-practices/prompting/pronunciation
- 辞書アップロードAPI: https://elevenlabs.io/docs/api-reference/pronunciation-dictionaries/add-from-file
<?xml version="1.0" encoding="UTF-8"?>
<lexicon version="1.0" xmlns="http://www.w3.org/2005/01/pronunciation-lexicon"
alphabet="ipa" xml:lang="ja-JP">
<lexeme><grapheme>入口</grapheme><alias>いりぐち</alias></lexeme>
</lexicon>
読み替えには3つの方式があります。
| 方式 | 対応モデル | 日本語での実用性 |
|---|---|---|
| alias(別表記に置換) | 全モデル | △ 期待どおりに効かないことがある |
| phoneme(発音記号) | eleven_flash_v2 のみ | ✗ 多言語モデルでは使えない |
| IPA(本文に直接記述) | eleven_v3 | △ 公式も一貫性80〜90%と明記 |
実測:日本語ではかな書きが最も確実だった
入口 → いりぐち の alias を登録して合成したところ、**「にゅうぐち」**という
中途半端な読みになりました。前半だけ元の誤読が残り、部分的にしか適用されていません。
何もしない(「にゅうこう」)
PLS の alias 適用(「にゅうぐち」)
かな書きに置換(「いりぐち」)
送信前に置換してしまえば、モデルは素直に読みます。前処理が最も確実です。
YOMI = {
"AICU media": "アイキューメディア", # 複合語を先に登録する
"AICU": "アイキュー",
"ComfyUI": "コンフィーユーアイ",
"入口": "いりぐち",
"curl": "しーゆーあーるえる",
}
def apply_yomi(text: str) -> str:
for src in sorted(YOMI, key=len, reverse=True): # 長い語から置換
text = text.replace(src, YOMI[src])
return text
:::caution 長い語から置換すること
AICU を先に処理すると、AICU media が「アイキュー media」になります。
sorted(..., key=len, reverse=True) が効いているのはこのためです。
:::
AICU そのまま
アイキュー に置換
2. 抑揚を直す
発音辞書では抑揚を扱えません
W3C PLS 仕様の §1.4「What PLS does not Support」に明記があります。
The most complex features have been postponed to a future revision of this specification.
PLS が持つのは <grapheme> <phoneme> <alias> だけで、
韻律(prosody)・アクセント・イントネーションの要素は仕様に存在しません。
日本語で抑揚を触る手段は、いまのところ eleven_v3 の audio tag だけです。
audio tag の一覧
[laughs] [laughs harder] [starts laughing] [wheezing] [snorts]
[whispers] [sighs] [exhales] [sarcastic] [curious] [excited]
[crying] [mischievously]
[gunshot] [applause] [clapping] [explosion] [swallows] [gulps]
[strong X accent] [sings]
公式は「これで全部ではない、試してほしい」としており、実際に
[softly] [warmly] [happy] [breathless] [questioning] なども反応します。
実測:タグの効き方は声によって違う
同一文「いりぐちはどちらですか?」でタグだけを差し替え、無タグとの長さ比を測りました。
| tag | Mina | Saki | 所見 |
|---|---|---|---|
laughs | 3.0× | 1.7× | Mina で最も強く反応 |
happy | 2.2× | 1.6× | |
sarcastic | 2.2× | 1.1× | Saki ではほぼ効かない |
breathless | 2.2× | 1.2× | 同上 |
questioning | 2.2× | 1.0× | 同上 |
excited | 2.1× | 1.6× | 両方効く |
sighs | 1.3× | 2.0× | Saki のみ強く反応(逆転) |
cheerfully | 1.1× | 1.5× | Mina ではほぼ効かない |
softly | 1.4× | 1.7× | |
curious / whispers | 1.3× | 1.2× | 控えめ |
sighs は Mina 1.3× / Saki 2.0× と逆転しています。
公式が言う「ある声で効くタグが別の声では効かない」が、そのまま数字に出ました。
全16タグ × 2声の音源はこちらです。
- Mina:
/audio/ja-tts/tags/mina/00-none.mp3〜15-questioning.mp3 - Saki:
/audio/ja-tts/tags/saki/00-none.mp3〜15-questioning.mp3
:::note 長さは代理指標です
表の倍率は「無タグに対する再生時間の比」であり、タグが効いた度合いの目安にすぎません。
最終判断は必ず耳で行ってください。実際、cheerfully(Mina 1.1×)は
ほとんど変化が聴き取れませんでした。
:::
抑揚辞書という運用
読みが正しくても抑揚が崩れる語句は、タグを語句の直前に差し込んで矯正できます。
「いりぐちはどちらですか?」は無タグだと平板に落ちますが、
[softly] を付けると疑問文として自然に上がります。Mina / Saki の両方で確認しました。
PROSODY = {
"いりぐちはどちらですか": "softly",
}
def apply_prosody(text: str) -> str:
"""eleven_v3 専用。v2 はタグを解釈せず、そのまま読み上げてしまう"""
for phrase in sorted(PROSODY, key=len, reverse=True):
text = text.replace(phrase, f"[{PROSODY[phrase]}] {phrase}")
return text
:::danger v2 にタグを渡さないこと
eleven_multilingual_v2 は audio tag を解釈しません。
[softly] という文字列をそのまま音読してしまいます。タグは v3 専用です。
:::
組み合わせた例
Mina
Saki
[breathless] せいせいエーアイ時代に、[happy] つくる人をつくる!
[excited] げっかんアイキューのはいたつに来ました!
[curious] いりぐちは、どちらですか?
読み(かな置換)と抑揚(タグ)は別々の辞書として持つのが扱いやすいです。 読みは全モデル共通、抑揚は v3 のみ、と適用範囲が違うためです。
3. まとめ
| やりたいこと | 手段 | 対応モデル |
|---|---|---|
| 固有名詞・熟字訓の読み | 送信前にかな書きへ置換 | 全モデル |
| 発音辞書を使いたい | PLS(.pls)をアップロード | 全モデル(日本語では不安定) |
| 抑揚・感情 | audio tag | eleven_v3 のみ |
| アクセント・韻律の精密制御 | 手段なし(PLS の仕様外) | — |
誤読も抑揚の崩れもプロジェクト固有です。 見つけるたびに辞書へ1行足す運用にすれば、回を追うごとに精度が上がります。
関連
- 音声 API — エンドポイントと長文の扱い
- キャラクター活用API — AiCuty キャラクターボイス