Amazon Polly 音声合成チューニング入門

ジャーニーマン( @beajourneyman )です。長いの"ジャニ"と呼ばれています。

この記事は [セゾンテクノロジー Advent Calendar 2024](https://qiita.com/advent-calendar/2024/saison-tech) シーズン3、1日目の記事です。

業務で Amazon Polly のプロダクション向けの音声を合成しています。音声合成チューニングの勘所についてデモを交えて何度か登壇したので、スライドのエッセンスを抽出して読み物としてまとめます。巻末に関連ブログも掲載しておくので、良かったらご覧ください。

# Amazon Polly とは

深層学習(ディープラーニング)を使用したAWSのテキスト読み上げサービスです。複数言語に対応しており、日本語にも対応しています。合成音声にはそれぞれ“人名“がついていて、声色が異なるいくつかの男性・女性のバージョンが存在します。

https://aws.amazon.com/jp/polly/

ただ「日本語は、その筆記体系の複雑さのために、TTS システムに多くの課題をもたらす言語です。」と以下のブログにある通り、日本語は、Polly にとって非常に扱うコトが難しい言語です。非常に充実した解説ブログなので、プロダクションで音声合成チューニングをされる方は必読の内容です。是非、ご覧ください。

https://aws.amazon.com/jp/blogs/news/optimizing-japanese-text-to-speech-with-amazon-polly/

# 音声エンジンの種類とチューニングなし音声のデモ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155285/514586c4-9638-c10f-8596-b5d943ea8bb8.png)

デモをお聞きいただく前に、音声エンジンの種類をご説明します。Polly全体では4種類あるのですが、日本語はスタンダートとニューラルの2種類だけ一般提供されています。画面の通り英語ではすでにロングフォームと生成がリリースされており、実際に聞くと非常に優れた性能を発揮します。日本語の登場が待ち遠しいです。

* スタンダート：自然な音声を生成します。
* ニューラル：スタンダードエンジンよりも自然で人間に近い音声を生成します。
* ロングフォーム：長時間のコンテンツのために、極めて自然な音声を生成します。
* 生成：生成 AI を使用して、最も表現力豊かで適応性の高い音声を生成します。

スタンダード音声のデモをご紹介します。マネージメントコンソールで「自然な」と紹介されていますが、新しくリリースされる度、音声の性能は飛躍的に上がっており、ロボット音声という印象です。デモでご確認ください。

https://note.com/beajourneyman/n/n25d71eb2df9a

与えているテキストはこちらです。
```
JAWS-UG、SORACOMUG 共催クラウドお遍路、開催おめでとうございます！
```
続いて”チューニングしていない”ニューラル音声です。お聞きください。

https://note.com/beajourneyman/n/n046bba3287c8

いかがでしょうか？ チューニングの必要性をご理解いただけたかと思います。

# 音声合成チューニング手法とチューニングした音声のデモ

音声合成マークアップ言語(SSML:Speech Synthesis Markup Language)によるチューニングを行います。ピッチ、発音、読み上げ速度、音量などのテキスト読み上げの出力属性を微調整するために使用できる XML ベースのマークアップ言語です。以下に、サポートされているタグがまとまっています。

https://docs.aws.amazon.com/ja_jp/polly/latest/dg/supportedtags.html

プロダクションレベルで頻出のタグは以下の3つです。お客様納品している合成音声もこちらで実装しています。※小文字の＜がマークダウン記法だと表の中で干渉するので、半角スペースを入れていますが、SSMLを書く際は不要です。

| タグ | 用途 | ユースケース |
| :-- | :-- | :-- |
| < break time="0.1s"/> | ブレイク(間)を入れる。 | 連続で話すコトで不自然に感じてしまうケースで非常に有効。0.05秒などコンマ2単位でチューニングする。 |
| < p>< /p> | 明確に文章の区切りを入れる。 | 区切りを入れないと、人間だと息継ぎをしているようなケースも一気に発話してしまい。違和感になる。 |
| < phoneme alphabet="x-amazon-pron-kana" ph="オヘ'ンロ">お遍路</phoneme> | 読み上げを制御する。アクセントを入れられる。 | タグ名は"フォネーム"と読んでいる。漢字読み上げ、イントネーションを制御できる。尚、標準語・関西弁などの指定はできない。 |

では、実際にチューニングした音声をお聞きください。

https://note.com/beajourneyman/n/n321d8c7c50fc

意図した読み上げになりました。与えているSSMLは以下の通りです。コンソールの「入力テキスト」欄にの右の切替でSSMLにして、以下のコードをペーストするとお試しいただけます。

```SSML
<speak> 
<phoneme alphabet="x-amazon-pron-kana" ph="ジョーズ'">JAWS</phoneme>
<phoneme alphabet="x-amazon-pron-kana" ph="ユージ'ー">-UG</phoneme>、<break time="0.05s"/> 
<phoneme alphabet="x-amazon-pron-kana" ph="ソラコムユージ'ー">SORACOMUG</phoneme>、共催、 
<p><phoneme alphabet="x-amazon-pron-kana" ph="クラウドオヘ'ンロ">クラウドお遍路</phoneme>、開催おめでとうございます！</p> 
</speak>
```
ご紹介したブレーク、区切り、読み上げ(フォネーム)を駆使して実装しています。このように日本語はアルファベット、ひらがな、カタカナ、漢字、そして同一漢字でも読み上げが違う、同じ表音でもイントネーションが異なるなど、読み上げにとってもは非常に複雑な体系になっています。良かったら、実際に Polly を触って試してみてください。

# 関連ブログ

Amazon Polly で音声合成して Amazon Connect の音声プロンプトを実装する際に都度調べたりする手間を省くために備忘録をまとめてあります。滅多に日本語のアップデートがないため、更新していません。ただ、最近、日本語以外では期待が持てるアップデートあるので、追記しても良さそうです。

https://qiita.com/beajourneyman/items/047fe1da0411d05e1799

プロジェクト管理視点で、音声合成案件の見積について標準化した工夫ポイントをまとめています。

https://qiita.com/beajourneyman/items/14a86305b97a0b653a58

# まとめ

* Polly にとって日本語の読み上げは難しくチューニングが肝
* プロダクションレベルで必要なSSMLタグは3つ
* 実音声を聞いて行う微調整が非常に重要

今回は Amazon Polly の音声合成チューニングの入門をご紹介しました。デモを掲載しているので、違いを聞きくらべて体感いただけると嬉しいです。ご参考になれば幸いです。

以上です。