文章を読み上げ
SAPIを使う
SAPI(Speech Application Programming Interface)とは、Windowsアプリケーションで音声認識や音声合成を使うためにマイクロソフトが開発した、プログラミング言語で利用できるライブラリなどの機能の入り口です。
http://ja.wikipedia.org/wiki/Speech_Application_Programming_Interface
sapi.dll は、その登録パスが、使っているパソコンの環境によって異なる場合があります。この場合は、参照設定を使ったマクロは、受け取ったパソコン側で設定変更しなければなりません。このため、私は、[Microsoft Speech Object Library] を参照設定しないほうが、制約が少ないので、良いと思います。
「合成音声の情報取得」で、お持ちのパソコンに登録されているキャラクターの一覧を、見ることができます。
WinXP 標準の英語音声は、Sam のみですが、下記で sapi51xp.msi もしくは、Sp5TTIntXP.exe をインストールすると、Mary - 女声 (English、私の推奨)と、Mike - 男声 (English)を、追加できます。
sapi51xp.msi (XP 用。Vista や 7 では機能しません。)
http://www.transparentcorp.com/downloads/sapi51xp.msi
Speech SDK 5.1
http://www.microsoft.com/downloads/details.aspx?FamilyId=5E86EC97-40A7-453F-B0EE-6583171B4530&displaylang=en
の、Sp5TTIntXP.exe (XP 用。Vista や 7 では機能しません。)
http://download.microsoft.com/download/B/4/3/B4314928-7B71-4336-9DE7-6FA4CF00B7B3/Sp5TTIntXP.exe
(Vista の場合は、Speech SDK 5.3 で、そのキャラクタ Microsoft Anna-English はベストなので、追加メンバ不要です。)
上記の日本語の説明
http://support.microsoft.com/kb/320207/ja
参考:
VBSでスイスイ(スピーチオブジェクトを使ってみる)
http://yayoi3gatsu.sakura.ne.jp/rd.cgi?f=vbs01
VocExcel(単語帳) / VBA Tips (SAPI で読み上げ)
http://www.geocities.jp/dz02572i/VBA/excel_026.htm
http://msdn2.microsoft.com/en-us/library/ms723609(VS.85).aspx
http://msdn2.microsoft.com/en-us/library/ms723601(VS.85).aspx
http://msdn.microsoft.com/ja-jp/library/bb690934.aspx
Excelで日本語・英語を読み上げるマクロ
http://www.cs.k.tsukuba-tech.ac.jp/labo/koba/software/excel.php
以下は、TextToSpeechVBA02.xls の SAPI で読み上げさせるための、メインの部分です。
参考:
Microsoft Speech API (SAPI) 5.3 (Windows Vista に同梱されたバージョン)
http://msdn.microsoft.com/en-us/library/ms723627(VS.85).aspx
SpVoice Interface (SAPI 5.3)
http://msdn.microsoft.com/en-us/library/ms723602(VS.85).aspx
TextToSpeech と MSAgentSpeak
「青空文庫」の一括ダウンロード・マクロ(AozoraGetter)を知人に紹介したところ、
「いっそのこと、ダウンロードした小説を、読み上げるところまでできれば、もっと役に立つ」と言われたので、作ってみました。
「青空文庫」は、ルビ付きテキストのため、漢字とルビを重複して読み上げてしまいます。
このマクロでは、漢字とルビのどちらか一方を指定して消して、同じことを繰り返して読まないようにしました。
ただ、日本語の音読では、
1.漢字を、カナに逆変換する
2.カナに、音の高低をつける
と、2つの大きなハードルがあって、テキスト・データそのままだと、人が読上げるようにはうまく行きません。
しかし、英語だと、その制約が、比較的少ないので、有効です。
このマクロは、映画の英語字幕データを、貼り付けて、読上げさせるのに使うと、それなりに実用になるかと思っています。
このマクロのデザインと骨格は、下記を参考にさせていただきました。
MS Agentを使った文章読み上げソフト
http://codezine.jp/a/article/aid/867.aspx
http://codezine.jp/a/article/aid/870.aspx
Microsoft Agent を使った Office アプリケーションへのアニメーション効果の設定
http://msdn.microsoft.com/ja-jp/library/aa163978(office.10).aspx
百万人のプログラミング
http://fry.no.coocan.jp/MISC/mil/
Agentにお話をしてもらう
http://www6.plala.or.jp/MilkHouse/menu2.html
キャラクタアニメーション ( Microsoft Agent )
http://winofsql.jp/VA003334/smalltech051002131227.htm
Win XP で標準機能だった、日本語のスピーチ エンジンが、Windows Vista や Windows 7 には、標準搭載されていません。
http://www.microsoft.com/japan/enable/products/windowsvista/narratorturnon.mspx
したがって、このマクロの日本語読上げを Vista や Windows 7 で使うことができません。(英語の読上げは、できます。)
Vista は、「重い」、「うざい」、ということは良く聞きますが、その上さらに、「役立たず」ということができまね。
クリップボードからテキストデータを取得
クリップ・ボードのテキストデータを、既定のセルに貼付けます。
クリップボードのデータを取得する方法には、以下の 3つの方法があります。
1.MSFormsのメンバの DataObject を使用する。
この場合は、Microsoft Forms 2.0 Object Library を参照設定する必要があります。
2.Internet Explorer のインスタンスを利用する。←VBSの場合はこちら
3.Worksheet オブジェクトの PasteSpecial メソッド を使う。←Excel VBA での私の推奨★
以下は、下記サイトのコードを、そのまま使わせていただいています。
Office TANAKA
クリップボードを操作する(1)
http://officetanaka.net/excel/vba/tips/tips20.htm
掌のおもちゃ箱
http://zaz.air-nifty.com/
http://zaz.air-nifty.com/blog/vbscript/index.html
解説:
DataObject オブジェクトは、データ転送操作により転送された書式付きテキスト データが格納される領域です。DataObject オブジェクトに格納されているテキストに対応するデータ フォーマットのリストも保持されます。
DataObject オブジェクトは、クリップボード テキスト形式のテキストを 1 つと、それ以外のテキスト形式のテキスト (カスタム形式やユーザー定義形式など) を、各テキスト形式ごとに 1 つずつ保持できます。
DataObject オブジェクトは、クリップボードとは異なります。DataObject オブジェクトは、クリップボード関連のコマンドと、テキストに対するドラッグ アンド ドロップ操作関連のコマンドをサポートしています。クリップボード関連の操作 (GetText など) やドラッグ アンド ドロップ操作を開始すると、操作対象のデータは DataObject オブジェクトに移動されます。
DataObject オブジェクトは、クリップボードと似た働きをします。テキスト文字列を DataObject オブジェクトにコピーすると、DataObject オブジェクトにそのテキスト文字列が格納されます。2 つ目の同じ形式のテキスト文字列を DataObject オブジェクトにコピーすると、最初のテキスト文字列は破棄され、2 つ目のテキストのコピーが DataObject オブジェクトに格納されます。DataObject オブジェクトには、同一形式のテキスト文字列の場合、最後にコピーされたテキストのみが保持されます。
IE7の場合は、Internet Explorerを使う方法では、「別のプログラムで OLE の操作が完了するまで待機を続けます。」と表示されて、マクロが止まらなくなります。
あるいは、何も表示されなくて、マクロが止まります。
これは、バックグラウンドで、下記のダイアログが表示されているからです。
このダイアログが表示されないようにするには、IE7を以下のように設定します。
IE7の「ツール」→「インターネット オプション」で、
「セキュリティ」タブの「レベルのカスタマイズ」を選択します。
「スクリプトによる貼り付け処理の許可」を「ダイアログを表示する」から「有効にする」に変更します。
WSH と VBScript 場合は、Excel VBAの DataObject のように、クリップボードを操作する機能がありません。
この場合は、クリップボードを操作することができる、Internet Explorer に頼るしかありません。
http://www.microsoft.com/japan/technet/scriptcenter/resources/qanda/dec04/hey1215.mspx
Internet Explorer を使って、クリップボードにデータをコピーしたり、クリップボードからデータを貼り付けたりします。
上のコードでは、Internet Explorer のインスタンスを作成し、それを空白のページとして開いています。
このインスタンス(instance:メモリ上に配置されたデータの集合)は実際には表示されません。Visible を TRUE に設定していないからです。すべての処理がバックグラウンドで実行されます。
次に、clipboardData.GetData メソッドを使用してクリップボードからテキストを取得し、変数 クリップText に格納します。
Internet Explorer のインスタンス (objIE.Quit) を解放します。
クリップボードにデータをコピーする場合は、以下のようにします。
clipboardData.setData "text", "クリップボードに格納したい文字列"
英語字幕テキストを整形
洋画の字幕データは、映画の字幕データ・ダウンロード・サイトで、簡単に入手できます。
字幕のテキストは、下の2種類の形式が有ります。
srt 形式
1
00:04:24,438 --> 00:04:26,872
-Here we go, Nick.
-All right.
2
00:04:29,71 --> 00:04:31,644
-Good morning, Detective.
-I want a shot of the two detectives.
一行目:字幕No
字幕Noは、必ずしも連番になっていなくてよい。
二行目:表示時間開始終了
表示時間は小数点以下3桁までの秒を指定可能
HH:MM:SS,MMM(時間 : 分 : 秒 , ミリ秒)(例 00:01:23,654)
三行目:字幕の内容(テキスト)
表示文字は改行して複数段落で表示可能
一行の文字が長い場合には、再生時に自動改行される
識別用の空行(文字ブロックと文字ブロックの間は改行して一行空行を入れる)
sub 形式
{6438}{6494}- Here we go, Nick.|- All right
{6565}{6609}- Good morning, Detective.|- I want a shot of the two detectives.
ここでは、読み上げるためのセリフの部分だけを抽出して、読み上げに不要な部分を削除する「整形」をします。
Windows 標準で読み上げ
解説:
Speech.Speak メソッド は、引数として渡されたテキスト文字列を再生します。
expression.Speak(Text, SpeakAsync, SpeakXML, Purge)
expression 必ず指定します。対象となる Speech オブジェクトを返すオブジェクト式を指定します。
Text 必ず指定します。文字列型 (String) の値を使用します。読み上げるテキストを指定します。
SpeakAsync 省略可能です。バリアント型 (Variant) の値を使用します。True の場合、Text は非同期で読み上げられ、Text の読み上げが終わるのを待たずに次の処理に進みます。False の場合、Text は同期して読み上げられ、Text の読み上げが終わってから次の処理に進みます。既定値は False です。
SpeakXML 省略可能です。ブール型 (Boolean) の値を使用します。True の場合、Text は XML として解釈されます。False の場合、Text は XML として解釈されないので、XML タグも解釈されずに読み上げられます。既定値は False です。
Purge 省略可能です。バリアント型 (Variant) の値を使用します。True の場合、Text を読み上げる前に、現在の読み上げを終了させ、バッファに残っているテキストを取り除きます。? False の場合、Text を読み上げる前に、現在の読み上げを終了させず、バッファに残っているテキストも取り除きません。既定値は False です。
次の使用例は、"こんにちは" を読み上げます。
Sub UseSpeech()
Application.Speech.Speak "こんにちは"
End Sub
エージェントで読み上げ
注意:Agent のアニメーション機能を使い始める前に、
Microsoft Agent Control 2.0 への参照設定を追加する必要があります
Agent の Request の Status プロパティで、動作終了のイベントを取得して、Excel のセル操作と同期させています。
http://msdn.microsoft.com/en-us/library/aa227647(VS.60).aspx
表 14.14: Request オブジェクト Status コード
Status | 内容 |
0 | 要求はうまくいった。 |
1 | 要求は失敗した。 |
2 | 要求は保留中である。 |
3 | 要求は中断された。 |
4 | 要求は進行している。 |
Request オブジェクトを使うとき、下の2つのイベントも利用できます。
RequestStart と RequestComplete
特定のメソッドの状態を追跡するために、グローバルな Request オブジェクトを作ると、これらのイベントが、発生します。
このイベントは、要求しているクライアント・オブジェクトの中でのみ引き起こされます。
解説:
SmallScroll メソッド は、指定された行数分または列数分だけ、ウィンドウの文字列をスクロールします。
expression.SmallScroll(Down, Up, ToRight, ToLeft)
expression 必ず指定します。Window オブジェクトを返すオブジェクト式を指定します。
Down 省略可能です。バリアント型 (Variant) の値を使用します。指定した行数分だけ、ウィンドウの文字列が下にスクロールします。
Up 省略可能です。バリアント型 (Variant) の値を使用します。指定した行数分だけ、ウィンドウの文字列が上にスクロールします。
ToRight 省略可能です。バリアント型 (Variant) の値を使用します。指定した列数分だけ、ウィンドウの文字列が右にスクロールします。
ToLeft 省略可能です。バリアント型 (Variant) の値を使用します。指定した列数分だけ、ウィンドウの文字列が左にスクロールします。
説明:
引数 Down と Up を共に指定すると、ウィンドウの文字列は 2 つの引数の差だけスクロールします。たとえば、引数 Down に 3、Up に 6 を指定すると、ウィンドウの文字列は上に 3 行分スクロールします。
引数 ToLeft と ToRight を共に指定すると、ウィンドウの文字列は 2 つの引数の差だけスクロールします。たとえば、引数 ToLeft に 3、ToRight に 6 を指定すると、ウィンドウの文字列は右に 3 列分スクロールします。
いずれの引数にも、負の数を指定できます。
使用例
次の使用例は、シート 1 のアクティブ ウィンドウの文字列を下に 3 行分スクロールします。
Worksheets("Sheet1").Activate
ActiveWindow.SmallScroll down:=3
ScrollRow プロパティは、ウィンドウ枠 (ペイン) 内またはウィンドウ内で上端に表示される行の番号の値を設定します。値の取得および設定が可能です。長整数型 (Long) の値を使用します。
解説
ウィンドウを分割表示している場合、Window オブジェクトの ScrollRow プロパティは左上のウィンドウ枠を対象とします。ウィンドウ枠を固定している場合、Window オブジェクトの固定領域は対象外とされます。
使用例
次の使用例は、行 10 が上端になるようにウィンドウをスクロールします。
Worksheets("Sheet1").Activate
ActiveWindow.ScrollRow = 10
エージェント停止
解説:
SendKeys ステートメント は、キーストロークまたはキーストロークの組み合わせを、キーボードから入力したときと同様にアクティブ ウィンドウに渡します。
構文
SendKeys string[, wait]
SendKeys ステートメントの構文は、次の名前付き引数から構成されます。
項目 |
内容 |
string |
必ず指定します。転送するキー コードを表す文字列式を指定します。 |
wait |
省略可能です。名前付き引数 string の転送によって行われる処理が終了するまで、実行を一時中断するかどうかを次に示すブール型 (Boolean) の値で指定します。
(既定値) Falseプロシージャの終了を待たずに次の行に制御を移します。
True処理が終了するまで実行を一時中断します。
|
キーボードの各キーは 1 つ以上の文字で表されます。キーボード上の文字を渡すには、キーの指定にその文字を使います。たとえば、キーボード上の文字 A を表すには、名前付き引数 string に "A"
を指定します。複数の文字を表すには、文字を連続して設定します。たとえば、文字 A、B、C を表すには、名前付き引数 string に "ABC"
と指定します。
プラス記号 (+)、キャレット (^)、パーセント記号 (%)、チルダ (~)、かっこ (( )) はそれぞれ SendKeys ステートメントで特別な意味を持っています。これらの文字を渡すには、文字を中かっこ ({ }
) で囲んで指定します。たとえば、プラス記号は {+
} のように指定します。角かっこ ([ ]) は SendKeys ステートメントでは特別な意味を持ちませんが、Microsoft Windows の他のアプリケーションで特別な意味を持つ場合があるので、中かっこで囲みます。これは、ダイナミック データ エクスチェンジ (DDE) を行うときに角かっこが重要になることがあるためです。文字として中かっこを渡すには、{{}
または {}}
を使います。
キーを押したときに表示されない文字 または、文字ではなく動作を表すキーを指定するには、例えば、Enter キーは、{ENTER}または {~}、や Tab キーは{TAB}などのコードを使います。
Shift キー、Ctrl キー、または Alt キーと他のキーとの組み合わせを指定するには、通常のキー コードの前に次のコードを単独、または組み合わせて記述します。
キー |
コード |
Shift |
+ |
Ctrl |
^ |
Alt |
% |
Shift キー、Ctrl キー、Alt キーを押しながら他のキーを押す操作を指定するには、キーのコードをかっこで囲みます。たとえば、Shift キーを押しながら E と C を押す操作を指定するには、"+(EC)
" を使います。Shift キーを押しながら E を押し、その後 Shift キーを離して C を押す操作を指定するには、"+EC
" を使います。
同じキー ストロークの繰り返しを指定するには、{key number}
という形式を使います。key
と number
の間には必ず半角のスペースが必要です。たとえば、{LEFT 42}
は ← キーを 42 回押すことを意味します。また {h 10}
は、H キーを 10 回押すことを意味します。
SendKeys ステートメントは、Microsoft Windows 上で動作するように設計されたアプリケーション以外にはキー ストロークを渡せません。また Sendkeys ステートメントは、アプリケーションに Copy キーを渡せません。
SendKeys ステートメントの使用例
次の例は、Shell 関数を使って、電卓アプリケーションを実行します。
SendKeys ステートメントでキーストロークを転送して、数値の加算を行ってから電卓アプリケーションを終了します。このプログラムを実行するには、コードを任意のプロシージャに貼り付けてから、そのプロシージャを実行してください。
AppActivate ステートメントによって、フォーカスが電卓アプリケーションに移動するため、このコードをシングル ステップで実行することはできません。
AppActivate ステートメント は、アプリケーション ウィンドウをアクティブにします。
構文
AppActivate title[, wait]
項目 |
内容 |
title |
必ず指定します。アクティブにするアプリケーション ウィンドウのタイトル バーのタイトルを表す文字列式を指定します。名前付き引数 title に Shell 関数によって返されるタスク ID を指定して、アプリケーションをアクティブにすることもできます。 |
wait |
省略可能です。名前付き引数 title で指定したアプリケーションをアクティブにする前に呼び出し側のアプリケーションにフォーカスを持たせるかどうかを、次に示すブール型 (Boolean) の値を使って設定します。
(既定値) False呼び出し側のアプリケーションがフォーカスを持っていなくても、指定したアプリケーションをアクティブにします。
True呼び出し側のアプリケーションがフォーカスを持つまで待機し、指定したアプリケーションをアクティブにします。
|
AppActivate ステートメントは、指定したアプリケーションやウィンドウにフォーカスを移します。
このとき、フォーカスが移っても指定したウィンドウの状態は変化しません。たとえば、最小化されているウィンドウにフォーカスを移しても、そのウィンドウは最小化されたままです。
ユーザーがフォーカスを変更するか、またはウィンドウを閉じると、他のウィンドウへフォーカスが移ります。
アプリケーションを実行するには、Shell 関数を使用します。また、ウィンドウ スタイルの設定をする場合にも Shell 関数を使用します。
アプリケーション ウィンドウのタイトル バーの文字列と名前付き引数 title が完全に一致しているかどうかを比較することによって、どのアプリケーションをアクティブにするかが判別されます。
完全に一致するものが見つからないときは、アプリケーション ウィンドウのタイトル バーの文字列が名前付き引数 title で始まるアプリケーションをアクティブにします。
名前付き引数 title と一致するアプリケーション ウィンドウが複数ある場合も、その中の 1 つが任意に選択されてアクティブになります。
AppActivate ステートメントの使用例
次の例は、AppActivate ステートメントを使って、アプリケーション ウィンドウをアクティブにします。
アプリケーションの実行に Shell ステートメントを使っていますが、指定されたパスにアプリケーションの実行プログラムが保存されていなければ、アプリケーションを実行することはできません。
名前付き引数 とは、オブジェクト ライブラリにあらかじめ定義された名前を持つ引数。
名前付き引数を使用すると、構文どおりに指定された順序で各引数に値を指定しなくても、任意の順序で値を設定することができます。
たとえば、3 つの引数を取得できる次のようなメソッドがあるとします。
DoSomeThing namedarg1, namedarg2, namedarg3
名前付き引数を使うと、次のように引数を指定することができます。
DoSomeThing namedarg3 := 4, namedarg2 := 5, namedarg1 := 20
名前付き引数は、構文の標準的な配置順序で指定する必要はありません。
エージェント設定
プロパティシート(設定ダイアログ)を開きます。
音声応答ツール
声が出にくいときに、使えるかなと思って、作ってみました。
特長:
お使いのパソコンに、合成音声が登録されていれば、男声・女声を、Excel 側で指定して発声させることができます。
また、日本語・英語を自動判定します。