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で文字列を読み上げるマクロ」に上記コードを組み込んでみることにします。

Google TTSで文字列を読み上げるマクロ前のページ

Google TTSで文字列を読み上げるマクロ(言語自動検出対応版)次のページ

関連記事

  1. Office関連

    アラビア文字かどうかを判別するWordマクロ

    以前mougの質問用に書いたコードが出てきたので、一部修正しました。…

  2. Office関連

    起動中のMicrosoft EdgeからタイトルとURLを取得するVBAマクロ(UI Automat…

    当ブログでは、Microsoft Edgeを外部から操作するプログラム…

  3. Office関連

    IEサポート終了でVBAマクロはどうなるの?

    ※下記情報は2021年5月時点の情報で、今後状況が変わっていく可能性が…

  4. Office関連

    Windows 10 Technical PreviewにOffice XPをインストールしてみまし…

    「最新ビルドを詳細レビュー! Windows 10 Technical…

コメント

    • あくしず
    • 2013年 4月 09日 11:39pm

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

Time limit is exhausted. Please reload CAPTCHA.

※本ページはプロモーションが含まれています。

Translate

最近の記事

アーカイブ

PAGE TOP