0
votes

Can anybody help me? I use SAPI to speech text, but I can`t set female voice, here is code, It speaks in male voice, but i want to change it, I want female voice

#include "stdafx.h"

using namespace std;

void speack(HRESULT, ISpVoice*, string);

int main(int argc, char* argv[])
{
ISpVoice * pVoice = NULL;

if (FAILED(::CoInitialize(NULL)))
    return FALSE;

HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice);
if (SUCCEEDED(hr))
{
    hr = pVoice->Speak(L"Hi my friend", 0, NULL);
    string text;
    while (true){
        getline(cin, text);
        speack(hr, pVoice, text);
        if (text == "Goodbye" || text == "goodbye")
            break;
    }

    speack(hr, pVoice, "Have a good day !!");

    pVoice->Release();
    pVoice = NULL;
}
::CoUninitialize();
return TRUE;

}

void speack(HRESULT hr, ISpVoice * pVoice, string text){
hr = pVoice->Speak(CA2CT(text.c_str()), 0, NULL);
}

Please help Thank you

3

3 Answers

1
votes

When you call

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

SAPI will create the default voice object. Since you want a specific voice, you'll need to use one of the SAPI helper functions - SpCreateBestObject.

hr = SpCreateBestObject(SPCAT_VOICES, L”Gender=Female”, NULL, &pVoice); 

This will create the best object in the VOICES category that has a Female gender (since it's specified as a required attribute).

1
votes
// speak.cpp

#include "stdafx.h"
#include "speak.h"

using namespace std;

bool speak(wchar_t * text, wchar_t * pszReqAttribs)
{
    ISpVoice * pVoice = NULL;
    HRESULT stInitializing = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice);
    if (SUCCEEDED(stInitializing))
    {
        ISpObjectToken* cpToken(NULL);
        HRESULT stTokenFinding = SpFindBestToken(SPCAT_VOICES, pszReqAttribs, L"", &cpToken);
        if (SUCCEEDED(stTokenFinding))
        {
            HRESULT stVoiceSetting = pVoice->SetVoice(cpToken);
            if (SUCCEEDED(stVoiceSetting))
            {
                HRESULT stSpoken = pVoice->Speak(text, 0, NULL);
                if (SUCCEEDED(stSpoken))
                {
                    cpToken->Release();
                    cpToken = NULL;

                    pVoice->Release();
                    pVoice = NULL;

                    return true;
                }
                else
                {
                    cpToken->Release();
                    cpToken = NULL;

                    pVoice->Release();
                    pVoice = NULL;

                    wcout << "Error, I couldn't play this text " << text << endl;
                    return false;
                }
            }
            else
            {
                cpToken->Release();
                cpToken = NULL;

                pVoice->Release();
                pVoice = NULL;

                wcout << "Error, I can't set this voice " << pszReqAttribs << endl;
                return false;
            }
        }
        else
        {
            pVoice->Release();
            pVoice = NULL;

            wcout << "Error, I can't find this voice " << pszReqAttribs << endl;
            return false;
        }
    }
    else {
        wcout << "Error, I can't create Voice instance" << endl;
        return false;
    }
}


// language.cpp

//#pragma once 
#include "stdafx.h"
#include "language.h"

wchar_t * getLanguage(wchar_t * languageShortcut) throw (wchar_t*)
{   
    if (wcscmp(languageShortcut, L"EN") == 0) {
        return L"Vendor=IVONA Software Sp. z o. o.;Language=809";
    }
    else if(wcscmp(languageShortcut, L"DE") == 0){
        return L"Vendor=IVONA Software Sp. z o. o.;Language=407";
    }
    else if (wcscmp(languageShortcut, L"PL") == 0) {
        return L"Vendor=IVONA Software Sp. z o. o.;Language=415";
    }
    else {
        throw L"I don't uderstand your language";
    }
}
0
votes

All you have to do us to add XML tags. Refer to Official Documentation

if (SUCCEEDED(hr))
{
    cout << "Enter text:\n";
    getline(wcin, input);
}
hr = pVoice->Speak((L"<voice required='Gender = Female;'>" + input).c_str(), 0, NULL);
pVoice->Release();
pVoice = NULL;