Microsoft Agent を MFC から使う方法(の備忘録)
まずは Microsoft Agent の準備が必要よね。
まずはダウンロードページに行く。
http://www.microsoft.com/msagent/downloads/user.asp
http://www.microsoft.com/msagent/downloads/user.asp#core
にある
http://activex.microsoft.com/activex/controls/agent2/MSagent.exe
をダウンロード&インストール。
http://www.microsoft.com/msagent/downloads/user.asp#character
から、好きなキャラクタをダウンロード&インストール。
http://www.microsoft.com/msagent/downloads/user.asp#tts
から、必要な音声再生エンジンをダウンロード&インストール。
以上の3つの手順でOK。
Windows2000/XP は Agent core components は必要ないらしい。 (Windows2000 で試してみたら必要だったけど…)
MFC で Agent を使うサンプルが下記 URL にある。
http://www.microsoft.com/msagent/dev/code/vstudio.asp#MFC
Agent の ActiveX コントロールがダイアログに張り付いている。
こいつは CAgentCtlEx オブジェクトで、こいつを起点に Agent の様々な操作をするらしい。
:CAgentCtlEx:http://msdn.microsoft.com/library/en-us/msagent/pacontrol_6lyk.asp?frame=true
CAgentCtlEx m_Agent;
として話を進める。
CAgentCtlEx::GetCharacters()::Load メソッドでキャラクタをロードできる。
m_Agent.GetCharacters().Load( "default", COleVariant() );
と書くだけでキャラクタがロードできるので実に簡単。
ただ、これだけではタスクトレイに入ったままで表示されないので、次のコードで表示させる。
m_Agent.GetCharacters().Character( "default" ).Show( COleVariant() );
キャラクタのロード方法だが、どうやら2種類あるようで、 「デフォルトキャラクタを使う方法」と「ファイル名/URLを指定して使う方法」があるようだ。
前節では「デフォルトキャラクタを使う方法」を使った。これは、Load メソッドの第2引数を 指定しないことで行っている。「引数を指定しない」ためには、COleVariant() を渡せばいい。
また、既にインストールされているキャラクタを使う場合もこちらの方法に該当する。 例えば Genie さんをデフォルトキャラクタとして使いたければ
m_Agent.GetCharacters().Load( "default", COleVariant() );
とすればいい。
Load メソッドの型 agent.Characters.Load "CharacterID", Provider
「ファイル名/URLを指定して使う方法」は、第2引数に ACS ファイルか URL を書けばいいらしい。 URL は VB スクリプトなどで Agent を使う場合に指定する(と思う)。
m_Agent.GetCharacters().Load ("Genie", "http://agent.microsoft.com/characters/v2/genie/genie.acf");
Load したら Unload しないとリソースを消費しつくしてしまうかもよ(^^;
というわけで本題。
キャラクタの名前が分かっているなら、Load の第一引数に名前を指定すればいい。 が、どのキャラクタがインストールされているかを調べるのは困難だと思う (Windows/msagent/chars を調べてもいいだろうけどそれが適切なわけはないだろう…)。
そんなときのために、キャラクタを選択するためのウィンドウが用意されている。
m_Agent.ShowDefaultCharacterProperties( COleVariant(), COleVariant() );
引数には表示位置を指定する。指定なし(つまり COleVariant() )だとデフォルト位置に表示される。
既にデフォルトキャラクタが表示されている状態ならば、OK ボタンを押した瞬間にキャラクタが変化する。
PSS で使いたいので、Speak させたい。
とりあえず発音させるには
m_Agent.GetCharacters().Character("default").Speak( COleVariant("hello"), COleVariant() );
で「はろー」って言ってくれる。
CAgentCtlCharacterEx::SetLanguageID() を使う。
これだけで言語は変化するが、再生エンジンも変更したいだろう。
そういうときのために CAgentCtlCharacterEx::SetTTSModeID() がある。
列挙したいけどその方法は分からない(不可能?)
http://www.microsoft.com/msagent/support/dev/miscellany.asp#changedefaultchar
いわく、デフォルトキャラクタの TTS Mode ID を変更後に ShowDefaultCharacterProperties() すると OS が吹っ飛ぶらしい(^^; 但し、Win2k/XP 以外の OS で。
TTS Mode ID は(まだ調べていないがおそらく)TextToSpeak で使う言語設定に関わってくると思う。
これを回避するには
you should either not allow the user to change the default character after you
change the default character’s TTS Mode ID,
or do not use the default character in your application or Web page.
らしい。つまり、「TTS Mode ID の変更後にデフォルトキャラクタを変えない」または 「デフォルトキャラクタを使わない」ことらしい。後者は解決策じゃねー(笑)
たぶん TTS Mode ID を変更したらアプリケーションの再起動を要求すればいいんだろう。 今度試すべし。
このページに書かれている内容は、竹内が自分自身のための備忘録として書いたものであり、 その内容については一切保証しません。
質問等は下記にお願いします。