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

一、前言

网上很多程序都可以阅读英文和中文,典型的就是金山词霸,最近找了一下,发现网上在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

本文配套源码

时间: 2024-11-03 19:37:34

在Visual C++6.0中使用Text-to-Speech的相关文章

visual basic 6.0-Visual Basic 6.0中怎么给界面添加主题样式?

问题描述 Visual Basic 6.0中怎么给界面添加主题样式? 已经根据http://www.cnblogs.com/clso/archive/2010/11/29/1891059.html的介绍添加了manifest文件 Private Declare Sub InitCommonControls Lib "comctl32.dll" () Private Sub Form_Initialize() InitCommonControls End Sub 这些代码也添加了,为什么

visual basic 6.0-Visual Basic 6.0中TextBox的行距的控制

问题描述 Visual Basic 6.0中TextBox的行距的控制 TextBox的行距太小了,我希望能拉大行距,请问在Visual Basic编程文本框,应该改什么属性呢? 解决方案 TextBox的行距的控制需要重绘才能实现了.不过VB本身重绘比较麻烦,你可以用C++编写一个给VB调用. 解决方案二: 用richtextbox吧 解决方案三: http://bbs.csdn.net/topics/80135493 解决方案四: 设置控制的字符属性来实现

Visual Basic 6.0 控件和 .NET 控件的区别

visual|控件|区别 Visual Basic 6.0 控件和 .NET 控件的区别 摘要:本文简单介绍了 Microsoft Visual Basic 6.0 中的标准控件和等效的 Microsoft .NET 控件. 目标 了解哪些 Visual Basic 6.0 ActiveX 控件在 .NET 中具有等效控件. 了解 .NET 控件中哪些属性发生了变化. 了解 .NET 中有哪些新控件. 前提条件 要彻底理解本文内容,需要满足以下条件: 了解什么是 ActiveX 控件. 使用 V

Visual Basic 6.0 控件和 .NET 控件的区别后记

visual|控件|区别 Public Class frmTest    Inherits System.Windows.Forms.Form #Region " Windows Form Designer generated code "     Public Sub New()        MyBase.New()         'Windows 窗体设计器必需此调用.        InitializeComponent()         '调用 InitializeCom

Visual Basic 6.0 控件和 .NET 控件的区别(续)

visual|控件|区别 图 1:典型的数据输入屏幕 如图 1 所示,在用键盘键入数据的输入窗体上,您可能希望使 Add.Update.Delete 和 Clear 按钮保持在窗体的右下角.要实现此目的,请突出显示这些按钮,然后将 Anchor 属性设置为 BottomRight.要执行此操作,请在 Properties 窗口中找到 Anchor 属性,并单击其下拉箭头.清除选择左边和上边的栏,然后选择右边和下边的栏,如图 2 所示. 图 2:已激活 Anchor 下拉列表的 Propertie

Visual Basic .NET 已不再支持的 Visual Basic 6.0 功能

visual Visual Basic .NET 已不再支持下列的 Visual Basic 6.0 功能.A: ·    OLE 容器控件   Visual Basic .NET 中没有对等的对象.依赖这个控件的应用程序应继续使用 Visual Basic 6.0. ·    动态资料交换 (DDE)   DDE 方法不再受到支持.依赖 DDE 的应用程序应该修改为使用其它的应用程序间通讯方法或继续使用 Visual Basic 6.0. ·    DAO 或 RDO 资料系结 (Data B

Visual Basic 9.0概述

简介 Visual Basic 一直以生成实用的.面向数据的业务线应用程序为中心.尽管迁移到 .NET 为应用程序开发人员带来了统一的框架和托管平台,但是下一版本的 Visual Basic 包括一组对开发人员构建面向数据的应用程序时的工作效率影响深远的功能.这些语言扩展引入了适用于所有数据源的通用查询工具,不管是关系对象图.分层对象图还是 XML 文档. 本文档将简略介绍这些新增功能. Visual Basic 9.0 入门 要查看这些语言功能的实际作用,让我们首先看一个真实的示例 - CIA

关于Visual C++ 6.0的调试技巧和经验总结

用VC来写程序,有时总是出这样那样的问题,没办法只能自己上网查资料来解决,在这里把自己常见的问题和一些技巧贴出来分享给大家,希望对大家有用,也省去大家再去搜索的烦恼--     1.如何在Release状态下进行调试     Project->Setting=>ProjectSetting对话框,选择Release状态.C/C++标签中的Category选General,Optimizations选Disable(Debug),Debut info选Program Database.在Link

《易学C++(第2版)》——2.4 Visual C++ 6.0的使用

2.4 Visual C++ 6.0的使用 Visual C++ 6.0是微软公司在1998年推出的一款C++语言的集成开发环境,属于Visual Studio 6.0中的一部分.当时C++的国际标准尚未形成,因此在兼容性方面表现不佳.但由于之前其应用广泛,在不少教材中仍介绍使用该开发环境.在本节中,将简要介绍一下它的使用方法④. 打开Visual C++ 6.0之后,可以看到以下界面,如图2.12所示. 与Visual Studio 2012稍有不同,Visual C++ 6.0在菜单栏中只有