Microsoft Translatorを使って翻訳Botを作ってみる


Microsoft Translatorを使って話しかけた言葉を英語に翻訳して返すBotを作成します。
# Translatorのサブスクリプションを追加する
Microsoft Translatorを使用するため[Gettting Started with Microsoft Translator](https://www.microsoft.com/ja-jp/translator/getstarted.aspx)
に従ってTranslatorのサブスクリプションを追加します。

認証キーには以下のKEY１を使用します。
![key1.png](https://qiita-image-store.s3.amazonaws.com/0/171118/12e054e8-2f1b-d9fe-24ec-107bb352d3a9.png "key1.png")

# Translatorを使ってみる
* 認証キーを取得する
認証キーを取得するコードが必要ですが[公式の無料サンプル](https://github.com/MicrosoftTranslator)にサンプルコードがありますので、
[GetAzureToken](https://github.com/MicrosoftTranslator/GetAzureToken)よりAzureAuthToken.csをプロジェクトに追加します。


* Translatorを呼び出す
次にTranslatorを呼び出すプログラムです。
以下のような感じ。変数*key*はサブスクリプションのKEY1に置き換えてください。

```csharp
using System;
using System.IO;
using System.Net;
using System.Runtime.Serialization;

namespace Bot_Application2.Translator
{
    public class TextTranslator
    {
        private readonly string key = "KEY1";
        private string token;

        public TextTranslator()
        {
            token = new AzureAuthToken(this.key).GetAccessToken();
        }

        public string Translate(string input)
        {
            string translated = string.Empty;
            string from = "ja";
            string to = "en";
            string uri = "http://api.microsofttranslator.com/v2/Http.svc/Translate?text=" +
                System.Web.HttpUtility.UrlEncode(input) + "&from=" + from + "&to=" + to;

            HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(uri);
            httpWebRequest.Headers.Add("Authorization", token);
            WebResponse response = null;
            try
            {
                response = httpWebRequest.GetResponse();
                using (Stream stream = response.GetResponseStream())
                {
                    translated = (string)new DataContractSerializer(Type.GetType("System.String")).
                        ReadObject(stream);
                }
            }
            finally
            {
                if (response != null)
                {
                    response.Close();
                    response = null;
                }
            }
            return translated;
        }
    }
}
```
次にBotのソースですが、Bot Applicationプロジェクトを作成したときに生成されるテンプレートを変更します。
変更箇所はMessagesController.csのPostメソッドになります。

```csharp
        /// <summary>
        /// POST: api/Messages
        /// Receive a message from a user and reply to it
        /// </summary>
        public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
        {
            if (activity.Type == ActivityTypes.Message)
            {
                ConnectorClient connector = new ConnectorClient(new Uri(activity.ServiceUrl));
                // calculate something for us to return
                int length = (activity.Text ?? string.Empty).Length;

                // return our reply to the user
                Activity reply = activity.CreateReply(new TextTranslator().Translate(activity.Text));
                await connector.Conversations.ReplyToActivityAsync(reply);
            }
            else
            {
                HandleSystemMessage(activity);
            }
            var response = Request.CreateResponse(HttpStatusCode.OK);
            return response;
        }
```
以下の部分を書き換えました。

```csharp
Activity reply = activity.CreateReply(new TextTranslator().Translate(activity.Text));
```

では動作を確認してみます。
![SnapCrab_Bot Framework Channel Emulator_2017-3-19_17-26-56_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/171118/0d5884b3-a7e9-1a4b-01a1-00c508830c5d.png "SnapCrab_Bot Framework Channel Emulator_2017-3-19_17-26-56_No-00.png")

見事に翻訳されてますね～

次回はAzureに発行してBotConnectorでSkypeに接続してみたいと思います。