2013-05-03 74 views
1

請看看下面的代碼SAPI:應用程序沒有講話

的main.cpp

#define _ATL_APARTMENT_THREADED 

#include <atlbase.h> 
//You may derive a class from CComModule and use it if you want to override something, 
//but do not change the name of _Module 
extern CComModule _Module; 
#include <atlcom.h> 

#include <sapi.h> 
#include <iostream> 

using namespace std; 

int main(int argc, char* argv[]) 
{ 
    cout << "Hello" << endl; 
    ISpVoice * pVoice = NULL; 

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

    HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice); 
    if(SUCCEEDED(hr)) 
    { 
     cout << "Succeeded" << endl; 
     hr = pVoice->Speak(L"Hello world", 0, NULL); 
     pVoice->Release(); 
     pVoice = NULL; 
    } 
    else 
    { 
     cout << "Not succeeded" << endl; 
    } 

    ::CoUninitialize(); 
    return TRUE; 
} 

當我運行這段代碼,窗口打開,打印「你好」消息。但沒有聲音出來!它應該說「Hello World」!爲什麼是這樣?

以下是QT的.pro的情況下,設置則需要

以下是QT的.pro設置

#------------------------------------------------- 
# 
# Project created by QtCreator 2013-05-03T14:31:00 
# 
#------------------------------------------------- 

QT  += core 

QT  -= gui 

TARGET = Speech 
CONFIG += console 
CONFIG -= app_bundle 

TEMPLATE = app 


SOURCES += main.cpp 

INCLUDEPATH += "C:/Program Files/Microsoft Speech SDK 5.1/Bin" 
INCLUDEPATH += "C:/Program Files/Microsoft Speech SDK 5.1/Include" 



LIBS += "C:/Program Files/Microsoft Speech SDK 5.1/Lib/i386/sapi.lib" 
LIBS += "C:/Program Files/Microsoft SDKs/Windows/v7.0A/Lib/User32.lib" 

請幫幫忙!

+0

不知道,但值得檢查'pVoice-> Speak()'返回的'hr'的值。更重要的是,你怎麼知道'CoCreateInstance'成功了? – john 2013-05-03 14:54:05

+0

@john:我不知道,我是這個主題的新手。這個例子可以在MS網站上找到。 – 2013-05-03 14:57:45

+0

那麼如果Merlin的答案沒有幫助,那麼你需要像'if(SUCCEEDED(hr)){...} else {cout <<「CoCreateInitialise失敗!」<< hex << hr <<「\ n」; }'和你從'pVoice-> Speak()'得到的hr值相同。始終檢查錯誤代碼。 – john 2013-05-03 15:00:29

回答

0

此問題是驅動程序錯誤或應用程序衝突。我的筆記本電腦是戴爾inspiron 4030,這是發生這個問題的地方。適用於我的臺式電腦。

0

在講話結束之前,您正在調用pVoice對象上的Release。 API有一個waitUntilDone函數,在釋放對象之前可能需要這個函數。

+0

剛剛嘗試過,但它沒有幫助:( – 2013-05-03 14:59:47

+0

)我建議將waitUntilDone函數放在裏面,當你計算出其他問題導致它不能播放時,我假設你的揚聲器已打開並且音量已上升(! )...有沒有SAPI的示例應用程序,你能夠正常工作? – TheDarkKnight 2013-05-03 15:05:33

+0

感謝您的幫助,我給了waituntilDone的值爲4000,但沒有任何東西,我無法運行任何SAPI應用程序。 – 2013-05-03 15:19:22

0

嘗試使用SPF_ASYNC而不是0,同時調用pVoice->Speak(L"Hello world", 0, NULL)
這是我如何做到這一點:

[...] 

HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, reinterpret_cast<void**>(&pVoice)); 
if(SUCCEEDED(hr)) 
{   

    const wchar_t* reqAttributs = L"Language=409"; // 409 = en_US; 809 = en_UK; 40C = fr_FR 
    const wchar_t* optAttributs = L"Gender=Female"; // or L"Gender=Male" 

    ISpObjectToken* cpTokenEng; 
    if (FAILED(::SpFindBestToken(SPCAT_VOICES, reqAttributs, optAttributs, &cpTokenEng))) { 
     throw std::exception("Couldn't find a Token with the required attributs."); 
    } 

    pVoice->SetVoice(cpTokenEng); 

    hr = pVoice->Speak(L"Hello World", SPF_ASYNC, nullptr); 
     if (hr == S_OK) { 
      // OK 

     } else if (hr == E_INVALIDARG) { 
      // One or more parameters are invalid 

     } else if (hr == E_POINTER) { 
      // Invalid pointer 

     } else if (hr == E_OUTOFMEMORY) { 
      // Exceeded available memory 

     } else { 
      // Unknown error 
     } 

     hr = pVoice->WaitUntilDone(INFINITE); 

     pVoice->Release(); 
     pVoice = nullptr; 
} 

[...] 

的令牌的部分是不是真的有必要,但如果你想自定義聲音也可以是有用的(幾個聲音,必須在您的計算機以獲得最佳的結果上安裝)。