Excelで日本語・英語を読み上げるマクロ

VBAからTTSを切り替えてしゃべらせる単純な試み

このマクロの目的と手段

目的はズバリ,「簡単に英語と日本語をしゃべらせてみよう」というものです.
コトの発端は,「視覚障害者用の自学ツールや試験問題解答ツールができないか」という英語の先生からの要望でした.しかし,日本語と英語が混在する文章をコンピュータにしゃべらせることは,結構面倒くさいのです.
EmacspeakやALTAIRを使うと可能なのですが,初心者ユーザには使い方の習得が難しいかもしれませし,別のソフトウェアをインストールする,というのに抵抗がある場合もあります.(これらは本当にとても素晴らしいソフトです.バリバリ使う人には絶対オススメです.)

そこでText To Speech,TTSの登場です.TTSを使って,英語と日本語を切り替えながらしゃべらせることを考えました.TTSを使って英語を読ませるフリーソフトは結構ありますが,それをExcelのVBAでやってしまおうという試みです.つまり,Excelが入っている環境ならば「新しいソフトウェアのインストール」をしなくてもよいところが,こいつのウリなわけです.しかもセルの中に数字と読ませたい英語,読ませたい日本語を入れるだけでよいので,英語の先生が楽に教材を用意できる...はず,なのです.実際には,まぁ,言うほどラクなわけではないのですが...(汗)

2007.5.30追記:Windows Vista対応のPCトーカーは,日英混在文章をキレイに読んでくれる,という話を聞きました.まだ自分では試していませんが.


準備と実行

準備

まず,対象環境ですが,これを作った環境は

です.それ以外の環境でも動くとは思いますが,とりあえず以下の点をご確認ください.

条件を満たさない場合の対処方法(2004.1.30追記)

Excel2002なんだけど,コンパネの音声合成にLH KenjiとNaokoがいないよ,という方

これでケンジ君とナオコさんがインストールされると思います.

Excel2002じゃないんだけど,XP使っててMS Samはあるから英語だけ読ませらんないかな?,という方

結局,3つある音声合成エンジンを0〜2という数字で切り替えているだけですので,ひとつしかない場合にはこれが意味をなさないわけです.同様の理由で,音声合成エンジンがもっと多く入っている環境の場合や,インストールする順番によって発声種類の順番が変わってしまっている場合は,適宜数字を変更してみてください.

ダウンロード

それでは具体的に実行してみましょう.ファイルは以下のリンクからダウンロードしてください.

使い方

使い方はいたって簡単です.まず事前に前述の手順でExcelのセキュリティを下げておいてください.上記リンク先のファイルをExcel2002 で開くと,マクロを有効にするかどうか聞いてきます(セキュリティレベルが中の場合).実行すると,自動的にフォームが表示されます.あとは,

という操作で使います.もちろん終了してからデータの変更や入力もできます.読み上げさせたい英語や日本語をB列に入れ,英語の場合は左のA列のセルに1を,日本語の場合は2を入力しておいてください.実行ボタンにフォーム表示の命令を記述していますので,ボタンを押すと読み上げ確認ができます.

コードの解説と動かない人のための情報

ファイルを開いた状態でAlt+F11を押すと,VBエディタが立ち上がり,プログラムコード(というほどのものではないですが)を読むことが出来ます.VBエディタは立ち上がるけれどコードが表示されない場合は,左のペインのフォーム内にあるの「FrmMain」を右クリックして「コードの表示」を選んでクリックしてください.記述されている主なコードは以下のようになっています.コメントがそのまま解説となっています.非常に短いです.

Dim WithEvents Voice As SpVoice 'スピーチオブジェクトの定義
Dim SentenceNo As Integer '今読むべき行番号

'初期化ルーチン
Private Sub UserForm_Initialize()
Set Voice = New SpVoice 'スピーチオブジェクト生成
  SentenceNo = -1 '行番号の初期化
  FrmMain.Width = 700 'ウィンドウサイズ,幅と高さの直接指定.
  FrmMain.Height = 500 '画面サイズに合わせて適当に調整して下さい.
  FrmMain.TextWord.Width = 700 'テキストボックスサイズ,幅と高さの直接指定.
  FrmMain.TextWord.Height = 485 '画面サイズに合わせて適当に調整して下さい.
End Sub

'キーが押された動作
Private Sub UserForm_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
  Select Case KeyCode
    Case 38 '上矢印キー
      SentenceNo = SentenceNo - 1 '1行上に設定
      If SentenceNo < 0 Then '最上行のクリッピング
        SentenceNo = 0
      End If
      SpeakSentence (SentenceNo) '読み上げ命令
    Case 32 'スペースキー
      If SentenceNo < 0 Then '最初の場合だけ場合分け
        SentenceNo = 0
      End If
      SpeakSentence (SentenceNo) '読み上げ命令
    Case 40 '下矢印キー
      SentenceNo = SentenceNo + 1 '1行下に設定
      SpeakSentence (SentenceNo) '読み上げ命令
    Case 27 ' ESCキー
      End
  End Select
End Sub

'読みあげ関数.引数は行番号.A列の数字によって英語か日本語どちらを発声するかを決める.
Private Sub SpeakSentence(SentenceNo As Integer)
  TextWord.Text = Range("B1").Offset(SentenceNo, 0)
  If Range("A1").Offset(SentenceNo, 0) = 1 Then 'Aの列が1だったら英語発声
    Voice.Speak vbNullString, SVSFPurgeBeforeSpeak '音声出力のカット
    Set Voice.Voice = Voice.GetVoices().Item(2) 'MS Sam に設定
    Voice.Speak TextWord, SVSFlagsAsync '音声出力
  ElseIf Range("A1").Offset(SentenceNo, 0) = 2 Then 'Aの列が2だったら日本語発声.
    Voice.Speak vbNullString, SVSFPurgeBeforeSpeak '音声出力のカット
    Set Voice.Voice = Voice.GetVoices().Item(0) 'LH Kenji に設定.
'ここの数字は環境によって違うかもしれないのでうまく発声しないときは色々試してください.
    Voice.Speak TextWord, SVSFlagsAsync '音声出力
  End If
End Sub

つまり,A列を見てTTSを切り替えてる,ただそれだけです.TTSをExcelVBAから利用するには,Microsoft Speech Object Libraryを利用できるようにする必要があります.うまく動かない,という人はまずここを疑ってください.具体的な対処法は,

となります.また,コードの後半部分「Item(数字)」が音声の種類を指定する部分です.もし英語なのに日本語の音声で読んでいる,という場合はこの数字を適当に入れ替えて保存,実行することで英語と日本語をうまく読むようになります.

こんな簡単なマクロでも,英語の学習にちょっとは役に立つ…かもしれません(弱気).お使いになられた方,是非感想をお送りください.