方言で返答- LINE 翻訳Bot作ってみた！-AzureBotService MicrosoftTranslatorText-

<h2>はじめに</h2>
自分の学習の記録、忘備録としての内容になります。

Qiita初投稿のため、見にくい箇所、不備等があると思います。

内容: AzureBotServiceを使い、LINE 翻訳BOTを作る。
     言語によって日本各地の方言を使って返答する。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442827/39c15d28-4b0b-ba60-849d-bd135472bd34.png" width=40%>
[完成動画](https://youtu.be/Sa4yN9bys2w)

<h2>やったこと</h2>

<h3>１．node.jsでのLINE Botの作成</h3>
まず、この内容を一通り試し、基本的なLINE Botの作り方の学習をしました。
非常に丁寧に作られていて、分かり易かったです。

[1時間でLINE BOTを作るハンズオン (資料+レポート) in Node学園祭2017 #nodefest](https://qiita.com/n0bisuke/items/ceaa09ef8898bee8369d)

- LINE Botの基礎知識学習
- LINE Messaging APIの基礎知識学習
- Node.jsでBot開発
- ngrokでトンネリング
- nowでデプロイ

<h3>２．AzureBotServiceを利用した、LINE翻訳Botの作成</h3>
今後、Azureでの開発も進めて行きたいこともあり、上記　node.js、nowを使った開発部分をAzureBotServiceを利用して行ってみることにしました。
![概念図.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442827/f73e45f5-08d3-97dd-2812-a0ca80c80f74.png)


下記サイトで、AzureBotServiceとLINEを簡単に連携できるチャンネルができたことを知り、この内容に沿って作成してみました。

　　　[祝 LINE チャンネル追加！Azure Bot Service で翻訳チャットボット作成
　　　　　 (1)Azure Bot Service から LINE 接続 編](https://qiita.com/annie/items/1926fc16731fcaad0666#_reference-3f325c6269ef93c7d145)

　　　[祝 LINE チャンネル追加！Azure Bot Service で翻訳チャットボット作成
　　　　　 (2)Cognitive Services Translator Text API 編](https://qiita.com/annie/items/f8c5964bce2d15c26253#_reference-ed51d9df44b258ceeb40)

非常にわかりやすくかかれており、これに沿って進めさせていただきました。

LINEのレスポンス部分の編集はApp Service Editor画面の　bot.jsから行えます。


```node.js:bot.js
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

const { ActivityHandler } = require('botbuilder');

const rp = require('request-promise');

class EchoBot extends ActivityHandler {
    constructor() {
        super();
        // See https://aka.ms/about-bot-activity-message to learn more about the message and other activity types.
/*
        this.onMessage(async (context, next) => {
            await context.sendActivity(`You said '${ context.activity.text }'`);
            // By calling next() you ensure that the next BotHandler is run.
            await next();
        });
*/
        this.onMessage(async (context, next) => {
            console.log('got a message.');

            // Translate
            const subscriptionKey = '<SUBSCRIPTION_KEY>';

            const options = {
                method: 'POST',
                baseUrl: 'https://api.cognitive.microsofttranslator.com/',
                url: 'translate',
                qs: {
                  'api-version': '3.0',
                  'to': 'ja'
                },
                headers: {
                  'Ocp-Apim-Subscription-Key': subscriptionKey,
                  'Content-type': 'application/json'
                },
                body: [{
                      'text': context.activity.text
                }],
                json: true,
            };

            const responseBody = await rp(options);
            const translated = responseBody[0].translations[0].text;

        const responseMessage = `英語で「${translated}」って言ったっスね！`
                + `(検出言語: ${responseBody[0].detectedLanguage.language})`;

            await context.sendActivity(responseMessage);
            await next();
        });   
         
        this.onMembersAdded(async (context, next) => {
            const membersAdded = context.activity.membersAdded;
            for (let cnt = 0; cnt < membersAdded.length; ++cnt) {
                if (membersAdded[cnt].id !== context.activity.recipient.id) {
                    await context.sendActivity('Hello and welcome!');
                }
            }
            // By calling next() you ensure that the next BotHandler is run.
            await next();
        });
    }
}

module.exports.EchoBot = EchoBot;
```

![LINE翻訳Bot画像.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442827/6679925d-f81c-3c87-c30c-ae34fea07d84.jpeg)

<h3>３．入力した言語により、翻訳に方言を交えて返答するBotの作成</h3>
入力した言語により、Switch文で条件分岐し
イタリア後で「こんにちは」ゆーたやん！という風に文末を日本各地の方言を交えて返答する。


```node.js:bot.js
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

const { ActivityHandler } = require('botbuilder');

const rp = require('request-promise');

class EchoBot extends ActivityHandler {
    constructor() {
        super();
        // See https://aka.ms/about-bot-activity-message to learn more about the message and other activity types.

        this.onMessage(async (context, next) => {
            console.log('got a message.');

            // Translate
            const subscriptionKey = 'e2d153f610de4a8086ba83b7360c4c5b';

            const options = {
                method: 'POST',
                baseUrl: 'https://api.cognitive.microsofttranslator.com/',
                url: 'translate',
                qs: {
                  'api-version': '3.0',
                  'to': 'ja'
                },
                headers: {
                  'Ocp-Apim-Subscription-Key': subscriptionKey,
                  'Content-type': 'application/json'
                },
                body: [{
                      'text': context.activity.text
                }],
                json: true,
            };

            const responseBody = await rp(options);
            const translated = responseBody[0].translations[0].text;

/////////////////////////////////ここから変更//////////////////////////////////////////

            const la = responseBody[0].detectedLanguage.language;

            let lang = null;
            let end_sent = 'って言ったっスね！';
      
            switch(la) {
                case 'en':
                    lang = '英語';
                    break
                case 'fr':
                    lang = 'フランス語';
                    end_sent = 'って言ったっショ！';
                    break
                case 'it':
                    lang = 'イタリア語';
                    end_sent = 'ゆーたやん！';
                    break
                case 'es':
                    lang = 'スペイン語';
                    end_sent = 'っつったべ！';
                    break
                case 'ja':
                    lang = '日本語';
                    end_sent = 'ちゆうちょっと！';
                    break
                case 'ko':
                    lang = '韓国語';
                    end_sent = 'っゆったぺよ！';
                    break
                case 'zh-Hans':
                    lang = '中国語';
                    end_sent = 'って言ったアルネ！';
                    break
                case 'de':
                    lang = 'ドイツ語';
                    end_sent = 'っちゅうたじゃろ！';
                    break
                case 'ru':
                    lang = 'ロシア語';
                    end_sent = 'って言うたがいね！';
                    break                                                    
                default:
                    lang = 'ホゲホゲ語';
                    end_sent = 'っていったべさ！';
                    break
             }
            
             const responseMessage =lang+`で「${translated}」`+ end_sent
               + `(検出言語: ${responseBody[0].detectedLanguage.language})`;

/////////////////////////////////ここまで変更//////////////////////////////////////////

            await context.sendActivity(responseMessage);
            await next();
        });   
         
        this.onMembersAdded(async (context, next) => {
            const membersAdded = context.activity.membersAdded;
            for (let cnt = 0; cnt < membersAdded.length; ++cnt) {
                if (membersAdded[cnt].id !== context.activity.recipient.id) {
                    await context.sendActivity('Hello and welcome!');
                }
            }
            // By calling next() you ensure that the next BotHandler is run.
            await next();
        });
    }
}

module.exports.EchoBot = EchoBot;
```


<h2>最後に</h2>
LINEのチャンネルができたことで非常に簡単にLINE翻訳Botを作ることができました。
response部分の編集により色々バリエーションが作れます。

今後、[LUIS](https://azure.microsoft.com/ja-jp/services/cognitive-services/language-understanding-intelligent-service/)を絡めた開発にもチャレンジしていきたいと思います。