Amazon PollyのSSMLを利用し、住所を自然な日本語の発音になるようチューニングしてみた

2024.03.27

はじめに

Amazon Pollyは、深層学習を使用したテキスト読み上げサービスで、SSML (Speech Synthesis Markup Language)タグを使うことで、音声の様々な側面をカスタマイズできます。例えば、発音、話速、ピッチ、ボリューム、一時停止の長さなどを調整可能です。

Amazon Connectでは、音声出力にAmazon Pollyが採用されております。

しかし、住所名を読み上げる際に不自然な発音になることがあったため、SSMLを利用して自然な日本語の発音となるようチューニングを行いました。

今回は、以下の架空の住所を例に、SSMLタグを使ってどのように発音をカスタマイズできるかを解説します。

  • 沖縄県宜野湾市真志喜1-1-1 アパート真志喜301号室

この住所を読み上げエンジンのニューラルタイプで発音させると、以下のようになります。ニューラルタイプは標準エンジンより自然で人間に近い音声です。

<speak>
    沖縄県宜野湾市真志喜1-1-1 アパート真志喜301号室
</speak>

この音声出力で、問題点がいくつかあります。

  • 「沖縄県宜野湾市」の発音が不自然
  • 「1-1-1」とアパート名の「アパート」が続けて発音され、アパート名と「301号室」の間で一拍置かれる
  • 「沖縄県宜野湾市真志喜」の「真志喜」は「ましき」と正しい読み方だが、「アパート真志喜301号室」の「真志喜」は「まさしき」と間違った読み方
  • 音声の速度が早い

これらの問題を解決するため、Amazon ConnectでサポートされているSSMLタグを使ってチューニングを行いました。

ブレがある

理由は不明ですが、同じ地名と住所形式でも、マンション名の号室番号が異なると発音が変わるというブレがありました。

  • 301号室の場合: 「アパート真志喜301号室」の「真志喜」が「まさしき」と間違った読み方

  • 101号室の場合: 「アパート真志喜101号室」の「真志喜」が「ましき」と正しい読み方

<speak>
    沖縄県宜野湾市真志喜1-1-1 アパート真志喜101号室
</speak>

また、市町村名が異なると発音が変わりました。

  • 宜野湾市の場合: 「沖縄県宜野湾市」が途切れずに発音
  • 那覇市の場合: 「沖縄県」の後にわずかに一拍置かれ、「那覇市」が区切られて発音。聞き取りやすいです。
<speak>
    沖縄県那覇市真志喜1-1-1 アパート真志喜301号室
</speak>

このようなブレが生じる理由は不明ですが、おそらくAmazon Pollyのニューラル音声エンジンの仕様によるものと考えられます。AIサービスには一定の不確実性があり、実際に試さないと分からない部分があります。

そのため、住所発音のようなきめ細かい制御が必要な場合は、SSMLタグを使ってあらかじめ発音をコントロールしておく必要があります。そうすれば、このようなブレを防ぎ、安定した自然な発音を実現できます。

結論

SSMLタグを使用し、以下の設定にすると、先程の問題が解決されました。

<speak>
    <prosody rate="slow">
        沖縄県<break strength="medium"/>宜野湾市<break strength="medium"/><phoneme alphabet="x-amazon-yomigana" ph="ましき">真志喜</phoneme><break strength="medium"/>1-1-1<break strength="medium"/>アパート<phoneme alphabet="x-amazon-yomigana" ph="ましき">真志喜</phoneme><break strength="medium"/>301号室
    </prosody>
</speak>

使用しているSSMLタグと内容は以下の通りです。

  • <prosody rate="slow">: 話す速度を遅くする
  • <break strength="medium"/>: 中程度の一時停止を入れる
  • <phoneme alphabet="x-amazon-yomigana" ph="ましき">: 指定した発音記号で発音する。今回は「ましき」

一つ一つの設定について解説します。

発声を特殊なタイプに指定

<say-as> タグを使い、addressを指定すると、住所としてテキストを解釈します。しかし、使ってみても「まさしき」と発音されてしまいましたので、利用しませんでした。

<speak>
    <say-as interpret-as="address">
        沖縄県宜野湾市真志喜1-1-1 アパート真志喜301号室
    </say-as>
</speak>

話す速度

<prosody rate="速度">で話す速度を調整できます。

速度は正のパーセンテージか、x-slow、slow、medium、fast、x-fastなどの事前定義値で指定できます。

今回は聞き取りやすさからslowを採用しています。

<speak>
    <prosody rate="slow">ゆっくり発話</prosody>
</speak>

一拍置く

<break strength="強さ"/>で一時停止の強さを指定できます。

値には以下が設定可能です。

  • none: 一時停止しません。none は、ピリオドの後などに通常発生する一時停止を削除する場合に使用します。
  • x-weak: noneと同じ強度で一時停止しない
  • weak: カンマ後と同じ長さの一時停止を設定します。
  • medium: weak と同じ強度です。
  • strong: 文の後と同じ長さの一時停止を設定します。
  • x-strong: 段落後と同じ長さの一時停止を設定します。
<speak>
    沖縄県<break strength="medium"/>宜野湾市真志喜
</speak>

「沖縄県宜野湾市」がつながって発話されていましたが、一拍置くことで聞き取りやすくなりました。

<break strength="medium"/>は、ドキュメントにも記載されている通り、カンマ()でも同等の効果があります。

沖縄県、宜野湾市真志喜

また、一拍置くタグは、他にも以下があります。

  • <s>:文章間に一時停止を追加する
  • <p>:段落間に一時停止を追加する

しかし、<s><p>は、<break strength="x-strong"/>を使用した一時停止の指定と同等のため、<break strength="medium"/>もしくはカンマの方が自然と感じました。

<speak>
    沖縄県<p>宜野湾市</p>真志喜
</speak>
<speak>
    沖縄県<s>宜野湾市</s>真志喜
</speak>

発音記号を使用する

<phoneme>タグでは、発音記号を指定して発音を制御できます。

<phoneme alphabet="x-amazon-yomigana" ph="ましき">と指定すると「ましき」と発音されます。

<speak>
    沖縄県宜野湾市<phoneme alphabet="x-amazon-yomigana" ph="ましき">真志喜</phoneme>1-1-1アパート<phoneme alphabet="x-amazon-yomigana" ph="ましき">真志喜</phoneme>301号室
</speak>

ちなみに、地名をひらがなにした場合、以下のように、丁と番地と号が「1から1から1」と発音されます。おそらく、住所と認識されなかったためだと推測します。

<speak>
    沖縄県宜野湾市ましき1-1-1アパートましき301号室
</speak>

addressを利用しましたが、変わらず「1から1から1」と発音されました。

<speak>
    <say-as interpret-as="address">
        沖縄県宜野湾市ましき1-1-1アパートましき301号室
    </say-as>
</speak>

しかし、カタカナを利用すると、丁と番地、号が「1の1の1」と発音されました。

<speak>
    沖縄県宜野湾市マシキ1-1-1アパートマシキ301号室
</speak>

このあたりは、AIサービスということもあり、実際に試さないと分からないものですね。

動的にするには?

本文中で説明したように、SSMLタグを使えば住所の発音をきめ細かく制御できます。実際のコールセンターでは固定された住所ではなく、様々な住所を発話する必要があります。

以下の設定をすると、比較的様々な住所に対して自然な発音が実現できるはずです。

  • 住所名はゆっくりと話す
    • <prosody rate="slow">
  • 市区町村ごとに一拍置く。マンション名の前や部屋番号の前に一拍置く。
    • <break strength="medium"/>
  • 地名は、発音記号を使用する
    • <phoneme alphabet="x-amazon-yomigana" ph="地名">

さらに、住所の構造を解析し、動的にSSMLタグを生成するロジックを実装すれば、より汎用的な対応が可能になるでしょう。例えば、以下のようなロジックが考えられます。

  • <prosody> タグで話速を調整
  • 住所文字列から市区町村名と地名、番地、マンション名を抽出
    • 市区町村名と地名の前後に <break> タグを挿入
    • 地名に <phoneme> タグを挿入

最後に

今回はAmazon PollyのSSMLを活用し、住所名の発音を自然な日本語となるようチューニングしました。AIサービスには不確実な部分もあり、実際に試さないと分からないことも多くありましたが、SSMLを使えばきめ細かい発音制御が可能です。

本事例が参考になれば幸いです。今後もAIサービスの発展に伴い、より自然な発音の実現が期待できそうです。