先日、FlashAirのLuaスクリプトで、Microsoft Cognitive ServicesのComputer Vision APIを使ってみた記事を公開した後、さらにBing Speech APIを使ってComputer Vision APIで付与したキャプションを合成音声でしゃべらせた「しゃべるデジカメ」を製作し、FlashAir Developersサイトのユーザーチュートリアルとして公開していただきました。
この「しゃべるデジカメ」は、Computer Vision APIのキャプションが、現状、英語しか対応していないので、当然、英語でしゃべるわけですが、日本語対応したいなと思ったので、今回は、FlashAirのLuaスクリプトから、Microsoft Translator APIを使ってみることにしました。FlashAirでは音声再生できないため、今回はSpeech Translation APIではなく、Text Translation APIを使います。
サブスクリプションキーの取得
まず、Microsoft Translator APIを利用するためのサブスクリプションキーを入手します。現時点では、月間200万文字までは無料で利用できます。
Microsoft Translator - Text Translationに、自分のMicrosoftアカウント(もし、お持ちでなければ無料で作成できます)でログインします。すると、以下のページが表示されるので、右上の月額¥0の「サインアップ」をクリックして有効化します。
つぎに、開発者ページを開き、これから製作する自分のアプリケーションを登録します。以下のページの「登録」ボタンをクリックします。
以下のページでは、必要事項を記入して、最後に「作成」ボタンをクリックします。
- クライアントID……適当な自分のアプリケーションの名前をつけます。識別子であるので、一意になるように留意します。この文字列を後ほどプログラムコードで使用します。
- 名前……好きな名前をつけます。
- 顧客の秘密……変更不要。この文字列を後ほどプログラムコードで使用します。
- リダイレクトURI……Microsoft Translator APIでは不要ですが、無効なURLを入力しておきます。(http://flashair/など)
- サブドメインアクセスを有効にする……オフのまま
- 説明……省略可能ですが、アプリケーションの簡単な概要を記載します。
Luaスクリプトファイル
FlashAirのルートフォルダに以下のコードを記述したテキストファイル(translator_sample.lua)をコピーします。
ポイントは、Translator Text APIを呼び出す前に、アクセストークンを取得し、このアクセストークンを用いてTranslator Text APIを呼び出すことです。アクセストークンの有効期限は600秒に設定されているため、10分に1回取得すれば良いのですが、今回は、毎回取得することで処理を簡略化しています。
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")では、英語から日本語に翻訳するように、第2、第3引数で指示しています。第2引数には第1引数に指定した文字列の言語を指定し、第3引数には翻訳先の言語を指定します。指定できる言語は、Translator Language Codesを参照してください。
まとめ
これで、FlashAirで翻訳サービスを簡単に使えることがわかりました。これで「しゃべるデジカメ」を日本語対応することができますね。
また、応用次第では、FlashAirで撮影した写真にComputer Vision APIでタグやキャプションを自動付与して、これをTranslator APIで日本語化して、日本語タグで自動分類するようなこともできるかもしれませんね。
参考資料
Microsoft Translator API
Getting started using the Translator API
so-zou.jp Webアプリケーション開発の技術情報 - Microsoft Translator API
Lua Memo - string.gsub ... パターンを置き換え