MacでゆっくりSlackBotの作成（基礎編）

# はじめに
最近ゆっくり実況プレイ動画をBGMにしているので、
普段の生活でもゆっくりにいろいろ話しかけてもらいたいと思いました。
他方、SlackのリマインドやGoogleカレンダーの予定を確認し忘れるので通知方法を改善したいと思っていました。
そこで、通知をゆっくりに読み上げてもらいたい!となりました。

今回は基礎編としてSlackの特定チャンネルで発言したものをゆっくりボイスでエコーしてくれるBotを作成したいと思います。

# 前提と制限

## 前提
MacOS Mojave: 10.14.5
botkit: 0.7.4

## 制限

### Macでのゆっくりボイスについて
Mojaveに正式対応しているライブラリが少なく、使用できるゆっくりボイスは非常に限られます。

今回は簡単に動いたのでsaykanaを使用していますが、
後述のとおりMojaveでは警告が出るのでいつ使えなくなってもおかしくありません。
あと漢字や英語は発音できません。

有償ですが、元のAquesTalkを使用するのが最も確実です。

### Botによるゆっくりボイスについて

いまのところ、Botが動作している環境じゃないと聞こえません。
今回の目的が個人使用なので、サーバーに置いて参加者全員が聞こえるようにすると言ったことは実施しません。
(やりたい人はぜひ記事を書いていってね)

# 手順

## ゆっくりボイス(saykana)のインストール

[ダウンロード(vector)](https://www.vector.co.jp/soft/dl/mac/art/se475878.html)

ダウンロードしたzip解答して実行すると警告が出ます。
システム環境設定のセキュリティとプライバシーからインストールを許可しましょう。
インストールすると、このプログラムはMojaveには対応していません的なメッセージが出ますがインストール可能です。

インストールできたら以下のように動作確認してみましょう。

```
$saykana ゆっくりしていってね
```

スピーカーやイヤホンからゆっくりしていってねと流れてくればインストール成功!


## Slack Botの作成

大筋は以下の記事を参考にさせていただきました。
どうもありがとうございます!

[Botkitを利用してSlack上の発言からGitHubのIssueを作成するBotを作る](https://qiita.com/potato4d/items/81e9e8aef6cd57c234af)

ですが、**最近になってBotkitのバージョンが上がった**ようで、
**この記事そのままでは動作しません**。
そのあたりも含めて解説したいと思います。

なお、この調査には週一でモブプロしている知人のエンジニアが、
モブで一緒に調査してくれました!
この場を借りて一心不乱の大感謝を!


### Botの登録

ここで紹介する手順はレガシートークンと言われる種類のトークンです。
新しい方式ではアクセスできる権限を細かく設定できるため、さらにセキュアな運用が可能です。
今回はレガシートークンでの紹介とします。

https://[workspace名].slack.com/services/new/bot

[workspace名]を適宜、自分のワークスペース名にしてアクセス。
ボットのユーザー名を入力します。

<img width="761" alt="スクリーンショット 2019-06-07 16.26.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277397/619e306a-55c3-3137-e688-09263c0de88a.png">


ボットインテグレーションを追加するをクリックすると、
こんな画面になります。
赤点線部の部分にトークンが表示されています。
(スクショでは隠してます)

<img width="761" alt="スクリーンショット 2019-06-07 16.27.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277397/8c215187-50f6-7407-496a-17cfc5140a81.png">

これをメモしておいて、完了。


## Botkitの実装

まずはインストールから。適当にフォルダを作成してから以下を実行します。
`npm init`後はEnter連打でOKです。
(npmのインストールはググればいくらでも出てくるのでそちらで…)

```
$npm init
$npm i -S botkit@0.7.4
```

次に同じフォルダにBotの中身となるコードを実装します。
`<token>`は自分で取得したトークンに置き換えてください。

```index.js
const exec = require('child_process').exec;
const Botkit = require("botkit");
const bot = Botkit.slackbot({
    debug: false
});

bot.spawn({token: <token>}).startRTM();

bot.hears("(.*)",["ambient","mention"], (bot, message) => {
    bot.reply(message, message.text);
    exec('/usr/local/bin/saykana ' + message.text, (err, stdout, stderr) => {
        if (err) { console.log(err); }
        console.log(stdout);
      });
});
```

実装したら実行してみましょう。

```
$node index.js
```

以下のように表示されたらOKです。
(control + cでBotを停止できます)

```
Initializing Botkit v0.7.4
info: ** No persistent storage method specified! Data may be lost when process shuts down.

中略

notice: ** BOT ID: <bot名> ...attempting to connect to RTM!
notice: RTM websocket opened
```

実装したソースでポイントなのは`startRTM`です。
`Real Time Messaging API`と呼ばれるAPIでSlack上で発生したイベントをリアルタイムで受信可能です。
これのAPIをnode.jsで監視することでBotがイベントに対して反応できます。

反応はhearsで実現しています。
`bot.hears`の第1引数は対象となるメッセージの条件、
第2引数は対象となるイベントの種類、
第3引数はイベントに対する反応です。
今回はエコーBotとして投稿された発言に対してそのままオウム返し発言をするように実装しています。

bot.replyをやめればSlack上には表示されず、音声だけにできます。

最後にexecでsaykanaを実行しています。
コンソールではsaykanaだけで実行できますが、プログラムから実行する場合はフルパスで指定しましょう。
半角スペースを開けて喋らせたい文字列を指定します。

# 今後やりたいこと

 - 漢字の対応
 - 英語の対応
 - botの自動起動
 - Slackのリマインドに反応する
 - SlackからGoogleカレンダーの当日予定を発言する
 - 当日予定をゆっくりに読み上げさせる
 - 当日予定の読み上げ毎日特定の時刻(またき起動後の特定時刻)にさせる

なお、SaykanaがMcOSに対応しなくなったら、
AquesTalkかWineを使用してSoftalkにすると思います。

そのときにまだ使用していたら記事にしたいですね。

# おわりに

今の段階では起動しないと喋ってくれないですが、
個人的にはとても楽しい物ができたので将来が楽しみです。

ちょいちょい遊んでい後と思います。