Microsoft Translator APIを使ってLINEから翻訳させてみた

引続き自分に使えるLINEBotシリーズをひたすら研究中。
海外輸入でサポートに問い合わせることが多いので翻訳できるLINEBotを作ってみた。

# 翻訳ライブラリ
Google Cloud Translation APIは有料のようなので、Microsoft Translator APIを利用することにした。
200百万文字/月までは無料で利用できるようだ、Microsoftありがとう。

登録方法などはこの記事が詳しい。
<TABLE ALIGN=CENTER><TR><TD WIDTH=400px>
 <A HREF="http://qiita.com/kemayako/items/21fe36005e6e729aff77" TARGET="_blank"><STRONG>Microsoft Translator APIを使ってみる - Qiita</STRONG></A>
 <A HREF="http://b.hatena.ne.jp/entry/http://qiita.com/kemayako/items/21fe36005e6e729aff77" TARGET="_blank">
 <IMG BORDER="0" SRC="http://b.hatena.ne.jp/entry/image/http://qiita.com/kemayako/items/21fe36005e6e729aff77" BORDER="0" ALT="" /></a>
 <BR>
 Microsoft Translator APIを使ってみる - Qiita... 
 </TD>
 <TD WIDTH=150px>
 <IMG STYLE="float:left;margin-right:.5em;" SRC="http://capture.heartrails.com/120x120/cool?http://qiita.com/kemayako/items/21fe36005e6e729aff77" ALT="" WIDTH="120" HEIGHT="120" />
 </TD></TR>
</TABLE>

# プログラム
プログラムはこの記事をほぼ真似させてもらった。
<TABLE ALIGN=CENTER><TR><TD WIDTH=400px>
 <A HREF="http://qiita.com/lm0x/items/707ea4051b92bf839a1a" TARGET="_blank"><STRONG>Microsoft Translator APIを使ってみた - Qiita</STRONG></A>
 <A HREF="http://b.hatena.ne.jp/entry/http://qiita.com/lm0x/items/707ea4051b92bf839a1a" TARGET="_blank">
 <IMG BORDER="0" SRC="http://b.hatena.ne.jp/entry/image/http://qiita.com/lm0x/items/707ea4051b92bf839a1a" BORDER="0" ALT="" /></a>
 <BR>
 Microsoft Translator APIを使ってみた - Qiita... 
 </TD>
 <TD WIDTH=150px>
 <IMG STYLE="float:left;margin-right:.5em;" SRC="http://capture.heartrails.com/120x120/cool?http://qiita.com/lm0x/items/707ea4051b92bf839a1a" ALT="" WIDTH="120" HEIGHT="120" />
 </TD></TR>
</TABLE>

日本語が混じっていれば入力は日本語と判定し英語に翻訳、それ以外は逆とした。

```php:callback.php
<?php

require_once('./LINEBotTiny.php');

$channelAccessToken = 'YOUR_ACCESS_TOKEN';
$channelSecret = 'YOUR_SECRET';

$client = new LINEBotTiny($channelAccessToken, $channelSecret);

foreach ($client->parseEvents() as $event) {
    switch ($event['type']) {
        case 'message':
            $message = $event['message'];

            switch ($message['type']) {
                case 'text':

                    $client->replyMessage(array(
                        'replyToken' => $event['replyToken'],
                        'messages' => array(
                            array(
                                'type' => 'text',
                                'text' => translation($message['text'])
                            )
                        )
                    ));

                    break;
                default:
                    error_log("Unsupporeted message type: " . $message['type']);
                    break;
            }
            break;
        default:
            error_log("Unsupporeted event type: " . $event['type']);
            break;
    }
};

function translation($text) {
  $client_id = "YOUR_ID";
  $client_secret = "YOUR_SECRET";
  $access_token = getAccessToken($client_id, $client_secret)->access_token;

  $text = mb_convert_kana($text, 'KVas');

  $from = '';
  $to = '';
  if (preg_match('/[ぁ-んァ-ヶー一-龠、。]/u',$text)) {
    $from = 'ja';
    $to = 'en';
  }
  else{
    $from = 'en';
    $to = 'ja';
  }


  return tranlator($access_token, array(
          'text' => $text,
              'to' => $to,
              'from' => $from));

}


  function getAccessToken($client_id, $client_secret, $grant_type = "client_credentials", $scope = "http://api.microsofttranslator.com"){
      $ch = curl_init();
      curl_setopt_array($ch, array(
          CURLOPT_URL => "https://datamarket.accesscontrol.windows.net/v2/OAuth2-13/",
          CURLOPT_SSL_VERIFYPEER => false,
          CURLOPT_RETURNTRANSFER => true,
          CURLOPT_POST => true,
          CURLOPT_POSTFIELDS => http_build_query(array(
              "grant_type" => $grant_type,
              "scope" => $scope,
              "client_id" => $client_id,
              "client_secret" => $client_secret
              ))
          ));
      return json_decode(curl_exec($ch));
  }

  function tranlator($access_token, $params){
      $ch = curl_init();
      curl_setopt_array($ch, array(
          CURLOPT_URL => "https://api.microsofttranslator.com/v2/Http.svc/Translate?".http_build_query($params),
          CURLOPT_SSL_VERIFYPEER => false,
          CURLOPT_RETURNTRANSFER => true,
          CURLOPT_HEADER => true,
          CURLOPT_HTTPHEADER => array(
              "Authorization: Bearer ". $access_token),
          ));
      preg_match('/>(.+?)<\/string>/',curl_exec($ch), $m);
      return $m[1];
  }
```

# 動作
精度や速度は全く問題なしだ。これはかなり使えそうな予感。
![cap.PNG](https://qiita-image-store.s3.amazonaws.com/0/120983/99ce28e7-c43a-2bd2-5ac0-1fa72cdafb96.png)


（追記）
ちょうどこの記事を見て、 ニューラルネット翻訳に対応してみた。
<TABLE ALIGN=CENTER><TR><TD WIDTH=400px>
 <A HREF="http://qiita.com/sosuke/items/03617730cfbdd4187e2a" TARGET="_blank"><STRONG>Microsoft Translate API を用いた Slack ニューラルネット翻訳コマンドの実装 - Qiita</STRONG></A>
 <A HREF="http://b.hatena.ne.jp/entry/http://qiita.com/sosuke/items/03617730cfbdd4187e2a" TARGET="_blank">
 <IMG BORDER="0" SRC="http://b.hatena.ne.jp/entry/image/http://qiita.com/sosuke/items/03617730cfbdd4187e2a" BORDER="0" ALT="" /></a>
 <BR>
 Microsoft Translate API を用いた Slack ニューラルネット翻訳コマンドの実装 - Qiita... 
 </TD>
 <TD WIDTH=150px>
 <IMG STYLE="float:left;margin-right:.5em;" SRC="http://capture.heartrails.com/120x120/cool?http://qiita.com/sosuke/items/03617730cfbdd4187e2a" ALT="" WIDTH="120" HEIGHT="120" />
 </TD></TR>
</TABLE>