2015-05-31 110 views
0
#include <sapi.h> 
#include <string> 
#include <iostream> 

//User inputs what is to be said// 
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)) 
    { 
     std::wstring input; 
     while (true) 
     { 
      std::cout << "Enter text:\n"; 
      std::getline(std::wcin, input); 

      hr = pVoice->Speak(input.c_str(), 0, NULL); 
     } 
    } 
    pVoice->Release(); 
    pVoice = NULL; 
    ::CoUninitialize(); 
    return 0; 
} 

上面的代碼允許用戶輸入他們想要發言和完美工作的內容。C++ sapi:用戶輸入,編輯語音輸出

下面是改變音高的MSDN方法,任何其他類似的操作都以相同的方式完成。

hr = pVoice->Speak(L"This sounds normal <pitch middle = '-10'/> but the pitch drops half way through", SPF_IS_XML, NULL); 

我想改變音調,但無法弄清楚如何用我的代碼做同樣的動作。

+0

所以這個問題並不是關於SAPI,而是關於字符串操作。 – chris

+0

我認爲這與sapi有關。來自MSDN的方法使用''方法來處理音頻,這是嚴格意義上的事情。如果這個動作是操縱字符串,我現在不會如何完成它。 –

+0

根據你的問題,改變音高意味着將元信息添加到字符串的一部分。那裏唯一與SAPI相關的東西是添加塊的內容。但是,要回答這個問題,添加的內容可以是任何東西,它的工作方式也是一樣的。 – chris

回答

0

我知道這個帖子大概是22-23天,但我決定對它進行一次拍攝。我一直無法讓所有的聲音在飛行中改變音調,但MS Anna絕對可以。

#include <sapi.h> 
#include <sphelper.h> 
#include <string> 
#include <conio.h> 

void SetVoice(CComPtr<ISpVoice> _cpVoice, std::wstring _voiceName) 
{ 
    IEnumSpObjectTokens *pProfileEnum; 
    SpEnumTokens(SPCAT_VOICES, NULL, NULL, &pProfileEnum); 

    unsigned long l; 
    pProfileEnum->GetCount(&l); 

    for(unsigned long i = 0; i < l; ++i) { 
     CComPtr<ISpObjectToken> IT; 
     pProfileEnum->Item(i, &IT); 
     WCHAR *wptr; 
     IT->GetId(&wptr); 
     CSpDynamicString dstrDefaultName; 
     SpGetDescription(IT, &dstrDefaultName); 
     if(wcsncmp(dstrDefaultName, _voiceName.c_str(), _voiceName.size()) == 0){ 
      _cpVoice->SetVoice(IT); 
     } 
    } 
} 

int main(int argc, char* argv[]) 
{ 
    CoInitialize(0); 
    CComPtr<ISpVoice> cpVoice; 
    CComPtr<ISpAudio> cpOutAudio; 

    HRESULT hr = cpVoice.CoCreateInstance(CLSID_SpVoice); 

    SpCreateDefaultObjectFromCategoryId(SPCAT_AUDIOOUT, &cpOutAudio); 

    if(nullptr != cpVoice) { 
     hr = cpVoice->SetOutput(cpOutAudio, FALSE); 
    } 

    SetVoice(cpVoice, L"Microsoft Anna - English (United States)"); 
    if(cpVoice) { 
     cpVoice->Speak(L"<pitch absmiddle=\"+10\">This is a really high pitched voice</pitch> <pitch absmiddle=\"-10\"> but the pitch drops half way through</pitch>", SVSFIsXML | SVSFPurgeBeforeSpeak, NULL); 
    } 
    puts("Press any key to continue..."); 
    getch(); 
    return 0; 
}