Amazon Web Services ブログ

Amazon Polly を使用した日本語テキスト読み上げの最適化

Amazon Polly は、高度なディープラーニングテクノロジーを使用して、29 の言語および 61 の音声でテキスト入力を音声波形に変換するシステムである、テキスト読み上げ (TTS) 機能を提供するクラウドサービスです。Amazon Polly サービスは、自動コンタクトセンター、言語学習プラットフォーム、翻訳アプリ、および記事の読み上げなどのさまざまなユースケースのために音声合成を使用するデジタル製品の開発において企業をサポートしています。

Amazon Polly は現在、ポートフォリオに 2 つの日本語音声を提供しています。日本語は、その筆記体系の複雑さのために、TTS システムに多くの課題をもたらす言語です。

この投稿では、日本語が TTS に与える課題の概要、Amazon Polly がそれらの課題に対処する方法、およびカスタマーエクスペリエンスを最適化するために開発者が利用できるものについて説明します。

日本語は TTS にとって課題が多い言語

日本語の書記体系は、主に 3 つの書記法 (漢字平仮名、および片仮名) で構成されており、多くの場合、これらの書記法は同じ意味合いで使用できます。たとえば、「キャンドル」を表す単語は、漢字 (蝋燭)、平仮名 (ろうそく)、または片仮名 (ロウソク) で書くことができます。漢字は表語文字であり、平仮名と片仮名 (総称して仮名と呼ばれます) は、発音をより正確に表す音節文字です。日本語の文章には、ほとんどの場合、漢字と仮名の両方が含まれています。

この豊富な書記法により、日本語を話す人はクリエイティブに筆記することができ、熟語の読みは、構成文字 (当て字) から予想されるものとは異なる場合があります。これは、人名でさらに顕著であり、文字の連なりからその名前の発音方法を常に予測できるとは限りません。

TTS フロントエンドの最初のステップの 1 つは、文を単語に分割することです。これは、日本語においては、別の課題となります。英語では、単語をスペースで確定的に分離できるため、タスクは簡単です。日本語は、間にスペースを入れずに単語をつなぎ合わせます。そのため、単語の終わりと次の単語の始まりを予測するモデルが必要です。英語で、Applesonatable などの文字の順序を個々の単語に分解することを想像してみてください。言語的な知識に基づき、これが「Apple son at able」ではなく「Apples on a table」であることがわかります。 これを行うにはモデルに教える必要があります。

さらに、日本語の単語の発音は周囲の文脈に大きく依存します。同じ漢字の連なりの単語であっても、発音が異なり、文脈に応じて異なる意味を有することがあります (同形異義語)。これらは TTS にとって最大の課題です。次の例は、この発音の違いを示しています。

「とうきょうと」と発音される「東京都」は「東京という都市」を意味します

音声

https://aws-ml-blog.s3.amazonaws.com/polly/optimizing-japanese-polly/tokyoto-mizuki.mp3?_=49

「ひがしきょうと」は感じでは東京都ですが、実際は「京都の東」を意味します。

音声

https://aws-ml-blog.s3.amazonaws.com/polly/optimizing-japanese-polly/higashikyoto-wtag-mizuki.mp3?_=50

「いった」と発音される「行った」は、「ある場所に出かけたこと」を意味します

音声

https://aws-ml-blog.s3.amazonaws.com/polly/optimizing-japanese-polly/itta-ruby-takumi.mp3?_=51

一方で、「行った」は「おこなった」とも表現されます。

音声

https://aws-ml-blog.s3.amazonaws.com/polly/optimizing-japanese-polly/okonatta-ruby-takumi.mp3?_=52

 

「東京都に行った」は、「東京/都/に/行った」と分割でき、この場合の発音は「とうきょうとにいった」となりますが、「東/京都/に/行った」の場合の発音は「ひがしきょうとにいった」となります。 これらの両方の場合において、「行った」は「いった」と発音されます。しかし、「東京都に行った事業の報告をする」などの別の文脈では、2 番目の意味 (「何かを実行したこと」) となり、「いった」ではなく「おこなった」と発音します。「おこなった」と発音される「行った」は、「何かを実行したこと」を意味します

さらに、日本語は高低アクセントの言語であるため、高低アクセントの違いによって単語の意味に違いが生じる可能性があります。たとえば、があります。筆記された日本語には、高低アクセントが示されていません。

これらの困難に対処するために、Amazon Polly は日本の TTS システムでいくつかの機械学習 (ML) モデルを採用しています。ML モデルは、周囲の単語およびその構文 (文法) および形態 (単語構造) 情報に関する情報を使用して、単語の発音または高低アクセントおよび成句を予測します。これらのモデルは、言語のパターンを一般化するのに役立ち、合成されたことのない文の発音およびイントネーションを予測できます。

Amazon Polly のモデルの改善に継続的に取り組んでいますが、サービスが正しい発音を予測できない場合があります。人間は、書かれた文脈がほとんどわからなくても、より広い文化的または状況的知識から文脈情報を推測し、筆記された文を理解できます。これらの種類の情報の一部は現在の TTS モデルでは利用できず、またはモデルが正確な予測を行うために利用可能な情報を利用することが現時点ではできません。ネイティブスピーカーでさえ、背景知識がないことにより、正しい発音を予測するのに苦労する場合があります。これは、人名や地名について特によくあることです。たとえば、「愛」などの人気の名前には、「あい」、「めぐみ」、「まなみ」、「まな」など、少なくとも 28 通りの読み方があります。

これらの問題を回避するために、日本語テキストの発音を制御する方法がいくつかあります。

単語境界を指定して発音を制御する

単語境界を指定するだけで、目的の発音を示すことができる場合があります。たとえば、東京都 (東京という都市) は、通常「とうきょうと」と読みます。ここで、この単語は、「東京」と「都」 (「と」と発音) の 2 つの単語で構成されていると解釈できます。しかし、同じく有効な別の解釈もあります。それは、発音が「ひがしきょうと」で、「京都東部」を意味する場合です。 この単語は、「東」 (「ひがし」と発音) と「京都」の間に単語境界がある 2 つの単語で構成されていると解釈できます。明示的な単語境界マーカー <w>...</w> を適用することにより、次のように目的の発音を取得できます。

 <w>東</w><w>京都</w> 
 東<w>京都</w>
 <w>東</w>京都

音声

https://aws-ml-blog.s3.amazonaws.com/polly/optimizing-japanese-polly/higashikyoto-wtag-mizuki.mp3?_=53

振り仮名で発音を制御するこれにより、「東京都」のデフォルトの発音が上書きされ、「とうきょうと」ではなく「ひがしきょうと」と発音されるようになります。 <w>...</w> タグは、個々の単語を囲むことによって TTS の発音を制御するために使用できる SSML (音声合成マークアップ言語) の形式です。

単語境界の指定は便利ですが、文字の連なりが複数の単語で構成されている場合にのみ機能します。単一の単語 (または単一の文字) が複数の発音を有することは多々あります。たとえば、東京の地名である「日本橋」は「にほんばし」と発音されますが、大阪の同じ地名を指す場合は「にっぽんばし」と発音されます。文脈がなければ、正しい発音がわかりません。

このような場合に発音を指定する最も簡単な方法は、括弧内に振り仮名を表記することです。

日本橋(にほんばし)
https://aws-ml-blog.s3.amazonaws.com/polly/optimizing-japanese-polly/nihonbashi-brackets-mizuki.mp3?_=54″

日本橋(にっぽんばし)
音声
https://aws-ml-blog.s3.amazonaws.com/polly/optimizing-japanese-polly/nipponbashi-brackets-mizuki.mp3?_=55

振り仮名は、漢字の発音を明確にして、読み方を示すものです。漢字の後の括弧内に振り仮名が表記されているこの形式は、本や新聞で見ることができます。日本語を話す人は振り仮名に慣れているため、使用は簡単です。

ただし、テキストには振り仮名の文字列が表示されているため、ユースケースによっては望ましくない場合があります。また、振り仮名が Amazon Polly が認識する発音 (海(やま)など) のひとつと一致しない場合もうまく機能しません。これは、たとえば「七音」(どれみ)のように、標準的ではない文字の読み方をする人名の場合によくあります。

この問題を克服するために、Amazon Polly には日本語用の特別な SSML タイプ属性があり、振り仮名を使用して発音を指定できます。可能な限り発音を制御するために、この方法をお勧めします。

次の例に示すように使用して、デフォルトの発音が「にほんばし」である「日本橋」について、「にっぽんばし」の発音を強制できます。

<phoneme type="ruby" ph="にっぽんばし">日本橋</phoneme> 

音声

https://aws-ml-blog.s3.amazonaws.com/polly/optimizing-japanese-polly/nipponbashi-brackets-mizuki.mp3?_=56

この構文を使用すると、任意の振り仮名 (発音) を任意の文字の連なりに適用できます。音素タイプの ruby は、単語境界に関係なく機能します。たとえば、次の例のように、単語の一部に使用して、送り仮名なしで単語の漢字部分のみにタグを付けることができます。音素タイプは ruby と呼ばれ、通常は漢字の上または横に配置され、日本語テキストに振り仮名を表示する小さな注釈を指します。

<phoneme type=”ruby” ph=”い”>行</phoneme>った
https://aws-ml-blog.s3.amazonaws.com/polly/optimizing-japanese-polly/itta-ruby-takumi.mp3?_=57
<phoneme type=”ruby” ph=”おこな”>行</phoneme>った
https://aws-ml-blog.s3.amazonaws.com/polly/optimizing-japanese-polly/okonatta-ruby-takumi.mp3?_=58

Amazon Polly が認識する単語の発音の 1 つと振り仮名が一致しない場合、高低アクセントが予測されますが、これは正しくない場合があります。たとえば、「山」という文字に「うみ」という発音を強制することはできますが、これはこの文字の認識された発音のひとつではないため、高低アクセントは期待したものではない場合があります。

ph 属性で指定された振り仮名は、平仮名または片仮名にすることができます。ただし、振り仮名が有効な形式でない場合、指定された発音は効果がなく、システムはタグ付き文字列に対して予測されたデフォルトの発音にフォールバックします。振り仮名には数字や記号などの仮名以外の文字を含めることはできません。また、二重の長音符 (長音記号) などの一般的ではない振り仮名の使用は無効とみなされます。

次の例では、振り仮名の形式が正しくないため、有効にはなりません。

 <phoneme type="ruby" ph="にっぽんばし2">日本橋</phoneme>
 <phoneme type="ruby" ph="にっぽんばし(おおさか)">日本橋(大阪)</phoneme> 
 <phoneme type="ruby" ph="にっぽーーばし">日本橋</phoneme> 

内部に文字列なしで ruby タグを使用すると、何も合成されません。次の例は、空の音素タグを示しています。

<phoneme type="ruby" ph="にっぽんばし"></phoneme> --> Silence

発音仮名で発音を制御する

音素タイプの ruby は、高低アクセントを細かく制御できないため、十分に強力でない場合があります。高低アクセントの変更は単語の意味を変え、また、同じ単語であっても、周囲の状況に応じて異なる高低アクセントを持つことがあります。たとえば、「音声」という単語の発音は「オ’ンセー」で、単独で発音される場合は、最初の (音節) に高低アクセントが付きます。ここで、アポストロフィ記号は高低アクセントを示します。高低アクセントは、単語の高低が下がる拍を示します。「合成」という言葉は、単独の場合、アクセント無しで「ゴーセー」と発音されます。

ただし、2 つの単語が組み合わさって、「音声合成」という複合語が形成されると、高低アクセントの位置 (アポストロフィで表記されます) が移動し、複合語は「オ’ンセーゴーセー」ではなく「オンセーゴ’ーセー」と発音されます。したがって、単語の高低アクセントを予測することは、TTS にとっての課題です。ML モデルはそれを解決できますが、時々間違うこともあります。SSML alphabet 属性である x-amazon-pron-kana は、発音仮名と呼ばれる発音表記を使用しており、高低アクセントを直接かつ明示的に指定することに役立ちます。

SSML alphabet 属性である x-amazon-pron-kana を使用することによって、「毎日新聞を読む」の 2 つの読み方を区別できます。1 つは「毎日、新聞を読む」で、もう 1 つは「毎日新聞という新聞を読む」という意味です。最初のパターンは、Amazon Polly が現在予測するデフォルトの高低アクセントです。

次の例は、2 番目の高低アクセントのパターンを適用する方法を示しています。

<phoneme alphabet="x-amazon-pron-kana" ph="マイニチシ'ンブン">毎日新聞</phoneme>を読む 

音声
https://aws-ml-blog.s3.amazonaws.com/polly/optimizing-japanese-polly/mainichinewspaper-mizuki.mp3?_=59

振り仮名は必ずしも発音を正確に反映するわけではありませんが、発音仮名は反映します。たとえば、助詞の「は」は、発音仮名では「ハ」ではなく「ワ」と音声表記されます。助詞「へ」は「ヘ」ではなく「エ」、助詞「を」は「ヲ」ではなく「ヲオ」と音声表記されます。「格子」と「子牛」は、振り仮名ではどちらも「こうし」ですが、発音仮名ではそれぞれ「コーシ」と「コウシ」です。音声記号である x-amazon-pron-kana (発音仮名) は片仮名文字のセットで表記され、振り仮名に似ていますが、いくつかの点で異なります。この違いを無視すると、不自然な発音につながる可能性があります。

発音仮名では、アポストロフィはピッチが下がる位置を示します。アポストロフィがない場合、語句にはアクセントがないものとみなされます (平板アクセント)。

次の例は、高低アクセントの違いを示しています。

<phoneme alphabet=”x-amazon-pron-kana” ph=”カ’レシ”>彼氏</phoneme>
https://aws-ml-blog.s3.amazonaws.com/polly/optimizing-japanese-polly/kareshi-a1-pronkana-mizuki.mp3?_=60
<phoneme alphabet=”x-amazon-pron-kana” ph=”カレシ”>彼氏</phoneme>
https://aws-ml-blog.s3.amazonaws.com/polly/optimizing-japanese-polly/kareshi-a0-pronkana-mizuki.mp3?_=61

各単語には、最大 1 つの高低アクセントを含めることができます。ここでいう単語とは、韻律語を意味し、各単語には最大で 1 つのピッチの下げがあります。タグ付けする語句に複数の高低アクセント (ピッチの複数のピーク) があることがわかった場合は、各単語の発音仮名をスペースで区切るか、別々の音素タグにする必要があります。

次の例は、韻律語のグループ化によるイントネーションの違いを示しています。句をさまざまな方法で韻律語に分割できるため、これらはすべて同じ発音仮名を持っていますが、イントネーションが異なります。

<phoneme alphabet=”x-amazon-pron-kana” ph=”バ’ス ガスバ’クハツ”>バスガス爆発</phoneme>
https://aws-ml-blog.s3.amazonaws.com/polly/optimizing-japanese-polly/busgasexplosion-v1-takumi.mp3?_=62
<phoneme alphabet=”x-amazon-pron-kana” ph=”バ’ス ガ’ス バクハツ”>バスガス爆発</phoneme>
https://aws-ml-blog.s3.amazonaws.com/polly/optimizing-japanese-polly/busgasexplosion-v2-takumi.mp3?_=63″
<phoneme alphabet=”x-amazon-pron-kana” ph=”バスガスバ’クハツ”>バスガス爆発</phoneme>
音声
https://aws-ml-blog.s3.amazonaws.com/polly/optimizing-japanese-polly/busgasexplosion-v3-takumi.mp3?_=64


次の表は、振り仮名 (片仮名表記) と発音仮名の違いの一部をまとめたものです。
phoneme type="ruby"
とは異なり、phoneme alphabet="x-amazon-pron-kana" は周囲の単語境界を強制します。単語に送り仮名をタグ付けする場合、送り仮名を含む単語全体にタグ付けする必要があります。

彼は北欧神話に登場する神を紹介した。
振り仮名 (片仮名表記) カレハホクオウシンワニトウジョウスルカミヲショウカイシタ
発音仮名 (x-amazon-pron-kana) ホクオンワニ トジョスル カ ショカイシタ

まとめ

この投稿では、日本語の TTS システムの開発において、その筆記体系の複雑さにより生じるいくつかの課題について説明しました。このサービスでは、いくつかの ML モデルを使用して発音および高低アクセントを予測します。また、いくつかの日本語固有の SSML タグを使用することで、Amazon Polly の自然な日本語音声のコンテンツをより簡単に作成できます。この投稿の目的は、開発プロセスを高速化し、Amazon Polly での作業をより快適にすることです。Amazon Polly が提供する言語と音声の完全なリストについては、「Amazon Polly の音声」を参照してください。


著者について

Kayoko Yanagisawa は Amazon Text-to-Speech (TTS) チームのシニアリサーチサイエンティストです。Kayoko は、Amazon Polly と Amazon Alexa のための Amazon の日本語 TTS 音声のローンチに従事しました。マシンに話をさせることに取り組んでいないときは、自作したビオラの演奏を楽しんでいます。