Skip to main content
日本語の文章には、文脈によって読み方が変わる漢字、数字、記号、単位が多く含まれています。
これらをそのまま音声化すると、意図しない発音になる場合があります。
この問題を軽減するために、Supertone Text-to-Speechでは日本語向けの**正規化テキスト(normalized text)**機能を提供しています。
元の文章と発音を考慮して正規化されたテキストを併せて入力することで、より自然で安定した音声を生成できます。
このガイドでは、正規化テキストの考え方、利用すべき場面、そして生成方法について説明します。

Why Normalized Text Is Needed

日本語の表記と実際の発音は、必ずしも一対一で対応していません。 漢字には複数の読み方があり、数字は文脈によって読みが変わり、記号や単位は音声では展開して読まれることが一般的です。そのため、元のテキストだけでは正しい発音を推測するのが難しい場合があります。 正規化テキストは、「どのように発話されるべきか」を明示的に示すことで、この問題を補完します。

How It Works

音声生成時には、以下の2つのテキストを使用します。
  • 漢字と仮名が混在した自然な日本語の原文テキスト
  • 発音を基準に変換された正規化テキスト
TTSエンジンはこれらを併用し、
原文は意味と文脈を保持し、正規化テキストは発音をガイドします。
正規化テキストが提供されない場合は、原文のみを使用して音声を生成します。

When You Should Use Normalized Text

正規化テキストは、以下のような場合に特に有効です。
  • 数字やパーセンテージを含む文章
  • 単位表現を含む文
  • 記号や略語が含まれる場合
  • 複数の読み方を持つ漢字
  • 日本語と英語が混在する表現
ナレーション、案内音声、オーディオブック、キャラクターボイスなど、発音の正確さが重要な用途では使用を推奨します。
短い会話文などでは必須ではありません。

Generating Normalized Text with LLMs

多くのワークフローでは、TTS APIを呼び出す前に、LLMを使用して正規化テキストを事前に生成します。 以下は、日本語テキストを発音用に正規化するための推奨プロンプトです。
このプロンプトは、TTSリクエストでそのまま使用できる構造化されたJSON出力を生成します。
You will receive a Japanese sentence that may contain kanji, numbers, symbols, and units.
For the given input, provide:
- the original text (natural Japanese text using standard kanji–kana mixed notation, without furigana)
- the normalized text, converted according to the rules below.

Important:
- You must respond only with pure JSON format.
- Do not include any explanations or additional text.
- In original_text, do not include furigana (ruby annotations).

Response Format

{
  "original_text": "[natural Japanese Text]",
  "normalized_text": "[converted Text]"
}

Transcription Conversion Rules
1. Convert all kanji into hiragana using context-appropriate readings.
2. Keep katakana as is.
3. Preserve punctuation exactly as written.
4. Convert Arabic numerals into hiragana.
5. Expand units and English abbreviations into full katakana forms.
6. Apply natural phonological changes such as gemination and sound alternations.

Conversion Examples

{
  "original_text": "今日はどんな一日だったの?",
  "normalized_text": "きょうはどんないちにちだったの?"
}

{
  "original_text": "今日は10%オフだよ。身長は170cm、体重は60kgだって!",
  "normalized_text": "きょうはじゅっパーセントオフだよ。しんちょうはひゃくななじゅっセンチメートル、たいじゅうはろくじゅっキログラムだって!"
}