7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

モチベーション

留学生が多い研究室は多くあると思います。
しかし、学生みんな英語がペラペラなわけではありませんよね?汗

そして、言語の壁はチャット上でも存在します。
大事なことはちゃんと英語に訳しますが
些細なことを英語にいちいち訳すのはおっくですよね。

そこで、翻訳コマンドがあったら
チャット上の言語の壁が少しでも小さくなるのでは?
と思っていました。

こんな感じ

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 だけでできました。

アクセストークン

上の鍵と入れて Try it out! してみてください。
Response Body にトークンが返ってきてると思います。

Screen Shot 2016-12-06 at 20.30.45.png

API 一覧

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

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
7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?