剛剛從
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);
■
點到為止,希望這篇文章能帶給初學者一點啟發。