こんにちは!エンジニアの岩間です。
Amazon Connectや、Amazon Lex を使ったボイスボット開発で「なんかイントネーション変だな、、、」と思ったことはありませんか?
これらのサービスではデフォルトでAmazon Pollyを使用して音声を合成しますが、テキストをそのまま読み上げると、意図しない抑揚になったり、語尾が不自然に強調されたりすることがあります。
本記事では、SSMLタグを活用してイントネーションを自然に改善する方法と、Amazon Connect・Lex での具体的な設定方法を紹介します。
SSMLの基本については公式ドキュメントをご参照ください。
Amazon ConnectやLexの構築方法について興味のある方は以下の過去記事をご覧ください。
Amazon Pollyの音声を自然な日本語に改善してみる
早速Amazon Pollyの音声を自然な日本語へと改善していきましょう!
最初に、「ご案内」という単語を例に挙げてみます。Pollyがデフォルトで読み上げると、
1 |
それでは本日のご案内は以上となります。 |
上記のように「ゴアンナイ」と平坦に発音され、実際の日本語の自然な抑揚と異なります。
そこで、以下のように<phoneme>
タグを使ってイントネーションを改善してみます。
1 |
<speak>それでは本日の<phoneme alphabet="x-amazon-pron-kana" ph="ゴアンナ'イ" >ご案内</phoneme>は以上となります。</speak> |
ゴアンナ’イ
のアポストロフィーは、高低アクセントの「下がり目」を表します。
phonemeタグについては、AWS公式ブログでも詳しく解説されているので、是非チェックしてみてください!
他にも、<prosody>
タグを使って音の速度や大きさも制御できます。
1 2 3 4 5 6 |
<speak> <prosody rate="slow">ゆっくり話します。</prosody> <prosody rate="fast">早めに話します。</prosody> <prosody volume="x-soft">静かな声で話します。</prosody> <prosody volume="x-loud">大きな声で話します。</prosody> </speak> |
さらに、<break>
タグを使って会話に自然な間を入れることもできます。
1 |
<speak>お名前を教えてください。<break time="700ms"/> 山田さんですね。</speak> |
ここからはちょっとした裏技です。
Pollyは句読点の位置でもポーズや抑揚が変わります。たとえば読点(、)なしの場合は以下のように「カブシキカイシャ」と発音し、「ギークフィード」のイントネーションにも違和感があります。
1 |
こちらは株式会社ギークフィードです。 |
そこで、株式会社の直後に読点(、)を追加すると、「カブシキガイシャ」と発音し、「ギークフィード」のイントネーションも違和感なく発音されています。
1 |
こちらは株式会社、ギークフィードです。 |
また、口座番号や電話番号を確認するシーンもあるかと思います。
1234のような数字の列を読点(、)で区切って読み上げると、間が短くなりすぎて聞き取りづらくなることがあります。
1 |
口座番号は、1、2、3、4でお間違いないでしょうか? |
このような場合、読点(、)の代わりに句点(。)を使うことでポーズが入り、聞きやすくなることがあります。
1 |
口座番号は、1。2。3。4でお間違いないでしょうか? |
SSMLタグは他にも色々種類があります。詳しくはこちらをご覧ください。
Amazon Connectを使用する際は、一部のSSMLタグがサポートされていませんので、ご注意ください。
SSMLの設定方法
ここからはAmazon Connect、LexでのSSML設定方法についてご紹介します。
Amazon Connect
Amazon Connectの場合、フローエディタの「プロンプトの再生」ブロックなどで、解釈タイプを「SSML」にすることで設定可能です。
Amazon Lex
Amazon Lexの場合、インテント画面内のスロットの「詳細オプション」から設定できます。
CDK
CDKを使ってLexボットを構築する場合、ssmlMessage
を設定することで、SSMLタグ付きのテキストの記述が可能になります。以下は設定例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
const chatbot = new lex.CfnBot(this, "ChatBot", { name: "SampleBot", roleArn: lexRole.roleArn, dataPrivacy: { ChildDirected: false }, idleSessionTtlInSeconds: 300, autoBuildBotLocales: false, botLocales: [ { localeId: "ja_JP", nluConfidenceThreshold: 0.8, intents: [ { name: "SampleIntent", sampleUtterances: [ { utterance: "サンプル" }, ], slots: [ { name: "TestSlot", slotTypeName: "AMAZON.FreeFormInput", valueElicitationSetting: { slotConstraint: "Required", promptSpecification: { allowInterrupt: false, messageGroupsList: [ { message: { ssmlMessage: { // ここで設定 value: `<speak>はじめに次にご登録いただいている<phoneme alphabet="x-amazon-pron" ph="ケイヤクシャサマ" />契約者様<phoneme alphabet="x-amazon-pron" ph="ケイヤクシャサマ" />の生年月日について西暦でお聞かせください。</speak>`, }, }, }, ], maxRetries: 2, }, }, }, ], }, ], voiceSettings: { voiceId: "Takumi", }, }, ], }); |
さらに、LexのLambdaハンドラーでSSMLを返すこともできます。
以下はFulfilled状態でSSML応答を返す記述例です。
1 2 3 4 5 6 7 8 9 10 11 12 |
static closeResponse = (sessionState: any): lambda.LexV2Result => { sessionState.intent.state = 'Fulfilled'; sessionState.dialogAction = { type: 'Close' }; return { sessionState, messages: [{ contentType: 'SSML', '<speak>それでは本日の<phoneme alphabet="x-amazon-pron-kana" ph="ゴアンナ'イ" >ご案内</phoneme>は以上となります。</speak>' }] }; }; |
まとめ
ちょっとした工夫で、ボイスボットの印象はぐっと良くなります!
Nova Sonicなどの新しい音声合成技術も登場しており、今後ますますText to Speechの進化が楽しみですね。
ここまでお読みいただきありがとうございました!


- Amazon PollyのSSMLを使って日本語のイントネーションを自然にする - 2025-05-07
- [会話型AI活用]Amazon LexとConnectでシーン別にお花をレコメンドする仕組みを作ってみた - 2024-12-23
- FreePBXで留守電メッセージをメール通知するまでの設定手順 - 2024-12-16
- Amazon Connect最初の一歩!シンプルなコールセンターを構築してみた - 2024-12-06
- 電子工作で自作した植物の自動水やり機から土壌データをAWS IoT Coreに連携してみた - 2024-09-13
【採用情報】一緒に働く仲間を募集しています
