中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Visual C++ > COM技术
在Visual C++6.0中使用Text-to-Speech
作者:未知 时间:2005-07-20 14:21 出处:VC知识库 责编:chinaitpower
              摘要:在Visual C++6.0中使用Text-to-Speech

在Visual C++6.0中使用Text-to-Speech


作者:flybug_zgj


下载源代码


一、前言

  网上很多程序都可以阅读英文和中文,典型的就是金山词霸,最近找了一下,发现网上在VC这方面的资料不是很多,好些程序都是基于API的(比如VCKBASE ::首页 >> 文档中心 >> 在线杂志 >> 音频技术 中的文章"文本语音转换入门"作者:Suyu),加之我在 VCKBASE 获益良多,现在想回报一二,所以就写了个基于MFC的程序,希望抛砖引玉,请高手指点。

二、安装TTS引擎

  要使用TTS必须安装微软的TTS引擎,这点Suyu已经说明了,作为用户需要下载两个文件MSTTS.EXE和SPCHAPI.EXE,如果需要阅读中文,还需要下载中文发音包SimpChinese Speech Package。这三个软件都可以在微软主页上找到,如果您发布程序,则需要将其打包在一起。作为程序员,您可以去微软主页下载Microsoft Speech SDK, version 5.1,顺便把中文和日文的语言包SpeechSDK51LangPack.exe下载回来。

三、建立程序项目

  • 1. 建立一个MFC AppWizard(exe)
  • 2. 在step1里面选择Dialog Based
  • 3. 在step2里面把Automation选项勾上(必需这么做)
  • 4. 结束

四、导入类型库

  查找 spai.dll,将其拷贝到你程序的 res 目录(不拷贝也行 ^_^),打开 MFC ClassWizard,选择 Automation 页,单击按钮"Add Class…",选择"From a type library…",选中"sapi.dll"文件,这时系统会出现 confirm Classes 对话框,询问将要导入的类,呵呵,反正闲着也是闲着,全选中吧。到此,准备工作全部完成。

五、示例程序

我写了个演示程序,界面如下:



单击"Speak English"将女声读出"apple",单击"Speak Chinese"将男声读出"苹果",
单击"English"和"Chinese"在下面的Input Text框里面分别将出现英文和中文,单击"Read"即可读出,单击"Stop"即可停止阅读。"Rate"表示阅读速度,"+"、"-"可以改变;"Volume"表示音量大小,"+"、"-"可以改变。"Voice"列出了系统当前有的声音,但是,实际上我的计算机只能阅读四种,我列在了右边"Mary,Mike,Sam,Chinese",关于这点,原因未知,请高手赐教。要注意的是,如果输入中文,要首先在Voice里面选择chinese后才能正确发声,读英文时也要选择非中文才可以。
发声的关键代码为:

	CLSID CLSID_SpVoice;    // class ID for the SAPI SpVoice object
	LPDISPATCH pDisp;       // dispatch interface for the class
	ISpeechVoice voice;     // use the MFC Class Wizard generated wrapper

	CLSIDFromProgID(L"SAPI.SpVoice", &CLSID_SpVoice);
	voice.CreateDispatch(CLSID_SpVoice); 
	pDisp = voice.m_lpDispatch; 

	HRESULT hr = pDisp->QueryInterface(CLSID_SpVoice, (void**)&voice.m_lpDispatch); 

	if (hr == S_OK) { 
		pDisp->Release(); 
	} 
	else { 
		voice.AttachDispatch(pDisp, TRUE); 
	}

	voice.Speak("Hello World", 1);   // asynchronous call to Speak method of ISpeechVoice interface
我的程序大家详见代码。

六、抛砖引玉

  我现在有几个问题希望和大家一起讨论,请高手不吝赐教。
  • 1. 如何调节语调。声音之所以有Mary和Sam的 区别,实际上是语调不同。
  • 2. 阅读时语音和文本同步,即读到哪个单词就把哪个单词高亮显示。
  • 3. 如何把 Windows 上的 TTS 移植到 PocketPC 上面。这个问题是我最为关心的,如果有高人知道,小生有礼再有礼,一定告诉我啊,谢谢谢谢再谢谢。

    小生的 Email:skysoft_z@sina.com
关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有