FlashAirのLuaスクリプトでMS Translator APIを使ってみた

　先日、FlashAirのLuaスクリプトで、Microsoft Cognitive ServicesのComputer Vision APIを使ってみた[記事](http://qiita.com/ayasehiro/items/40972da214eddb6bc324)を公開した後、さらにBing Speech APIを使ってComputer Vision APIで付与したキャプションを合成音声でしゃべらせた「しゃべるデジカメ」を製作し、FlashAir Developersサイトの[ユーザーチュートリアル](https://flashair-developers.com/ja/documents/tutorials/users/6/)として公開していただきました。
　この「しゃべるデジカメ」は、Computer Vision APIのキャプションが、現状、英語しか対応していないので、当然、英語でしゃべるわけですが、日本語対応したいなと思ったので、今回は、FlashAirのLuaスクリプトから、Microsoft Translator APIを使ってみることにしました。FlashAirでは音声再生できないため、今回はSpeech Translation APIではなく、Text Translation APIを使います。

#サブスクリプションキーの取得
　まず、Microsoft Translator APIを利用するためのサブスクリプションキーを入手します。現時点では、月間200万文字までは無料で利用できます。
　[Microsoft Translator - Text Translation](https://datamarket.azure.com/dataset/bing/microsofttranslator)に、自分のMicrosoftアカウント（もし、お持ちでなければ無料で作成できます）でログインします。すると、以下のページが表示されるので、右上の月額￥０の「サインアップ」をクリックして有効化します。
![AzureMarketPlace05.png](https://qiita-image-store.s3.amazonaws.com/0/89137/2c130e27-bda2-add0-aa80-91581494ecc0.png)

　つぎに、[開発者ページ](https://datamarket.azure.com/developer/applications)を開き、これから製作する自分のアプリケーションを登録します。以下のページの「登録」ボタンをクリックします。
![AzureMarketPlace06.png](https://qiita-image-store.s3.amazonaws.com/0/89137/7ba3ae90-8000-a5de-c400-b57e6bfb7d74.png)

　以下のページでは、必要事項を記入して、最後に「作成」ボタンをクリックします。
- **クライアントID**……適当な自分のアプリケーションの名前をつけます。識別子であるので、一意になるように留意します。この文字列を後ほどプログラムコードで使用します。
- **名前**……好きな名前をつけます。
- **顧客の秘密**……変更不要。この文字列を後ほどプログラムコードで使用します。
- **リダイレクトURI**……Microsoft Translator APIでは不要ですが、無効なURLを入力しておきます。（http://flashair/など）
- **サブドメインアクセスを有効にする**……オフのまま
- **説明**……省略可能ですが、アプリケーションの簡単な概要を記載します。

![AzureMarketPlace04.png](https://qiita-image-store.s3.amazonaws.com/0/89137/b69a485a-162f-7d95-10fe-833c4343e43e.png)

#Luaスクリプトファイル
　FlashAirのルートフォルダに以下のコードを記述したテキストファイル（translator_sample.lua）をコピーします。
　ポイントは、Translator Text APIを呼び出す前に、アクセストークンを取得し、このアクセストークンを用いてTranslator Text APIを呼び出すことです。アクセストークンの有効期限は600秒に設定されているため、10分に１回取得すれば良いのですが、今回は、毎回取得することで処理を簡略化しています。

```translator_sample.lua
local cjson = require "cjson"
function encodeURIComponent(str)
  str = string.gsub (str, "\n", "\r\n")
  str = string.gsub (str, "([^0-9a-zA-Z ])", -- locale independent
  function (c) return string.format ("%%%02X", string.byte(c)) end)
  str = string.gsub (str, " ", "+")
  return str
end

function getAccessToken()
  local token = ""
  local clientId     = "ここにクライアントIDを記述する"
  local clientSecret = "ここに顧客の秘密を記述する"
  local mes	= "grant_type=client_credentials&client_id=" .. encodeURIComponent(clientId) .. "&client_secret=" + encodeURIComponent(clientSecret) + "&scope=http://api.microsofttranslator.com"
  local AccessTokenUri = "https://datamarket.accesscontrol.windows.net/v2/OAuth2-13"
  local len = string.len(mes)
  local b, c, h = fa.request{url = AccessTokenUri,
    method = "POST",
    headers = {
      ["Content-Length"] = tostring(len),
      ["Content-Type"]   = "application/x-www-form-urlencoded",
    },
    body = mes
  }
  if(c == 200) then
    res = cjson.decode(b)
    token = "Bearer " .. res.access_token
  end
  return token
end

function getTransratedString(str, fromlang, tolang)
  local translated_str = ""
  local token = getAccessToken()
  local encstr = encodeURIComponent(str)
  local requri = "http://api.microsofttranslator.com/v2/Http.svc/Translate?text=" .. encstr .. "&from=" .. fromlang .. "&to=" .. tolang
  local b, c, h = fa.request{url = requri,
    headers = {
      ["Authorization"] = token
    },
  }
  if(c == 200) then
    translated_str = b
  end
  return translated_str
end

--呼び出し例
translatedStr = getTransratedString("翻訳したい文字列", "en", "ja")
```

#呼び出し方
　サンプルコードのgetTransratedString("翻訳したい文字列", "en", "ja")では、英語から日本語に翻訳するように、第２、第３引数で指示しています。第２引数には第１引数に指定した文字列の言語を指定し、第３引数には翻訳先の言語を指定します。指定できる言語は、[Translator Language Codes](https://msdn.microsoft.com/en-us/library/hh456380.aspx)を参照してください。

#まとめ
　これで、FlashAirで翻訳サービスを簡単に使えることがわかりました。これで「しゃべるデジカメ」を日本語対応することができますね。
　また、応用次第では、FlashAirで撮影した写真にComputer Vision APIでタグやキャプションを自動付与して、これをTranslator APIで日本語化して、日本語タグで自動分類するようなこともできるかもしれませんね。

#参考資料
　[Microsoft Translator API](https://datamarket.azure.com/dataset/bing/microsofttranslator)
　[Getting started using the Translator API](https://www.microsoft.com/en-us/translator/getstarted.aspx)
　[so-zou.jp Webアプリケーション開発の技術情報 - Microsoft Translator API](http://so-zou.jp/web-app/tech/web-api/bing/translator/)
　[Lua Memo - string.gsub ... パターンを置き換え](http://aoikujira.com/wiki/lua/index.php?string%252Fgsub)