Amazon Alexaで自然な発話をする方法

# はじめに

先日、自作したAlexa Skillが公開されました。

## 日本郵便番号

![IMG_0534.jpg](https://qiita-image-store.s3.amazonaws.com/0/4529/169ab0c2-85a1-39e1-26e4-fe99e187d23d.jpeg "IMG_0534.jpg")

このスキルを作ったときにこんな発話がありました。

````
岡山県岡山市南区の郵便番号は709-1234です。他の郵便番号を調べますか？
```

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">AlexaのSSMLを使った発話 その１ <a href="https://t.co/L4bRr9Dh3K">https://t.co/L4bRr9Dh3K</a> <a href="https://twitter.com/YouTube?ref_src=twsrc%5Etfw">@YouTube</a>さんから</p>&mdash; tochi (@aguuu) <a href="https://twitter.com/aguuu/status/952436487441690625?ref_src=twsrc%5Etfw">2018年1月14日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ここでは住所と郵便番号を発話していますが、郵便番号の前に一息いれて郵便番号が聞き取りやすくしたいと思います。

# 句読点や疑問符で良い感じに発話してくれる

実はAlexaでは句読点を入れると一息いれてくれます。
つまり、先程の発話は下記のように、郵便番号の前に読点を使えば一息入れてくれます。

````
岡山県岡山市南区の郵便番号は、709-1234です。他の郵便番号を調べますか？
````

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">AlexaのSSMLを使った発話 その2 <a href="https://t.co/aQpFloqVnV">https://t.co/aQpFloqVnV</a> <a href="https://twitter.com/YouTube?ref_src=twsrc%5Etfw">@YouTube</a>さんから</p>&mdash; tochi (@aguuu) <a href="https://twitter.com/aguuu/status/952436560389062656?ref_src=twsrc%5Etfw">2018年1月14日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# SSML（Speech Synthesis Markup Language）を使った自然な発話

では、次の場合の発話ではどうでしょう？

````
正解は、1番です！
````

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">AlexaのSSMLを使った発話 その3 <a href="https://t.co/llxjDONliD">https://t.co/llxjDONliD</a> <a href="https://twitter.com/YouTube?ref_src=twsrc%5Etfw">@YouTube</a>さんから</p>&mdash; tochi (@aguuu) <a href="https://twitter.com/aguuu/status/952436649547321346?ref_src=twsrc%5Etfw">2018年1月14日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

これでも大きな問題はありませんが、できるなら「1番です！」の前にもっと「タメ」が欲しいですよね。そんな時に使えるのがSSML（Speech Synthesis Markup Language）です。

[音声合成マークアップ言語（SSML）のリファレンス \| Custom Skills](https://developer.amazon.com/ja/docs/custom-skills/speech-synthesis-markup-language-ssml-reference.html)

SSMLとは簡単に言うと発話するテキストに強弱や読み方などを支持するためのマークアップです。百聞は一見にしかず。（でも発話の場合には「百見は一聞にしかず」か？）

````
<speak>
正解は<break time="3s"/>1番です！
</speak>
````

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">AlexaのSSMLを使った発話 その4 <a href="https://t.co/IdEX53wPkv">https://t.co/IdEX53wPkv</a> <a href="https://twitter.com/YouTube?ref_src=twsrc%5Etfw">@YouTube</a>さんから</p>&mdash; tochi (@aguuu) <a href="https://twitter.com/aguuu/status/952436704182456320?ref_src=twsrc%5Etfw">2018年1月14日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

どうですか？すごく「タメ」が入っていい感じですね。これがSSMLです。

SSMLは`<speak>`タグで囲みます。ちなみにAlexaのボイスシュミレーターでは`<speak>`タグは省略します。
`<speak>`の中に`<break time="3s"/>`というタグがありますが、これは3秒間待ってから次の発話を行うという意味です。
SSMLにはこの他にも幾つかの種類があります。他のタグも試してみましょう。

[音声合成マークアップ言語（SSML）のリファレンス \| break](https://developer.amazon.com/ja/docs/custom-skills/speech-synthesis-markup-language-ssml-reference.html#break)

# 音量、高さ、速さを調整するprosodyタグ

次に先程の発話に更に感情を付けてみましょう。`prosody`タグを使うと音量、トーン、速さを指定することができます。
音量は`volume`、速さは`rate`、トーンは`pitch`の属性をそれぞれ設定することでコントロールすることができます。

[音声合成マークアップ言語（SSML）のリファレンス \| prosody](https://developer.amazon.com/ja/docs/custom-skills/speech-synthesis-markup-language-ssml-reference.html#prosody)

````
<speak>
<prosody rate="x-slow" pitch="x-low">正解は</prosody>
<break time="3s"/>
<prosody rate="x-fast" pitch="x-high" volume="x-loud">1番</prosody>
です！
</speak>
````

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">AlexaのSSMLを使った発話 その5 <a href="https://t.co/kAhTXiFHLf">https://t.co/kAhTXiFHLf</a> <a href="https://twitter.com/YouTube?ref_src=twsrc%5Etfw">@YouTube</a>さんから</p>&mdash; tochi (@aguuu) <a href="https://twitter.com/aguuu/status/952436753775783937?ref_src=twsrc%5Etfw">2018年1月14日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

どうですか？分かり易くすために強弱を強めにかけているので、自然？！とは言い難いですが、変化しているのがわかると思います。
このようにSSMLを使うと濃淡の少ない発話にいろいろな表現を追加することが可能です。

# audioタグで発話の途中に音を差し込む

更に先程の発話に雰囲気を追加したいと思います。
`break`タグでタメを入れましたが、あの場所にドラムロールを追加したいですね。
「正解は（ドロドロドロドロ、ダーン）1番です！」みたいな感じです。
実はSSMLには`audio`タグがあり、発話の途中に指定のMP3を流すことが可能です。

[音声合成マークアップ言語（SSML）のリファレンス \| audio](https://developer.amazon.com/ja/docs/custom-skills/speech-synthesis-markup-language-ssml-reference.html#audio)

audioタグは90秒以内であることや幾つかの制限があります。後はインターネット上から再生可能な場所にMP3を配置します。
今回はS3にファイルを配置しました。

ドラムロールの音源は魔王魂の物をお借りましました。

[『ドラムロール』無料・フリー効果音素材/魔王魂](https://maoudamashii.jokersounds.com/archives/se_maoudamashii_instruments_drumroll.html)

````
<speak>
<prosody rate="x-slow" pitch="x-low">正解は</prosody>
<audio src="https://s3-ap-northeast-1.amazonaws.com/xxx/output.mp3"/>
<prosody rate="x-fast" pitch="x-high" volume="x-loud">1番</prosody>
です！
</speak>
````

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">AlexaのSSMLを使った発話 その6 <a href="https://t.co/hIFCZKAqEz">https://t.co/hIFCZKAqEz</a> <a href="https://twitter.com/YouTube?ref_src=twsrc%5Etfw">@YouTube</a>さんから</p>&mdash; tochi (@aguuu) <a href="https://twitter.com/aguuu/status/952436805428658176?ref_src=twsrc%5Etfw">2018年1月14日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

かなり雰囲気が付きました。９０秒まで指定可能なので発話に間にジングルを追加してラジオ風にすることもできそうですね。

# say-asタグで読み方を指定する

次は数字を発話してみます。

```
番号は1234です。
```

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">AlexaのSSMLを使った発話 その7 <a href="https://t.co/s5SAGJvt18">https://t.co/s5SAGJvt18</a> <a href="https://twitter.com/YouTube?ref_src=twsrc%5Etfw">@YouTube</a>さんから</p>&mdash; tochi (@aguuu) <a href="https://twitter.com/aguuu/status/952436855173144577?ref_src=twsrc%5Etfw">2018年1月14日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

このように発話させると数字のところは「せんにひゃくさんじゅうよん」と発話されます。
例えば暗証番号として数字を扱う場合には「いちにいさんよん」と発話させたいですよね。

そんな時に使うのが`say-as`タグです。`interpret-as`属性に`digits`を指定すると数字ごとに別々の発話をしてくれます。

[音声合成マークアップ言語（SSML）のリファレンス \| say-as](https://developer.amazon.com/ja/docs/custom-skills/speech-synthesis-markup-language-ssml-reference.html#say-as)

```
<speak>
番号は<say-as interpret-as="digits">1234</say-as>です。
</speak>
```

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">AlexaのSSMLを使った発話 その8 <a href="https://t.co/YJOUhYSPi8">https://t.co/YJOUhYSPi8</a> <a href="https://twitter.com/YouTube?ref_src=twsrc%5Etfw">@YouTube</a>さんから</p>&mdash; tochi (@aguuu) <a href="https://twitter.com/aguuu/status/952436993513832450?ref_src=twsrc%5Etfw">2018年1月14日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

他にも`say-as`タグには日付の読み方を指定するものもあります。

```
<speak>
今日は<say-as interpret-as="date" format="md">01/17</say-as>です。
</speak>
```

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">AlexaのSSMLを使った発話 その9 <a href="https://t.co/5rUwecj4wV">https://t.co/5rUwecj4wV</a> <a href="https://twitter.com/YouTube?ref_src=twsrc%5Etfw">@YouTube</a>さんから</p>&mdash; tochi (@aguuu) <a href="https://twitter.com/aguuu/status/952437038157975552?ref_src=twsrc%5Etfw">2018年1月14日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# まとめ

SSMLはAmazonが拡張したエフェクトなどもあり、今後も追加されそうです。
例えば、「怒る」「笑う」「悲しむ」など、感情を表すタグが追加されれば、より自然で豊かな発話ができそうです。

Alexaでは発話にMP3などの音声ファイルを直接使うことも可能です。しかし、パターンが多いと音声ファイルを準備するのも大変です。
SSMLが発展してより多くの表現ができるようになればそういった手間も軽減できそうです。