Slackでのチャットをリアルタイムに翻訳するものを作った
Posted by <

みなさん、こんにちは。あんどうです。

最近、フィリピンの人と英語でチャットをしつつ仕事をしているのですが、自分で英語を書くよりも機械翻訳の方が伝わるのでないかと考えました。

そこで、今回はチャットをリアルタイムに翻訳してくれるプログラムを作りました。

準備するもの

Micro Soft Translator
Microsoftが提供している翻訳APIです。なんと、毎月200万文字まで無料
アカウントの無料登録が必要です。)

・SlackのAPI
詳細は下で書きます。

製作の流れ

1.Microsoftの翻訳APIを触ってみる

2.SlackのAPIを触ってみる

3.1と2を組み合わせてカスタマイズ

1.Microsoftの翻訳APIを触ってみる

こちらのサイトを参考に下記のPHPを動かしてみました。

[code lang=”php”]
<?php
const APPID = ‘your APPID’;
$text = ‘彼はベンですか?いいえ彼はベンではありません。’;
$to = ‘en’;

$ch = curl_init(‘https://api.datamarket.azure.com/Bing/MicrosoftTranslator/v1/Translate?Text=%27′.urlencode($text).’%27&To=%27′.$to.’%27′);
curl_setopt($ch, CURLOPT_USERPWD, APPID.’:’.APPID);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$result = curl_exec($ch);
$result = explode(‘<d:Text m:type="Edm.String">’, $result);
$result = explode(‘</d:Text>’, $result[1]);
$result = $result[0];
echo $text." -> ".$result;
?>
[/code]

実行した結果

実行結果

動きました。

2.SlackのAPIを触ってみる

次はSlackのAPIを触ってみます。

今回はここにある「Outgoing WebHooks」というAPIを使いました。
https://slack.com/services/new

このAPIでは、Slack内の特定のチャンネルで発言があった場合にその発言内容や発言者の情報をもと送信してくれます。

さらに、受け取ったプログラムでjsonを表示すると、それをBotからの返信としてSlackに書き込みしてくれます。こんな感じ。

[code]
{text:"@message@"}
[/code]

3.1と2を組み合わせてカスタマイズ

ステップ1:送信者の判別

誰が書いたのかを判断する。日本人なら日本語->英語に、フィリピン人なら英語->日本語に

ステップ2:マイクロソフトのAPIを使って翻訳

ステップ3:少しだけセキュリティに気を付ける

アクセストークンが取得したものと違った場合は「無効なトークンです」と返すように。

ステップ4:Slackへ書き込み

翻訳されたものを出力としてSlackへ書いてもらいます。

 

完成したプログラムがこちら

[code lang=”php”]<?php
const APPID = ‘Your_App_ID’;
$text = $_POST["text"];
//投稿者が日本人の場合
if ($_POST["user_name"] == "Japanese_User_Name" ){
$to = ‘en’;
}
//投稿者が英語を書く人の場合
elseif ($_POST["user_name"] == "English_Post_User_Name") {
$to = ‘ja’;
}
$ch = curl_init(‘https://api.datamarket.azure.com/Bing/MicrosoftTranslator/v1/Translate?Text=%27′.urlencode($text).’%27&To=%27′.$to.’%27′);
curl_setopt($ch, CURLOPT_USERPWD, APPID.’:’.APPID);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
$result = explode(‘<d:Text m:type="Edm.String">’, $result);
$result = explode(‘</d:Text>’, $result[1]);
$result = $result[0];
if ($_POST["token"] != "Your_Slack_Token"): ?>
<h2>無効なトークンです</h2>
<?php endif ?>
{"text":"<?php echo $_POST["user_name"] ?> said : <?php echo $result ?>"}
[/code]

使ってみた

完成しましたので実際に使ってみました。

translate_image

短い文章であればある程度使えますが、少し長くなると全くダメですね。

githubに公開しました。

上記のソースコードだけですので、公開するほどでもないのですがgithubにもアップしておきます。

https://github.com/takuya-andou/slack_translate/