天天看點

Hello World by Microsoft Speech SDK 5.1

剛剛從

Microsoft

網站下栽了

Speech SDK 5.1

和中日文發聲更新檔,參考

Speech SDK

文檔寫了幾個小程式,盡管我也是剛剛接觸

Speech

若幹小時的初學者,還是拿出來共享吧:

Speech SDK

采用

COM

的形式封裝,和大多數

COM

對象一樣,下面是一個似曾相識的初始化:

CoInitialize(NULL);

CLSIDFromProgID(L"SAPI.SpVoice", &CLSID_SpVoice);

ISpVoice * pSpVoice = NULL;

if

(FAILED(CoCreateInstance(CLSID_SpVoice, NULL,

CLSCTX_INPROC_SERVER, IID_ISpVoice, (void **)&pSpVoice)))

{

cout << "Failed to create instance of ISpVoice!" << endl;

return

-1;

}

現在我們用它來說

“Hello World”

,非常簡單:

pSpVoice->Speak(L"Hello World!", SPF_DEFAULT, NULL);

最後,清除這一切

pSpVoice->Release();

CoUninitialize();

很容易,是不是?下面我們稍微改變一下:

IEnumSpObjectTokens *pSpEnumTokens = NULL;

(SUCCEEDED(SpEnumTokens(SPCAT_VOICES, L"language=409", NULL, &pSpEnumTokens)))

ISpObjectToken *pSpToken = NULL;

while

(SUCCEEDED(pSpEnumTokens->Next(1, &pSpToken, NULL)) &&

pSpToken != NULL)

pSpVoice->SetVoice(pSpToken);

pSpToken->Release();

pSpEnumTokens->Release();

如果隻需要一種

Voice

SpFindBestToken

更加友善:

ISpObjectToken * pSpObjectToken = NULL;

(SUCCEEDED(SpFindBestToken(SPCAT_VOICES, L"gender=female",

NULL, &pSpObjectToken)))

pSpVoice->SetVoice(pSpObjectToken);

pSpObjectToken->Release();

現在改為使用中文:

(SUCCEEDED(SpFindBestToken(SPCAT_VOICES, L"language=804",

pSpVoice->Speak(L"

世界你好!

", SPF_DEFAULT, NULL);

ISpVoice::Speak

可以允許朗讀的句子中包含

XML

标記,其實以上這一切用

标記将變得十分簡單:

pSpVoice->Speak(L"<lang langid=\"804\">

</lang>", SPF_DEFAULT, NULL);

pSpVoice->Speak(L"<voice required=\"gender=female\">Hello World!</voice>",

SPF_DEFAULT, NULL);

最後,以一段簡單的報時結束這篇文章:

SYSTEMTIME st;

GetLocalTime(&st);

(SUCCEEDED(SpFindBestToken(SPCAT_VOICES, L"language=804", NULL,

&pSpObjectToken)))

WCHAR wsz[128];

swprintf(wsz,

L"

現在是

<context ID = \"CHS_Date_ymdhm\">%.4d-%.02d-%.2d %.2d:%.02d</context>",

st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute);

pSpVoice->Speak(wsz, SPF_IS_XML, NULL);

點到為止,希望這篇文章能帶給初學者一點啟發。