Twilio ConversationRelay の Amazon Polly の発音を SSML タグで少し改善できた話

Twilio ConversationRelay の Amazon Polly の発音を SSML タグで少し改善できた話

Twilio ConversationRelay で Amazon Polly (Takumi-Neural) を使った日本語音声 AI を構築した際、カタカナ複合語のイントネーションに違和感がありました。SSML タグで改善を試みた結果、break と phoneme の組み合わせが有効でした。
2026.02.18

はじめに

Twilio ConversationRelay では、Amazon Polly を使用した音声合成 (Text-to-speech, TTS) が標準で利用できます。

Polly の日本語ニューラル音声 (Neural voice) は全体的に自然な発音をしてくれますが、一部の語句でイントネーションに違和感が残ります。特に気になったのは、長いカタカナ複合語や漢字とカタカナが混ざった語句です。

たとえば「プレミアティアサービスパートナー」はひとつの複合語として滑らかに読まれず、各パーツが分断されたような抑揚になります。「全サービス」も「ぜん」の部分のピッチアクセントが不自然で、固有名詞のように聞こえてしまいます。

電話応対の音声としてはこうした細かい違和感が気になるため、SSML タグによる改善を検証しました。本記事ではその試行錯誤と得られた知見を共有します。

検証環境

検証環境は以下の通りです。

項目 内容
WebSocket サーバ API Gateway WebSocket API + Lambda (Node.js)
LLM Amazon Bedrock (Claude Haiku 4.5)
TTS Twilio ConversationRelay 経由で Amazon Polly (Takumi-Neural)

ConversationRelay では、WebSocket サーバから送信する token フィールドに SSML タグをそのまま含められます。今回の環境では <speak> タグで囲まなくても動作しました。

{
  "type": "text",
  "token": "ご説明します。<break time=\"300ms\"/>AWS全サービスが対象です。"
}

この仕組みを利用して、Bedrock の LLM が生成するテキストに SSML タグを含めることで発音の改善を試みました。

SSML タグの試行錯誤

<break> タグ: 句読点後に有効、複合語の分割は逆効果

最初に試したのは <break> タグです。句点の直後に <break time="300ms"/> を挿入したところ、文の区切りに適度なポーズが生まれ、聞き取りやすくなりました。

AWS全サービスが7%割引になります。<break time="300ms"/>
24時間365日の日本語サポートが付いてきます。<break time="300ms"/>

一方で、長いカタカナ複合語の意味の区切りに短い <break> を挿入する試みは失敗しました。

「プレミアティア<break time="100ms"/>サービス<break time="100ms"/>パートナー」

100ms という短い <break> でも、Polly は文の境界として解釈します。結果として「プレミアティア。サービス。パートナー。」のように、各パーツが独立した文のイントネーションで読み上げられ、SSML なしよりも悪化しました。

<phoneme> タグ: ピッチアクセントの制御に有効

Amazon Polly の日本語ニューラル音声では、<phoneme>alphabet="x-amazon-pron-kana" を使ってピッチアクセントを指定できます。

<phoneme alphabet="x-amazon-pron-kana" ph="プレミアティアサービスパー'トナー">プレミアティアサービスパートナー</phoneme>

ph 属性にカタカナで読みを書き、ピッチが下がるモーラの直前にアポストロフィ (') を置きます。この指定により、Polly は指定通りのアクセントパターンで読み上げます。「プレミアティアサービスパートナー」がひとつの複合語として自然な抑揚で発音されるようになりました。

最終的な構成と LLM 出力例

最終的には次のような構成に落ち着きました。

タグ 用途
<break time="300ms"/> 句点の直後に挿入
<break time="200ms"/> 読点の直後に挿入
<phoneme alphabet="x-amazon-pron-kana"> カタカナ複合語や漢字+カタカナ混合語のアクセント指定

英語略語 (AWS, API 等) にはタグを使わず、Polly のデフォルト処理に委ねます。<sub><lang> は日本語ニューラル音声で副作用があるため使用しません。

LLM の出力例

LLM が実際に出力した例は以下の通りです。

クラスメソッドメンバーズは、AWS総合支援サービスです。<break time="300ms"/>
2014年からAWS最上位の<phoneme alphabet="x-amazon-pron-kana"
ph="プレミアティアサービスパー'トナー">プレミアティアサービスパートナー
</phoneme>に認定されており、10年以上で累計5,000社以上にAWSの構築・運用支援を
行っています。<break time="300ms"/>
<phoneme alphabet="x-amazon-pron-kana" ph="ゼ'ンサービス">全サービス
</phoneme>が7%OFF、24時間365日の日本語サポート、
そして<phoneme alphabet="x-amazon-pron-kana" ph="クラウドホ'ケン">クラウド保険
</phoneme>が無料で付いてきます。<break time="300ms"/>
他にご不明な点はございますか?

SSML なしの場合と比べ、カタカナ複合語のイントネーションが改善されました。<break> による適度なポーズも加わり、電話応対としての聞き取りやすさが向上しました。

まとめ

Twilio ConversationRelay + Amazon Polly (Takumi-Neural) の日本語音声に対して、SSML タグによる発音改善を検証しました。

結果として、<break> による句読点後のポーズ挿入と、<phoneme> によるカタカナ複合語のピッチアクセント指定の組み合わせが有効でした。一方で <sub><lang> などのタグは日本語ニューラル音声では副作用が大きく、使用を断念しています。

今回の検証では特定の語句 (「プレミアティアサービスパートナー」「全サービス」等) に対して改善が確認できましたが、ドメイン固有の用語が増えるにつれ、いかにプロンプトで例示するかが課題になります。

この記事をシェアする

FacebookHatena blogX

関連記事