Posted at

Microsoft Translate API を用いた Slack 翻訳コマンドの実装

More than 1 year has passed since last update.


モチベーション

留学生が多い研究室は多くあると思います。

しかし、学生みんな英語がペラペラなわけではありませんよね?汗

そして、言語の壁はチャット上でも存在します。

大事なことはちゃんと英語に訳しますが

些細なことを英語にいちいち訳すのはおっくですよね。

そこで、翻訳コマンドがあったら

チャット上の言語の壁が少しでも小さくなるのでは?

と思っていました。


こんな感じ

Screen Shot 2016-12-06 at 19.25.09.png

英語は訳さない仕様です汗


Microsoft Translate API

上記の記事を見つけていたのですが

Screen Shot 2016-12-06 at 19.33.19.png

もう DataMarket は終わってしまうようだったのでした。

そこで、 Microsoft Cognitive Services の Translator API を使ってみることにしました。

Screen Shot 2016-12-06 at 19.40.30.png

無料枠の制限は同じです。


登録とか

ここ見ながら適当に登録して、 Translator Text APIFree のものを適当にやりました。

translate_api_overview.png


鍵とかアクセストークンとか


スブスクリプションキー

translate_api_key.png

KEY1KEY2 が何なのかよくわかりませんが、とりあえず KEY1 だけでできました。


アクセストークン

http://docs.microsofttranslator.com/oauth-token.html

上の鍵と入れて Try it out! してみてください。

Response Body にトークンが返ってきてると思います。

Screen Shot 2016-12-06 at 20.30.45.png


API 一覧

http://docs.microsofttranslator.com/text-translate.html

あとはここを叩くだけです。

Screen Shot 2016-12-06 at 20.34.14.png


Google Apps Script


doPost

ウェブアプリケーションとして公開するために doPost 関数か、 doGet 関数を用意します。

function doPost(e) {

if(e.parameter.token != SLACK_OUTGOING_TOKEN) return null;

var command = e.parameters.text[0].split(" ");
command.shift();
var text = command.join(" ");
var translated = translate(text);
return postToSlack( SECRETARY, "#" + e.parameters.channel_name[0], translated);
}


translate

実際に 翻訳APIを叩いているところです。

Detect も使って、テキストが何語なのかも判別しています。

function translate(text) {

var subscription_key = "<さっきの鍵>";
var token_url = "https://api.cognitive.microsoft.com/sts/v1.0/issueToken";
var token_options = {
"method": "post",
"headers": {
"Accept": "application/jwt",
"Ocp-Apim-Subscription-Key": subscription_key
}
};
var access_token = UrlFetchApp.fetch(token_url, token_options).getContentText("UTF-8");

var detect_url = "http://api.microsofttranslator.com/v2/Http.svc/Detect?text=" + encodeURIComponent(text);
var translate_options = {
"headers": {
"Authorization": "Bearer " + access_token
}
};
var language_xml = UrlFetchApp.fetch(detect_url, translate_options).getContentText();
// <string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">en</string>
var language = XmlService.parse(language_xml).getRootElement().getText();

var from = "ja";
var to = "en";

if (language.indexOf("ja") >= 0) {
Logger.log("日本語です");
from = language;
} else if (language.indexOf("zh") >= 0) {
Logger.log("中国語です");
from = language;
} else {
Logger.log("英語です");
return "You should read it in English. (-_-;";
}

var translate_url = "http://api.microsofttranslator.com/v2/Http.svc/Translate?from=" + from + "&to=" + to + "&text=" + encodeURIComponent(text);
var translated_xml = UrlFetchApp.fetch(translate_url, translate_options).getContentText();
var translated = XmlService.parse(translated_xml).getRootElement().getText();
return translated;
}

日本語、中国語以外は全て英語としてしまうくそ仕様ですが。。


公開

公開したURLをSlackのoutgoing webhook に指定して、incoming webhook に翻訳後のテキストを返すようにしておけば出来上がりですね。

Screen Shot 2016-12-06 at 20.45.33.png


所感

まあチャット言葉の翻訳は難しいですね。。。

Screen Shot 2016-12-06 at 20.48.09.png