我正在编写一个包含两个字符的应用程序,每个字符都应该使用不同的文本到语音。我们仍在使用 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 不为空(这将导致加载默认语音),并且由于我切换系统默认语音而返回的 voiceToken 不会更改(因此它也不会自动映射到默认语音),并且 voiceToken 在我分配它的位置和我访问它的位置之间不会改变(所以没有其他干扰)。
有任何想法吗?
非常感谢您的宝贵时间。对此,我真的非常感激!