- 热门文章:
- · 初级X编程2
- · 彻底粉碎“指针与数组的困惑”(上)
- · ADSL组建局域网快捷方案
- · ADSL组建局域网快捷方案
- · 形形色色的自定义消息(上)
- · 数据结构学习(C++)——线性链式结构总结(代后记)【1】
- · vc入门宝典(九)
- · 形形色色的自定义消息(下)
- · C++中的预处理(上)
- · 非常时期突现网络办公的魅力!
- · asp_dll
- · 学Java,观GP
Hello World by Microsoft Speech SDK 5.1
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;
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();
}
■ 到此为止,希望这篇文章能带给初学者一点启发。
- · 怎样写一个 NT 服务程序
- · 代码优化试验——短循环优化(上)
- · 代码优化试验——短循环优化(下)
- · =========<C++未眠夜---我学习C++的心路历程>========
- · BOOK
- · 读《Efficient C++》疑惑
- · C++中的预处理(下)
- · DSP v1.0--序列化和反序列化对象和DNS v1.0--得到域的邮件服务器
- · C++入门解惑(0)——序
- · 代码自动完成、文档自动生成、提高开发效率----介绍VcExtend
- · “瑜珈山夜话”---序
- · C++入门解惑(1)——浅析cout
- · VC6使用#pragma warning的一点经验
- · 如何在一个容器中放入不同对象(续)
- · “瑜珈山夜话” ----内存分配(一)
- · 最简单的屏幕拷贝程序(象素拷贝)
- · vc入门宝典(十)
- · Win32学习笔记 第六章 程序6-3 Typer 说明
- · 自动建库的安装程序制作方法
- · “瑜珈山夜话” ----内存分配(二)
- · 让Windows 2000/XP中的任意窗口透明起来
- · 不比不知道,一比吓一跳!
- · “瑜珈山夜话” ----内存分配(三)
- · WTL体系结构(3)
- · 控制台程序的事件處理
- · 深入DCOM之DCOM的发展史
- · Windows程序效率
- · C++入门解惑(2)——初探指针(上)
- · 读好文章,快速理解COM组件知识,10分钟深刻阅读,获得超过2000元的培训
- · WTL的消息机制
- · DirectShow应用——支持DVD播放
- · 浏览器集成教学 自定义浏览器
- · 计算机科学与技术学生学习基础材料参考
- · 关于std::list的sort函数在VC6下的修正
- · 数据结构学习(C++)——线性链式结构总结(代后记)【2】
- · 深入DCOM之STA
- · 在COM中使用数组参数-数组指针
- · 在COM中使用数组参数-SafeArray
