nagomeのplugin nagome-polly 作った

# nagome-pollyとは?

nagome の plugin です。ニコ生のコメントをAWS polly経由で読み上げます。golangで書かれています。

github リポジトリは[こちら](https://github.com/bamchoh/nagome-polly)です

# 経緯

[Rubyで深層学習を使った音声合成Amazon Pollyを使ってWebサイトの読み上げ音声合成してみた](http://chezou.hatenablog.com/entry/amazon-polly-with-ruby)

こちらのサイトを見て、ニコ生中毒者の私はピンときました。これ、読み上げちゃんの替わりに使えるんじゃね？と。

最近go言語を勉強していることと、ニコ生でnagomeというコメントビューワを作成されている生主さんに出会ったこともあって、nagomeのpluginをgoで書いて、polly使って読み上げちゃんを作ろう!!というアツい思いがこみ上げてきました。

# nagomeとは?

diginatu さんが開発しておられる **次世代コメントビューワ** です。[Viqo](https://github.com/diginatu/viqo)の後継として作成されており、クロスプラットフォームで動作することが特徴で、プラグイン機構を備えています。`nagome`はバックエンドアプリケーションとして動作します。よって、nagome自身にはUIは存在していません。nagomeはUIやプラグインに対してjsonデータを標準入出力もしくはTCP通信経由で送受信することで動作します。UIも一つのプラグインとして存在しているので、フレキシブルな開発が可能となっています。

こちらがgithubリポジトリとなります。

https://github.com/diginatu/nagome

## nagomeのインストール

上記のURLに行くと、バイナリ版が配布されていますが、私はソースコードからのビルド版しか触っておらず、かつ、Windowsユーザーなので、基本Windowsの内容を記述します。

まず、goをインストールしてください。(https://golang.org/dl/)
次に、nagomeのビルドですが、Windows では nagome で使用しているライブラリがcgoに依存している為、mingw が必要なります。mingwのインストールには [こちら](http://qiita.com/spiegel-im-spiegel/items/ba4e8d2418bdfe0c8049)を参考にインストールしました。mingwを起動すればあとは簡単で、コンソール上で以下のコマンドを実行するだけです。

```bash
$ go get github.com/deginatu/nagome
```

ビルドが完了すると、`%GOPATH%\bin`の中に`nagome.exe`ができています。`%GOPATH%\bin`を`%PATH%`に追加されているのであれば、コンソールから`nagome`と打つと起動します。

ですが、その状態ではまだちゃんと動作してくれません。

## nagomeの設定

Windows では設定ファイルをデフォルトで `%APPDATA%\Nagome` ディレクトリの下に配置する必要があります。配置するファイル名は`account.yml`です。内容は以下の通り。

```yaml:account.yml
mail: <ニコニコのログインで使用しているメールアドレス>
pass: <ニコニコのログインパス>
usersession: nagome # ここの設定がこれで良かったのかは忘れてしまいましたすみません
```

## nagomeの起動

nagomeの設定ファイルを配置した後、`nagome`を起動します。

```
> nagome
{"domain":"nagome_directngm","command":"Plug.Enabled"}
{"domain":"nagome","command":"Antenna.Open"}
```

上記のような画面になったと思います。この状態で以下のjsonデータをコンソール上に入力してください。cmd.exeであれば、以下をコピーして、Ctrl+Vで張り付けられるはずです。

```json
{"domain":"nagome_query","command":"Account.Login"}
```

本当はログイン用のプラグインだとかUIだとかを用意するべきなのでしょうけれど、時間の都合上直接入力にしました。
ログインが成功すると、以下のような出力があるはずです。

```json
{"domain":"nagome_ui","command":"Dialog","content":{"type":"Info","title":"login succeeded", "description":"login succeeded"}}
```

次に、コメントを読み込みたい放送を指定します。

```json
{"domain":"nagome_query","command":"Broad.Connect","content":{"broad_id":"<読み込みたい放送枠ID>"}}
```

`<読み込みたい放送枠ID>`のところにはlvXXXXXXXXXとかcoXXXXXXXXXとかのIDを指定します。lvやcoも必要です。
成功すると、(コメントがあれば)コメントが流れ始めます。

# AWS Polly とは?

人工知能を使用したAmazonの音声合成サービスです。AWS CLIを使用することでコマンドラインから読み上げてほしいテキストを送信し、音声データをダウンロードすることができます。

## AWS CLI のインストール

[こちら](https://aws.amazon.com/cli/)よりインストーラーをダウンロードし、インストールしてください。インストールが完了した後、コマンドラインより`aws --version`と入力してバージョンが表示されればインストール完了です。

# nagome-polly のインストール

以下のコマンドを実行してください。

```
> go get github.com/bamchoh/naogme-polly
```

すると、先ほどのnagomeの時と同様に`%GOPATH%\bin`の下に`nagome-polly.exe`が出来ます。それと、`%GOPATH%\src\github.com\bamchoh\nagome-polly\plugin.yml`を`%APPDATA%\Nagome\plugin\nagome-polly`の下にコピーしてください。`plugin\nagome-polly`が存在しなければ、ディレクトリを作成してください。

## nagome-polly を使用する

先ほどの`nagomeを起動`の手順を実行していただくと、コメントが読み込まれるたびにコメントが読み上げられます。

## nagome-polly の仕組み

大まかには以下のような流れです

1. nagomeからコメントを受信する
2. Polly に AWS CLI にて テキストを送信
3. Polly から mp3 データを取得。ローカルに保存する
4. mp3 データを DirectShow ライブラリで再生
5. 1. に戻る

# 課題

* 再生が終了するとmp3データを削除するようにしているのですが、なぜか消えてくれません。おそらく、再生後のハンドルの解放がうまくいっていないんじゃないかと思います。ですので、現状はnagomeをずっと起動しているとmp3データがどんどんローカルに溜まっていってしまいます。プラグインが読み込まれたタイミングでデータの一括削除をしているので、ずっと残るわけではないですが、気分が良いものではないので、修正が必要だなぁと思っています。
* 現状はWindowsのみの対応ですので、MacやLinuxにも対応していけたらなと思っています。
* 一発でpluginディレクトリにデプロイできる仕組みを考えたいなぁ。とぼんやり思っています。goの標準機能出来そうな気もするんですが。。。
* コメントが大量に流れるような放送だと読み上げがついていけなくなるので、速度調整する機構がほしいと思っています。
* コメントが長いと読み上げを途中で終了するようにしたいです
* 放送開始時のコメントを一気に読み上げようとするので、放送開始時のコメントは無視するような設定が必要です。
* 運営からの通知コメント(広告情報やコミュニティへの参加)の読み上げがところどころおかしいので、修正が必要です。


あげればキリがないですが、なんしかまだまだ作成段階なので、**プルリクお待ちしておりますです。**