Watson APIを利用してPythonで多言語通訳botをSlackに作る

#はじめに
Slack上にWatsonのLanguage Translatorを活用した翻訳botを作ってみます。
想定として、もし日本語の通じない多国籍チームに入ることになってもなんとかSlack上の会話についていき発言できるように！多言語通訳をbotにしてもらいます。
ここでは、日本語、英語、ドイツ語の3言語にします。
通訳らしく発言を常に翻訳してくれるbotにします。

| ユーザー発言   |➡  |          bot翻訳1 |        bot翻訳2   |
|:---------------|:--:|:------------------|:------------------|
| 英語           | ➡ |            日本語 |   ドイツ語        |
| 日本語         | ➡ |              英語 |    ドイツ語       |
| ドイツ語       | ➡ |              英語 |   日本語　        |




#環境
OS : Windows 10
botプログラム ： Python3 - slackbotライブラリ
botを作る場所 ： Slack
通訳(翻訳) ： Watson - Language Translator


botプログラムはここに置いておきます。
https://github.com/kg1-thub/bot.git


翻訳はWatson APIを使います。
IBM Cloudライト・プランで一部機能が無料で使えるようになっており、Language Translatorもそのひとつです。
Watson APIのサービスを使い始める記事をこちらに記載しました。
[【AI事始め】Watson APIをPythonで使ってみる（Language Translator）](https://qiita.com/kg1/items/88be91c5ecde8600220e)


#事前準備

##Slack上にbotを作成してAPIトークンを取得する

まずはSlackにbotを作成して、PythonプログラムとつなぐためのAPIキーを取得します。
以下のリンクからbotを作成します。bot作成には、SlackのWorkspaceの管理者権限が必要です。

[Slack bot作成](https://my.slack.com/services/new/bot)

このリンクをクリックすると次のような画面に移ります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/188272/2b82e15b-ef8c-1dca-628e-0ed1e1bacc1f.png)


この画面でUsername(botの名前)を入力して「Add bot integration」ボタンを押してください。
Slack上のbotの表示名は次の画面で、設定できます。

「Add bot integration」ボタンを押すと次のようなbotの設定画面に移ります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/188272/88955e70-f1f7-890d-f1d1-354dfe6b8eec.png)

はい、API Tokenをひかえましょう。
あとでPythonで作るプログラムに指定します。
あとは、同じ設定画面内に「Full Name」という項目でbotのSlack上の表示名を指定できます。
この記事で作る通訳botの名前は「WatsonTranslatorくん」にします。

これでbotのガラができたイメージです。
次にbotの中身になる部分を作っていきます。

#botプログラムを作成する
ここからbotプログラムの中身になる部分についての記述です。

##多言語翻訳の実現方法を考える
botの中身になるプログラムの中でWatson API を使って、Language Translatorで翻訳を行います。

###Language Translatorのモデルの考慮
ここで日本語⇔ドイツ語の翻訳については注意が必要です。

Language Translatorの翻訳する言語やドメイン(領域)にはモデルがあります。
例えば
　・日本語から英語へ翻訳するニュースドメインのモデル
　・英語からスペイン語へ翻訳する会話ドメインのモデル
というような翻訳言語を定めるモデルです。
モデルがない言語間の翻訳はできません。

Language Translatorのサービス作成時点での、日本語・ドイツ語・英語間のモデルの存在状況は以下でした。[^1]

|翻訳言語|モデル|
|:--|:--|
|日本語 ⇔ 英語|あり|
|ドイツ語 ⇔ 英語|あり|
|日本語 ⇔ ドイツ語|なし|

日本語⇔ドイツ語間を直接翻訳するモデルがありません。

[^1]: Language Translator の list modelsというAPIを使用するとモデルの情報確認ができます。[Watson API Reference - Language Translator - list models](https://www.ibm.com/watson/developercloud/language-translator/api/v2/#list-models)



###モデルのない言語間の翻訳への対策
モデルを作ればよいのでしょう[^2] けど、手間も時間もかけずに、とりあえず動くようにしたいので、
ここでは英語をハブにして、英訳したものをドイツ語・日本語に翻訳するという形をとることにします。

| ユーザー発言      |➡ |  中継翻訳 |➡|    bot翻訳   |
|:---------------:|:--:|:------------------:|:--:|:------------------|
| 英語           | ➡  |    ➡           |➡|        日本語        |
| 英語           | ➡  |     ➡          |➡|        ドイツ語        |
| 日本語          | ➡ |      ➡       |➡|       英語       |
| 日本語          | ➡ |            英語 |➡|       ドイツ語       |
| ドイツ語         | ➡    |      ➡         |➡|        英語        |
| ドイツ語         | ➡    |              英語 |➡|        日本語　        |

[^2]: Langeage Translator の create modelというAPIでモデル作成ができます。[Watson API Reference - Language Translator - create model](https://www.ibm.com/watson/developercloud/language-translator/api/v2/#create-model)


##Pythonプログラム作成

チャットボットのプログラムとしては、Pythonのslackbotライブラリを使います。
slackbotの導入、使い方はこちらを参考にしました。
[PythonのslackbotライブラリでSlackボットを作る]
(https://qiita.com/sukesuke/items/1ac92251def87357fdf6)

Pythonプログラムを動かしておくと、Slack上の発言にbotが反応してくれます。

###ファイル構成
ファイル構成は以下です。

```
slackbot
├─ run.py
├─ slackbot_settings.py
└─ plugins               
   ├─ __init__.py  
   └─ translator.py 
```

###pyファイル内容
各pyファイルの内容を記載します。


####run.py
このプログラムを実行することで、botプログラムが起動できるようになります。

```Python:run.py
# coding: utf-8

from slackbot.bot import Bot

def main():
    bot = Bot()
    bot.run()

if __name__ == "__main__":
    print('start slackbot')
    main()
```

####slackbot_settings.py
bot設定プログラムです。
API_TOKENに、Slack上でbot作成時に採番されたAPI Tokenを指定します。

```Python:slackbot_settings.py
# coding: utf-8

# Slack-botのAPIトークンを指定
API_TOKEN = "{{ API_Token }}"

# このbot宛のメッセージで、どの応答にも当てはまらない場合の応答文字列
DEFAULT_REPLY = "ちょっと何言ってるかよくわかんないです"

# プラグインスクリプトを置いてあるサブディレクトリ名のリスト
PLUGINS = ['plugins']
```


####\_\_init__.py
空ファイルでいいです。


####translator.py
ここが通訳botの中身(動き)の核になるプログラムです。
通訳botの動きとして以下にします。
　・すべての発言をリッスン
　・まず発言の言語識別
　・そして翻訳して発信

```Python:translator.py
# coding: utf-8

from slackbot.bot import listen_to      # チャネル内発言で反応するデコーダ
from watson_developer_cloud import LanguageTranslatorV2 as LanguageTranslator

language_translator = LanguageTranslator(
  username = '{{ username }}',
  password = '{{ password }}'
)

@listen_to(r'.+') # すべての発言をリッスンする。正規表現。
def listen_func(message):
    text = message.body['text']     # メッセージを取り出す
    language = language_translator.identify(text)  
    source = language['languages'][0]['language']   # 言語識別
    if source not in ['ja','de'] :
        source = 'en'
        target1 = 'ja'
        target2 = 'de'
        msg1 = language_translator.translate(
            text=text,
            source=source,
            target=target1)
        msg2 = language_translator.translate(
            text=text,
            source=source,
            target=target2)
    else :
        if source == 'ja':
            target1 = 'en'
            target2 = 'de'
        elif source == 'de':
            target1 = 'en'
            target2 = 'ja'
        msg1 = language_translator.translate(
            text=text,
            source=source,
            target=target1)
        msg2 = language_translator.translate(
            text=msg1,
            source=target1,
            target=target2)
    message.send(msg1)      # target1への翻訳結果をsend
    message.send(msg2)      # target2への翻訳結果をsend
```

パラメータの意味説明は割愛します。API Referenceを読んでください。
以上です。


#使ってみる
botを使うための手順は以下3点です。

1.　(Slack) 通訳botを使うChannelを決めて、通訳botをインバイトしてChannelに所属させましょう。

2.　(ローカルPC) pythonプログラムを起動しましょう。

``` shell
$ cd slackbot
$ python run.py
```
3.　(Slack) 通訳botを所属させたChannelで発言してみましょう。

##実行例
以下の例では、1人3役(日本語発言/英語発言/ドイツ語発言)でお送りします。
「WatsonTranslatorくん」が通訳botです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/188272/2d967689-17c1-dd1c-4b31-52b72b5ceaa2.png)

訳されたドイツ語の意味が正しいかとかよくわからない。。けどちゃんと動きました！

#おわりに
Pythonで公開されているライブラリとサービス(Watson、Slack)を組み合わせて活用するだけで、
入力内容に応じて発言するチャットボットを簡単に形にすることができました。
今回は通訳botとしましたが、Watsonの他の機能や別のAIサービスと組み合わせるだけでも多様なチャットボットを自分で作れそうです。

---