2010-11-16 6 views
2

J'écris une application comportant deux caractères et chacun d'entre eux doit utiliser une autre voix texte-voix. Nous utilisons toujours Windows XP, nous sommes donc limités à SAPI 5.1.Utilisation de jetons vocaux pour échanger des voix avec SAPI 5.1 text to speech

Ce que je suis en train de faire est quand un personnage est créé, attribuez-lui un jeton qui représente sa voix:

//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; 
      } 
     } 

puis quand je veux réellement parler, je passe dans le caractère comme paramètre dans le texte à la discussion de la parole et attribuer la voix de son jeton:

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); 

mon problème est peu importe quelle voix j'attribue à mon caractère quand je fais l'appel SetVoice je reçois la voix par défaut du système. L'exécution en mode débogage montre que le voiceToken n'est pas nul (ce qui provoquerait le chargement de la voix par défaut) et que le voiceToken retourné ne change pas en changeant la voix par défaut du système (donc il ne correspond pas automatiquement) et que le voiceToken ne change pas entre l'endroit où je l'ai assigné et l'endroit où j'y accède (donc il n'y a rien d'autre qui interfère).

Des idées?

Merci beaucoup pour votre temps. J'apprécie vraiment cela!

Répondre

1

... peu importe.

Pour toute autre personne qui se confond, vous ne pouvez pas définir pVoice jusqu'à ce que vous avez fait cet appel de fonction:

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