一個簡單的 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;
if (SUCCEEDED(SpEnumTokens(SPCAT_VOICES, L"language=409", NULL, &pSpEnumTokens)))
{
ISpObjectToken *pSpToken = NULL;
while (SUCCEEDED(pSpEnumTokens->Next(1, &pSpToken, NULL)) &&
pSpToken != NULL)
{
pSpVoice->SetVoice(pSpToken);
pSpVoice->Speak(L"Hello World!", SPF_DEFAULT, NULL);
pSpToken->Release();
}
pSpEnumTokens->Release();
}
如果只需要一種 Voice,SpFindBestToken 更加方便:
ISpObjectToken * pSpObjectToken = NULL;
if (SUCCEEDED(SpFindBestToken(SPCAT_VOICES, L"gender=female",
NULL, &pSpObjectToken)))
{
pSpVoice->SetVoice(pSpObjectToken);
pSpVoice->Speak(L"Hello World!", SPF_DEFAULT, NULL);
pSpObjectToken->Release();
}
現在改爲使用中文:
ISpObjectToken * pSpObjectToken = NULL;
if (SUCCEEDED(SpFindBestToken(SPCAT_VOICES, L"language=804",
NULL, &pSpObjectToken)))
{
pSpVoice->SetVoice(pSpObjectToken);
pSpVoice->Speak(L"世界你好!", SPF_DEFAULT, NULL);
pSpObjectToken->Release();
}
ISpVoice::Speak 可以允許朗讀的句子中包含 XML 標記,其實以上這一切用 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);
ISpObjectToken * pSpObjectToken = NULL;
if (SUCCEEDED(SpFindBestToken(SPCAT_VOICES, L"language=804", NULL, &pSpObjectToken)))
{
pSpVoice->SetVoice(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);
pSpObjectToken->Release();
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.