下面一段实现发音,请问如何更换发音人(Mary,Mike,Sam...)? ISpVoice * pVoice = NULL;

if (FAILED(CoInitialize(NULL)))
    {
        AfxMessageBox("Error to intiliaze COM");
        return;
    }

    HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice);
    if( SUCCEEDED( hr ) )
    {
        hr = pVoice->Speak(L"You have ask for help.", 0, NULL);
        pVoice->Release();
        pVoice = NULL;
    }

::CoUninitialize();

解决方案 »

  1.   

    HRESULT                             hr = S_OK;
    CComPtr<ISpObjectToken>             cpVoiceToken;
    CComPtr<IEnumSpObjectTokens>        cpEnum;
    CComPtr<ISpVoice>                   cpVoice;
    ULONG                               ulCount = 0;
    // Create the SAPI voice
    if(SUCCEEDED(hr))
        hr = cpVoice.CoCreateInstance( CLSID_SpVoice ); 
    //Enumerate the available voices 
    if(SUCCEEDED(hr))
        hr = SpEnumTokens(SPCAT_VOICES, NULL, NULL, &cpEnum);
    //Get the number of voices
    if(SUCCEEDED(hr))
        hr = cpEnum->GetCount(&ulCount);
    // Obtain a list of available voice tokens, set the voice to the token, and call Speak
    while (SUCCEEDED(hr) && ulCount -- )
    {
        cpVoiceToken.Release();
        if(SUCCEEDED(hr))
            hr = cpEnum->Next( 1, &cpVoiceToken, NULL );
        if(SUCCEEDED(hr))
            hr = cpVoice->SetVoice(cpVoiceToken);
        if(SUCCEEDED(hr))
            hr = cpVoice->Speak( L"How are you?", SPF_DEFAULT, NULL); 
    }
      

  2.   

    你这一段是在是在sapi帮助里的,但是不能用.
    hr = cpVoice->Speak( L"How are you?", SPF_DEFAULT, NULL); 
    这一句不能出声.能不能在我的代码中改一下?
      

  3.   

    我也不知道怎么帮你了,在我的程序中这段代码能够很好地运行。台式机上。
    你的问题是不是出现在嵌入式下,我现在也遇到了这样的问题,但不是台式机上。
    我的程序初始化能成功,但在发音的时候就不行了。
    我的问题如下:
    http://www.csdn.net/expert/topic/997/997810.xml?temp=.3285486
      

  4.   

    I think you can try this way,may help you
    BOOL CTts::SetMan(UINT uMan)
    {
    ISpObjectToken                  *pToken = NULL;  // Token interface pointer
    CComPtr<IEnumSpObjectTokens>    cpEnum;          // Pointer to token enumerator
    ULONG                           ulIndex = 0;
    ULONG   ulNumTokens;
    UINT i=0;
    HRESULT hr = SpEnumTokens(SPCAT_VOICES, NULL, NULL, &cpEnum);
    if ( S_OK == hr )
    {

    hr = cpEnum->GetCount( &ulNumTokens ); if ( SUCCEEDED( hr ) && 0 != ulNumTokens &&  ulNumTokens>=uMan )
    {

    while(cpEnum->Next(1, &pToken, NULL) == S_OK)
    {
    i++;
    if(i==uMan)
    {
    hr = m_cpVoice->Speak( NULL, SPF_PURGEBEFORESPEAK, 0);
    // 设置新的引擎
    if (SUCCEEDED (hr) )
    {
    hr = m_cpVoice->SetVoice( pToken );
    }
    break;
    }
    pToken->Release();
    pToken = NULL;
    }                   
    }
    }
    if (SUCCEEDED (hr) )
    return TRUE;
    else 
    return FALSE;
    }
      

  5.   

    这样用怎么会出错?? SetMan(1);
    m_cpVoice->Speak( L"china is a great country !", SPF_PURGEBEFORESPEAK, 0);
      

  6.   

    把下面的
    cpVoice->Speak( L"How are you?", SPF_DEFAULT, NULL); 
    改成
    cpVoice->Speak( L"How are you?", SPF_ASYNC, NULL); 
    就可以了,我已经实现了有没有人用过SAPI4
      

  7.   

    希望大家一起来讨论讨论SAPI的东东,我的邮:
    [email protected]