Alexaのイタコ芸・NHKニュースRSSを日本語自動読み上げした奴を流すSkillを作ってみた


この記事を書いている本日2017年4月30日現在、
Alexaは日本語に対応していません。
ですんで‘日本語でニュースを読み上げる‘というのはできないです。

しかし日本語でニュースが聞きたい！
というか喋らせたい！

Alexa Skillsの中には、ラジオを流してくれるのもあります。
だから日本語で読んだ音源ファイルさえあれば、Alexaは日本語を‘流して‘くれるはず！
しかし日本語のファイルなんて持ってないです。
自分で喋るのきもいし。
そこで、天下のnhkさんのニュースのRSSを自動読み上げソフトに読ませてMp3　ファイルを作り、それをalexaに憑依させることを試みたいと思います。

関係ないですが、今日はイングランドのプレミアリーグ、トッテナム対アーセナルの通称ノースロンドンダービーが始まる夜中の１２時半まですることがありませんので、その間にできるところまでやってみようと思います。


# 仕組み

1.日本語ニュースをとってくる
2.Amazon Pollyに読ませる
3.音声ファイルを AWSのどこかに保存
4.Alexaの応答時にこの音声ファイルを応答

ニュースのRSSをとってくるのは以前やりましたが、それ以外が全部はじめて。楽しみだなぁ。 Amazon pollyも５分前に知ったばっかです。

ついでにいうと家のキーボードをHHKBにしたところ、printscreenのボタンが無いのでスクショのとり方がわからず、[Alt]+[Fn]+[i]で取れることを今さっき知りました。
しかもqiitaだとこのエディター上でctrl+vで画像貼り付けできるんですね。便利すぎて泣きそうです。

# Amazon Polly

はじめてこの機能にアクセスしました。
使い始めるという意味のボタンを力一杯押します。

https://console.aws.amazon.com/polly/home/SynthesizeSpeech
女性の声でテキストを読み上げてくれます。女性の名前はmizukiさんだそうです。
水木さんかな。美月さんかな。

https://aws.amazon.com/jp/polly/details/

```
Amazon Polly 用の API を使用すれば、アプリケーションに音声合成を簡単に
統合できます。音声に変換するテキストを Polly API に送信するだけで、
Polly からアプリケーションにオーディオストリームがすぐに返信されます。
アプリケーションで直接ストリーミングを開始することも、MP3 のような
標準的な音声ファイル形式で保存することもできます。
```

へー。
サンプルを読み上げもらってmp3ファイルをダウンロードしてみます。

![image](https://qiita-image-store.s3.amazonaws.com/0/173392/efd6660b-8163-d9da-a5a5-aba453561a71.png)

音声ファイルのサイズは44kbでした。
けっこう軽いですね！



# ニュースを選ぶ

何でも良かったのですが、タイトルだけだと意味がわからないというか、続けて読んだら圧縮新聞みたいになっちゃうと思ったので、タイトルのほかに要約が入っているのが良いと思って探しました。

yahoo. タイトルだけで短すぎるからダメ。
https://news.yahoo.co.jp/pickup/sports/rss.xml

nhkの主要ニュース. これなら要約も入ってるのでよさそう。
http://www3.nhk.or.jp/rss/news/cat0.xml

・nhkの主要ニュースから抜粋したサンプルテキスト

```
日本放送協会 NHKニュース
４月３０日　１８時５０分

各地で気温上昇。 真夏日も 。あすは広い範囲で大気不安定に。
３０日は広い範囲で晴れて兵庫県や鳥取県でところによって３０度以上の真夏日になるなど各地で気温が上がりました。一方、１日は、西日本と東日本の広い範囲で大気の状態が非常に不安定になる見込みで、気象庁は急な雷雨や竜巻などの突風に注意するよう呼びかけています。

春の天皇賞 、１番人気 キタサンブラックが優勝で２連覇。
競馬の「春の天皇賞」が京都競馬場で行われ、１番人気のキタサンブラックが優勝し、２連覇を達成しました。
```

# amazon pollyの呼び出し

![image](https://qiita-image-store.s3.amazonaws.com/0/173392/699282e6-ce81-0d43-a244-5d20e11ad04c.png)



東日本を‘あずまにほん‘って読んじゃってるなぁ。。まぁ無料枠で使えるので文句は言わないこととします。やっぱ日本語は漢字熟語の読み方が難しいんだな、と感慨にふけるなど。

mp3ファイルをダウンロードしたら290kbでした。
これでニュースは２件ですから、長いの短いのあわせて５件で 750kbくらいと目算しておきます。どうせalexaは家のwi-fiで使うからこれくらいの容量ならまったく問題ないでしょう。

なお、Amazon pollyはphpやnode.jsなどからsdk経由で呼び出せるということですが、ノーロンダービーまでに夕飯を作ってたべなければならないので、あとでやります。
今日はAWSコンソールからMizukiさんに読んでもらったものをs3にアップして
Alexaから呼び出すことにします。

（無料枠内ですむことを祈りながら）




# Alexa Skillの作成

デベロッパーコンソールに行きます。
https://developer.amazon.com/edw/home.html

add a new skillを押して、以下の豪快な名前でスキルを作ります。

>name;Japanese news read in Japanese
invocation name ;japanese news
Global Fields ; Audio player; yes

![audioplayerSkill.png](https://qiita-image-store.s3.amazonaws.com/0/173392/0763711e-82ba-98dd-be2d-844226fb1099.png)

いままで何個かskillsを作りましたが、audioのタイプは初めてなので、
まず説明を読みます。
https://developer.amazon.com/public/solutions/alexa/alexa-skills-kit/docs/custom-audioplayer-interface-reference
うっ、長い。。:sob:
１分で挫折してしまいました。そういえば以前も読もうとして途中で寝てしまったなぁ。

そこでgithubにサンプルソースを探したらありました。
https://github.com/alexa/skill-sample-nodejs-audio-player
readmeに設定方法が細かく全部書いてあって、非常に助かる感じ。
これを一度使ってみて把握することにします。
とにかく、わからないことだらけなんで。


# skill-sample-nodejs-audio-playerのreadmeどおりに作ってみる

[readme](https://github.com/alexa/skill-sample-nodejs-audio-player)を読み、準備をします。


## 1. 準備

参考にさせていただきました!
[Node.js / npmをインストールする（for Windows）](http://qiita.com/taipon_rock/items/9001ae194571feb63a5e)


## 2. Lambda関数を作る

準備ができたので、[readme](https://github.com/alexa/skill-sample-nodejs-audio-player)のとおりに進めていきます。


```
Tips:
このreadmeでは、Node.jsのスクリプトをパッケージするとき
コマンドラインで実行していますが、windowsだとコマンドライン用の
zipソフトのインストールが面倒なので、すでに持っているソフトを使い、
ファイルエキスプローラーからやりました。
```
```
Tips:
ランタイムは Node.js4.3 (Node.js6.10ではない)
```

```
Tips:
zipについて
readmeではコマンドラインから実行してますが、普通にwindows用の
zip圧縮ソフトをつかってやりました。
```
zip圧縮したときのスクショ。対象ファイルを全部選んで、audio-player.zipの
名前をつけて圧縮する。
この上の階層に移動してフォルダごと圧縮じゃだめなのねん。
![image](https://qiita-image-store.s3.amazonaws.com/0/173392/8b19f402-0671-3e61-6637-504b5fe03f1b.png)


なお、zipのアップロードができたら、
Lambda関数の単体テストをしておいたほうが良い。

＜テスト画面＞
![audioplayerSkillLambdaFunction-3-1.png](https://qiita-image-store.s3.amazonaws.com/0/173392/b2bd72f4-72ae-5575-4407-7880d754fdb9.png)

青い‘テスト‘ボタンの右横にある‘アクション‘から‘テストイベントの設定‘でAlexa start session‘を選び、‘保存してテスト‘を押す。
実行結果がグリーンなら次へ進む。


もし実行結果が失敗だったら、設定を見直す。


## 3. Alexa Skillを作る

[readme](https://github.com/alexa/skill-sample-nodejs-audio-player)のとおりに進めていきます。

なお、先週の半ばから、skill builder betaというのができて、
intentsやutterancesをフォーム入力できるようになったのですが、
readmeの説明文には対応してないし、まだ使い方がよくわからないので、
旧エディタを使って編集しました。
![audioplayerSkill-3.png](https://qiita-image-store.s3.amazonaws.com/0/173392/008d046b-7e92-415a-2688-a9c8dc1c9207.png)



## 4. 実機テスト

readmeでは‘Alexa, ask my skill to play`と呼びかけてね、
とあるが、私は違う名前でskillを作っていたので、

Alexa, open japanese news.

と呼びかけました。
すると、episode 140を聞きたければ yesと言ってください、と聞いてくるので、

yes.

と答えます。すると、episode 140という何かのラジオかpodcastをストリーミングしてくれました。
やったね:thumbsup:


## episode 140とは何か、どうやって呼ばれているのか？

readmeのHow it Worksのところに、めちゃめちゃ重要な事が書いてあるので読む。


>サンプルプロジェクトでは、js / audioAssets.jsで定義されたオーディオコンテンツの定義済みリストが再生され、ユーザーはさまざまなcustom intentやbuilt-in intentsで再生を制御できます。 

```js/node_modules/AudioAssets.js
'use strict';

// Audio Source - AWS Podcast : https://aws.amazon.com/podcasts/aws-podcast/
var audioData = [
    {
        'title' : 'Episode 140',
        'url' : 'https://feeds.soundcloud.com/stream/275202399-amazon-web-services-306355661-amazon-web-services.mp3'
    },
    {
        'title' : 'Episode 139',
        'url' : 'https://feeds.soundcloud.com/stream/274166909-amazon-web-services-306355661-aws-podcast-episode-139.mp3'
    }
];

module.exports = audioData;
```

ほうほう。
ここにmp3ファイルのurlを書いているのですね。


じゃぁ、さっきAmazon pollyに読み上げてもらったファイルをインターネットにアップして、urlの形で指定すれば、代わりに流してくれるかな？

# AWS S3に日本語で読み上げたファイルをアップする


さっきから気になっていたので、
バケットをつくる前に無料枠を確認しました。

https://aws.amazon.com/jp/free/

5 GB 標準ストレージ
20,000 件の Get リクエスト 
2,000 件の Put 要求 
サインアップから 12 か月で有効期限が切れます。

なるほど。
今はサンプルファイル300kbしか置かないから大丈夫だけど、
もしリリースしたら、運用していくうちにどんどん増えるから、
消しこみをしなければ。覚えておこう。
あと、有効期限がきれる前にこのskillは止めないとな。
（誰かスポンサーがついてくれたら別ですが:ok_hand:）

バケットを作りました。
![image](https://qiita-image-store.s3.amazonaws.com/0/173392/19f12f33-5f39-32ca-c392-79c4881eb62f.png)

>バケット名：japanese-news-read
>リージョン 米国東部（バージニア北部）
>全員にオブジェクトの読み込みを許可
Versioning, Logging, Tags,全部無効.

さっきのmp3ファイルをいそいそとアップロードするとurlが発行されます。
chromeでアクセスしたら音が再生できなかったので、
メタ情報を付与してあげました。
これで‘日本ほうそうきょうかい～‘と読み上げてくれました。

以下はメタデータを付与した画面のスクショです。
![image](https://qiita-image-store.s3.amazonaws.com/0/173392/9f1473e5-44b1-afa0-a4e3-e2ccdbb49bb6.png)


# サンプルの.jsを書き換えて、S3のurlを指定する

AudioAssets.jsの中に書いてる、ストリーミングファイルのurlを書き換えます。

```js/node_modules/AudioAssets.js
'use strict';

// Audio Source - AWS Podcast : https://aws.amazon.com/podcasts/aws-podcast/
var audioData = [
    {
        'title' : 'Episode 140',
        'url' : https://s3.amazonaws.com/japanese-news-read/sample/speech_20170430103107963.mp3'
    },
    {
        'title' : 'Episode 139',
        'url' : 'https://s3.amazonaws.com/japanese-news-read/sample/speech_20170430103107963.mp3'
    }
];

module.exports = audioData;
```

保存したら、最初やったのと同じようにzipで固めて、
lambda関数のコード設定画面でアップロードし、
‘テスト‘し、‘アクション‘からの‘テストイベントの設定‘からの
‘Alexa start sessions`の‘保存してテスト‘をします。

実行結果がグリーンだったら、最後の確認です。


# 日本語のニュースを読んでくれるか？

Alexa, open japanese news.

と呼びかけると、ちゃんと、
さっきamazon pollyのmizukiに読み上げてもらったNHKのニュースを流してくれました！:thumbsup:


<a href=https://youtu.be/GWW0CLteA-E>
<img src=https://qiita-image-store.s3.amazonaws.com/0/173392/43f0ee6c-6911-876d-9e9c-d1a213a8fbcf.png></a>

ここは日本なので、事情によりオールドパーの瓶が echo dot役を演じています。


# 感想

あーよかった。。。
ノースロンドンダービーに間に合ってよかったです。

残課題
・amazon PollyをNode.jsから呼び出すところ
・S3のファイルの自動消しこみは必要。
・でも、去年の今日はどんなニュースがあったか？っていうアーカイブも面白そう。





ではこれから斎戒沐浴して、飯もつくって食って、
ユニフォームに着替えて、
激アツのアーセナル対トッテナム、通称ノースロンドンダービーをテレビ観戦します！
１時間後キックオフ！！！