Amazon Pollyで使えるSSMLまとめ #reinvent

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

AWS re:Invent 2016で発表されたAI三兄弟。Amazon RekognitionAmazon Pollyも超楽しいです。毎日触ってます。

今日はAmazon Pollyで使えるSpeech Synthesis Markup Language (SSML)について確認してみました。なおAmazon PollyはSSML Version 1.1に準拠しています。

SSML解説

speak

SSMLのルートとなるタグです。最もシンプルなSSMLはspeakタグで文字列を囲むだけです。

<speak>これはSSMLの例です。</speak>

なお、speakにxml:langを書くことで、読み上げ言語を強制できます。以下の例だとen-USに設定しているため、日本語文書は無視されます。

<speak xml:lang="en-US">これはSSMLの例です。</speak>

lang

langタグで囲んだ文章に対し言語を指定します。上記の例でxml:lang="en-US"を指定した場合は文章内の日本語は無視されましたが、日本語の所だけlangで日本語を指定すれば、全文が読み上げされます。

<speak xml:lang="en-US"><lang xml:lang="ja-JP">これは</lang>SSML<lang xml:lang="ja-JP">の例です。</lang></speak>

sub

subタグで囲んだ文章はaliasで指定された文章に置換されます。

<speak>私たちは<sub alias="くらめそ">Classmethod</sub>です。</speak>

emphasis

emphasisは文章読み上げの強調について設定します。オプションとしてlevelの指定があり、4段階で指定できます。

<speak>普通。
<emphasis level="strong">強い強調。</emphasis>
<emphasis level="moderate">ほどほどの強調。</emphasis>
<emphasis level="none">強調しない。</emphasis>
<emphasis level="reduced">弱い。</emphasis>
</speak>

break

breakタグは文章読み上げの韻律の境目、または休止を設定します。オプションとしてstrengthとtimeの指定があります。strengthは韻律の境目の強弱を6段階で指定できます。

<speak>
休止無し。<break strength="none" />
とても弱い。<break strength="x-weak" />
弱い。<break strength="weak" />
中間。<break strength="medium" />
強い。<break strength="strong" />
とても強い。<break strength="x-strong" />
</speak>

timeでは休止を秒(s)またはミリ秒(ms)で設定します。

<speak>
10ミリ秒休止。<break time="10ms" />
1秒休止。<break time="1s" />
5秒休止。<break time="5s" />
はい!
</speak>

prosody

prosodyタグは音声出力のピッチ、読み上げ速度、音量の設定が出来ます。 ピッチはpitchオプションで設定します。6段階あります。

<speak>
<prosody pitch="default">標準。</prosody>
<prosody pitch="x-low">とても低い。</prosody>
<prosody pitch="low">低い。</prosody>
<prosody pitch="medium">中間。</prosody>
<prosody pitch="high">高い。</prosody>
<prosody pitch="x-high">とても高い。</prosody>
</speak>

読み上げ速度はrateオプションで設定します。こちらも6段階あります。

<speak>
<prosody rate="default">標準。</prosody>
<prosody rate="x-slow">とても遅い。</prosody>
<prosody rate="slow">遅い。</prosody>
<prosody rate="medium">中間。</prosody>
<prosody rate="fast">早い。</prosody>
<prosody rate="x-fast">とても早い。</prosody>
</speak>

音量はvolumeオプションで設定します。設定は+XXdBか-XXdBといった数値、あるいは用意された7段階です。silentの場合は読み上げされません。

<speak>
<prosody volume="default">標準。</prosody>
<prosody volume="x-soft">とても小さい。</prosody>
<prosody volume="soft">小さい。</prosody>
<prosody volume="medium">中間。</prosody>
<prosody volume="loud">大きい。</prosody>
<prosody volume="x-loud">とても大きい。</prosody>
<prosody volume="silent">無音。</prosody>
<prosody volume="-10dB">マイナス10デシベル。</prosody>
<prosody volume="+10dB">プラス10デシベル。</prosody>
</speak>

これらのオプションは組み合わせが可能です。

<speak>
<prosody pitch="x-high" rate="x-fast" volume="x-loud">
シルクドソレイユ いつまでそれ言う?<break strength="weak" />
飲んだら睡眠 そしたら<sub alias="もーにん">Morning!</sub><break strength="weak" />
サーカスを見ずに水かけられたよ<break strength="weak" />
俺は<sub alias="おーぐり">Oguri</sub>、これにはビックリ<break strength="weak" />
</prosody>
</speak>

say-as

タグでは文章に対する情報を記載します。フォーマットを定義するものです。今は日付フォーマットを記載した例です。

<speak>
今日は<say-as interpret-as="date" format="ymd">2016/12/23</say-as>です。
</speak>

まとめ

上記で大体カバーできていると思いますが、不足があれば是非教えてください。結構細かく指定が可能なことがお分かり頂けましたでしょうか。これに加えLexiconsを使えばかなり人間に近い読み上げができるかと思います。