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関連

    図形の結合を行うPowerPoint マクロ(ExecuteMsoメソッド編)

    Excel MVPの伊藤さんのブログで、PowerPointの「図形の…

  2. Google関連

    [Google Apps Script]URL Shortener APIを使って短縮URLを取得す…

    2015/7/14 追記:いつの間にかAPIの呼び出しにAPI…

  3. Google関連

    「Save to Drive」ボタンを試してみました。

    下記Webページでも紹介されていますが、Webサイト上のファイルを直接…

  4. Office関連

    関数一覧(Excel 2010)

    関数の挿入ダイアログから抽出したExcel 2010の関数情報をリスト…

  5. Office関連

    [PowerPoint]シェイプの名前を指定して「変形」ができるようになりました。

    PowerPoint 2016で新しい画面切り替え効果「変形」が追加さ…

  6. Office アドイン

    Office 365でVisio JavaScript APIsを試してみました。

    昨年末にVisio Onlineの機能をJavaScriptで拡張する…

コメント

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

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

Time limit is exhausted. Please reload CAPTCHA.

最近の記事

アーカイブ

RapidSSL_SEAL-90x50
PAGE TOP