起きてすぐに「おはホロ」が見たい！

##はじめに
この記事は[スマートスピーカー Advent Calendar 2019](https://qiita.com/advent-calendar/2019/smart-speaker)の18日目の記事です。

## 3行まとめ
* Amazon Echo Showで動画を再生するスキルを作ったよ。
* 動画は自前じゃなくてTewitterから検索して再生するよ。
* VTuberの宝鐘マリンさんはすごく面白かわいいぞ。

## 前置き
皆さんは、バーチャルYouTuber（以下、VTuber）をご存じでしょうか？
彼ら彼女らは、YouTubeで動画を投稿・配信している人たちです。
通常のYouTuberさんとの大きな違いは、存在がバーチャル（3Dや絵）だということです。

自分は最近、宝鐘マリンさんというVTuberさんにハマりました。
[Marine Ch. 宝鐘マリン](https://www.youtube.com/channel/UCCzUftO8KOVkV4wQG1vkUvg/featured)
お話がとても上手で、話題も絶妙に古く、私はそんなたまにどこか30～40代な話題を話す彼女（17歳設定）に惹かれました。

そしてこの宝鐘マリンさんですが、VTuberの事務所である[ホロライブプロダクション](https://www.hololive.tv/)（以下、ホロライブ）に所属しています。
宝鐘マリンさんと同じく面白くてかわいいVTuberさんが大勢所属しており、事務所主導でも動画を投稿していたりと、箱推し（事務所まるごと全部応援）したくなる楽しさがあります。

## 毎日見ている動画
ホロライブさんの活動は活発です。

毎朝7時頃に「おはようホロライブ」（以下、おはホロ）という動画をTwitterに投稿しています。
この動画は、その日の天気・運勢を所属VTuberさんが紹介する動画です。
※朝テレビで見かける番組のVTuber版といった感じです。

事務所まるごと好きになった私は、朝起きてすぐに再生するほど楽しみにしています。
例えば今日（2019/12/18）のおはホロは下記となります。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">☀12月18日水曜日☀<br>おはようございます！ <a href="https://twitter.com/hashtag/%E3%81%8A%E3%81%AF%E3%82%88%E3%81%86%E3%83%9B%E3%83%AD%E3%83%A9%E3%82%A4%E3%83%96?src=hash&amp;ref_src=twsrc%5Etfw">#おはようホロライブ</a> です。<br>風邪が流行ってきました、みなさんもお気をつけください😷<br><br>🔽所属タレントの配信スケジュールはこちらから🔽<a href="https://t.co/Mu8oE53BqY">https://t.co/Mu8oE53BqY</a><br><br>今日もホロライブをよろしくお願いします！ <a href="https://t.co/b13p1A0VXl">pic.twitter.com/b13p1A0VXl</a></p>&mdash; ホロライブプロダクション公式▶ (@hololivetv) <a href="https://twitter.com/hololivetv/status/1207057164428357634?ref_src=twsrc%5Etfw">December 17, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## スキルを作るきっかけ
先日、Alexaのイベントに初めて参加してきました。
[Alexa スキル Learning Day tokyo 2019](https://alexalearningday2019.splashthat.com/)

イベント中、Alexaについて様々なお話を聞いていく中で、あることに気づきました。
毎朝の楽しみであるおはホロをもっと素早く見られるのでは、と。

朝一で動画を見るために私がしている動作を書きだすと7つあります。

```
  1. 起きる
  2. スマホを探す
  3. スマホの認証を解除する
  4. Twitterアプリを立ち上げる
  5. ホロライブのアカウントを開く
  6. おはホロのツイートを探す
  7. 動画の再生をクリック
```

それがAlexaなら2つで済みます。

```
  1. 起きる
  2. Alexaに声をかける（動画が再生される）
```

「起きた瞬間におはホロを見られる！」と気づいたわけです。

## スキルを作る準備
まずはAlexaのスキルが作れるように、開発者アカウントを作りました。
[Amazon開発者ポータル - Amazon Developer](https://developer.amazon.com/ja/)

イベントのワークショップで体験していたので、すぐでした。
普段使っているAmazonのアカウントでOKなのが嬉しいです。（AWSアカウントも要らない）

次に、おはホロのツイートを取得するためにTwitter APIを登録をしました。
英語なので大変でしたが、下記の記事を参考にさせて頂き、スムーズに登録できました。
[Twitter API 登録 (アカウント申請方法) から承認されるまでの手順まとめ](https://qiita.com/kngsym2018/items/2524d21455aac111cdee)

## スキルの実装
イベントのワークショップで「Hello, World!」と喋らせるスキルの開発を体験しました。
そのため、ワークショップの流れ同様にテンプレを使ってスキルを実装していきました。
[Alexaスキル開発トレーニングシリーズ第1回: 初めてのスキル開発](https://developer.amazon.com/ja/blogs/alexa/post/31c9fd71-f34f-49fc-901f-d74f4f20e28d/alexatraining-firstskill)

テンプレ選択時に、Node.jsとPythonどちらを使うかが選べます。
ワークショップではNode.jsでしたので、同じくNode.jsを選択しました。

テンプレでスキルを作成した後、コードエディタ画面に入り
今回使うTwitter APIを登録するため`package.json`を下記のように変更しました。
※`twitter`を追加しただけです。

  ```package.json 
  {
    "name": "sauce-boss",
    "version": "1.0.0",
    "description": "",
    "main": "index.js",
    "scripts": {
      "test": "echo \"Error: no test specified\" && exit 1"
    },
    "author": "",
    "license": "ISC",
    "dependencies": {
      "ask-sdk-core": "^2.6.0",
      "ask-sdk-model": "^1.18.0",
      "i18next": "^10.5.0",
      "twitter": "*"
    }
  }
  ```

そして、同じくコードエディタ画面で`index.json`にスキルを実装していきました。
Twitterの読み込みと各種キー設定を追加して、`LaunchRequestHandler`の中身を変更しました。

  ```js:index.js
const Alexa = require('ask-sdk-core');

// Twitter APIの設定
const twitter = require('twitter');
const client = new twitter({
    "consumer_key"        :"xxxxxxx",
    "consumer_secret"     :"xxxxxxx",
    "access_token_key"    :"xxxxxxx",
    "access_token_secret" :"xxxxxxx",
});

const Util = require('util.js');
const LaunchRequestHandler = {
    canHandle(handlerInput) {
        return handlerInput.requestEnvelope.request.type === 'LaunchRequest';
    },
    async handle(handlerInput) {
        // ツイートを検索（アカウント指定、RTは含めない、動画付き、ハッシュタグ指定。1件だけ。ツイートの情報全部取得）
        const params = {q:'from:hololivetv exclude:retweets filter:native_video #おはようホロライブ', count:1, tweet_mode: 'extended'};
        let searchData = await client.get('search/tweets', params);
        let tweet = searchData.statuses[0]; // 1件目のツイート

        // ツイートに動画の入ってる情報があるか念のためチェック   
        if (tweet.extended_entities) {
            //ある場合

            // 動画情報を取得
            var video_info = tweet.extended_entities.media[0].video_info;

            // 動画の各ビットレートを取得（1つの動画でも複数のビットレートでわかれて動画URLがある）
            var var_length = video_info.variants.length;
            var video_index = [];
            var video_bitrate = [];
            for (var k = 0; k < var_length; k++) {
                if(video_info.variants[k].content_type == "video/mp4") {
                    video_index.push(k);
                    video_bitrate.push(video_info.variants[k].bitrate);
                }
            }

            // ビットレートが最大の動画URLを取得（一番キレイなのが見たい！）
            var max_index = video_index[video_bitrate.indexOf(Math.max.apply(null, video_bitrate))];
            var video_url = video_info.variants[max_index].url;

            // 動画を再生する（動画URLとタイトルとサブタイトル）
            return handlerInput.responseBuilder
                .addVideoAppLaunchDirective(video_url, "おはようホロライブ", "今日の動画")
                .getResponse();
        } else {
            // ない場合

            // 音声を再生する
            return handlerInput.responseBuilder
                .speak('動画が見つかりませんでした')
                .withShouldEndSession(true)
                .getResponse();
        }
    }
};

// 以下、変更無し
  ```
Twitter APIに関しては、下記記事を参考にさせて頂きました。
[Alexa + Twitter のスキルの作り方の一例](https://qiita.com/koujin/items/cd3310a5b4eb770abd6d)
[(17/01/06追記)twitterで特定ユーザの画像を全部ダウンロードする(動画追加)](http://kokemono.hatenablog.com/entry/2016/05/07/135739)

Alexaの動画再生に関しては、下記記事を参考にさせて頂きました。
[http://android-smart.com/2019/06/alexaskilldevelopvideo.html](http://android-smart.com/2019/06/alexaskilldevelopvideo.html)

## 完成品
完成したのがこちらです。やったぜ！
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Qiitaの記事用！今朝のおはホロ再生。 <a href="https://t.co/odmMDicdZ9">pic.twitter.com/odmMDicdZ9</a></p>&mdash; 山桜ぱぱ (@sakura_beers) <a href="https://twitter.com/sakura_beers/status/1207080178251227136?ref_src=twsrc%5Etfw">December 17, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## はまったところ
Twitter APIで取得したツイートのうち、動画付きなのに動画URLが含まれない場合がありました。
ツイート内容の文字数が多い場合に省略されてしまうようです。
下記記事を参考に`tweet_mode: 'extended'`を指定することで、動画URLを取得することができました。
[Twitter APIで取得したつぶやきが「truncated=true」で切れてしまう！](http://absg.hatenablog.com/entry/2016/11/01/205507)

Alexaの開発者コンソールには、シミュレーターがついています。
実機がなくても、その場でスキルの動作検証をできるので非常にありがたいのですが、このシミュレーターは動画再生まではしてくれません。
ですので、動画を再生するスキルを検証したい場合、手元に実機が必要となります。
※これに気づいた時点ではまだ実機購入前でしたので、本当に再生されるか分からず購入して届くまでドキドキでした。

## 最後に
テンプレートとたくさんの記事に救われ、幸いにも実装はすぐに終わりました。
そのため、イベントに参加した翌々日の朝から私の朝は一変しました。
朝起きて布団の中から目も開けずに「Alexa、おはホロを開いて」と唱えるだけで、大好きなホロライブの最新動画が再生されるのです。
ありがとう、Alexa。ありがとう、Amazon。ありがとう、きっかけをくれたイベントに登壇された方々。

日々の生活を変えるきっかけは、どこに落ちているか分かりません。
これからもいろんなイベントに参加して、人生をより楽しんでいこうと思います。

あ！とこで宝鐘マリンさんはもうチェックされましたか？
面白かわいいのでぜひ！ぜひ！
[Marine Ch. 宝鐘マリン](https://www.youtube.com/channel/UCCzUftO8KOVkV4wQG1vkUvg/featured)