Office関連

Google翻訳の言語自動検出機能を追う

Google TTSで文字列を読み上げるマクロ」でGoogle翻訳の音声再生機能を利用した文字列の読み上げマクロを紹介しましたが、このマクロは対象文字列の言語を指定しなくてはいけません。
Google翻訳には自動で言語を検出する機能も備わっており、この機能も実装できればより便利になるだろうと思って調べてみました。



とりあえず、仕組みを調べるためにGoogle翻訳で言語を自動検出したとき、「言語を検出する」ボタンをクリックしたときのHTTPヘッダを見てみると、下記のようになっていました。

http://translate.google.com/translate_a/t?client=t&text=%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF%E3%80%82&hl=ja&sl=auto&tl=en&multires=1&prev=conf&psl=ja&ptl=en&otf=1&………

各パラメータが何を表しているのかは置いておいて、特に重要そうなのは「sl」と「text」。
slで自動検出するために「auto」を渡して、textではエンコードされた文字列を渡しているだろうことが推測できます。
そこで試しに下記のようなURLにしてみると、

http://translate.google.com/translate_a/t?sl=auto&text=%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF%E3%80%82

403エラーが返ってきました。
sl」と「text」だけでは足りないようなので、今度は「client」も付けてみます。

http://translate.google.com/translate_a/t?client=t&sl=auto&text=%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF%E3%80%82

今度は「t」という名前のテキストファイル(Content-Type:text/javascript)が返ってきました。

この「t」の中身をテキストエディタで見てみると、下記のようになっています。

[[["Hello .","こんにちは。","","Kon'nichiwa."]],,"ja",,[["Hello",[5],1,0,820,0,1,0],[".",[6],0,0,820,1,2,0]],[["こんにちは",5,[["Hello",820,1,0],["Hi",71,1,0]],[[0,5]],"こんにちは。"],[".",6,[[".",820,0,0]],[[5,6]],""]],,,[["ja"]],17]

パッと見JSON形式のようで、検出されたと思われる言語「ja」も記載されています。
ここまで分かれば後はこの「ja」を取得するコードを書けば良いだけなのですが、先ほど返ってきた「t」というファイル名、これが気になるので、関係すると思われる「client」の値を試しに変更してみました。

http://translate.google.com/translate_a/t?client=callback&sl=auto&text=%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF%E3%80%82

すると先ほどと同じく「t」ファイルが返ってきたのですが、中身を見ると下記のようになっていました。

{"sentences":[{"trans":"Hello.","orig":"こんにちは。","translit":"","src_translit":"Kon'nichiwa."}],"src":"ja","server_time":49}

client」の値は返ってくるファイル名と関係無いようでしたが、ファイルの中身は先ほどよりも各値の内容が推測しやすいものになっています(src:検出された言語)。
この「client」の値をabcや123等と変更してみましたが、「t」以外は上記のような形になるようです。
データの形式としては「t」で返ってきたものよりも、こちらのデータを使用した方が扱いやすそうなので、このデータを使って言語を自動検出するマクロを早速考えてみます。
(“src”以外の”trans”や”src_translit”も色々利用できそうですが、今回は言語を検出すれば良いだけなので”src“のみを使います。)

Private Function DetectLanguageG(ByVal txt As String) As String
'言語自動検出
  Dim ret As String
  Dim js As String
  
  ret = "": js = "" '初期化
  On Error Resume Next
  With CreateObject("MSXML2.XMLHTTP")
    .Open "GET", "http://translate.google.com/translate_a/t?client=0&sl=auto&text=" & EncodeURL(txt), False
    .Send
    If .Status = 200 Then js = .responseText
  End With
  On Error GoTo 0
  If Len(js) > 0 Then
    js = "(" & js & ")"
    With CreateObject("ScriptControl")
      .Language = "JScript"
      ret = .CodeObject.eval(js).src
    End With
  End If
  DetectLanguageG = ret
End Function

対象文字列を引数として、GETした結果をJSONとして受け取り”src“のみを返すという、ごく単純なマクロです。
何回かテストしてみましたが、今のところ上手く検出できているようなので、次回の記事では前回の「Google TTSで文字列を読み上げるマクロ」に上記コードを組み込んでみることにします。

関連記事

  1. Office関連

    「データ追跡機能付きテンプレート ウィザード」のダウンロード先

    ※ 下記に紹介する方法はOfficeのサービスパックからデータ追跡機能…

  2. Office関連

    Gmail APIを使ってメール送信するVBAマクロ

    「「Gmail API」β版公開、連動アプリ開発を支援」にもあるように…

  3. アイコン一覧

    Office 365アイコン(imageMso)一覧(T)

    Office 365のデスクトップ版Officeアプリケーション(Wo…

  4. Office関連

    VBAプロジェクトを「展開する」VBAマクロ

    MSDNフォーラムに面白い質問がありました。VBE・プロジェクト …

  5. Office関連

    Office 365 APIをVBAから呼び出す(3)

    前々回の記事でOffice 365とAzure ADの紐づけを、前回の…

コメント

    • あくしず
    • 2013年 4月 09日

    SplitButtonの代わりに、通常のボタンとMenu要素で類似の事ができる事が判ったので、試して見ました。一概には言えないのですが、ラベルはSplitButtonの方が収まりが良いようです。これまでSplitButtonの上半分は、アイコンの置き場としてしか使ってませんでしたが、ガイドメッセージが出るように直したので、迷わず扱えるようになったと思います。

Time limit is exhausted. Please reload CAPTCHA.

最近の記事

アーカイブ

RapidSSL_SEAL-90x50
PAGE TOP