Microsoft Translatorを使って話しかけた言葉を英語に翻訳して返すBotを作成します。
Translatorのサブスクリプションを追加する
Microsoft Translatorを使用するためGettting Started with Microsoft Translator
に従ってTranslatorのサブスクリプションを追加します。
Translatorを使ってみる
-
認証キーを取得する
認証キーを取得するコードが必要ですが公式の無料サンプルにサンプルコードがありますので、
GetAzureTokenよりAzureAuthToken.csをプロジェクトに追加します。 -
Translatorを呼び出す
次にTranslatorを呼び出すプログラムです。
以下のような感じ。変数keyはサブスクリプションのKEY1に置き換えてください。
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メソッドになります。
/// <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;
}
以下の部分を書き換えました。
Activity reply = activity.CreateReply(new TextTranslator().Translate(activity.Text));
見事に翻訳されてますね~
次回はAzureに発行してBotConnectorでSkypeに接続してみたいと思います。