VBA(Access)アプリにMicroSoftのTranslator APIを使って翻訳機能付けてみた

2015-01-23_17h10_18

こんにちは、えんぞーです。

普段から使ってる業務用アプリに「あ~、ここに翻訳ボタンあれば便利だな~・・コピペすんのめんどい」とか文句垂れていたので付けてみました。

とりあえず動いているので「同じような事したい人がいるかも知れない」ということで参考までにやり方書いときます。簡単に。

マイクロソフトのAccessを使用しているのでVBAでの記述となります。

必要なもの

必要というか下準備みたいなものですが・・・。

Microsoft Azure Marketplaceへの登録

API使うことになるのでWindows Azure Marketplaceへの登録が必要です。なんか難しそうな名前になってますけどWindowsLiveアカウントでOKです。

持っている人はそのままログインして、持っていない人は無料登録しておきましょう。

Microsoft Translator APIの登録

ここから翻訳APIの登録を行います。(もしくはログイン後の検索で探すと出てきます。)

下の画像のような画面になっているはずですので無料版で登録します。
(すでに押した後だったので画像は「キャンセル」と書いてますがこの位置です)

2015-01-23_17h18_07

無料版は月に2,000,000文字の翻訳が可能となっています。

ちなみにログイン後のマイデータの項目で現在どのくらい使っているのかが確認できます。

2015-01-23_17h23_18

アプリケーションの登録

ここからアプリケーションを登録します。

各項目の説明は次の通りです。

  • クライアントID
    既にされているID以外であれば好きなの付けて大丈夫です。
  • 名前
    好きなの入れてください。
  • 顧客の秘密
    アプリケーションのパスワード。自分の好きなパスワードにも出来ます。
  • リダイレクト URI
    このAPIでは不要っぽいですが必須らしいので適当に「http://localhost/」とか入れておく。httpsじゃないと・・・とか言われますが無視して大丈夫です。
  • 説明
    お好きな説明を入れてください。空でも大丈夫です。

Translator APIを使ってみる

ようやく本番です。

このAPIを使用する際の流れは、「access_tokenを取得する」→「翻訳する」という流れになるそうで。

まずはaccess_tokenを取得する為に指定されたURLへPOSTメソッドをつかってパラメーターを投げてやりましょう。

access_token取得に必要な各種パラメーター

・リクエストURL
https://datamarket.accesscontrol.windows.net/v2/OAuth2-13

・メソッド POST

・パラメーター

  • grant_type
    client_credentials
  • client_id
    アプリケーションの登録時に指定したクライアント ID
  • client_secret
    アプリケーションの登録時に取得した顧客の秘密
  • scope
    http://api.microsofttranslator.com

この部分をVBAでコードにしてみると

これを実行するとJSON形式の返り値があるのであとはそこから「access_token」を抜き出します。

ポイントとすればRepuestHeaderには「application/x-www-form-urlencoded」を指定する所でしょうか。

あと、顧客のパスワード部分ですが最初に決められたものを使う場合は注意して下さい。文字列の中に「=」とか入っているとそれを考慮した書き方しないといけないかも知れません。

なんか上手くいかない・・・って言う場合はパスワードを英数字のみにして試して見てください。

JSON形式から「access_token」を取り出す

返り値取得出来たならあとは好きに料理してくれればOKって感じですがずぼらな私の場合でご紹介。

JSONからの取り出しはそれように関数作っちゃいました。

これで「access_token」が入手出来たので、やっと翻訳作業に入れます。

翻訳してみる

翻訳はGETメソッドを使って行いました。

なにやらPOSTでも良いらしいっていうのも見た気がしますがGETでやって動いちゃったのでこれで良いです。

翻訳に必要なパラメーター

・リクエストURL
http://api.microsofttranslator.com/V2/Http.svc/Translate

・メソッド GET

・パラメーター

  • from
    翻訳元言語のコード
  • to
    翻訳先言語のコード
  • text
    翻訳するテキスト

あと先程取得したaccess_tokenをリクエストヘッダに組み込んであげればOK。

リクエストヘッダに指定する際、”Authorization”をヘッダ名にして値に”Bearer “を入れてからaccess_tokenを入れると言うルールみたいです。

“Bearer”のあとに半角で 入っているので気を付けて下さい。

これで翻訳したものが返り値として帰ってきます。

後は自分の要望に合わせて翻訳メソッド自体を関数にしたりして自由に使えるかと思います。

私は単純に一行文の翻訳だけしたかったのでそのまま関数にして使ってます。

2015-01-23_18h08_13

追記:日本語から英語へ翻訳するときの注意

コメント欄に頂いた質問(日本語→英語が文字化けしてしまう現象)が気になったので試してみました。KOJIさんありがとうございます^^

考えてみたら自分の場合「英→日」の翻訳しか必要なかったので「日→英」は試していませんでした。

結果、

screenshot_07

見事に文字化けしました。

文字化けすると言う事は渡す文字列のエンコードに問題あるのでUTF-8にエンコードして渡せば・・・と言うことで下記のページでまとめられているようにエンコードする関数を用意しました。

文字列をUTF-8でエンコードするユーザー定義関数 | You Look Too Cool

注意点としては

VisualBasicエディタの設定をする必要があります。
ツール-参照設定-参照設定ダイアログで「Microsoft ActiveX Data Objects 2.8 Library」にチェックを入れます。
2.5以上であれば動くようです。

参照設定が必要になるのでそこを忘れないようにしてください。

肝心のコードはありがたくそのまま使わせて頂きます。

この関数を使って再度試してみると・・・・

screenshot_08

はい、正常に翻訳してくれました。

APIに渡す文字列はUTF-8にして渡す必要があるようです。

とりとめのないまとめ

1ヶ月で2,000,000文字もあれば十分過ぎるのでちょっと翻訳機能を組み込みたいっていう人にはオススメです。

今回はVBAでしたけど基本的にはどんな言語になっても一緒なので参考にはなるだろうと思います。

翻訳に頼らなくとも大丈夫なくらいの英語力があればそれで話は済むのですけれどもね(身も蓋も無い・・・)。

コメント

  1. KOJI  より:

    はじめまして!!こちらの記載大変参考にさせて頂きました。ありがとうございました。
    私もACCESSで翻訳機能を設定したく、勉強しております。
    こちらのサイトをみて英語→日本語はうまく表示できたのですが、日本語→英語が文字化けしてしまう現象が解決できませんでした・・。もしおわかりになれば教えていただくと大変助かります。突然の投稿で恐縮です。よろしくお願いします。

    • えんぞー より:

      >KOJIさん
      コメントありがとうございます^^
      参考になったのであればうれしい限りです。

      日本語→英語の翻訳が文字化けする問題ですが、文字列のエンコードが問題ですのでそこを変えれば正常に翻訳してくれるのを確認しました。
      記事中にその件について追記してますので試してみてください。

  2. KOJI より:

    えんぞー様

    ありがとうございました!!翻訳結果出ました。私も
    UTF8に変更するのにマイクロソフトのサンプルコードを突っ込んでみましたが全然できなくて・・違う原因かと思ってました。本当に助かりました~

    もう一つだけお聞きしたいのですが、翻訳結果の返り値は翻訳結果
    とタグがついてくると思いますが、どのようにパースされてますでしょうか?
    これも今、いろいろ試して見たのですがうまく取得できず、正規表現でタグ削除
    をすることにしましたが、何か違うやり方でもあるのかな?と思いまして・・

    • えんぞー より:

      >KOJIさん
      うまく動いたようでよかったです^^
      タグの削除の方法はKOJIさんがやっているように正規表現で削除して良いと思いますよ。
      私なんか正規表現どころか普通にReplace関数使ってゴリゴリ消してますからw
      ただ、Replace関数だとタグの中身の値が変わったら置換されなくなっちゃうので・・・KOJIさんの様に正規表現で消したほうが安心ですね~。