2 つの文字を含むアプリケーションを作成しており、それぞれが異なるテキスト読み上げ音声を使用する必要があります。まだ Windows XP を使用しているため、SAPI 5.1 に制限されています。
私がやろうとしているのは、キャラクターが作成されたときに、その声を表すトークンを割り当てることです:
//female voices
HRESULT hr;
if (sceneObjects.at(characterLocation).gender == FEMALE){
if (sceneObjects.at(characterLocation).age == ADULT){
hr = SpFindBestToken(SPCAT_VOICES, L"Name=VW Kate", L"", &pToken);
if (FAILED(hr)){
hr = SpFindBestToken(SPCAT_VOICES, L"Gender=Female",L"",&pToken);
//if we fail load the default voice
if(FAILED(hr)) pToken = NULL;
}
sceneObjects.at(characterLocation).voiceToken = pToken;
}
else{
hr = SpFindBestToken(SPCAT_VOICES, L"Gender=Female", L"Name=Microsoft Mary", &pToken);
//if we fail load the default voice
if(FAILED(hr)) pToken = NULL;
//s = L"<pitch middle=\"+10\">"+s+L"</pitch>";
sceneObjects.at(characterLocation).voiceToken = pToken;
}
}
そして、実際に話してもらいたい場合は、文字をパラメーターとしてテキスト読み上げスレッドに渡し、音声にそのトークンを割り当てます。
DWORD WINAPI DIGuy::sayMessage(LPVOID lpParam){
HRESULT hres;
try{
ThreadParam * param = (ThreadParam *)lpParam;
wstring s = param->message;
wstring characterName = param->sceneObject.name;
ISpVoice * pVoice;
pVoice->SetVoice(param->sceneObject.voiceToken);
私の問題は、SetVoice 呼び出しを行うときに自分のキャラクターに割り当てた声に関係なく、デフォルトのシステム音声を取得することです。デバッグ モードで実行すると、voiceToken が null ではなく (デフォルトの音声が読み込まれる原因になります)、返された voiceToken は、システムのデフォルトの音声を切り替えたために変更されないことが示されます (そのため、デフォルトの音声に自動的にマッピングされません)。そして、voiceToken は、割り当てた場所とアクセスした場所の間で変化しません (したがって、他に干渉するものは何もありません)。
何か案は?
お時間をいただきありがとうございます。ほんとうにありがとう!