Archive for February, 2006
梅林会说话了
Posted by Ricky in 职业 Profession on February 27, 2006
要让梅林说话很简单,只需要安装上合适的TTS引擎就可以了,比如微软AGENT主页上面提供的一个叫做L&H引擎,并且在代码中设置一下语种ID就好了。可惜的是这个引擎尚不支持中文(同样是东亚语言,日文和韩文倒是支持,郁闷),要让这个控件能够说中文,还是需要安装完整的SAPI和相关的资源,这就过分了。
还有一个小进步就是支持脚本,要让梅林说更多的话做更多的动作不需要重新修改编译程序了,只需要编辑一个XML文档。而且如果想换一个角色,比如机器人、阿拉丁灯神、鹦鹉等也变得很方便了。
魔法师梅林
Posted by Ricky in 职业 Profession on February 21, 2006
前些年浙大校网曾经有个黑客事件,某同学因为不能忍受校网中心的管理水平和办事效率,一怒之下攻入校网中心的Web服务器,修改了首页。不过此君大概也是个生性幽默之人,没有像时下动辄号称自己是黑客红客绿客的“高手”们一样在网页上破口大骂胡乱涂鸦,而是用一种让人意外的方式给所有人开了一个玩笑。
一登录该网站,屏幕上就跳出魔法师梅林,就是在常常搜索文件和Office助手里面出现的蓝袍白胡子老头。看着小老头摇头晃脑地抱怨使用校网过程中的种种不便,据说连“受害者”校网中心的负责老师们也忍俊不止。一看网页源代码,原来是用JavaScript插入了一个MS Agent控件,然后用脚本控制这个角色动作和说话。实现并不复杂,但是不得不佩服这个校友的创意,这位仁兄,现在早已毕业了吧,在何方高就呢?
后来我就一直记着这件事情,也曾经好好研究过MS Agent这个控件的用法,还在自己的一个程序里面聘请这个有趣的魔法师作为助手。只是有几个小小的问题,有些角色,比如Merlin,会在系统托盘栏中生成一个小图标。而我当时的那个邮件收发程序也是驻留在托盘栏中的,这下一个程序两个图标放在那里总觉得很别扭,得想个办法把这个图标给隐藏掉。
首先确认这个控件的C++包装类中没有提供关于托盘栏图标的方法,网上搜索也没有答案(Google也不是万能的),看来得自己动手强行干掉它了。方法很直接,就是调用Shell_NotifyIcon,问题就在于知道添加这个图标时候使用的窗口句柄和ID。请出Spy++查看桌面上与“Agent”相关的所有进程和窗口,呵呵,还真不少。联想到只有部分角色会生成这个图标,那么这里有一个注册名叫AgentCharacter的无标题窗口就很可疑。那么ID怎么办呢?呵呵,这里我用了一个很无赖的招数,那就是……一个个试,直到Shell_NotifyIcon函数返回TRUE,记录这个ID就是了。嘿,还真的成功了,重复几次确认每次都是用1025这个ID,看来这个方法是没错的了。
另外还有一个问题就是角色的有些动作是不会自动结束的,这样造成的结果就是如果长时间不去动这个角色,它可能会打瞌睡,到时候任凭你怎么点击拖动它都不会理你了。这个问题比较好解决,内置一个定时器,让角色无聊的时候随机做几个类似东张西望的动作即可。如果发现角色长时间处在睡眠、阅读的时候,点击或者拖动它的时候让它用不满的语气说上一句“找我有什么事?”,一个有趣的小老头,哈哈。
VB和JavaScript里面使用该控件都是比较简单的事情,如果使用VC可能要面对十几个名叫CAgentCtlXXX的类,未免繁琐了一些。所以我把这个控件重新封装成一个类以DLL的方式发布,只提供几个基本的方法:Create/Destroy、Show/Hide、Speak/Think/Play……这下使用起来方便多了。未来希望能够搞清楚TTS,使用语音进行交互,让这位老头为我们的程序做更多的事情。
Google黑板报
狗年看狗
Posted by Ricky in 镜头 Photography on February 11, 2006