前へ

スクリーンリーダー対応アプリ作成のために

PC-Talker試用記

SAPI

PC-Talkerの試用期間も過ぎてしまったのだが、もちろん本体は動かないが、ProTalker(?)音声エンジンをSAPI経由で制御することはできるようだ。
SAPIとは、Microsoft Speech APIのことである。SAPI3、SAPI4、SAPI5などがある。
Windows XPにはSAPI5が最初から入っている。(ただし日本語エンジンは入っていない。)
PC-Talker XPは基本的にはSAPI4で動作するようで、該当モジュールがインストールされている。
SAPI3はPC-Talker XPのDVDに入っており、「SAPI4でパフォーマンス上の問題が出るようならSAPI3に入れ換えろ」のような記述がある。
ということは、SAPI4はSAPI3の上位互換なのだろうと想像できる。
しかし、SAPI4とSAPI5は別物で互換性は無いようだ。実際、SAPI4のSDKのサンプルのspeak.exeを、SAPI5しか入ってないXPにコピーしてみたが、英語文章でも動かなかった。
SAPI5はWindows XPには必ず入っているが、日本語の音声合成エンジンはOffice XP等を買わないと入っていない。(無理やり英語エンジンに日本語をローマ字で与えるという手も無いこともない。)
一方、SAPI4は自分で入れる必要があるが、無料の日本語エンジンもあるようだ。

アプリから任意の文字列をリアルタイムに喋らせたい場合、
・クリップボードに転送
・スクリーンリーダーのAPIを呼び出す
・SAPIを呼び出す
の三つの方法が考えられる。それぞれの長所短所を考えてみると、

クリップボード転送

長所:スクリーンリーダーに依存しない
短所:クリップボードにすでにあるデータを破壊
   スクリーンリーダーの設定変更が必要
   場合によっては他の方法より時間的な遅れが発生する

スクリーンリーダーのAPI呼び出し

長所:クリップボード転送の問題点をすべて解決
   しかも途中で発音を止めたりといったきめ細かい制御も可能
短所:スクリーンリーダーに依存

SAPI呼び出し

長所:スクリーンリーダーに依存しない。
   それどころかSAPIさえ入っていればスクリーンリーダーが無くても動く
   きめ細かい制御が可能
短所:スクリーンリーダーの動作を妨害するおそれがある。
   プログラミングが複雑(特にSAPI4とSAPI5に両対応しようとすると…)

実際にSAPI4のSDKをダウンロードして、サンプルソースのspeak.cppをコンパイルしてみた。
Borland C++ 5.5を使ったのだが、MicrosoftとBorlandはOBJやLIBの形式が違うため、speak.cppのコンパイルだけでは済まず、SpchWrapフォルダに入ってるソース一式をコンパイルしてSpchWrap.libを作る必要があるのだった。
(ソースも一ヶ所変更の必要あり。まあ_int64を__int64に変更するだけだが)

なお、Speech APIと言いながら、Windows APIのような関数呼び出し形式のAPIではなく、COM(Common Object Model)である。
それにしても、SAPIは日本語の情報が少ない。以前DirectShowについて調べたときも日本語の情報が少なくて結局洋書を注文してしまったのだが、それ以上に少ない感じ。

あと、SAPIについてWebを調べていて、こんなのを見つけた。 HearIt
なんと、Freeな日本語対応スクリーンリーダー。(要SAPI対応日本語音声エンジン)
そのうちレポートするかもしれない。
(ただしFreeなのは98、Me用で、XP用はシェアウエア

HOME

コメント、トラックバックはココログ