SAPI4のダウンロードとインストール

 今日、初めて外国の人からメールをもらいました。
そのなかで FAILED Sapi Init と表示されて使えないというのがありました。
このメッセージはSAPI4のエンジンが使えない場合に表示されます。
Vistaの場合、SAPI4には対応していないらしいので Text To Wav 2 の方を使ってください。

そういう訳で、マイクロソフトからSAPI4を使うのに必要なファイルをダウンロードしてみたのですが、404 Not Found になってできませんでした(今はダウンロードできるようになっています)。そこで、そうしたリンク切れなどでダウンロードできなくなった場合の対処法を書きます。

 先ずこのサイトに行きます。
http://www.archive.org/web/web.php
そこで、すぐ下のテキスト入力欄に
http://www.microsoft.com/msagent/downloads/user.aspx
と入力して Take Me Back を押します。
すると過去のキャッシュされたリンクが出てくるので、なるべく古い日付のリンクを選択します。
後は通常通り、ダウンロードしたいリンクを選択すればいくつかの物はできます。

 だけど音声合成エンジンはダウンロードしてみてもできませんよね。でそうした場合は先ず。

1.ダウンロードできなかったときに開いているページのURLをコピーします。
例えば日本語合成エンジンなら http://activex.microsoft.com/activex/controls/agent2/lhttsjpj.exe です。

2.一旦、一つ前のキャッシュのページに戻ります。

3.そのページのURL
http://web.archive.org/web/20071011004249/http://www.microsoft.com/msagent/downloads/user.aspx
のhttp://web.archive.org/web/20071011004249/と1でコピーしたURLを繋げます。
完成したURLは下のです。
http://web.archive.org/web/20071011004249/http://activex.microsoft.com/activex/controls/agent2/lhttsjpj.exe

後はそのURL先に移動すれば、キャッシュに残っている場合はダウンロードできます。

この方法はいろいろなリンク切れのサイトで使えるので便利ですよ。

SAPI5をBorland C++ Compilerで使う

bccでSAPI5を使うにはbccSDKを使うのが簡単です。注意点はspdebug.hで発生する多重定義エラーの処理とSetNotifyWindowMessageなどいくつかの場所で巧く動作しない点です。

多重定義エラーはヘッダーの一番上の
#pragma onceをコメントアウトして
#ifndef SPDebug_h
#define SPDebug_h
//...
#endifと置き換えます。

Notifyでエラーが出る場合はWaitUntilDoneとタイマーを使って対処します。
BCCではSAPI5は向いてないのかもしれません。

2010.7.19
試行錯誤すること2年9ヶ月、bcc でも SAPI5 が使えることがわかりました。(´・ω;`)
SetIntarest や SetNotifyWindowMessage には問題がありませんでした。
SPFEI というマクロに問題がありました。
なぜ発見できたかというと SetInterest で例外を捕らえることができるのがわかったからです。
以下が BCC で例外が発生するコードです。

//これならいける! ULONGLONG ev = SPFEI_ALL_EVENTS
ULONGLONG ev = SPFEI(SPEI_END_INPUT_STREAM) | SPFEI(SPEI_WORD_BOUNDARY);
try {
_com_util::CheckError(m_cpVoice->SetInterest(ev, ev));
}
catch (_com_error &err) {
// ここで「パラメータが間違っています。」と例外がでるので
// sapi.h に定義されている SPFEI を調べると下にあるコードが見つかります。
MB(err.ErrorMessage());
}

 

enum SPEVENTENUM
{ SPEI_UNDEFINED = 0,
SPEI_START_INPUT_STREAM = 1,
SPEI_END_INPUT_STREAM = 2,
SPEI_VOICE_CHANGE = 3,
SPEI_TTS_BOOKMARK = 4,
SPEI_WORD_BOUNDARY = 5,
SPEI_PHONEME = 6,
SPEI_SENTENCE_BOUNDARY = 7,
SPEI_VISEME = 8,
SPEI_TTS_AUDIO_LEVEL = 9,
....
SPEI_RESERVED1 = 30,
SPEI_RESERVED2 = 33,
SPEI_RESERVED3 = 63
} SPEVENTENUM;

#define SPFEI_FLAGCHECK ( (1ui64 << SPEI_RESERVED1) | (1ui64 << SPEI_RESERVED2) )
#define SPFEI_ALL_TTS_EVENTS (0x000000000000FFFEui64 | SPFEI_FLAGCHECK)
#define SPFEI_ALL_SR_EVENTS (0x001FFFFC00000000ui64 | SPFEI_FLAGCHECK)
#define SPFEI_ALL_EVENTS 0xEFFFFFFFFFFFFFFFui64
#define SPFEI(SPEI_ord) ((1ui64 << SPEI_ord) | SPFEI_FLAGCHECK)

 
どこに問題があるかわかりますか?
問題は (1ui64 << SPEI_RESERVED2) などにありました。
VC++ では大丈夫ですが、BCC ではこの記述だと32ビットを超えた値が無効になってしまうようなのです。
ちなみにコンパイラは警告を出しませんでした。
変わりに、このように対処したらうまくいきました。
ULONGLONG ev = 0x0000000200000000ui64 | SPFEI(SPEI_END_INPUT_STREAM) | SPFEI(SPEI_WORD_BOUNDARY);

現在は VC++ でコンパイルしているので、もう関係ないのですが。。。


リンク
(*´∀`)ノ (´・ω・`)

最近の記事
最近のコメント
ブログ内検索
RSSフィード
カテゴリー
月別アーカイブ
メールフォーム

Name:
Mail:
Title:
Message:

FC2カウンター