Text to speech 使用语音令牌与SAPI 5.1文本到语音交换语音

Text to speech 使用语音令牌与SAPI 5.1文本到语音交换语音,text-to-speech,sapi,Text To Speech,Sapi,我正在编写一个应用程序,其中有两个字符,每个字符都应该使用不同的文本到语音。我们仍在使用Windows XP,因此仅限于SAPI 5.1 我想做的是,当一个角色被创建时,给它分配一个表示其声音的标记: //female voices HRESULT hr; if (sceneObjects.at(characterLocation).gender == FEMALE){ if (sceneObjects.at(characterLocati

我正在编写一个应用程序,其中有两个字符,每个字符都应该使用不同的文本到语音。我们仍在使用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;
            }
        }
我的问题是,无论我在进行SetVoice调用时为角色分配了什么语音,我都会得到默认的系统语音。在调试模式下运行表明voiceToken不为null(这将导致加载默认语音),并且返回的voiceToken不会因切换系统默认语音而更改(因此也不会自动映射到默认语音),并且voiceToken不会在我分配它的位置和访问它的位置之间更改(因此没有其他干扰)

有什么想法吗

非常感谢您抽出时间。我真的很感激!

…没关系

对于其他感到困惑的人,在完成以下函数调用之前,无法设置pVoice:

hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice);
hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice);