2012/2/15 追記:
下記マクロをExcel 2007/2010に対応したアドインファイルにしました。
ファイルは「Google TTSで文字列を読み上げるExcelアドイン」からダウンロードすることができます。
前々回の記事でGoogle翻訳の音声再生機能を利用した文字列の読み上げマクロを紹介し、前回の記事で言語を自動検出する仕組みについて触れました。
今回は「Google TTSで文字列を読み上げるマクロ」を改良して言語の自動検出に対応させてみたいと思います。
※ 下記マクロは64ビット版Office環境を考慮していません。
Option Explicit
Private Declare Function mciSendString Lib "winmm" Alias "mciSendStringA" ( _
ByVal lpstrCommand As String, _
ByVal lpstrReturnString As String, _
ByVal uReturnLength As Long, _
ByVal hwndCallback As Long) As Long
Private Declare Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" ( _
ByVal pCaller As Long, _
ByVal szURL As String, _
ByVal szFileName As String, _
ByVal dwReserved As Long, _
ByVal lpfnCB As Long) As Long
Public Sub Sample()
'TTSGoogle "こんにちは"
'TTSGoogle "Hello", "en"
TTSGoogle Selection.Text, "auto"
End Sub
Private Sub TTSGoogle(ByVal txt As String, Optional ByVal lng As String = "ja")
'Google TTSを利用して音声再生
Dim TTSFilePath As String
Dim tmp As String
Dim ret As Long
'**********************************************************
'■ 対応する言語(引数lng) http://translate.google.com/ より
' 自動検出:auto
' アイスランド語:is
' アフリカーンス語:af
' アラビア語:ar
' アルバニア語:sq
' アルメニア語:hy
' イタリア語:it
' インドネシア語:id
' ウェールズ語:cy
' オランダ語:nl
' カタロニア語:ca
' ギリシャ語:el
' クレオール語(ハイチ):ht
' クロアチア語:hr
' スウェーデン語:sv
' スペイン語:es
' スロバキア語:sk
' スワヒリ語:sw
' セルビア語:sr
' タイ語:th
' タミル語:ta
' チェコ語:cs
' デンマーク語:da
' ドイツ語:de
' トルコ語:tr
' ノルウェー語:no
' ハンガリー語:hu
' ヒンディー語:hi
' フィンランド語:fi
' フランス語:fr
' ベトナム語:vi
' ポーランド語:pl
' ポルトガル語:pt
' マケドニア語:mk
' ラテン語:la
' ラトビア語:lv
' ルーマニア語:ro
' ロシア語:ru
' 英語:en
' 韓国語:ko
' 中国語:zh-CN
' 日本語:ja
'**********************************************************
'文字列確認
tmp = Replace(txt, " ", "")
tmp = Replace(tmp, " ", "")
tmp = Replace(tmp, vbCrLf, "")
tmp = Replace(tmp, vbCr, "")
tmp = Replace(tmp, vbLf, "")
If Len(tmp) < 1 Then
MsgBox "音声出力する文字列を指定してください。" & vbCrLf & "処理を中止します。", vbCritical + vbSystemModal
Exit Sub
End If
If Len(txt) > 100 Then
MsgBox "文字数が多すぎます。" & vbCrLf & "処理を中止します。", vbCritical + vbSystemModal
Exit Sub
End If
'言語自動検出対応
Select Case LCase$(lng)
Case "auto"
lng = DetectLanguageG(txt)
'Debug.Print lng
If Len(lng) < 1 Then
MsgBox "自動検出できませんでした。" & vbCrLf & "言語を「日本語」に設定します。", vbInformation + vbSystemModal
lng = "ja"
End If
End Select
'音声ファイルの保存
With CreateObject("Scripting.FileSystemObject")
TTSFilePath = .GetSpecialFolder(2) & Application.PathSeparator & "tts.mp3"
If .FileExists(TTSFilePath) Then Kill TTSFilePath 'ファイルを事前に削除
ret = URLDownloadToFile(0&, "http://translate.google.com/translate_tts?tl=" & lng & "&q=" & EncodeURL(txt), TTSFilePath, 0&, 0&)
If ret <> 0& Then
MsgBox "音声ファイルがダウンロードできませんでした。" & vbCrLf & "処理を中止します。", vbCritical + vbSystemModal
Exit Sub
End If
If .FileExists(TTSFilePath) = False Then
MsgBox "音声ファイルが保存されていません。" & vbCrLf & "処理を中止します。", vbCritical + vbSystemModal
Exit Sub
End If
End With
'音声ファイルの再生・削除
mciSendString "Open " & Chr(34) & TTSFilePath & Chr(34), "", 0&, 0&
mciSendString "Play " & Chr(34) & TTSFilePath & Chr(34) & " wait", "", 0&, 0&
mciSendString "Close " & Chr(34) & TTSFilePath & Chr(34), "", 0&, 0&
Kill TTSFilePath
End Sub
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
Private Function EncodeURL(ByVal sWord As String) As String
With CreateObject("ScriptControl")
.Language = "JScript"
EncodeURL = .CodeObject.encodeURIComponent(sWord)
End With
End Function
上記マクロでは引数lngに「auto」を指定すると、言語を自動的に検出してその言語に合った音声が出力されます。
(言語が検出できなかった場合には日本語が設定されます。)
最初のマクロに比べて、これで大分便利になりました。

















この記事へのコメントはありません。