「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で文字列を読み上げるマクロ」に上記コードを組み込んでみることにします。
SplitButtonの代わりに、通常のボタンとMenu要素で類似の事ができる事が判ったので、試して見ました。一概には言えないのですが、ラベルはSplitButtonの方が収まりが良いようです。これまでSplitButtonの上半分は、アイコンの置き場としてしか使ってませんでしたが、ガイドメッセージが出るように直したので、迷わず扱えるようになったと思います。