2

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 は、割り当てた場所とアクセスした場所の間で変化しません (したがって、他に干渉するものは何もありません)。

何か案は?

お時間をいただきありがとうございます。ほんとうにありがとう!

4

1 に答える 1

1

...気にしない。

混乱している他の人のために、この関数呼び出しを完了するまで pVoice を設定することはできません:

hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice);
于 2010-11-16T18:41:37.017 に答える