メインコンテンツまでスキップ

日本語TTSを使いこなす

日本語の音声合成には、英語では起きにくい2つのつまずきがあります。

  1. 読み間違い — 「入口」が「にゅうこう」、社名が綴りどおりに読まれる
  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が返り、合成時に指定できます。

<?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] なども反応します。

実測:タグの効き方は声によって違う​

同一文「いりぐちはどちらですか?」でタグだけを差し替え、無タグとの長さ比を測りました。

tagMinaSaki所見
laughs3.0×1.7×Mina で最も強く反応
happy2.2×1.6×
sarcastic2.2×1.1×Saki ではほぼ効かない
breathless2.2×1.2×同上
questioning2.2×1.0×同上
excited2.1×1.6×両方効く
sighs1.3×2.0×Saki のみ強く反応(逆転)
cheerfully1.1×1.5×Mina ではほぼ効かない
softly1.4×1.7×
curious / whispers1.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 tageleven_v3 のみ
アクセント・韻律の精密制御手段なし(PLS の仕様外)—

誤読も抑揚の崩れもプロジェクト固有です。 見つけるたびに辞書へ1行足す運用にすれば、回を追うごとに精度が上がります。

関連​