マイクロソフトAPI「Translator Text API」をVBAから使ってみました


とある英文商品名の大量翻訳案件があったので、Microsoftの提供するAPI「Translator Text API」を使って試してみました。その時の実装までの手順をご紹介致します。

紹介されているサイトは幾つか存在したのですが、情報が更新されたのか手順通りにやってもうまくいかなかったため、2017年6月時点での最新手順として参考になれば幸いです。

GoogleかMicrosoftか

突然ですが、Web翻訳と言えばどこを思い浮かべますか?

私は「Google翻訳」です。

実は数年前にGoogle翻訳用の処理を関数化して作ってあったのですが、いつの間にか有料化していた様で使えなくなっていました・・・。

後継として登場していたのが有料の「Google Translation API」ですが、比例計算で課金される様で「100万文字の翻訳で20ドル(5万文字で1ドル)」の料金体系だそうです。

ただし、初回登録時には12ヶ月間使用できる300ドル分のクレジットがもらえるそうなので、「1年間1,500万文字」までであれば無料で翻訳ができるみたいです。(間違っていたら指摘をお願いします。)

対するMicrosoftにも「Translator Text API」翻訳APIが存在していた様です。今回初めて知りました。こちらは「1月200万文字」以内の翻訳であれば無料。その上が「1月2億5千万文字上限で20万9,610円」という法人向けのプランです。

100万文字あたり1,020円」という従量課金制のプランも存在します。こちらは翻訳文字数の上限はありません。

慣れ親しんだGoogle翻訳を登録して使うのもアリだったんですが、Microsoftの翻訳精度にも興味があったので、とりあえず基本無料のMicrosoft翻訳を利用してみることにしました。

Microsoft Azureにアクセスする

まずはMicrosoft Azureにアクセスし、ログイン(未登録の場合は登録)します。

⇒Microsoft Azure ポータル

未登録の場合の初回登録方法については特に説明不要だと思うので割愛させて頂きます。


スポンサーリンク

リソースのデプロイ

ログイン後、Azure Portalにアクセスすると以下の様なメニューが表示されますので、画面左に表示されている「+」のマークをクリックします。

※項目の表示内容は人によって若干異なります。

表示された検索フォームに「translator」と入力すると、候補一覧に「Translator Text API」が表示されるので、そちらを選択後検索します。

アイコンと一緒に表示されている「Translator Text API」と書かれたリンクをクリックします。

APIの説明や注意事項などが英文で記載されたメッセージが表示されますので、内容を確認後問題が無ければ「作成」を押します。

「作成」という言葉が使われていますが、自身の環境で使える様に「有効化」するといった方が近い様な気がしますね。

先ほどの「作成」ボタンを押すと次の様な画面が表示されますので、全ての必須項目を入力した後、同画面内の「作成」ボタンを押しましょう。

それぞれの説明は以下の通り。

名前
あなた自身のダッシュボードに表示される、このAPIの表示名です。

■サブスクリプション
あなたのMSAzureのアカウントプランです。デフォルトで入力されています。

価格レベル
このAPIの利用プランです。

リソースグループ
初めての利用の場合は適当な文字列で構いません。

リソースグループの場所
この項目はよく分かりませんでしたが、データセンターの場所でしょうか?私はとりあえず「東日本」で設定しました。

最後に同意内容を確認し、チェックを入れれば完了です。

アクセスキーを確認する

APIを呼び出す準備が整うまであともう一息です。

作成完了後ダッシュボードに戻ると、先ほど設定した名前でリソースが表示されていると思います。早速クリックしてみましょう。

この様な画面が表示されたら、赤枠内にある「アクセスキーを表示…」リンクを押します。

こちらのページが表示されたら、「キー1」の文字列を控えておきましょう。


スポンサーリンク

VBAで記述する

実行サンプル付きのソースは以下の通りです。

Public Sub Sample()
  Dim access_key As String
  Dim source_str As String
   
  '********** 要変更 **********
  access_key = "(アクセスキー)"
  source_str = "こんにちは!"
  '****************************
   
  With CreateObject("WScript.Shell")
    '日本語→英語
    .Popup TranslateStringMS(access_key, _
                             source_str, _
                             "ja", _
                             "en")
  End With
End Sub
 
Public Function TranslateStringMS(ByVal access_key As String, _
                                  ByVal source_str As String, _
                                  Optional ByVal from_lang As String, _
                                  Optional ByVal to_lang As String)
    Dim url As String
    Dim access_token As String
    Dim ret As String
    Dim d As Object
     
    ret = "": Set d = Nothing '初期化
    access_token = GetAccessToken(access_key)
    url = "http://api.microsofttranslator.com/v2/Http.svc/Translate" & _
          "?text=" & EncodeURL(source_str) & _
          "&from=" & from_lang & _
          "&to=" & to_lang
    On Error Resume Next
    If Len(Trim(access_token)) > 0 Then
      With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", url, False
        .setRequestHeader "Content-Type", "application/x-www-form-urlencoded;charset=utf-8"
        .setRequestHeader "Authorization", "Bearer " & access_token
        .send
        Select Case .Status
          Case 200: Set d = .responseXML
        End Select
      End With
      If Not d Is Nothing Then ret = d.Text
    End If
    On Error GoTo 0
    TranslateStringMS = ret
End Function
 
Private Function GetAccessToken(ByVal access_key As String) As String
    Dim url As String
    Dim js As String
    Dim ret As String

    url = "https://api.cognitive.microsoft.com/sts/v1.0/issueToken?Subscription-Key=" & access_key
    On Error Resume Next
    With CreateObject("MSXML2.XMLHTTP")
      .Open "POST", url, False
      .send
      Select Case .Status
        Case 200: ret = .responseText
      End Select
    End With
    On Error GoTo 0
    
    GetAccessToken = ret
End Function
 
Private Function EncodeURL(ByVal str As String) As String
    With CreateObject("ScriptControl")
      .Language = "JScript"
      EncodeURL = .CodeObject.encodeURIComponent(str)
    End With
End Function

ソース等は以下の記事を参考にさせて頂きました。
Microsoft Translator APIで文字列を翻訳するVBAマクロ

上記ソースをそのままコピーした後、「sample」関数内の『access_key』に代入する値を、先ほど控えた「アクセスキー」に置き換えるだけで動くはずです。

source_str』の値を翻訳していますので、翻訳したい文章をこちらに入力して下さい。

「TranslateStringMS」関数の引数として『from_lang』と『to_lang』を渡しています。これはそれぞれ翻訳元の言語翻訳先の言語です。

翻訳元についてはある程度自動判別してくれる様なので、翻訳元が日本語や英語であれば空欄にしていても問題ありませんでした。ただし、翻訳先の指定は必須なので注意して下さい。

ちなみに「ja」だと日本語指定、「en」だと英語指定となります。

その他の言語についてはTranslator Language Codesのページに言語コードの一覧が記載されていますので、そちらでご確認下さい。

翻訳の精度について

それでは実際の翻訳結果を確認してみましょう。

今回は、下記英文商品名のサンプルを3つ用意致しました。

O Neck Loose Dress
O Neck Pocket Cotton Dresses
Turndown Collar Cotton Dresses

これをGoogleとMSのそれぞれで翻訳してみたいと思います。

結果は以下の通りとなりました。

原文 Google翻訳 MS翻訳
O Neck Loose Dress Oネックルーズドレス O ネック緩いドレス
O Neck Pocket Cotton Dresses Oネックポケットコットンドレス O ネック ポケット コットン ドレスします。
Turndown Collar Cotton Dresses ターンダウンカラーコットンドレス 折り襟コットン ドレス

うーん・・・MS翻訳は余計な部分まで日本語に訳してしまっていますね。

対するGoogle翻訳はさすがといった所でしょうか。無理矢理日本語に訳そうとせず、スッキリと横文字で統一された翻訳(変換?)となっています。商品名としてそのまま使おうと思うのであれば、だいぶ理想の形になっていると思います。

 ただし、「翻訳」かと言われれば疑問は残りますけどね。

もちろんそれぞれの翻訳機構に得手不得手はあると思いますが、今の所利用するのであればGoogle翻訳でしょうか。

上記の結果を見る限り、MS翻訳は翻訳後の確認と修正が必須となりますので、手間を考えるとお金を支払ってでもGoogle翻訳を利用する方が良いかなと思います。MSは今後に期待ですね。

Google翻訳を使ったやり方についてはまたいつかご紹介します。

関連記事と広告

シェアする

  • このエントリーをはてなブックマークに追加

フォローする