GoogleアシスタントとAmazon Alexa、使用できるSSMLの比較

Amazon Echoがついに日本で発売されます！
これで自分たちは次の2つでスマートスピーカー用アプリを開発できるように！

* Google HomeのGoogleアシスタント
* Amazon EchoのAmazon Alexa

どっちで開発してみようかなと悩んでいる人や、共通化できるかな？と悩んでいる人もいると思います。
この記事では発話部分（SSML）について調査し、両者の比較をしてみたいと思います。

# そもそもSSMLとは？
SSMLはXMLベースの音声合成用のマークアップ言語です。

SSMLを使うと特定箇所の発音や声の大きさを変えたり、読み上げる文章に意味を持たせたり
音源を再生させたり等、合成音声を読み上げる時に制御を加えることができます。

GoogleアシスタントとAmazon Alexaでは、使えるSSMLタグが所々異なります。

# 各SSMLタグの紹介と比較
これらは2017/11/22時点の情報になります。
また、公式ドキュメントに記載されていない情報がいくつかあります。

（2017/11/22 追記）
11/15にGoogleアシスタントのアップデートがありました。
これによりprosody、emphasisタグがサポートされ、audioタグで利用できる属性が増えました。
また、近日実装予定のタグpar、seq、mediaタグの発表がありました。
https://developers.googleblog.com/2017/11/help-users-find-interact-re-engage-with.html

## audio
| Googleアシスタント | Amazon Alexa |
|:-----------------:|:------------:|
| ○                 | ○            |

録音済みオーディオファイルを再生するタグです。再生が終わるまで次の読み上げは行われません。

指定できるオーディオファイルはやや仕様の差があります。
ファイル形式はAlexaがmp3のみ、Googleアシスタントはmp3、ogg、wav(非推奨)が指定できます。
再生時間についてはAlexaは90秒までですが、Googleアシスタントは120秒まで可能です。
ビットレートに関してはAlexaが48 kbps以内に対し、Googleアシスタントは96 kbpsまで扱えます。

audioタグで利用できる属性ですが、こちらは仕様の差が大きいです。
Alexaは音源を指定するsrc属性しかありません。
一方、Googleアシスタントの方は再生開始位置を指定できるclipBegin、再生速度を調整するspeed、
リピート回数を指定できるrepeatCount、音量を変えるsoundLevelなど様々な属性が用意されています。

これらの差を見ると、オーディオファイルの再生に関してはGoogleアシスタントの方が優れてそうです。

さらに、Googleアシスタントの場合、[Google側から100以上もの音を用意してくれています。](https://developers.google.com/actions/tools/sound-library)
簡単なものだったら音源を用意する必要はなく、URLを指定するだけですぐ使えてしまいます。

次の例は「３，２，１」と読み上げた後にアラームを流したものです。

```xml
3<break time="1s"/>
2<break time="1s"/>
1<break time="1s"/>
<audio src="https://actions.google.com/sounds/v1/alarms/alarm_clock.ogg" />
朝ですよー
```


## break
| Googleアシスタント | Amazon Alexa |
|:-----------------:|:------------:|
| ○                 | ○            |

音声の中に休止を入れることができるタグです。
休止の強さを決めれるstrengthを指定する方法か、具体的な秒数を決めれるtimeを指定する方法があります。

次の例は「いないいない」を読み上げた後に、1秒の休止が入ります。

```xml
いないいない<break time="1s" />ばああ
```

## emphasis
| Googleアシスタント | Amazon Alexa |
|:-----------------:|:------------:|
| ○                 | ○            |

タグで囲まれた単語またはフレーズを強調することができます。

次の例は「really like」の部分だけ大きな声、かつゆっくりに再生させ強調させます。

```xml
I already told you I
<emphasis level="strong">really like</emphasis>
that person.
```
## p
| Googleアシスタント | Amazon Alexa |
|:-----------------:|:------------:|
| ○                 | ○            |

段落を表すタグです。このタグで囲った前後に休止が入ります。
休止の強さは、句点（。）や<break strength="strong"/>と同じ強さになります。

```xml
<p>This is the first paragraph.</p>
```

## phoneme
| Googleアシスタント | Amazon Alexa |
|:-----------------:|:------------:|
| ×                 | ○            |

記述されているテキストに音素/音声上の発音を付与するタグです。
alphabet属性で音声記号を指定し、ph属性で音声学的発音を指定します。

次の例に出てくる「pecan」という単語は人によって発音が変わる単語です。
1回目の「pecan」と2回目の「pecan」は異なった発音で再生されます。

```xml
You say, <phoneme alphabet="ipa" ph="pɪˈkɑːn">pecan</phoneme>.
I say, <phoneme alphabet="ipa" ph="ˈpi.kæn">pecan</phoneme>.
```


## prosody
| Googleアシスタント | Amazon Alexa |
|:-----------------:|:------------:|
| ○                 | ○            |

音声出力のピッチ、読み上げ速度、音量の制御を行えるタグです。
両者共に指定できる内容はほとんど同じですが、ピッチを指定できる大きさに差があり、
Alexaは-33.3％～+50％で指定できるのに対し、Googleアシスタントは-100％～+100%で指定できます。

次の例はprosodyタグを使って、ピッチ、速度、音量を変えたものです。

```xml
<prosody volume="x-loud">とても大きい声で話します</prosody>.
<prosody rate="x-slow">とてもゆっくり話します</prosody>.
<prosody pitch="x-high">とても高い声で話します</prosody>,
```

## s
| Googleアシスタント | Amazon Alexa |
|:-----------------:|:------------:|
| ○                 | ○            |

センテンスを表すタグです。このタグで囲った前後に休止が入ります。
休止の強さは、句点（。）や<break strength="strong"/>と同じ強さになります。

```xml

This is a sentence

```

## say-as
| Googleアシスタント | Amazon Alexa |
|:-----------------:|:------------:|
| ○                 | ○            |

タグを囲った部分の解釈の方法を指定することができるタグです。interpret-as属性で指定します。
Googleアシスタントの方は、公式ドキュメントに書かれてない指定にもいくつか対応してます。
（ピー音にするexpletiveなど）
ただ、指定できる数自体はAlexaの方が多く、Alexa専用の指定方法もあります。
（間投詞として解釈させ感情豊かにするinterjection）

次の例はcharactersが指定されているため、1文字ごとに読み上げる解釈になってます。

```xml
<say-as interpret-as="characters">can</say-as>
```

## speak
| Googleアシスタント | Amazon Alexa |
|:-----------------:|:------------:|
| ○                 | ○            |

SSMLドキュメントのルート要素です。
他のSSMLタグを使用したい場合は、あらかじめこのタグで囲みます。

```xml
<speak>
speakタグで囲まれてれば、他のSSMLタグを使うことができます。
</speak>
```

ただ、実はAlexaの方は省略可能で、いきなり他のSSMLタグから始めてもちゃんと認識してくれます。
一方、Googleアシスタントの方は必ずつける必要があります。
つけないと他のSSMLタグがSSMLとして認識されずタグがそのままテキストとして出力されてしまいます。

## sub
| Googleアシスタント | Amazon Alexa |
|:-----------------:|:------------:|
| ○                 | ○            |

指定した単語またはフレーズを、異なる単語またはフレーズとして発音させます。

次の例の場合、「エムジー」として発音せず「マグネシウム」として発音されます。

```xml
<sub alias="magnesium">Mg</sub>
```

## w
| Googleアシスタント | Amazon Alexa |
|:-----------------:|:------------:|
| ×                 | ○            |

このタグは、say-asと似た働きをします。
単語の品詞を指定でき、単語の発音をカスタマイズできます。
Alexaは、role属性にamazon独自の定義が用意されています。

次の例は、readという単語を過去分詞として解釈させる例です。

```xml
The word <say-as interpret-as="characters">read</say-as> may be interpreted
as either the present simple form <w role="amazon:VB">read</w>,
or the past participle form <w role="amazon:VBD">read</w>.
```

## par
| Googleアシスタント | Amazon Alexa |
|:-----------------:|:------------:|
| 近日実装                 | ×            |

こちらは標準のSSMLタグではなく、Googleアシスタント専用のSSMLタグになります。
また、現時点（2017/11/22）ではまだ利用できず、近日実装される予定のタグになります。
アプリと会話している間に背景音楽や音を再生することが出来るそうです。
[Google Developers Blogに載っているサンプル音源](https://developers.google.com/actions/downloads/ssml/ssml-example.wav)

## seq
| Googleアシスタント | Amazon Alexa |
|:-----------------:|:------------:|
| 近日実装                 | ×            |

こちらも標準のSSMLタグではなく、Googleアシスタント専用のSSMLタグになります。
また、現時点（2017/11/22）ではまだ利用できず、近日実装される予定のタグになります。
メディアを連続で再生できるとのことらしいですが、詳しい内容はまだ公開されていません。
[サンプル音源](https://developers.google.com/actions/downloads/ssml/ssml-example.wav)からの推測になりますが、parタグと組み合わせて使うのかもしれません。

## media
| Googleアシスタント | Amazon Alexa |
|:-----------------:|:------------:|
| 近日実装                 | ×            |

こちらも標準のSSMLタグではなく、Googleアシスタント専用のSSMLタグになります。
また、現時点（2017/11/22）ではまだ利用できず、近日実装される予定のタグになります。
レンダリングする音源を指定する？タグのようです。
[サンプル音源](https://developers.google.com/actions/downloads/ssml/ssml-example.wav)からの推測になりますが、parタグ、seqタグと組み合わせて使うのかもしれません。

## amazon:effect
| Googleアシスタント | Amazon Alexa |
|:-----------------:|:------------:|
| ×                 | ○            |

音声にAmazon固有の効果を適用します。当然ながらGoogleアシスタントにはありません！
ただ現在の所、ささやき声の効果を適用させるwhisperedしかないみたいです。

```xml
<amazon:effect name="whispered">I am not a real human.</amazon:effect>.
```

# まとめ
調査した結果、様々な点で差があることがわかりました。

使用できるタグの観点だと、Alexaの方が多い事がわかりました。
特にphonemeやwは発音をカスタマイズできるため、柔軟に発音させたいならAlexaの方が向いていそうです。

一方、音源再生の観点だと、Googleアシスタントの方が優れていることがわかりました。
ビットレートや再生時間の長さといった質の面で優れているのに加え、
ファイル形式の柔軟性、最初から音源が用意してくれてるといった開発面が楽な点も優れてます。

また、GoogleアシスタントもAlexaも独自のSSMLタグを提供していることがわかりました。
標準規格ではないため、片方はできて、もう片方にはできない事が発生してきそうです。

これらの事から、作りたいアプリによって向いているAIアシスタントが分かれてきそうです。

もし共通化したアプリを作りたい場合は、SSMLの仕様差を意識して開発する必要がありそうです。
それぞれ開発用シミュレーターが提供されており、そこでSSMLを打ち込むと再生時の音声を確認できるので、
想定しているSSMLをあらかじめ確認しておくと良さそうです。

# 参考資料
それぞれの公式資料です
【Googleアシスタント】[SSML](https://developers.google.com/actions/reference/ssml)
【Amazon Alexa】[音声合成マークアップ言語（SSML）のリファレンス](https://developer.amazon.com/ja/docs/custom-skills/speech-synthesis-markup-language-ssml-reference.html)