ドラグスレイブで比較するVoice Assistant

たぶん怪文書

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103496/d96dd3a8-8054-4e5a-e462-e87b03bf383c.png" width="200px">

## 前口上
スレイヤーズの第3部が始まりますね。子供の頃に呪文を覚えた方も多いんじゃないでしょうか。

スマホも喋る時代、Voice Assistantも呪文くらい唱えられなきゃスマートと言えませんよね？ということでAlexa/Google Home/Siriにドラグスレイブ唱えさせてみる。

## Alexa

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">アレクサ、ドラグスレイブを唱えて<a href="https://twitter.com/hashtag/%E3%82%B9%E3%83%AC%E3%82%A4%E3%83%A4%E3%83%BC%E3%82%BA?src=hash&amp;ref_src=twsrc%5Etfw">#スレイヤーズ</a> <a href="https://t.co/WV81GXtPUb">pic.twitter.com/WV81GXtPUb</a></p>&mdash; H. NOMATA (@hiromichinomata) <a href="https://twitter.com/hiromichinomata/status/1130324238273875969?ref_src=twsrc%5Etfw">May 20, 2019</a></blockquote> 


[Alexa用のコンソール](https://developer.amazon.com/)から作成可能。以前はLambdaを別途用意して紐付ける必要があったがCodeタブ内で簡単に編集できるようになった。

- ドラグスレイブを唱えて」をEnchantIntentとして登録

- 他のHandlerをコピペしてEnchantHandlerを作成。マッチさせるIntentをEnchantIntentに、読み上げるテキストを呪文に変える。

   Alexa SkillではSSMLに対応しているため、XMLタグを使うことで細かな制御が可能。漢字の読み上げは完璧でないのでひらがなにするかsubタグで読みを設定する必要がある。

```javascript

const EnchantHandler = {
    canHandle(handlerInput) {
        return handlerInput.requestEnvelope.request.type === 'IntentRequest'
            && handlerInput.requestEnvelope.request.intent.name === 'EnchantIntent';
    },
    handle(handlerInput) {
        const speechText = 
        '黄昏よりも昏きもの、血の流れより紅きもの、 時の流れに埋もれし、' + 
        '偉大なる汝の名において、我ここに闇に誓わん、我等が前に立ち塞がりし' +
        'すべての愚かなるものに、我と汝がちからもて、等しく滅びを与えんことを、' +
        '<prosody volume="x-loud">ドラグスレーイブ!</prosody>';
        return handlerInput.responseBuilder
            .speak(speechText)
            .reprompt(speechText)
            .getResponse();
    }
};
```

- handlerのリストの上の方にEnchantHandlerを足す

```javascript
exports.handler = Alexa.SkillBuilders.custom()
    .addRequestHandlers(
        LaunchRequestHandler,
        EnchantHandler, // add
        LagunaBladeHandler,
        HelpIntentHandler,
        CancelAndStopIntentHandler,
        SessionEndedRequestHandler,
        IntentReflectorHandler)
    .addErrorHandlers(
        ErrorHandler)
    .lambda();
```

- 申請するつもりでアプリの説明やアイコン画像をダミーで入れると実機でテストできるinvitationを送れるようになる

## Google Home

<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="ja" dir="ltr">ねえGoogle、ドラグスレイブを唱えて<a href="https://twitter.com/hashtag/%E3%82%B9%E3%83%AC%E3%82%A4%E3%83%A4%E3%83%BC%E3%82%BA?src=hash&amp;ref_src=twsrc%5Etfw">#スレイヤーズ</a> <a href="https://t.co/uf9K3u7A46">pic.twitter.com/uf9K3u7A46</a></p>&mdash; H. NOMATA (@hiromichinomata) <a href="https://twitter.com/hiromichinomata/status/1130839726355648512?ref_src=twsrc%5Etfw">May 21, 2019</a></blockquote>

[Dialogflow](https://dialogflow.com)(旧api.ai)で作成する。Alexa Skillと違いこの程度なら全てGUIで完結可能。

- Alexa Skillと同等にEnchantIntentにTraining phrases「ドラグスレイブを唱えて」をたす。

- ResponsesでText responseに呪文をたす。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103496/ca9f6d7f-e8c8-7b34-6d95-3e550387c3ab.png" width="400px">

- 実機テストを行うにはGoogleアカウントの設定でウェブとアプリのアクティビティを有効化する必要がある他、IntegrationsタブからGoogle Assistantを選択、Auto-preview changesをオンにする必要あり。呼び出し名はSimulatorの画面に飛んでから横メニューのInvocationで変更できる。

SSMLに対応している。

## Siri
<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="ja" dir="ltr">Hey Siri, ドラグスレイブを唱えて<a href="https://twitter.com/hashtag/%E3%82%B9%E3%83%AC%E3%82%A4%E3%83%A4%E3%83%BC%E3%82%BA?src=hash&amp;ref_src=twsrc%5Etfw">#スレイヤーズ</a> <a href="https://t.co/d5j4YgN7SC">pic.twitter.com/d5j4YgN7SC</a></p>&mdash; H. NOMATA (@hiromichinomata) <a href="https://twitter.com/hiromichinomata/status/1130819256570896384?ref_src=twsrc%5Etfw">May 21, 2019</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


iOS12からショートカットアプリが導入されており、Siriをhookにショートカットのアクションを定義可能。

ブロックの流れとしては テキスト設定 => 読み上げ。ショートカット内では発話人物を設定できるがSiri経由だと無視される模様。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103496/3985cf16-4fd4-54b9-1b31-46bf247dd9bd.jpeg" width="400px">


SSMLには対応していない。

## 比較
|           | Alexa  | Google Home | Siri           |
|-----------|--------|-------------|----------------|
| SSML      | Y      | Y           | N              |
| GUIで開発 | △      | ○           | ○              |
| Backend   | Lambda | Dialogflow GUI      | ショートカット |

## Future Work
Clova, Cortana Skillとか