InterPhonic 语音合成系统
开发手册
安徽中科大讯飞信息科技有限公司 ANHUI USTC iFLYTEK CO.,LTD.
本手册内容若有变动,恕不另行通知。本手册例子中所用的公司、人名和数据若非特别声明,均属虚构。未得到安徽中科大讯飞信息科技有限公司明确的书面许可,不得为任何目的、以任何形式或手段(电子的或机械的)复制或传播手册的任何部分。
本文档可能涉及安徽中科大讯飞信息科技有限公司的专利(或正在申请的专利)、商标、版权或其他知识产权,除非得到安徽中科大讯飞信息科技有限公司的明确书面许可协议,本文档不授予使用这些专利(或正在申请的专利)、商标、版权或其他知识产权的任何许可协议。
本手册提及的其它产品和公司名称均可能是各自所有者的商标。
本软件产品受最终用户许可协议(EULA)中所述条款和条件的约束,该协议位于产品文档和/或软件产品的联机文档中,使用本产品,表明您已阅读并接受了EULA的条款。
版权所有© 安徽中科大讯飞信息科技有限公司 Copyright © Anhui USTC iFLYTEK CO., LTD.
目录
目录
前言 .................................................................................................................................................................. 1 第1章
概述 ............................................................................................................................................... 3
1.1 InterPhonic 语音合成系统概述 ............................................................................................................ 3
1.1.1概述 .......................................................................................................................................... 3 1.1.2特色 .......................................................................................................................................... 4 1.1.3功能简介 .................................................................................................................................. 5 1.2 InterPhonic 系统开发应用概述 ............................................................................................................ 5
1.2.1 InterPhonic系统架构介绍 ....................................................................................................... 5 1.2.2本手册使用方法....................................................................................................................... 7 1.3名词和缩略语 ........................................................................................................................................ 7 1.4文档说明................................................................................................................................................ 8 第2章 标准开发接口 .................................................................................................................................... 9 2.1 接口简介 ............................................................................................................................................... 9 2.2 标准开发接口函数 ............................................................................................................................. 10
TTSInitializeEx ............................................................................................................................ 10 TTSUninitialize ............................................................................................................................ 10 TTSConnect ................................................................................................................................. 11 TTSDisconnect ............................................................................................................................ 13 TTSSynthText .............................................................................................................................. 13 TTSFetchNext .............................................................................................................................. 15 TTSSynthTextEx .......................................................................................................................... 16 TTSSynthText2File ...................................................................................................................... 17 TTSClean ..................................................................................................................................... 18 TTSSetParam ............................................................................................................................... 19 TTSGetParam .............................................................................................................................. 24 TTSLoadUserLib ......................................................................................................................... 25 TTSUnloadUserLib ...................................................................................................................... 26 TTSFormatMessage ..................................................................................................................... 27
目录
TTSAbout .................................................................................................................................... 27 2.2.1 过期的函数 ........................................................................................................................... 28 TTSInitialize ................................................................................................................................ 28 TTSSetSynthParam ...................................................................................................................... 29 TTSGetSynthParam ..................................................................................................................... 30
2.3 错误码的定义 ..................................................................................................................................... 30 2.4 使用语音合成开发包例程 ................................................................................................................. 33
2.4.1 使用回调方式的开发 ............................................................................................................ 33 2.4.2 使用同步方式的开发 ............................................................................................................ 36
第3章 多引擎管理接口 .............................................................................................................................. 41 3.1接口简介.............................................................................................................................................. 41 3.2函数调用.............................................................................................................................................. 42
SEMFindFirstEngine ................................................................................................................... 42 SEMFindNextEngine ................................................................................................................... 45 SEMFindFirstVoice ...................................................................................................................... 45 SEMFindNextVoice ..................................................................................................................... 48 SEMFindClose ............................................................................................................................. 49 SEMGetEngineInfo ...................................................................................................................... 49 SEMEngineCtrl ............................................................................................................................ 53
3.3开发指南.............................................................................................................................................. 54
3.3.1搭建开发环境 ........................................................................................................................ 54 3.3.2使用iFly SEM SDK开发 ...................................................................................................... 55 3.3.2.1枚举引擎 .......................................................................................................................... 55 3.3.2.2枚举Voice ........................................................................................................................ 56 3.3.2.3查询引擎信息 .................................................................................................................. 57 3.3.2.4多引擎语音合成 .............................................................................................................. 59 3.3.2.5引擎控制 .......................................................................................................................... 60
3.4开发包例程 .......................................................................................................................................... 61
3.4.1简介 ........................................................................................................................................ 61 3.4.2开发示例 ................................................................................................................................ 61
第4章 语音资源管理接口 .......................................................................................................................... 63
目录
4.1 接口简介 ............................................................................................................................................ 63 4.2函数调用.............................................................................................................................................. 64
SRMInitialize ............................................................................................................................... 64 SRMUninitialize .......................................................................................................................... 64 SRMNodeEnum ........................................................................................................................... 65 SRMGetIRS ................................................................................................................................. 66 SRMGetBestServer ...................................................................................................................... 67 SRMNodeQueryInfo .................................................................................................................... 68 SRMNodeGetLoad....................................................................................................................... 69 SRMNodeControl ........................................................................................................................ 70 SRMAddMonitor ......................................................................................................................... 72 SRMRemoveMonitor ................................................................................................................... 74 SRMSetParam .............................................................................................................................. 75 SRMGetParam ............................................................................................................................. 76 SRM_Routine_Proc ..................................................................................................................... 77
4.3开发指南.............................................................................................................................................. 79
4.3.1搭建开发环境 ........................................................................................................................ 79 4.3.2使用SRM SDK开发 ............................................................................................................. 79 4.4开发包例程 .......................................................................................................................................... 86
4.4.1简介 ........................................................................................................................................ 86 4.4.2开发示例 ................................................................................................................................ 86
第5章 FAQ .................................................................................................................................................. 87
1. 多线程开发时如何调用初始化和逆初始化函数? ............................................................. 87 2. 为什么合成系统在多线程调用时出现声音数据混杂的情况? .......................................... 87 3. 合成几次之后系统为什么出现授权不足的连接错误? ..................................................... 87 4. 合成函数中TTSData结构使用的注意事项? ..................................................................... 87 5. 合成系统输出的语音文件播放时为什么会出现杂音? ..................................................... 88 6. 用本地接口开发的程序改为网络调用应该注意哪些情况? .............................................. 88 7. 为什么在网络调用时出现合成效率低及接受发送数据错误的现象? .............................. 88 8. 把标准接口封装改为单个函数进行合成需要注意哪些问题? .......................................... 88 9. 调用合成系统的开发接口出现初始化失败的错误? ......................................................... 89
目录
10. 在电话语音应用系统中如何实现合成与播放的同步进行? ............................................ 89
第6章 技术支持 ........................................................................................................................................ 90
InterPhonic语音合成系统开发手册
前言
欢迎使用InterPhonic语音合成系统系列产品!
语音合成(Text-To-Speech),是将电子化文本的文字信息转化为声音信息的一项信息处理技术。作为信息技术的尖端研究领域,语音合成技术特别是中文语音合成技术的发展一直受到信息产业界的高度关注。
科大讯飞作为语音合成技术领域的“领头羊”,拥有国家863项目、九五攻关项目、国家自然科学基金项目、中国科学院八五重大项目等大力支持;拥有中科院声学所、社科院语言所等国内领先研究机构的联合实验室等强大后盾;并拥有与联想、华为等业界领先厂商的强力同盟,经过十余年的研究与积累,为语音技术的继续发展打下了坚实的基础,并持续保持业界领先地位。
本公司的InterPhonic语音合成系统以先进的大语料语音合成技术为基础,能提供可比拟真人发音的高自然度、高流畅性、面向任意文本篇章的连续合成语音合成系统。InterPhonic语音合成系统致力于建立和改善人—机语音界面,为大容量语音服务提供高效稳定的语音合成功能,并提供从电信、企业到桌面的全套应用解决方案,是新概念声讯服务、语音网站、多媒体办公教学的内在动力。
本手册适用读者:
语音服务的提供商
如果您从事信息查询、呼叫服务等,需要处理不同行业不同类型的海量信息,希望根据现有资源扩大某种特定服务的规模,但又担心为某一种服务去开发应用平台代价太大,通过阅读本手册,您会发现,只需要较少的编程就可以充分利用InterPhonic语音合成系统的诸多优势,实现服务拓展,缩短项目周期。
语音应用的开发商
如果您从事语音合成系统的二次开发,面向行业级、家庭级等最终用户提供语音合成产品,InterPhonic系统简洁明了而又功能全面的API将帮助您迅速完成语音应用系统的开发,从而大大节约开发投入,丰富语音服务的内容。
语音技术的爱好者
如果您对语音应用系统具有浓厚的兴趣,并且具有一定的编程基础,您可以通过应用和熟悉本公司的InterPhonic语音合成系统,并在本手册指导下学习语音合成方面的应用开发,体验语音世界的无穷乐趣。
本手册基本内容: 第1章 概述
简要概括InterPhonic语音合成系统的原理、特色、功能,以及本手册的使用方法等。
第2章 标准开发接口
介绍InterPhonic语音合成系统的标准开发接口,并详细阐述了回调方式和同步方式下的开发步骤。
第3章 多引擎管理接口
1
InterPhonic语音合成系统开发手册
介绍多引擎管理接口函数功能与应用,并详细列出开发步骤与例程。
第4章 语音资源管理接口
介绍语音资源管理接口函数功能与应用,并详细列出开发步骤与例程。
第5章 FAQ
介绍应用讯飞语音合成开发接口进行产品开发过程中可能会遇到的问题及其解决方法。
第6章 技术支持
介绍本公司提供的技术支持方式,便于用户迅速获取帮助,提高应用效率。
通过阅读本手册,读者可以: 了解语音合成技术基本原理
了解科大讯飞语音合成技术的基本功能与特色 掌握InterPhonic语音合成系统接口规范
了解InterPhonic语音合成系统网络应用开发的基本思想和方法 利用InterPhonic语音合成系统接口规范进行二次开发
请详细阅读本手册各章节内容,相信这些信息能为您带来帮助和便捷。
2
InterPhonic语音合成系统开发手册
第1章 概述
1.1 InterPhonic 语音合成系统概述
1.1.1概述
语音合成(Text-To-Speech),又称为文语转化。它涉及声学、语言学、数字信号处理、多媒体等多种学科,是中文信息处理领域的一项前沿技术。语音合成技术解决的主要问题是:如何将电子化文本的文字信息转化为能够播放的声音信息。近代语音合成技术是随着计算机技术和数字信号处理技术的发展而发展起来的,目的是让计算机能够产生高清晰度、高自然度的连续语音。近几十年来国际和国内的研究主要集中在按规则文语转换,即将书面语言转换成口头语言。
作为信息技术的尖端研究领域,语音合成技术特别是中文语音合成技术的发展一直受到信息产业界的高度关注。
科大讯飞语音合成技术在国家863项目、九五攻关项目、国家自然科学基金项目、以及中国科学院八五重大项目的支持下,历经十余年拼搏,在国内外同类技术中脱颖而出,成为语音合成技术领域内的“领头羊”。为持续保持世界领先地位,科大讯飞公司先后在中科院声学所、社科院语言所等相关领域的国内领先研究机构建立了联合实验室,并与联想、华为等业界领先厂商建立战略合作关系,为语音技术的继续发展打下了坚实的基础。
InterPhonic语音合成系统以先进的大语料语音合成技术为基础,能提供可比拟真人发音的高自然度、高流畅性、面向任意文本篇章的连续合成语音合成系统。InterPhonic语音合成系统致力于建立和改善人—机语音界面,为大容量语音服务提供高效稳定的语音合成功能,并提供从电信、企业到桌面的全套应用解决方案,是新概念声讯服务、语音网站、多媒体办公教学的内在动力。
语音合成技术的原理示意如下:
3
InterPhonic语音合成系统开发手册
可以从图中看到,语音合成系统的合成引擎在完成文本到语音数据的转化过程中可以简单分解为两个步骤的处理。文本先经过前端的语法分析,通过科大讯飞公司精心制作的词典和规则的处理,得到格式规范,携带语法层次的信息,传送到后端。后端在前端分析的结果基础上,经过韵律方面的分析处理,得到语音的时长、音高等韵律信息,再根据这些信息在音库中挑选最合适的语音单元,语音单元再经过调整和拼接,就能得到最终的语音数据。
在整个转化处理的过程中牵涉到大量的中英文语法和韵律知识的运用,以及语法和语义分析的算法,最佳路径搜索,单元挑选和调整的算法,语音数据编码方面的知识。语音合成技术涵盖了语音文字的社会科学、数字信号处理等自然科学,是跨学科的高新技术。
1.1.2特色
语音合成产品对核心技术的依赖程度很高,为保证在核心技术上的长期领先优势,同时保证有效的将核心技术转化为功能、稳定性、易用性等各方面全面达到用户要求的高品质产品,科大讯飞通过产学研相结合模式,保证研发水平和产品品质的同步提高。公司同国内语音研究领域具有领先水平的中科学声学所、中国科大和社科院语言所分别合作建立了联合实验室,将一些前瞻性的研究放在联合实验室完成,通过强强联合、优势互补,保证了核心技术的不断进步和领先优势。科大讯飞公司通过自主地研究和开发,在中文语音合成技术的多个领域都有独创性的技术成果。
独创的语料信息统计模型;
前后端一致性的语料库设计方法、和语料库的自动构建方法; 听感量化思想指导下,以变长韵律模板为基础的高精度韵律模型; 高鲁棒性的智能化文本分析处理技术; 基于听感损失最小的语料库裁减技术 ;
特定语种知识和系统建模方法分离的多语种语音合成系统框架; 面向特定领域应用的定制语音合成技术。
4
InterPhonic语音合成系统开发手册
1.1.3功能简介
InterPhonic中英文混读语音合成系统是科大讯飞公司推出的文语转化引擎,采用最先进的中文文本、韵律分析算法和大语料库的合成方法,合成语音已经接近真人的自然效果。InterPhonic语音合成系统具有的主要特性有:
1. 2. 3. 4. 5. 6. 7. 8. 9.
高质量语音——将输入文本实时转换为流畅、清晰、自然和具有表现力的语音数据;
多语种服务——整合了多语种语音合成引擎,可提供中文、中英文混读、英文、广东话的语音合成服务;
多音色服务——支持中年女声、青年女声、男声三种音色的音库资源,用户可以根据不同应用场合选择适当的合成音色;
高精度文本分析技术——保证了对文本中未登录词(如地名)、多音字、特殊符号(如标点、数字)、韵律短语等智能分析和处理;
多字符集支持——支持输入GB2312、GBK、Big5、Unicode和UTF-8等多种字符集,普通文本和带有CSSML标注等多种格式的文本信息;
多种数据输出格式——支持输出多种采用率的线性Wav,A/U率Wav和Vox等格式的语音数据; 灵活的接口——提供了标准接口、简单接口、COM接口、SAPI接口,便于在多种环境下进行系统的集成;
语音调整功能——开发接口提供了音量、语速、音高等多种合成参数的动态调整功能; 配置和管理工具——合成引擎提供了统一进行配置和管理的工具,完成了全局参数配置、用户词典、用户规则、定制资源包管理等功能;
10. 效果优化——合成引擎提供了以定制资源包和CSSML为代表的多种针对实际应用环境进行合成
效果优化的方法;
11. 一致的访问方式——能以Client/Server方式访问远程的语音合成服务,并且提供与本地调用相同
的开发接口,实现了完全透明的访问;
12. 动态负载均衡——提供了动态负载均衡模块,以对用户透明的方式动态调配多台语音合成服务器
的资源;
13. 背景音和预录音——合成引擎还提供了背景音和预录音的功能,以便获得更逼真、更多样化的合
成效果。
1.2 InterPhonic 系统开发应用概述
请注意,科大讯飞公司所有InterPhonic语音合成产品中只有桌面版、企业版包含语音合成开发包,演示版仅提供合成效果的演示功能,不包含开发功能。
1.2.1 InterPhonic系统架构介绍
典型的InterPhonic系统网络应用环境如下图所示:
5
InterPhonic语音合成系统开发手册
上图中各个部分简介: 资源服务器
指语音服务平台中的资源管理服务器,该服务器是整个语音服务平台的信息、控制中心,提供动态负载均衡服务。在语音资源服务器主机上,资源管理程序对当前平台中的各种用户请求(包括请求数量、用户请求在各个语音服务器上的分布情况、以及各个语音服务器的数据处理情况等)进行统计, 通过这些统计数据,可以得到当前语音服务平台的运行状况报表,该报表对于了解平台的运行状况、优化平台处理能力、调整处理策略等提供了第一手资料。
语音服务器
指语音服务平台中的服务器端,在该服务器上运行有语音合成引擎,能够提供高自然度的实时多路中英文语音合成服务,适用于使用各种独立/分布节点性质的在线语音合成服务的场合。
语音平台控制台
语音平台控制台(Speech Platform Console,SPC),指运行在语音服务监控端的监控程序,用户通过控制台程序可以监控语音服务平台的整体运行状况。
SPC组件是整个iSP系统中通用的服务状态远程监视和管理的组件,其工作流程是:连接到指定的服务器,收集该服务器的信息,通过图形界面向系统的管理维护人员提供服务器的当前运行状态,服务运行报表、服务器的日志等信息,并且提供管理的接口,以便配置、启动、停止指定的服务。
SPC程序可以运行在局域网中的任何主机上。用户通过Windows下的SPC GUI界面,可以实现如下功能: 1. 察看网络中任一台语音服务器、语音客户端、日志服务器主机的运行状况和负载情况; 2. 在多网段系统中,指定主资源服务器和备份资源服务器主机; 3. 加载或卸载语音服务器主机上的语音服务; 4. 统计语音应用的性能、网络流量。 InterPhonic语音合成客户端
安装在客户端的语音合成应用程序。主要包括:
6
InterPhonic语音合成系统开发手册
1. 语音合成引擎:提供语音合成的核心功能,包括了合成需要的各种资源文件、配置、标准开发接口和应用程序如:资源管理中心和合成效果演示程序等;如果是网络版开发,语音合成引擎位于语音服务器上。
2. 语音合成工具包:多种语音合成应用工具的集合。
3. 接口封装:包括标准开发接口、简单开发接口,TTS COM接口,SAPI接口、SEM、SRM等便于集成开发的接口封装,及其开发文档和示例程序。
1.2.2本手册使用方法
对于InterPhonic 2.0以前版本的用户
请详细阅读本手册第2章的标准开发接口介绍,了解各个接口函数的功能及具体调用方法,并使用开发包例程,按照我们提供的各种类型的开发步骤进行开发体验。 对于InterPhonic2.0及以后版本的用户
由于InterPhonic 2.0实现了网络级语音服务,相应的开发接口功能也大大扩展,增加了多引擎管理接口和语音资源管理接口两套新的应用接口。
用户需要在详细了解第2章(标准开发接口)的基础上,再掌握第3章(多引擎管理接口)和第4章(语音资源管理接口)。同样地,本手册中也提供了详细的接口函数介绍和开发步骤指南;另外,我们在产品的客户端安装包中提供了SRM/SEM SDK的开发实例程序SRMApp,这个例程简单演示了SRM/SEM SDK各个函数的用法,用户可以参考这些例程进行开发。
1.3名词和缩略语
iFly TTS
讯飞语音合成技术,又称文语转换技术(Text To Speech)即TTS技术,是指使用计算机把文本信息转换为相应文本发音的音频数据,然后播放出来——使计算机象人那样能够说话。 iFly TTS SDK
讯飞语音合成开发包,是在讯飞语音合成系统基础上,为语音合成开发者提供的一个能够使用讯飞语音合成技术进行应用开发的用户编程接口。 iSP
讯飞语音平台(iFly Speech Platform),是讯飞公司根据多年的语音应用案例需求而研制开发的最新语音平台产品,运行于网络环境,提供连续、实时的语音合成服务,为各种企业级、桌面级语音应用提供了一个全新的语音应用和开发方案。 SES
语音引擎服务(Speech Engine Services),指运行在语音服务器上的语音引擎管理器,负责提供具体的语音服务。 SRM
语音资源管理器(Speech Resource Manager),指运行在语音服务器上的语音资源管理器,负责提供动态负载均衡服务(LBS)。
7
InterPhonic语音合成系统开发手册
1.4文档说明
本文针对的读者是具有一些Win32编程经验的C/C++程序员。 文档中使用的符号约定: 符号 含义 [in] 表明该参数是调用时赋值的参数——输入参数 [out] 该参数在函数返回时被赋值——输出参数 [in/out] 该参数在函数调用时作为输入、函数返回时作为输出参数
8
InterPhonic语音合成系统开发手册
第2章 标准开发接口
2.1 接口简介
语音合成开发包提供了多个能够使用讯飞TTS系统进行语音应用开发的开发接口,通过这些接口可以开发出具有TTS功能的各种企业级、桌面及应用系统。这些接口都需要语音合成运行库的支持,但接口的功能和面向的开发者各有不同,适合多种开发环境。开发者可以根据具体的应用场合进行选择。
TTS标准开发接口是语音合成引擎提供的基础引擎支持功能的开发接口,该接口直接调用合成引擎,提供功能全面、性能出色的语音合成开发功能。标准接口支持C/C++、Delphi等语言的调用,但不支持VB、C#、java等高级语言的调用。
接口函数列表
在语音合成开发包中提供如下函数调用: 函数名称 TTSInitializeEx TTSUninitialize TTSConnect TTSDisconnect TTSSynthText TTSFetchNext TTSSynthTextEx TTSSynthText2File TTSClean TTSGetParam TTSSetParam TTSLoadUserLib TTSUnloadUserLib TTSFormatMessage TTSAbout 开发包组件
Windows平台下的开发 开发组件 头文件
组件组成 iFly_TTS.h、TTSErrcode.h 说明 接口函数的声明 9
功能简介 全局初始化TTS服务 全局逆初始化TTS服务 建立客户到TTS服务的连接 撤销客户到TTS服务的连接 指定将一段文本合成内存中的语音数据 合成并取回上次调用TSSynthText/TTSFetchNext后剩余文本对应的合成语音数据 扩展功能的合成函数 合成一段文本到某个文件,该函数可以用来向某个声音文件中添加音频数据 清除还未合成的待合成文本,释放相关资源,把当前TTS服务的状态设置成初始的状态 获取引擎实例的合成参数,作用和TTSSetParam相对 设置引擎实例的合成参数,这里的合成参数包括本地调用参数和网络调用参数 装载用户定义库 卸载用户定义库 根据TTS错误码生成相关的错误信息字符串 获得语音合成系统相关信息
InterPhonic语音合成系统开发手册 动态引入库 运行时刻库 iFlyTTS.lib iFlyTTS.dll 包含接口函数的引入 接口函数的具体实现
UNIX/LINUX平台下的开发 开发组件 头文件 组件组成 iFly_TTS.h、TTSErrcode.h libiflytts.so 说明 接口函数的声明 包含接口函数的具体实现
运行库 开发包支持情况 开发包类型 本地开发 网络开发 Windows系统 支持 支持 UNIX/LINUX系统 支持 支持 2.2 标准开发接口函数
TTSInitializeEx 函数原型
TTSRETVAL TTSInitializeEx(const char* pszEngine,void* pvReserved); 功能
全局初始化语音合成系统,把语音合成系统使用的一些全局数据装载到系统内存中。 参数
pszEngine
[in] 需要初始化的引擎或路径名称。 pvReserved
[in/out] 保留值,必须是NULL。 返回值
返回值 TTSERR_OK TTSERR_NOLICENCE TTSERR_OPENFILE 说明
1. 必须保证这个函数是使用TTS SDK时第一个被调用的函数,在一个进程内部该函数可以被调用多次。 2. 调用这个函数进行初始化时,pszEngine参数可以是以“;”(分号)分隔的多个引擎名称或者安装路径,例如:TTSInitilazeEx(“ce30;ct22”, NULL); TTSUninitialize 函数原型
TTSRETVAL TTSUninitialize();
10
意义 函数执行成功。 未检测到加密狗 未找到特定的系统文件。 InterPhonic语音合成系统开发手册
功能
全局逆初始化语音合成系统,从系统内存中移出语音合成系统。 参数
无; 返回值
如果函数调用成功返回TTSERR_OK,否则返回错误代号,错误代号的具体值由TTSGETERRCODE(x)宏获得,可能的值如下:
返回值 TTSERR_OK TTSERR_NOTINIT 说明
本函数释放由TTSInitialize函数分配的资源,是使用TTS SDK时最后一个被调用的函数,而且在一个进程内部调用次数应该与TTSInitialize函数相对应。 TTSConnect 函数原型
HTTSINSTANCE TTSConnect(PTTSConnectStruct pConnect); 功能
建立客户到TTS服务的连接; 参数
pConnect [in/out]
一个TTSConnectStruct结构的指针,在调用本函数连接TTS服务之前,您必须填充这个结构的信息以供TTS服务初始化使用。
TTSConnectStruct结构定义以及其成员意义如下: typedef struct { TTSDWORD CHAR CHAR CHAR CHAR CHAR CHAR TTSDWORD TTSDWORD TTSBOOL TTSINT16
意义 函数执行成功。 尚未初始化。 dwSDKVersion; szUserName[TTS_USER_NAME_MAX]; szCompanyName[TTS_COMPANY_NAME_MAX]; szSerialNumber[TTS_SERIAL_NO_MAX]; szServiceUID[TTS_SERVICE_UID_MAX]; szProductName[TTS_PRODUCT_NAME_MAX]; szTTSServerIP[TTS_IP_MAXLEN]; dwServiceID; dwErrorCode; bSetParams; nCodePage; 11
InterPhonic语音合成系统开发手册 TTSINT16 nVID; TTSINT16 nAudioFmt; TTSINT16 nSpeed; TTSINT16 nVolume; TTSINT16 nPitch; TTSINT16 nAudioHeadFmt; TTSINT16 nTextType; TTSDWORD dwReserved[TTS_RESERVED_LEN]; }TTSConnectStruct,*PTTSConnectStruct; 结构体各个成员意义如下: dwSDKVersion [in] 结构体的版本号,通常指定为IFLYTTS_SDK_VER 宏; szUserName [in] 连接TTS服务时的用户名,指定为一个不超过TTS_USER_NAME_MAX长度的字符串; szCompanyName [in] 连接TTS服务时的公司名,指定为一个不超过TTS_COMPANY_NAME_MAX长度的字符串; szSerialNumber [in] 连接TTS服务时的序列号,指定为一个不超过TTS_SERIAL_NO_MAX 长度的字符串,该序列号需要从讯飞公司获得; ServiceUID [in] 和TTS系统中集成的多个合成引擎建立连接,在多合成引擎的TTS系统中用于切换 合成引擎。 szTTSServerIP [in] 使用网络中TTS Server的IP地址,如果在这里指定一个有效的IP地址,则本次语音合成调用将与网络上IP为szTTSServerIP、启动了语音合成服务的语音合成服务器建立连接,如果szTTSServerIP的值为“0.0.0.0”,则客户将使用动态负载均衡系统与网络上的TTS服务建立连接。 dwServiceID [out] 返回本次连接的ID; dwErrorCode [out] 如果连接失败,这个成员将返回错误代码; bSetParams [in] 是否在建立连接的同时设置本次连接的合成参数; nCodePage [in] 本次连接缺省的文本内码类型; nVID [in] 本次连接的发音人编号; nAudioFmt [in] 本次连接的输出语音格式; nSpeed [in] 本次连接的合成语速; nVolume [in] 本次连接的合成音量; nPitch [in]
12
InterPhonic语音合成系统开发手册 本次连接的合成音高; nAudioHeadFmt [in] 本次连接的音频数据头格式; nTextType [in] 本次连接的文本类型; dwReserved [in/out] 这个参数为了和TTS以后扩展而保留,在语音合成开发包中,这个参数必须置0。 返回值
成功时返回连接到TTS服务的服务实例句柄,失败时返回NULL;
参数pConnect的dwErrorCode包含了错误代号,如果函数调用成功dwErrorCode返回0,否则返回错误代号,错误代号的具体值由TTSGETERRCODE(x)宏获得,可能的值如下:
dwErrorCode TTSERR_OK TTSERR_NOLICENCE TTSERR_INVALIDSN TTSERR_NOTINIT TTSERR_NOTRESPONSE 说明
在使用TTS服务之前,必须首先调用该函数建立与TTS服务的连接,并将函数的返回句柄保存,供以后调用使用。 TTSDisconnect 函数原型
TTSRETVAL TTSDisconnect(HTTSINSTANCE hTTSInstance); 功能
断开一个与语音合成系统建立的连接; 参数
hTTSInstance [in]
先前调用TTSConnect得到的TTS服务实例句柄。 返回值
如果函数调用成功返回0,否则返回错误代号; 返回值 TTSERR_OK TTSERR_INVALIDHANDLE TTSSynthText 函数原型
13
意义 函数执行成功。 无效的TTS服务实例句柄 意义 函数执行成功。 授权数量达到上限 错误的序列号 尚未初始化 TTS服务没有响应 InterPhonic语音合成系统开发手册
TTSRETVAL TTSSynthText(HTTSINSTANCE hTTSInstance, PTTSData pTTSData); 功能
指定将一段文本合成到内存中; 参数
hTTSInstance [in]
先前调用TTSConnect得到的TTS服务实例句柄。 pTTSData [in/out]
一个指向TTSData结构的指针,用来向TTS服务输入待合成的文本,以及TTS服务输出文本合成的语音数据。其各个成员定义以及其意义如下:
typedef struct { TTSDWORD dwServiceID; TTSDWORD dwInBufSize; TTSDWORD dwOutBufSize; TTSDWORD dwInFlags; TTSDWORD dwOutFlags; TTSWORD wAudioHeadLen; TTSDWORD dwCurStart; TTSDWORD dwCurEnd; TTSDWORD dwErrorCode; TTSCHAR* szInBuf; TTSCHAR* pOutBuf; PTTSCHAR pszPYBuf; TTSDWORD dwReserved; } TTSData, *PTTSData; dwServiceID[in] 在调用TTSConnect是返回的TTS服务ID; dwInBufSize[in] 请将此值赋值为输入数据的长度; dwOutBufSize[out] 输出时被修改为合成后的语音数据长度; dwInFlags[in] 输入的附加标志,保留,必须置为0; dwOutFlags[out] 输出标记,取值不同: TTS_FLAG_STILL_HAVE_DATA 表示待合成文本未完全合成数据回送,需要调用CTTSFetchNext合成并取回剩余文本对应的数据. TTS_FLAG_DATA_END
14
InterPhonic语音合成系统开发手册 表示文本成功合成并取完数据。 wAudioHeadLen [out] 输出声音数据的数据头长度; dwCurStart[out] 当前合成文本在szInBuf中的起始位置; dwCurEnd[out] 当前合成文本在szInBuf中的结束位置; dwErrorCode[out] 合成失败时的错误代码 szInBuf[in] 待合成的文本内容; pOutBuf[out] 输出数据缓冲区(合成语音数据内存映像); pszPYBuf [out] 输出拼音数据(部分支持); dwReserved [in/out] 系统保留,必须为0。 返回值
如果函数调用成功返回0,否则返回错误代号,错误代号的具体值由TTSGETERRCODE(x)宏获得,可能的值如下:
返回值 TTSERR_OK TTSERR_INVALIDHANDLE TTSERR_DATASIZE TTSERR_EXCEPTION TTSERR_MALLOC 说明
该函数将一段文本合成到内存中,其中待合成的文字和合成后的语音数据通过指针pTTSData来传送,其中的输入缓冲区szInBuf必须通过显式的内存分配函数调用分配。该函数等待当前缓冲区数据有效后即返回,既可能只合成部分文本(如一句话),剩余文本的合成语音数据可以通过调用TTSFetchNext来合成并取回。输出缓冲区pOutBuf、pszPYBuf是由系统内部进行分配和释放的,在调用之前应保证pOutBuf、pszPYBuf的值为NULL。 TTSFetchNext 函数原型
TTSRETVAL TTSFetchNext(HTTSINSTANCE hTTSInstance, PTTSData pTTSData); 功能
合成并取回上次调用TTSSynthText/TTSFetchNext后剩余文本对应的语音数据,待当前缓冲区数据有效
15
意义 函数执行成功。 无效的TTS服务实例句柄 输入的合成字符串长度超过了最大限制 合成过程中出现异常 为输出缓冲区分配内存失败 InterPhonic语音合成系统开发手册
后返回。 参数
hTTSInstance [in]
先前调用TTSConnect得到的TTS服务实例句柄。 pCTTSData [in/out]
指向TTSData结构的指针,其中dwInBufSize,szInBuf参数被忽略掉了,其它输入参数的指定与调用TTSSynthText时相同。 返回值
如果函数调用成功返回0,否则返回错误代号,错误代号的具体值由TTSGETERRCODE(x)宏获得,可能的值如下:
返回值 TTSERR_OK TTSERR_INVALIDHANDLE TTSERR_DATASIZE TTSERR_EXCEPTION TTSERR_MALLOC TTSERR_PRECONDITION TTSSynthTextEx 函数原型
TTSRETVAL TTSSynthTextEx(HTTSINSTANCE hTTSInstance,PTTSData 功能
使用回调方式合成一段文本,这里的回调可以是同步模式,也可以是异步模式; 参数
hTTSInstance [in]
先前调用TTSConnect得到的TTS服务实例句柄; pTTSData [in/out]
指向一TTSData结构的指针,这个结构包含了合成过程中的输入/输出信息; pTTSCallBacks [in]
指向一TTSCallbacks结构的指针,这个结构中指定了合成过程的回调函数和合成事件的回调函数,该结构的定义如下:
typedef struct { TTSINT32 nNumCallbacks; TTSPROCESSCB pfnTTSProcessCB; TTSEVENTCB pfnTTSEventCB;
16
pTTSData,PTTSCallBacks pTTSCallBacks,TTSBOOL bASynch,PTTSVOID UserData);
意义 函数执行成功。 无效的TTS服务实例句柄 输入缓冲区的文本超过了系统可以合成的最大长度 合成中出现异常 为输出数据申请内存失败 在调用之前没有调用TTSSynthText输入合成文本 InterPhonic语音合成系统开发手册 }TTSCallBacks, *PTTSCallBacks; 其中:nNumCallbacks说明每次TTS服务(客户连接)中使用的回调函数个数,它的取值只能为1或2;pfnTTSProcessCB是合成过程控制的回调函数指针;pfnTTSEventCB是合成过程中一些事件的回调函数,一般情况下不用设置该函数。
bAsynch [in]
指出此次回调方式的合成是否异步模式,TRUE表示本次合成使用异步操作,否则使用同步合成; pUserData [in]
指向用户自定义数据的指针,该指针在调用回调函数时被作为参数传入回调函数; 返回值
如果函数调用成功返回0,否则返回错误代号,错误代号的具体值由TTSGETERRCODE(x)宏获得,可能的值如下:
返回值 TTSERR_OK TTSERR_INVALIDHANDLE TTSERR_INVALIDPTR TTSERR_INVALIDPARA TTSERR_CREATEHANDLE TTSERR_SYNC 说明
⑴ 此函数以回调的方式进行文本合成,当使用这个函数时,就无须调用TTSFetchNext函数来获取声音数据,此时只需要指定合成过程中使用的回调函数入口地址和合成模式(同步或异步)。
⑵ 回调函数的原型 合成处理过程的回调函数
TTSRETVAL TTSProcessCB (HTTSINSTANCE hTTSInstance, PTTSData pTTSData, TTSINT32 lParam, PTTSVOID pUserData); 这个回调函数将在合成过程中每个分句合成完毕时被调用,如果想要终止合成过程,请将返回值置为非零即可(建议使返回值等于TTSERR_CANCELED)。
合成事件的回调函数
TTSRETVAL TTSEventCB(HTTSINSTANCE hTTSInstance, PTTSData pTTSData, TTSINT16 nNotify, TTSINT32 lParam, PTTSVOID pUserData); 事件的回调在目前的版本中不被支持。 TTSSynthText2File 函数原型
TTSRETVAL TTSSynthText2File(HTTSINSTANCE hTTSInstance,
PTTSData pTTSData, const char* pszOutFile, PTTSCallBacks pTTSCallBacks,
17
意义 函数执行成功。 无效的TTS服务实例句柄 无效的指针 参数错误,请检查pTTSCallBack参数的赋值 在异步合成时创建线程失败 该错误表示前一次合成的文本尚未完成 InterPhonic语音合成系统开发手册
功能
合成一段文本到某个文件,该函数可以用来向某个声音文件中添加音频数据。 参数
hTTSInstance[in]
先前调用TTSConnect得到的TTS服务实例句柄。 pTTSData[in/out]
指向一TTSData结构的指针,这个结构包含了合成过程中的输入/输出信息。 pszOutFile[in] 输出文件的完整路径。 pTTSCallBacks[in]
指向一TTSCallbacks结构的指针,这个结构中指定了合成过程的回调函数和合成事件的回调函数。 bAsynch[in]
指出此次回调方式的合成是否异步模式,TRUE表示本次合成使用异步操作,否则使用同步合成。 pUserData[in]
指向用户自定义数据的指针,该指针在调用回调函数时被作为参数传入回调函数。 返回值
如果函数调用成功返回0,否则返回错误代号,错误代号的具体值由TTSGETERRCODE(x)宏获得,可能的值如下:
返回值 TTSERR_OK TTSERR_INVALIDHANDLE TTSERR_INVALIDPTR TTSERR_INVALIDPARA TTSERR_NOTSUPP TTSERR_SYNC 说明
1. 有关异步合成和TTSData结构体的说明请阅读TTSSynthTextEx函数相关说明,这个函数的使用方法和TTSSynthTextEx是类似的。
2. 这个函数将根据当前的音频头格式设置为输出的音频文件添加音频头,用户可以针对输出文件音频头设置TTS_PARAM_AUDIOHEADFMT参数。
意义 函数执行成功。 无效的TTS服务实例句柄 无效的指针 参数错误,请检查参数的赋值是否在有效范围 系统不支持该项操作 该错误表示前一次合成的文本尚未完成
BOOL bAsynch,PTTSVOID pUserData);
TTSClean 函数原型
TTSRETVAL TTSClean(HTTSINSTANCE hTTSInstance);
18
InterPhonic语音合成系统开发手册
功能
清除合成缓冲区,把当前服务的状态设置成初始状态; 参数
hTTSInstance [in]
先前调用TTSConnect得到的TTS服务实例句柄。 返回值
如果函数调用成功返回0,否则返回错误代号,错误代号的具体值由TTSGETERRCODE(x)宏获得,可能的值如下:
返回值 TTSERR_OK TTSERR_INVALIDHANDLE 说明
无论在该服务实例是否有还未合成取回的待合成文本,本函数都将会把当前服务实例的状态设置成初始状态。 TTSSetParam 函数原型
TTSRETVAL TTSSetParam(HTTSINSTANCE hTTSInstance, TTSDWORD 功能
设置语音合成系统的合成参数,这里的合成参数包括本地调用参数和网络调用参数。 参数
hTTSInstance [in]
先前调用TTSConnect得到的TTS服务实例句柄; dwParamType [in]
指定设置的参数类型,参数类型包括本地参数网络调用参数; nParam [in] 设置的参数值。 nSize[in]
设置缓冲区大小的参数值。 返回值
如果函数调用成功返回0,否则返回错误代号,错误代号的具体值由TTSGETERRCODE(x)宏获得,可能的值如下:
返回值 TTSERR_OK TTSERR_INVALIDHANDLE
意义 函数执行成功。 无效的TTS服务实例句柄 19
dwParamType, TTSINT32 nParam, TTSINT32 nSize);
意义 函数执行成功。 无效的TTS服务实例句柄 InterPhonic语音合成系统开发手册 TTSERR_NOTSUPP 系统不支持该项参数 TTSERR_INVALIDPARA 参数错误,请检查参数的赋值是否在有效范围 说明
目前支持的合成参数因合成系统的版本而有所不同,具体支持的情况请查阅联机文档。 合成参数 dwParamType 参数意义 TTS_PARAM_INBUFSIZE 输入缓冲区的最大长度 TTS_PARAM_OUTBUFSIZE 输出缓冲区的最大长度 TTS_PARAM_VID 发音人编号 TTS_PARAM_CODEPAGE 中文文本内码类型 TTS_PARAM_AUDIODATAFMT 输出音频数据的声音格式 TTS_PARAM_SPEED 合成语速 TTS_PARAM_VOLUME 音量 TTS_PARAM_PITCH 音调 TTS_PARAM_AUDIOHEADFMT 音频数据头格式 TTS_PARAM_ENTERTREAT 分句时对回车符的处理 TTS_PARAM_MAXSENLEN 最大分句长度 TTS_PARAM_AVAILABLEVID 当前可用音库列表 TTS_PARAM_READALLMARKS 读出所有的标点符号 TTS_PARAM_STALL_STYLE 停顿风格 TTS_PARAM_READNUMBER 数字字符串的读法 TTS_PARAM_READENGLISH 英文文本的读法 TTS_PARAM_TEXTTYPE 文本类型 TTS_PARAM_BYTEORDER 输出音频的字节序 TTS_PARAM_VPTTREAT 设置预录音 TTS_PARAM_BGSOUND 设置背景音 设置系统使用的发音人 参数值(nParam) 参数含义 是否缺省值 0 缺省 1 小静 2 小燕 3 小美 4 小宇 注意 关于系统使用的发音人的具体定义请参阅iFly_TTS.h。
设置系统支持的中文内码类型 参数值(nParam) 参数含义 是否缺省值 TTS_CP_GB2312 GB-2312 TTS_CP_GBK GBK TTS_CP_BIG5 BIG5
20
InterPhonic语音合成系统开发手册 TTS_CP_UNICODE TTS_CP_GB18030 TTS_CP_UTF8 合成语速的设置
当dwParamType 等于TTS_PARAM_SPEED时就可以设置当前的合成语速,此时nParam的值将设置当前合成服务的语速,nParam的取值范围是-500~+500,0为原速,数值大则语速快,对应于0.5~1.5倍线性调整关系。
输出声音数据格式的设置
当dwParamType 等于TTS_PARAM_AUDIODATAFMT时就可以设置当前输出音频数据的格式,此时nParam的值将设置为以下其中一个:
参数值nParam TTS_ADF_DEFAULT TTS_ADF_PCM8K8B1C TTS_ADF_PCM16K8B1C TTS_ADF_PCM8K16B1C TTS_ADF_PCM16K16B1C TTS_ADF_PCM11K8B1C TTS_ADF_PCM11K16B1C TTS_ADF_PCM6K8B1C TTS_ADF_PCM6K16B1C TTS_ADF_ALAW16K1C TTS_ADF_ULAW16K1C TTS_ADF_ALAW8K1C TTS_ADF_ULAW8K1C TTS_ADF_ALAW11K1C TTS_ADF_ULAW11K1C TTS_ADF_ALAW6K1C TTS_ADF_ULAW6K1C TTS_ADF_ADPCMG7218K4B1C TTS_ADF_ADPCMG7216K4B1C TTS_ADF_ADPCMG7233B1C TTS_ADF_ADPCMG7235B1C TTS_ADF_VOX6K1C TTS_ADF_VOX8K1C 注意 当合成系统采用不同的音库进行合成时,所能支持的输出数据格式是不同的,只有 采用和要求输出数据格式相同采样率的音库时才能提供相应的输出数据格式。
由于ADPCM的编码过程运算量过大, 在输出ADPCM格式数据时,性能上无法达到输出其他数据类型时的性能要求。
21
声音格式 当前音库的缺省输出数据格式 PCM格式 8K 8bit线性量化 PCM格式 16K 8bit线性量化 PCM格式 8K 16bit线性量化 PCM格式 16K 16bit线性量化 PCM格式 11K 8bit线性量化 PCM格式 11K 16bit线性量化 PCM格式 6K 8bit线性量化 PCM格式 6K 16bit线性量化 ALAW格式 采样率16K ULAW格式 采样率16K ALAW格式 采样率8K ULAW格式 采样率8K ALAW格式 采样率11K ULAW格式 采样率11K ALAW格式 采样率6K ULAW格式 采样率6K ADPCM格式 采样率8K 32Kbps ADPCM格式 采样率6K 24Kbps ADPCM格式 采样率8K 24Kbps ADPCM格式 采样率8K 40Kbps VOX格式 采样率 6K VOX格式 采样率 8K 备注 8K音库缺省 16K音库缺省 11K音库缺省 6K音库缺省 Unicode GB18030 UTF-8 InterPhonic语音合成系统开发手册
设置输出音频数据头格式
语音合成系统的输出音频数据缺省时包含一个定长数据头(其长度由TTSData结构的wAudioHeadLen指出),如果需要改变音频头的格式,请使dwParamType的值等于TTS_PARAM_AUDIOHEADFMT,nParam为以下之中的一个:
参数值(nParam) TTS_AHF_DEFAULT TTS_AHF_NONE TTS_AHF_STAND 输出音量的设置
如果需要改变音频数据的输出音量,请使dwParamType的值等于TTS_PARAM_VOLUME,nParam的值将决定输出音量的大小。
音量的有效范围从小到大为:-20——+20 (0为缺省音量) 断句时回车符的处理
在实际应用过程中,不同合成文本的回车符的意义有可能是不相同的:可能代表句子或段落的结束,此时回车符应该作为断句的标志;可能是用户想对齐文本中每一行的长度而强行加入的,此时的回车符应该过滤掉。如果需要改变合成系统对回车符的处理方法,请使dwParamType的值等于TTS_PARAM_ENTERTREAT,nParam为以下值之一:
参数值(nParam) TTS_ET_AUTO TTS_ET_SPLITSEN TTS_ET_NOTHING TTS_ET_SPACE 最大断句长度的设置 最大断句长度是指如果文本中没有特定的断句标点符号,合成系统会强行断句的最大字符数量。如果需要改变最大断句长度,请使dwParamType的值等于TTS_PARAM_MAXSENLEN,nParam的值将决定最大断句的长度。
最大断句长度的有效范围从小到大为:16——128(128为缺省最大断句长度) 读出所有标点符号的设置
语音合成系统允许客户选择是否读出所有的标点符号,如果需要改变该参数,请使dwParamType的值等于TTS_PARAM_READALLMARKS,nParam的值将决定是否读出所有的标点符号。
参数的有效值是0(不读出所有的标点符号)或1(读出所有的标点符号)。 停顿风格的设置
停顿风格是指合成语音中词语之间停顿的长度表现。如果需要改变停顿风格,请使dwParamType的值等于TTS_PARAM_STALL_STYLE,nParam为以下值之一,这五种停顿风格按“抑扬顿挫”、“稍作顿挫”、“正常”、 22
回车符处理方式 合成系统自动判断 回车符作为断句标志 删除回车符 回车符被转化为空格 是否缺省 数据头格式 44字节音频数据头,只有在输出格式为Wave PCM时才有意义 不包含音频数据头 标准音频数据头格式,根据具体格式头长度可能为44(标准PCM格式)、58(Alaw和Ulaw)或0字节(Vox格式)。 是否缺省 InterPhonic语音合成系统开发手册
“平缓连贯”、“一气呵成”的顺序,对应的词语间停顿越来越小,语气越来越连贯:
参数值(nParam) TTS_SSL_NORMAL TTS_SSL_STALL TTS_SSL_SNATCHY TTS_SSL_UNCEASING TTS_SSL_VERBOSE 数字字符串读法的设置
语音合成系统中对数字字符串的处理在缺省情况下是自动判断的,合成系统将根据数字串前后的语流环境,如之前的汉字或特殊符号、之后的汉字或符号及数字字符串本身的特性,决定数字字符串是按照一个数值来发音(如“一千二百三十四”),还是按照一串数字来发音(如“一二三四”)。如果需要改变以后合成过程中对数字字符串读法的处理,请使dwParamType的值等于TTS_PARAM_READNUMBER,nParam为以下值之一
参数值(nParam) TTS_RN_AUTO_VALUE TTS_RN_VALUE TTS_RN_DIGIT TTS_RN_AUTO_DIGIT 输出声音缓冲区大小的设置
语音合成系统允许用户设置系统保存声音数据的缓存区的大小,使用较大的缓冲区可以一次获得较多的声音数据;因为每一个合成服务都会有独立的输出缓冲区,使用小缓冲区会极大的减少在大容量应用中对内存资源的消耗。如果需要改变系统声音输出缓冲区的大小,请使dwParamType的值等于TTS_PARAM_OUTBUFSIZE,nParam的值将决定缓冲区的大小。nParam的取值范围是64K Bytes――2M Bytes。
英文朗读方法的设置
在InterPhonic CE语音合成系统的缺省情况下,合成系统对英文将采取以单词为单位进行合成,对于系统已知的英文单词,将按词典中的音标进行朗读,而对于词典中不存在的单词,系统将根据当前词语的具体拼写组合进行合成。
TTS开发接口允许用户设置英文的处理方式,此时dwParamType的值应该等于TTS_PARAM_READENGLISH,nParam为以下值之一:
参数值(nParam) TTS_RE_AUTO_WORD TTS_RE_LETTER 文本类型的设置 合成系统提供对CSSML文本标记语言的支持,系统可以自动识别格式规范的CSSML文本,同时也允许用户指定文本类型。如果需要指定输入的文本类型,请设置dwParamType的取值为TTS_PARAM_TEXTTYPE,nParam为下表中的一值。
23
英文字符串读法 自动判断处理,如果不确定将按照英文词语拼写处理 所有英文按字母发音 是否缺省 数字字符串读法 自动判断处理,不能确定的按照值发音 按数值发音 按数字发音 自动判断处理,不能确定的按数字发音 是否缺省 停顿风格描述 正常停顿风格 稍作顿挫 抑扬顿挫 平缓连贯 一气呵成 是否缺省 TTS_RE_AUTO_LETTER 自动判断处理,如果不确定将按照字母朗读 InterPhonic语音合成系统开发手册 参数值(nParam) TTS_TT_AUTO TTS_TT_PLAINTEXT TTS_TT_CSSMLTEXT TTS_TT_EMAIL 设置预录音
当dwParamType 等于TTS_PARAM_VPTTREAT时,用户指定预录音的作用方式。nParam可以取下表中的一值:
参数值(nParam) TTS_VPT_DISABLE TTS_VPT_ENABLE 参数意义 在合成过程中不使用背景音文字匹配的功能 在合成过程中使用背景音文字匹配的功能,即如果合成文本中包含与预录音文本完全相同的孤立句子,该预录音生效并且该部分文本使用背景音来合成 是否缺省 参数意义 指定输入文本为普通文本,这种情况下系统将不会识别任何CSSML标记。 是否缺省 自动判断文本类型,如果不确定将按照普通文本进行合成 指定文本类型为CSSML文本,即使该文本不是规范格式 的XML文本,该文本中的CSSML标记也会被系统识别。 指定的输入文本为Email文本 注意此参数只对资源管理中心“预录音”库中的背景音及其“文本内容”有效。 设置背景音
当dwParamType 等于TTS_PARAM_BGSOUND时,用户可以指定要播放的背景音。设置了本合成参数后,后继合成将得到混合了背景音的语音数据。此时nParam参数指定了要播放的背景音库中某条背景音的编号ID,如果nParam参数为0,当前播放的背景音会停止。 注意此参数只可以引用位于资源管理中心“背景音”库中的背景音,不能自己指定背景音文件;如果用户想指定外部的音频文件,请使用CSSML标记。 TTSGetParam 函数原型
TTSRETVAL TTSGetSynthParam(HTTSINSTANCE hTTSInstance, TTSDWORD 功能
获取语音合成系统的合成参数,其作用和TTSSetSynthParam相对; 参数
hTTSInstance [in]
先前调用TTSConnect得到的TTS服务实例句柄。 dwParamType [in]
指定设置的参数类型,参数类型包括本地参数网络调用参数; pnParam [out] 指向返回参数值的指针。 pnsize [in/out]
24
dwParamType,TTSINT32 *pnParam, TTSINT32 *pnSize);
InterPhonic语音合成系统开发手册
获取表示缓冲区大小的参数值。 返回值
如果函数调用成功返回0,否则返回错误代号,错误代号的具体值由TTSGETERRCODE(x)宏获得,可能的值如下:
返回值 意义 TTSERR_OK 函数执行成功。 TTSERR_INVALIDHANDLE 无效的TTS服务实例句柄 TTSERR_NOTSUPP 系统不支持此项操作,请检查是否是网络运行库与本地运行库不同。 TTSERR_INVALIDPARA 参数错误 说明
目前支持的合成参数因本地调用和网络调用而有所不同。 合成参数(dwParamType) 支持情况 本地 网络 参数意义 TTS_PARAM_INBUFSIZE 输入缓冲区的最大长度 TTS_PARAM_OUTBUFSIZE 输出缓冲区的最大长度 TTS_PARAM_VID 发音人编号 TTS_PARAM_CODEPAGE 中文文本内码类型 TTS_PARAM_AUDIODATAFMT 输出音频数据的声音格式 TTS_PARAM_SPEED 合成语速 TTS_PARAM_VOLUME 音量 TTS_PARAM_PITCH 音调 TTS_PARAM_AUDIOHEADFMT 音频数据头格式 TTS_PARAM_ENTERTREAT 分句时对回车符的处理 TTS_PARAM_MAXSENLEN 最大分句长度 TTS_PARAM_AVAILABLEVID 当前可用音库列表 TTS_PARAM_READALLMARKS 读出所有的标点符号 TTS_PARAM_STALL_STYLE 停顿风格 TTS_PARAM_READNUMBER 数字字符串的读法 TTS_PARAM_READENGLISH 英文文本的读法 TTS_PARAM_TEXTTYPE 文本类型 TTS_PARAM_BYTEORDER 输出音频的字节序 TTS_PARAM_VPTTREAT 设置预录音 TTS_PARAM_BGSOUND 设置背景音 TTSLoadUserLib 函数原型
TTSRETVAL TTSLoadUserLib(HTTSINSTANCE hTTSInstance, HTTSUSERLIB*
lphUserLib, CHAR* lpUserLibFile, PTTSVOID pUserlib, TTSINT32 nSize);
25
InterPhonic语音合成系统开发手册
功能
将一个用户自定义库装入语音合成系统。 参数
hTTSInstance [in]
先前调用TTSConnect得到的TTS服务实例句柄。 lphUserLib [in/out] 指向返回值的指针; nTTSLibType [in] 要装入的用户库类型; pUserLib [in]
用户库文件的全路径名或者用户库的名称; nSize [in]
pUserlib参数缓冲区的大小 返回值
如果函数调用成功返回0,否则返回错误代号,错误代号的具体值由TTSGETERRCODE(x)宏获得,可能的值如下:
返回值 TTSERR_OK TTSERR_NOTSUPP TTSERR_NOTIMPL 说明
本函数将一个用户自定义的库文件装入语音合成系统,这里的库文件既可以是用户字典或其他任何语音合成系统支持的用户库。 TTSUnloadUserLib 函数原型
TTSRETVAL TTSUnloadUserLib(HTTSINSTANCE hTTSInstance, HTTSUSERLIB* lphUserLib, CHAR* lpUserLibFile, PTTSvoid pUserLib, TTSINT32 nsize); 功能
将指定的用户库移出语音合成系统。 参数
hTTSInstance [in]
先前调用TTSConnect得到的TTS服务实例句柄。 hUserLib [in]
先前调用TTSLoadUserLib得到的用户库句柄。 返回值
26
意义 函数执行成功。 当前的系统不支持此项操作 该版本的SDK尚未实现该功能 InterPhonic语音合成系统开发手册
如果函数调用成功返回0,否则返回错误代号,错误代号的具体值由TTSGETERRCODE(x)宏获得,可能的值如下:
返回值 TTSERR_OK TTSERR_NOTIMPL 说明
本函数把由TTSLoadUserLib函数装载的资源包从该TTS实例卸载,以后该实例的合成将使用原来的资源和合成参数。 TTSFormatMessage 函数原型
TTSRETVAL TTSFormatMessage(TTSDWORD dwTTSErrCode, PTTSVOID pMsgBuf, 功能
将指定的错误代码格式化为文本信息; 参数
dwTTSErrCode [in] 错误代号值; pMsgBuf [out] 错误信息缓冲区; pnSize [in/out]
调用时填入出错信息缓冲区的长度,函数返回时系统将填入实际需要的缓冲区长度。 返回值
如果函数调用成功返回0,否则返回错误代号,错误代号的具体值由TTSGETERRCODE(x)宏获得,可能的值如下:
返回值 TTSERR_OK TTSERR_INVALIDPTR TTSERR_NOENOUGHBUF 说明
如果该函数调用失败并且返回值为TTS_ERR_BUFFER_SIZE说明用户分配的缓冲区不足以容纳出错信息。pnSize参数指向的值是实际需要的缓冲区长度,请重新分配*pnSize长度的缓冲区,然后重新调用本函数。 TTSAbout 函数原型
TTSRETVAL TTSAbout(TTSDWORD dwAboutType, PTTSVOID pAboutContent,
27
意义 函数执行成功。 无效的指针 用户分配的缓冲区不足以写入错误描述字符串 TTSINT16* pnSize);
意义 函数执行成功。 该版本的SDK尚未实现该功能 InterPhonic语音合成系统开发手册
功能
获取语音合成运行库的相关信息。 参数
dwAboutType [in] 需要获取的信息编号; pAboutContent [out] 获取信息缓冲区; pnSize [in/out]
调用时填入信息缓冲区的长度,函数返回时系统将填入实际需要的缓冲区长度。 返回值
如果函数调用成功返回0,否则返回错误代号,错误代号的具体值由TTSGETERRCODE(x)宏获得,可能的值如下:
返回值 TTSERR_OK TTSERR_INVALIDPTR TTSERR_NOENOUGHBUF 说明
如果该函数调用失败并且返回值为TTS_ERR_BUFFER_SIZE说明用户分配的缓冲区不足以容纳关于信息。*pnSize参数指向的值是实际需要的缓冲区长度,请重新分配*pnSize长度的缓冲区,然后重新调用本函数。
dwAboutType参数可以取下表中的值 参数值 TTS_ABOUT_PRODUCTINFO 意义 函数返回描述产品名称,版本号等信息的字符串 意义 函数执行成功。 无效的指针 用户分配的缓冲区不足以写入信息。 TTSINT16 *pnSize);
2.2.1 过期的函数
以下三个函数(TTSInitialize、TTSSetSynthParam、TTSGetSynthParam)在iFLY TTS SDK 1.2中已经不再使用,这里列出来,目的是为了与以前的系统兼容。这些函数的功能,将分别由相应函数(TTSInitializeEx、TTSSetParam、TTSGetParam)实现。 TTSInitialize 函数原型
TTSRETVAL TTSInitialize(); 功能
全局初始化语音合成系统,把语音合成系统使用的一些全局数据装载到系统内存中; 参数
28
InterPhonic语音合成系统开发手册
无; 返回值
如果函数调用成功返回TTSERR_OK,否则返回错误代号,错误代号的具体值由TTSGETERRCODE(x)宏获得,可能的值如下:
返回值 TTSERR_OK TTSERR_NOLICENCE TTSERR_OPENFILE TTSERR_RESMISSING 备注
必须保证这个函数是使用TTS SDK时第一个被调用的函数,而且在一个进程内部只被调用一次。 TTSSetSynthParam 函数原型
TTSRETVAL TTSSetSynthParam(HTTSINSTANCE hTTSInstance, TTSDWORD 功能
设置语音合成系统的合成参数,这里的合成参数包括本地调用参数和网络调用参数。 参数
hTTSInstance [in]
先前调用TTSConnect得到的TTS服务实例句柄; dwParamType [in]
指定设置的参数类型,参数类型包括本地参数网络调用参数; nParam [in] 设置的参数值。 返回值
如果函数调用成功返回0,否则返回错误代号,错误代号的具体值由TTSGETERRCODE(x)宏获得,可能的值如下:
返回值 TTSERR_OK TTSERR_INVALIDHANDLE TTSERR_NOTSUPP TTSERR_INVALIDPARA 说明
请参考TTSSetParam函数的相关说明。
意义 函数执行成功。 无效的TTS服务实例句柄 系统不支持该项参数 参数错误,请检查参数的赋值是否在有效范围 dwParamType, TTSINT32 nParam);
意义 函数执行成功。 未检测到加密狗 未找到特定的系统文件。 资源文件缺失 29
InterPhonic语音合成系统开发手册
TTSGetSynthParam 函数原型
TTSRETVAL TTSGetSynthParam(HTTSINSTANCE hTTSInstance, TTSDWORD 功能
获取语音合成系统的合成参数,其作用和TTSSetSynthParam相对; 参数
hTTSInstance [in]
先前调用TTSConnect得到的TTS服务实例句柄。 dwParamType [in]
指定设置的参数类型,参数类型包括本地参数网络调用参数; pnParam [out] 指向返回参数值的指针。 返回值
如果函数调用成功返回0,否则返回错误代号,错误代号的具体值由TTSGETERRCODE(x)宏获得,可能的值如下:
返回值 TTSERR_OK TTSERR_INVALIDHANDLE TTSERR_NOTSUPP TTSERR_INVALIDPARA 说明
具体的使用方法请参考TTSGetParam函数的相关说明。 注意
本函数可以查询的其他合成参数是与TTSSetSynthParam设置的合成参数对应的,请参照前一节TTSSetSynthParam部分的说明。
意义 函数执行成功。 无效的TTS服务实例句柄 系统不支持此项操作,请检查是否是网络运行库与本地运行库不同。 参数错误 dwParamType,TTSINT32 *pnParam);
2.3 错误码的定义
所有错误码都在文件TTSErrcode.h中定义。 和错误码有关的宏定义:
# ifdef TTS_ERRCHECK_SEVERE # define TTSERRCHECK(x) (x == TTSERR_OK) # else # define TTSERRCHECK(x) SUCCEEDED(x)
30
InterPhonic语音合成系统开发手册 # endif # define TTSGETERRCODE(x) ((x) & 0x0000FFFF) 下面的表格是当前合成系统内部的错误列表,如果合成系统返回的是Window错误代码,请查阅WinError.h头文件:
错误码 值 说明 TTSERR_OK 0x0L 成功 TTSERR_FAIL 0x80000000L 失败 TTSERR_UNKNOWN 0x00000001 发生未知错误 TTSERR_EXCEPTION 0x00000002 发生异常 TTSERR_NOTSUPP 0x00000003 功能未支持 TTSERR_NOTIMPL 0x00000004 未正常执行 TTSERR_UNKNOWNCMD 0x00000005 未知的命令 TTSERR_INVALIDPARA 0x00000006 无效的参数 TTSERR_DATASIZE 0x00000007 未分配足够的缓冲区 TTSERR_ALREADYEXIST 0x00000008 对象已经存在 TTSERR_OVERFLOW 0x00000009 溢出 TTSERR_NOTRESPONSE 0x0000000A 没有响应 TTSERR_STOPPED 0x0000000B 已停止 TTSERR_CANCELED 0x0000000C 已取消 TTSERR_TOOMANYREQ 0x0000000D 过多的请求 TTSERR_TIMEOUT 0x0000000E 超时 TTSERR_NOTCONNECT 0x0000000F 未连接 TTSERR_INITFAIL 0x00000010 初始化失败 TTSERR_NOTINIT 0x00000011 未初始化 TTSERR_CLOSED 0x00000012 已关闭 TTSERR_NOMOREDATA 0x00000013 数据已取完 TTSERR_VERSIONCHECK 0x00000014 版本校验失败 TTSERR_PRECONDITION 0x00000015 没有预定义 TTSERR_NOTREGISTERED 0x00000016 未注册 TTSERR_CREATEHANDLE 0x00000101 创建系统句柄失败 TTSERR_NULLHANDLE 0x00000102 空的句柄 TTSERR_INVALIDHANDLE 0x00000103 无效的句柄 TTSERR_OPENDEV 0x00000104 打开设备失败 TTSERR_SETHOOK 0x00000105 设置HOOK失败 TTSERR_REMOVEHOOK 0x00000106 删除HOOK失败 TTSERR_LOADDLL 0x00000107 加载DLL失败 TTSERR_GETPROCADDR 0x00000108 取进程地址失败 TTSERR_SYNC 0x00000109 同步失败 TTSERR_CREATEOBJECT 0x0000010A 创建系统对象失败
31
InterPhonic语音合成系统开发手册 TTSERR_OBJECTEXIST 0x0000010B 系统对象已经存在 TTSERR_WAITTIMEOUT 0x0000010C 等待系统对象超时 TTSERR_OBJECTABANDON 0x0000010D 系统对象被舍弃 TTSERR_INVALIDOBJECT 0x0000010E 无效的系统对象 TTSERR_MALLOC 0x00000201 分配内存失败 TTSERR_REMALLOC 0x00000202 重新分配内存失败 TTSERR_OVERFLOWBUF 0x00000203 内存指针溢出 TTSERR_INVALIDPTR 0x00000204 无效的内存指针 TTSERR_NULLPTR 0x00000205 空的内存指针 TTSERR_READMEM 0x00000206 读内存失败 TTSERR_WRITEMEM 0x00000207 写内存失败 TTSERR_NOENOUGHMEM 0x00000208 没有足够的内存 TTSERR_NOENOUGHBUF 0x00000209 缓冲区大小不够 TTSERR_OPENFILE 0x00000301 打开文件失败 TTSERR_READFILE 0x00000302 读取文件失败 TTSERR_WRITEFILE 0x00000303 写文件失败 TTSERR_RENAMEFILE 0x00000305 重命名文件失败 TTSERR_MOVEFILE 0x00000306 移动文件失败 TTSERR_EMPTYFILE 0x00000307 空文件 TTSERR_OPENSOCK 0x00000401 打开套接字失败 TTSERR_CONNECTSOCK 0x00000402 套接字连接失败 TTSERR_ACCEPTSOCK 0x00000403 侦听套接字失败 TTSERR_SENDSOCK 0x00000404 发送套接字数据失败 TTSERR_RECVSOCK 0x00000405 收取套接字失败 TTSERR_INVALIDSOCK 0x00000406 无效的套接字句柄 TTSERR_SERVICEID 0x00000407 无效的服务ID TTSERR_RESLOAD 0x00000501 加载资源失败 TTSERR_RESFREE 0x00000502 释放资源失败 TTSERR_RESMISSING 0x00000503 找不到资源文件 TTSERR_INVALID_RESNAME 0x00000504 无效的资源文件名 TTSERR_INVALID_RESID 0x00000505 无效的资源ID TTSERR_INVALID_RESIMG 0x00000506 无效的资源映象指针 TTSERR_RESWRITE 0x00000507 试图写只读属性资源失败 TTSERR_RESLEAK 0x00000508 资源泄露 TTSERR_CONVERT 0x00000801 转换失败 TTSERR_MATCH 0x00000802 比较失败 TTSERR_GETPOS 0x00000803 获取位置失败 TTSERR_LOADINDEX 0x00000804 加载索引失败 TTSERR_INDEX 0x00000805 损坏的索引 TTSERR_TEXTEND 0x00000806 到文本尾 32 InterPhonic语音合成系统开发手册 TTSERR_NOTFOUND TTSERR_INVALIDSN TTSERR_GETSTATUS TTSERR_GETPARAM TTSERR_SETPARAM TTSERR_NOLICENCE TTSERR_VLIBUNKNOWN TTSERR_NODELEVEL 0x00000807 0x00000901 0x00000902 0x00000903 0x00000904 0x00000905 0x00000906 0x00000907 未找到 无效的序列号 获取状态信息失败 获取合成参数失败 设置合成参数失败 没有许可协议 未知的音库 获取合成树节点信息失败 2.4 使用语音合成开发包例程
2.4.1 使用回调方式的开发
简介
回调式的合成方法是在合成过程中, 语音合成系统合成一批声音数据后主动将该声音数据通过回调函数的形式回送给客户方,这种合成方式有着较高的合成效率和编程灵活性。 本地开发
在使用iFly TTS SDK进行开发时,请按以下步骤进行: ⑴ 语音合成系统(语音合成系统)的初始化 可以采用如下的调用方式:
nRet = TTSInitializeEx(NULL, NULL); if(nRet != TTSERR_OK)) { // 初始化失败„„ } 初始化过程将把语音合成系统中需要的一些通用模块加载到系统内存中并完成其他一些初始化步骤,所以可能花较多的时间。 ⑵ 与TTS服务建立连接
如果初始化成功,那么就可以使用TTSConnect函数与TTS服务建立连接。该函数有一个PTTSConnectStruct的结构指针参数,可以这样声明: HTTSINSTANCE hTTSInstance; TTSConnectStruct ttsConnect; memset(&ttsConnect, 0, sizeof(ttsConnect)); ttsConnect.dwSDKVersion = IFLYTTS_SDK_VER; strcpy(ttsConnect.szServiceUID, “ce30”); // 以下是连接时的一些缺省设置 ttsConnect. bSetParams= TRUE; ttsConnect.nCodePage = TTS_CP_GB2312;
33
InterPhonic语音合成系统开发手册 ttsConnect.nVID = 1; ttsConnect.nSpeed = 100; hTTSInstance = TTSConnect(&ttsConnect); if(hTTSInstance == NULL) { // 与TTS服务建立连接失败 nRet = TTSGETERRCODE(ttsConnect.dwErrorCode); if ( nRet == TTSERR_INVALIDSN ) { // 错误的序列号 } else if ( nRet == TTSERR_NOLICENCE ) { // 未检测到加密狗或授权数量达到上限 } return nRet; } 以上的代码建立了用户与TTS服务之间的连接,其中TTSConnect函数返回的TTS实例句柄需要保存,以后的代码中将会使用到该句柄。 ⑶ 开始合成
在开始合成文本之前,请先声明合成中将使用到的回调函数,可以这样:
TTSRETVAL SynthProcessProc(HTTSINSTANCE hTTSInstance, PTTSData pTTSData, TTSINT32 lParam, PTTSVOID pUserData) { if(pTTSData->dwOutBufSize > 0) { // 有语音数据,进行处理,如播放语音 PlaySound(pTTSData->pOutBuf, NULL, SND_SYNC|SND_MEMORY); } if(pTTSData->dwOutFlags == TTS_FLAG_DATA_END) { // 合成完毕 } return pTTSData->dwErrorCode; } 在主函数中首先应该声明一个TTSData的结构体变量,它将负责声音数据的输入/输出: TTSData TtsData;
34
InterPhonic语音合成系统开发手册 为了保证送入的文本不超过TTS服务所支持的最大合成文本长度,还应该获得TTS服务所支持的最大合成文本长度值: nRet = TTSGetSynthParam(hTTSInstance, TTS_PARAM_INBUFSIZE, (TTSINT32*)&nInBufSize); if(nRet != ERR_OK) { printf(\"Error in Get TTS system Parameter, Error Code %d.\\n\} 现在可以开始合成文本了,代码如下:
// 传递回调函数地址的参数 TTSCallBacks TtsCallBacks; TtsData.szInBuf = new char[nInBufSize]; // 用户注意需要释放这块内存 strcpy(TtsData.szInBuf, “„„”); // 待合成文本 TtsData.dwInBufSize = strlen(TtsData.szInBuf); TtsCallBacks.nNumCallbacks = 1; TtsCallBacks.pfnTTSProcessCB = SynthProcessProc; TTSSynthTextEx(hTTSInstance, &TtsData, &TtsCallBacks, FALSE, NULL); memset(&TtsData, 0, sizeof(TtsData)); 注意 合成是可以指定同步合成或者异步合成方式,当使用同步合成方式时,系统将在调用函数TTSSynthTextEx时处于阻塞状态,直至回调函数返回TTSERR_CANCELED(或其他非零值)或所有的文本都已经合成完毕为止;当使用异步方式合成时,如果在回调函数中返回TTSERR_CANCELED(或其他非零值),合成过程将会终止。当合成过程终止后,应当调用TTSClean函数以回收合成过程中使用的内存,从而防止内存泄漏。 ⑷ 断开与TTS服务的连接
合成完毕后,如果不需要再合成文本,需要断开已建立的连接: // 断开与TTS服务的连接 nRet = TTSDisconnect(hTTSInstance); if(nRet != TTSERR_OK) { // 失败„„ }
⑸ 逆初始化语音合成系统
最后一步就是从系统内存中移出语音合成系统:
35
InterPhonic语音合成系统开发手册 nRet = TTSUninitialize(); if( nRet != TTSERR_OK) { // 失败„„ } 网络开发
在进行网络开发时,开发步骤与本地开发是完全一致的。需要注意的是: ⑴ 与网络上的TTS服务建立连接
如果客户机上启动了LBAgent(负载平衡代理)程序,而在客户所在的子网内有至少一台TTS Server(TTS 服务器)并且启动了LBService(负载平衡服务),那么本地调用的程序可以完全不用修改就可以在网络中使用,如果没有LBSystem的支持TTSConnect函数的使用应该在参数pConnect的szServerIP域填入指定服务器的IP地址。
HTTSINSTANCE hTTSInstance; TTSConnectStruct ttsConnect; memset(&ttsConnect, 0, sizeof(ttsConnect)); ttsConnect.dwSDKVesion = IFLYTTS_SDK_VER; strcpy(ttsConnect.szServiceUID, “ce30”); // 以下是连接时的一些缺省设置 … // 网络连接TTS Server,假设TTS Server的IP地址是“192.168.75.3” strcpy(ttsConnect.szServerIP, “192.168.75.3”); hTTSInstance = TTSConnect(&ttsConnect); if(hTTSInstance == NULL) { // 与TTS服务建立连接失败 nRet = TTSGETERRCODE(ttsConnect.dwErrorCode); return nRet; } ⑵ 更换运行时刻库
在Windows系统平台下更换本地运行时刻库iFlyTTS.dll为网络运行时刻库iFlyTTS.dll后,应用程序就可以使用网络中的TTS服务了。
2.4.2 使用同步方式的开发
简介
传统的开发方式是在合成过程中由用户主动获取已经合成的声音数据,然后进行处理。这种方法虽然结构比较清晰,但在效率、灵活性上低于回调式的合成方法。为了与以前版本的TTS API保持一致,开发包中也保留了相应的接口函数。
36
InterPhonic语音合成系统开发手册
本地开发
在使用iFly TTS SDK进行开发时,请按以下步骤进行:
⑴ 语音合成系统(语音合成系统)的初始化 具体调用方法与3.1.2中相同。 ⑵ 与TTS服务建立连接 具体调用方法与3.1.2中相同。 ⑶ 开始合成
合成过程的调用方法与回调方式是不同的。
在主函数中首先应该声明一个TTSData的结构体变量,它将负责声音数据的输入/输出: TTSData TtsData; memset(&TtsData, 0, sizeof(TtsData)); 为了保证送入的文本不超过TTS服务所支持的最大合成文本长度,还应该获得TTS服务所支持的最大合成文本长度值:
nRet = TTSGetSynthParam(hTTSInstance, TTS_PARAM_INBUFSIZE, (TTSINT32*)&nInBufSize); if(nRet != ERR_OK) { printf(\"Error in Get TTS system Parameter, Error Code %d.\\n\} 现在可以开始合成文本了,代码如下:
TtsData.szInBuf = new char[nInBufSize]; strcpy(TtsData.szInBuf, “„„”); // 待合成文本 TtsData.dwInBufSize = strlen(TtsData.szInBuf); nRet = TTSSynthText(hTTSInstance, &TtsData); if(nRet != TTSERR_OK) { // 合成失败„„ … } if(TtsData.dwOutBufSize > 0) { PlaySound(TtsData.lpOutBuf, SND_SYNC|SND_MEMORY); } while(TtsData.dwOutFlags == TTS_FLAG_STILL_HAVE_DATA) { nRet = TTSFetchNext(hTTSInstance, &TtsData); if(nRet != TTSERR_OK)
37
InterPhonic语音合成系统开发手册 } { // 合成出错… break; } if(TtsData.dwOutBufSize > 0) { PlaySound(TtsData.lpOutBuf, SND_SYNC|SND_MEMORY); } 注意 TTSSynthText及TTSFetchNext调用所返回的输出数据是音频数据文件映像。它包括如下的头部格式:
标准PCM格式的WAV文件头长度为44字节: typedef struct WaveHead { char riff[4]; //=\"RIFF\" long size_8; //=datasize + 36 char wave[4]; //=\"WAVE\" char fmt[4]; //=\"fmt \" long pcm; //=16 short unknown; //=1 short channel; //通道数 long rate; //采样率 long byteps; //每秒字节数 short bytepe; //每采样点字节数 short quent; // 量化比特数 char data[4]; //=\"data\" long datasize; //纯数据长度 } WAVHEAD, *PWAVHEAD; 标准的A/U Law格式的WAV文件头格式为58字节: struct TWaveAULAWHdr { char szRiff[4]; // = \"RIFF\" DWORD dwSize_8; // = FileSize - 8 char szWave[4]; // = \"WAVE\" char szFmt[4]; // = \"fmt \" DWORD dwFmtSize; // = 下一个结构体的大小 : 18 WORD wFormatTag; // = aLaw : 6 | uLaw : 7 WORD wChannels; // = 通道数 : 1 DWORD dwSamplesPerSec; // = 采样率 : 8000 | 6000 | 11025 | 16000 DWORD dwAvgBytesPerSec; // = 每秒字节数
38
InterPhonic语音合成系统开发手册 WORD wBlockAlign; // = 每采样点字节数 : wBitsPerSample / 8 WORD wBitsPerSample; // = 量化比特数: 8 | 16 WORD wCbSize; // = 下一个结构体的大小 : 0 char szFact[4]; // = \"fact\" WORD wUnknown1; // = 4; WORD wUnknown2; // = 0; DWORD dwDatasize_raw; // = Datasize : FileSize - 58 char szData[4]; // = \"data\"; DWORD dwDatasize; // = DataSize : FileSize - 58 }; // 缺省的头信息 const TWaveAULAWHdr DEF_AULAWWAVHDR = { { 'R', 'I', 'F', 'F' }, 0, // 根据实际情况取值 {'W', 'A', 'V', 'E'}, {'f', 'm', 't', ' '}, 18, 6, // 根据实际情况取值 1, 8000, // 根据实际情况取值 16000, // 根据实际情况取值 2, // 根据实际情况取值 16, // 根据实际情况取值 0, {'f', 'a', 'c', 't'}, 4, 0, 0, // 根据实际情况取值 {'d', 'a', 't', 'a'}, 0, // 根据实际情况取值 }; ⑷ 断开与TTS服务的连接
合成完毕后,如果不需要再合成文本,需要断开已建立的连接: nRet = TTSDisconnect(hTTSInstance); if(nRet != TTSERR_OK) { // 断开与TTS服务的连接 }
39
InterPhonic语音合成系统开发手册
⑸ 逆初始化语音合成系统
最后一步就是从系统内存中移出语音合成系统: nRet = TTSUninitialize(); if( nRet != TTSERR_OK) { // 失败„„ } 网络开发
在进行网络开发时,开发步骤与本地开发是完全一致的。具体开发方法请参阅:回调方式开发的网络开发部分内容。
40
InterPhonic语音合成系统开发手册
第3章 多引擎管理接口
3.1接口简介
多引擎管理接口是讯飞语音应用平台客户端上提供的应用程序开发接口,通过一致的接口,透明地支持网络版、本地版两种开发方式。可以用来管理、查询位于本地或网络中的所有语音引擎及每个引擎拥有的Voice信息,控制语音服务引擎、查询引擎的静态属性及动态统计信息,以实现多合成引擎的语音服务需要。多引擎管理接口支持C/C++、Delphi等语言的调用,不直接支持VB、C#、java等高级语言的调用。 接口函数列表
在多引擎管理开发包中提供如下函数调用: 函数名称 SEMFindFirstEngine SEMFindNextEngine SEMFindFirstVoice SEMFindNextVoice SEMFindClose SEMGetEngineInfo SEMEngineCtrl 开发包组件
Windows平台下的开发 开发组件 头文件 动态引入库 运行时刻库
开发组件 头文件 运行库 开发包支持情况
开发包类型 本地开发 网络开发 组件组成 iFly_SEM.h、TTSErrcode.h iFlyTTS.lib iFlyTTS.dll 组件组成 iFly_SEM.h、TTSErrcode.h libiFlyTTS.so 说明 接口函数的声明 包含接口函数的引入 接口函数的具体实现 说明 接口函数的声明 包含接口函数的具体实现 功能简介 启动引擎搜索 搜索下一个引擎 启动Voice搜索 搜索下一个Voice 关闭搜索 查询各种引擎信息 通过命令字对引擎进行各种控制 UNIX/LINUX平台下的开发
Windows系统 支持 支持 41
InterPhonic语音合成系统开发手册
3.2函数调用
SEMFindFirstEngine 函数原型
TTSRETVAL SEMFindFirstEngine(PTEngineFindFilter pFindFilter, DWORD *pdwEngineID, HSEMHANDLE *phFindHandle); 功能
查找满足过滤条件的第一个引擎; 参数
pFindFilter [in]
指向引擎过滤条件结构的指针;为NULL时表示没有过滤条件;结构体的定义如下: typedef struct { TTSDWORD cbSize; /* [in] Size of structure */ TTSDWORD dwFilterMask; /* [in] Filter mask flag */ TTSCHAR szVoiceName[SEM_VOICENAME_LEN_MAX]; /* [in] Voice name */ TTSCHAR szIP[TTS_IP_MAXLEN]; /* [in] Server IP address */ TTSDWORD dwLanguage; /* [in] Language ID */ TTSDWORD dwGender; /* [in] Speaker gender of voice */ TTSDWORD dwAge; /* [in] Speaker age of voice */ TTSDWORD dwSampleRate; /* [in] Sample rate of voice */ TTSDWORD dwStatus; /* [in] Engine status */ TTSCHAR szEngineName[SEM_ENGINENAME_LEN_MAX]; /* [in] Engine name */ TTSDWORD dwReserved; /* [in/out] Reserved: must set to zero */ } TEngineFindFilter, *PTEngineFindFilter; 其中: cbSize [in] 结构的大小,以字节为单位。 dwFilterMask [in] 过滤条件掩码,指明结构中的哪些成员起作用,具体定义参考后面的表格。 szVoiceName [in] 引擎包含的Voice的名称,支持通配符”*”和”?”,如”Xiao*”。 szIP [in] 引擎所在的IP地址,点分十进制格式,如”192.168.73.12”。 注意:本条件只对网络版SEM接口有效。 dwLanguage [in] 引擎支持的语种,具体定义参考后面的表格。
42
InterPhonic语音合成系统开发手册 dwGender [in] 引擎支持的发音人性别,具体定义参考后面的表格。 dwAge [in] 引擎支持的发音人的年龄段,具体定义参考后面的表格。 dwSampleRate [in] 引擎支持的音库采样率,如8000(8K)、16000(16K)等。 dwStatus [in] 引擎的状态,具体定义参考后面的表格。 szEngineName [in] 引擎的名称,支持通配符”*”和”?”,如”ce*”、”ce2?”等。 dwReserved [in/out] 保留,必须为0。 pdwEngineID [out]
指向一个用于返回引擎ID的指针,搜索成功时设置为找到的引擎的ID; phFindHandle [out]
指向一个用于返回搜索句柄的指针;搜索成功时设置为本次查找的句柄; 返回值
如果函数调用成功返回0,否则返回错误代号,错误代号的具体值由TTSGETERRCODE(x)宏获得,可能的值如下:
返回值 TTSERR_OK TTSERR_INVALIDPARA TTSERR_NOMOREDATA TTSERR_NOTFOUND 说明
1.引擎过滤条件结构各成员的具体说明:
dwFilterMask是一个标志位的集合,可以组合设置的标志位如下: 标志位 SEM_EFIND_FILTER_VOICENAME SEM_EFIND_FILTER_IPADDR SEM_EFIND_FILTER_LANGUAGE SEM_EFIND_FILTER_GENDER SEM_EFIND_FILTER_AGE SEM_EFIND_FILTER_SAMPLERATE SEM_EFIND_FILTER_STATUS SEM_EFIND_FILTER_ENGINENAME dwLanguage可取的语种代码值如下: 语种代码 TTS_LANG_ZHO
意义 中文普通话 43
意义 szVoiceName成员有效 szIP成员有效 dwLanguage成员有效 dwGender成员有效 dwAge成员有效 dwSampleRate成员有效 dwStatus成员有效 szEngineName成员有效 意义 函数执行成功。 函数参数非法。 没有找到满足条件的引擎。 搜索条件中的IP指定的合成服务器没有找到 InterPhonic语音合成系统开发手册 TTS_LANG_ZHO_CAN TTS_LANG_ENG_USA TTS_LANG_ENG_UK TTS_LANG_FRA TTS_LANG_DEU TTS_LANG_JPN TTS_LANG_KOR TTS_LANG_RUS TTS_LANG_ITA TTS_LANG_SPA dwGender可取的发音人性别代码如下: 性别代码 SEM_GENDER_FEMALE SEM_GENDER_MALE dwAge可取的发音人年龄段代码如下: 年龄段代码 SEM_AGE_CHILD SEM_AGE_YOUTH SEM_AGE_MIDDLEAGE SEM_AGE_AGEDNESS dwStatus可取的引擎状态代码如下: 引擎状态代码 SEM_ENGINE_STATUS_LOAD SEM_ENGINE_STATUS_UNLOAD SEM_ENGINE_STATUS_DISABLE 注意:
1.引擎的状态码基本是互斥的,只有引擎禁用状态(SEM_ ENGINE_ STATUS_ DISABLE)可与其它状态组合使用以表示新的引擎状态,如将SEM_ ENGINE_ STATUS_ DISABLE与SEM_ ENGINE_ STATUS_ LOAD组合表示引擎已加载但被禁用的状态。
2.本函数可以在初始化函数TTSInitializeEx之前调用,与SEMFindNextEngine、SEMFindClose配合使用;
3.如果找不到满足要求的引擎,则返回TTSERR_NOMOREDATA,此时pdwEngineID和pFindHandle参数都不作任何修改;如果查找成功,则通过pdwEngineID返回找到的引擎的ID,并通过phFindHandle返回一个用于后续操作的句柄,代表为本次搜索分配的相关资源;当搜索完成时,一定要使用SEMFindClose函数关闭句柄以释放资源;
4.引擎ID是一个DWORD,从1开始编号,并且保证在一次进程运行过程中唯一。
意义 引擎已加载 引擎未加载 引擎已禁用 意义 幼年 青年 中年 老年 意义 女性发音人 男性发音人 中文粤语 美国英语 英国英语 法语 德语 日语 韩语 俄语 意大利语 西班牙语 44
InterPhonic语音合成系统开发手册
SEMFindNextEngine 函数原型
TTSRETVAL SEMFindNextEngine(HSEMHANDLE hFindHandle, DWORD *pdwEngineID); 功能
查找满足搜索条件的下一个引擎; 参数
hFindHandle [in]
调用SEMFindFirstEngine时返回的搜索句柄; pdwEngineID [out]
指向一个用于返回引擎ID的指针,搜索成功时设置为找到的引擎的ID; 返回值
如果函数调用成功返回0,否则返回错误代号,错误代号的具体值由TTSGETERRCODE(x)宏获得,可能的值如下:
返回值 TTSERR_OK TTSERR_INVALIDHANDLE TTSERR_NOMOREDATA TTSERR_INVALIDPARA 说明
本函数可以在初始化函数TTSInitializeEx之前调用,与SEMFindFirstEngine、SEMFindClose配合使用;
搜索所用的上下文由句柄hFindHandle指定。如果找不到满足要求的引擎,则返回TTSERR_NOMOREDATA,此时pdwEngineID不作任何修改;如果查找成功,则通过pdwEngineID返回找到的引擎的ID,引擎ID是一个DWORD,从1开始编号; SEMFindFirstVoice 函数原型
TTSRETVAL SEMFindFirstVoice(DWORD dwEngineID, PTVoiceFindFilter pFindFilter, PTVoiceInfo pVoiceInfo, HSEMHANDLE *phFindHandle); 功能
查找满足搜索条件的第一个Voice; 参数
dwEngineID [in]
指定要在其中搜索Voice的引擎的ID,如果设为0,则表示要在所有的引擎中搜索Voice;
45
意义 函数执行成功。 传入的引擎搜索句柄无效。 没有找到满足条件的引擎,表示搜索结束。 函数参数非法,可能原因为pdwEngineID为NULL InterPhonic语音合成系统开发手册
pFindFilter [in]
指向Voice过滤条件结构的指针;为NULL时表示没有过滤条件;结构体的定义如下: typedef struct { TTSDWORD cbSize; /* [in] Size of structure */ TTSDWORD dwFilterMask; /* [in] Filter mask flag */ TTSCHAR szVoiceName[SEM_VOICENAME_LEN_MAX]; /* [in] Voice name */ TTSCHAR szIP[TTS_IP_MAXLEN]; /* [in] Server IP address */ TTSDWORD dwLanguage; /* [in] Language ID */ TTSDWORD dwGender; /* [in] Speaker gender of voice */ TTSDWORD dwAge; /* [in] Speaker age of voice */ TTSDWORD dwSampleRate; /* [in] Sample rate of voice */ TTSDWORD dwReserved; /* [in/out] Reserved: must set to zero */ } TVoiceFindFilter, *PTVoiceFindFilter; 其中: cbSize [in] 结构的大小,以字节为单位。 dwFilterMask [in] 过滤条件掩码,指明结构中的哪些成员起作用,具体定义参考后面的表格。 szVoiceName [in] Voice的名称,支持通配符’*’和’?’,如”Xiao*”。 szIP [in] Voice所属引擎的IP地址,点分十进制格式,如”192.168.73.12”。 注意:本条件只对网络版SEM接口有效。 dwLanguage [in] Voice支持的语种,具体定义参考SEMFindFirstEngine。 dwGender [in] Voice的发音人性别,具体定义参考SEMFindFirstEngine。 dwAge [in] Voice的发音人的年龄段,具体定义参考SEMFindFirstEngine。 dwSampleRate [in] Voice支持的音库采样率,如8000(8K)、16000(16K)等。 dwReserved [in/out] 保留,必须为0。 pVoiceInfo [out]
指向TVoiceInfo结构的指针,搜索成功时通过它返回Voice信息;结构体的定义如下: typedef struct { TTSDWORD cbSize; TTSDWORD dwVoiceID;
/* [in] Size of structure */ /* [out] Voice ID unique in the scope of engine*/ 46 InterPhonic语音合成系统开发手册 TTSDWORD dwGender; /* [out] Gender of speaker */ TTSDWORD dwAge; /* [out] Age of speaker */ TTSCHAR szVoiceName[SEM_VOICENAME_LEN_MAX]; /* [out] Voice description string */ TTSDWORD dwLangCount; /* [out] Count of languages */ TTSDWORD arrLanguage[SEM_VOICE_LANG_MAX]; /* [out] Language identifier */ TTSDWORD arrLangScore[SEM_VOICE_LANG_MAX]; /* [out] Language scores */ TTSDWORD dwSRCount; /* [out] Count of sample rates */ TTSDWORD arrSampleRate[SEM_SAMPLERATE_MAX]; /* [out] Voice Sample rate array */ TTSDWORD dwEngineID; /* [out] ID of the engine which this voice belong to */ TTSDWORD dwReserved; /* [in/out] Reserved: must set to zero */ } TVoiceInfo, *PTVoiceInfo; 其中: cbSize [in] 结构的大小,以字节为单位。 dwVoiceID [out] 引擎内唯一个Voice的ID。 dwGender [out] Voice的发音人的性别。 dwAge [out] Voice的发音人的年龄段. szVoiceName [out] Voice的描述性的名称。 dwLangCount [out] Voice支持的语种的数量。 arrLanguage [out] Voice支持的语种代码的数组。 arrLangScore [out] 与arrLanguage一一对应的语种的分值数组。语种的分值是语种合成效果的一个主观评价,分值越高,效果越好。引擎、Voice搜索时将尽可能按语种分值从高到低的顺序返回搜索结果。 dwSRCount [out] Voice支持的采样率的数量。 arrSampleRate [out] Voice支持的采样率的数组。 dwEngineID [out] Voice所属的引擎的ID。 dwReserved [in/out] 保留,必须为0。 phFindHandle [out]
47
InterPhonic语音合成系统开发手册
指向一个用于返回搜索句柄的指针;搜索成功时设置为本次查找的句柄; 返回值
如果函数调用成功返回0,否则返回错误代号,错误代号的具体值由TTSGETERRCODE(x)宏获得,可能的值如下:
返回值 TTSERR_OK TTSERR_INVALIDPARA TTSERR_NOMOREDATA TTSERR_NOTFOUND 说明
1.Voice过滤条件结构的dwFilterMask成员是一个标志位的集合,可以组合设置的标志位如下: 标志位 SEM_VFIND_FILTER_VOICENAME SEM_VFIND_FILTER_IPADDR SEM_VFIND_FILTER_LANGUAGE SEM_VFIND_FILTER_GENDER SEM_VFIND_FILTER_AGE SEM_VFIND_FILTER_SAMPLERATE 用;
3.如果找不到满足要求的Voice,则返回TTSERR_NOMOREDATA,此时pVoiceInfo和pFindHandle参数都不作任何修改;如果查找成功,则通过pVoiceInfo返回找到的Voice的信息,并通过phFindHandle返回一个用于后续操作的句柄,代表为本次搜索分配的资源;当搜索完成时,要使用SEMFindClose函数关闭句柄以释放资源; SEMFindNextVoice 函数原型
TTSRETVAL SEMFindNextVoice(HSEMHANDLE hFindHandle, PTVoiceInfo pVoiceInfo); 功能
查找满足搜索条件的下一个Voice; 参数
hFindHandle [in]
调用SEMFindFirstVoice时返回的搜索句柄; pVoiceInfo [out]
指向一个用于返回Voice信息的指针,搜索成功时填入找到的Voice的信息; 返回值
48
意义 szVoiceName成员有效 szIP成员有效 dwLanguage成员有效 dwGender成员有效 dwAge成员有效 dwSampleRate成员有效 意义 函数执行成功。 函数参数非法。 没有找到满足条件的引擎。 搜索条件中的IP指定的合成服务器没有找到 2.本函数可以在初始化函数TTSInitializeEx之前调用,与SEMFindNextVoice、SEMFindClose配合使
InterPhonic语音合成系统开发手册
如果函数调用成功返回0,否则返回错误代号,错误代号的具体值由TTSGETERRCODE(x)宏获得,可能的值如下:
返回值 TTSERR_OK TTSERR_INVALIDHANDLE TTSERR_INVALIDPARA TTSERR_NOMOREDATA 说明
1.本函数可以在初始化函数TTSInitializeEx之前调用,与SEMFindFirstVoice、SEMFindClose配合使用;
2.搜索所用的上下文由句柄hFindHandle指定;如果找不到满足要求的Voice,则返回TTSERR_NOMOREDATA,此时pVoiceInfo不作任何修改;如果查找成功,则通过pVoiceInfo返回找到的Voice的信息; SEMFindClose 函数原型
TTSRETVAL SEMFindClose(HSEMHANDLE hFindHandle); 功能
关闭搜索句柄,释放相关资源; 参数
hFindHandle [in]
调用SEMFindFirstEngine、SEMFindFirstVoice返回的搜索句柄; 返回值
如果函数调用成功返回0,否则返回错误代号,错误代号的具体值由TTSGETERRCODE(x)宏获得,可能的值如下:
返回值 TTSERR_OK TTSERR_INVALIDHANDLE 说明
使用SEMFindFirstEngine和SEMFindFirstVoice函数打开的搜索句柄,必须使用SEMFindClose函数进行关闭,否则系统资源会发生泄漏。
意义 函数执行成功。 传入的搜索句柄无效。 意义 函数执行成功。 传入的Voice搜索句柄无效。 无效参数。 没有找到满足条件的Voice,表示搜索结束。
SEMGetEngineInfo 函数原型
TTSRETVAL SEMGetEngineInfo(DWORD dwEngineID, TTSDWORD dwInfoType,
49
InterPhonic语音合成系统开发手册
PVOID pBuffer, TTSWORD *pdwBufLen); 功能
查询引擎信息; 参数
dwEngineID [in] 要查询的引擎的ID; dwInfoType [in] 要查询的引擎信息类型; pBuffer [in/out] 用于返回引擎信息的缓冲区; pdwBufLen [in/out]
输入时为pBuffer缓冲区的长度,返回时为写为pBuffer缓冲区的字节数,字符串型信息时包括末尾的空字符; 返回值
如果函数调用成功返回0,否则返回错误代号,错误代号的具体值由TTSGETERRCODE(x)宏获得,可能的值如下:
返回值 TTSERR_OK TTSERR_INVALIDPARA TTSERR_NOENOUGHMEM TTSERR_NOTINIT TTSERR_NOTSUPP TTSERR_NOTFOUND 说明
1. dwInfoType可取的引擎信息查询类型如下: 引擎信息类型值 SEM_QUERY_EINFO_NAME SEM_…_VERSION SEM_…_PRODUCER SEM_…_INSTPATH SEM_…_LICENSE SEM_…_STDEFFICENCY SEM_…_CODEPAGE SEM_…_MARKLANG SEM_…_USERLIB SEM_…_IP SEM_…_STATUS SEM_..._TOTALSVC
信息意义 引擎名称 引擎的版本号 引擎的生产商 引擎安装路径 引擎的授权数 引擎的基准效率 引擎支持的代码页 引擎支持标记语言 引擎支持的资源包 引擎所在的IP地址 引擎的当前状态 引擎的总服务次数 返回值说明 以空字符结尾的字符串 以空字符结尾的字符串 以空字符结尾的字符串 以空字符结尾的字符串 DWORD DWORD 代码页ID(DWORD)的数组 标记语言ID( DWORD) 的数组 以分号分隔的资源包名称字符串 点分十进制形式的IP地址字符串 引擎状态码(DWOR D),请参考下面的列表 DWORD 50 意义 函数执行成功。 函数参数非法 缓冲区的长度不足以返回查询的信息 引擎没有初始化 不支持的信息类型 不能找到输入的引擎ID对应的信息(网络版) InterPhonic语音合成系统开发手册 SEM_..._TOTALERR SEM_..._TOTALRECV SEM_..._TOTALSEND SEM_..._TOTALEFF SEM_..._ACTEFF SEM_..._ACTINSTINFO
引擎的总出错次数 引擎总接收字节数 引擎总发送字节数 引擎总体合成效率 引擎当前合成效率 引擎活动实例信息 DWORD double double 实际效率*1000,DWORD 实际效率*1000,DWORD TinstInfo结构的数组
注意:如下引擎信息只有在引擎初始化后才能查询,否则返回TTSERR_NOTINIT: 引擎初始化后才能查询的信息类型值 SEM_QUERY_EINFO_LICENSE
2.代码页的ID列表如下:
代码页的ID TTS_CP_GB2312 TTS_CP_GBK TTS_CP_BIG5 TTS_CP_UNICODE TTS_CP_GB18030 TTS_CP_UTF8
3.标记语言的ID列表如下:
代码页的ID TTS_TT_PLAINTEXT TTS_TT_SSMLTEXT TTS_TT_CSSMLTEXT
4.引擎状态的ID列表如下:
代码页的ID SEM_ENGINE_STATUS_UNKN SEM_ENGINE_STATUS_LOAD SEM_ENGINE_STATUS_UNLOAD SEM_ENGINE_STATUS_DISABLE
5.TInstInfo结构及其成员意义如下:
代码页 状态未知 引擎已载入内存,处于可服务状态 引擎未载入内存,不能提供服务 引擎被禁用, 除现有的连接实例外, 不再提供新的服务 代码页 纯文本文件 SSML标记语言 CSSML标记语言 代码页 GB2312代码页 GBK代码页 BIG5代码页 UNICODE代码页 GB18030代码页 UTF8代码页 信息意义 引擎的授权数 51
InterPhonic语音合成系统开发手册 typedef struct { TTSDWORD cbSize; TTSDWORD dwInstID; TTSDWORD dwErrorCode; TTSDWORD dwErrorCount; TTSDWORD dwInstStatus; TTSDWORD dwClientIP; TTSCHAR szStartTime[SEM_DATESTR_LEN_MAX]; double dbRecvBytes; double dbSendBytes; TTSDWORD dwEfficency; TTSDWORD dwReserved; } TinstInfo, *PTInstInfo; 结构体各个成员意义如下: cbSize [in] 结构体的大小,指定sizeof(TinstInfo); dwInstID [out] 连接实例的句柄; dwErrorCode [out] 连接实例的当前错误码; dwErrorCount [out] 连接实例出现错误的次数; sdwInstStatus [out] 连接实例的当前状态; dwClientIP [out] 连接实例的客户IP; szStartTime [out] 连接实例的启动时间; dbRecvBytes[out] 实例的接收文本数据量; dbSendBytes [out] 实例的发送语音数据量; dwEfficency [out] 实例的当前合成效率; dwReserved [in/out] 保留,输入时请设为零;
实例的状态ID列表如下:
实例的状态ID
说明 52
InterPhonic语音合成系统开发手册 SEM_INST_STATUS_UNKN SEM_INST_STATUS_CONNECT SEM_INST_STATUS_DISCONNECT SEM_INST_STATUS_RECV SEM_INST_STATUS_SEND SEM_INST_STATUS_SYNTH SEM_INST_STATUS_IDLE SEMFindNexttEngine得到;
7.如果pBuffer缓冲区的长度不足以容纳要查询的信息时,返回TTSERR_ NOENOUGHBUF,并通过pdwBufLen返回需要的缓冲区大小(单位为字节)。 SEMEngineCtrl 函数原型
TTSRETVAL SEMEngineCtrl(DWORD dwEngineID, TTSDWORD dwCommand, TTSDWORD wParam, TTSWORD lParam); 功能
通过命令字控制引擎的状态及加载卸载引擎; 参数
dwEngineID [in] 要操作的引擎的ID; dwCommand [in] 控制引擎动作的命令字; wParam [in/out] 命令字的第一个参数; lParam [in/out] 命令字的第二个参数; 返回值
如果函数调用成功返回0,否则返回错误代号,错误代号的具体值由TTSGETERRCODE(x)宏获得,可能的值如下:
返回值 TTSERR_OK TTSERR_NOTSUPP TTSERR_FAIL TTSERR_NOTFOUND 说明
53
意义 函数执行成功。 不支持的命令字 执行引擎控制命令失败 引擎ID没有找到,无效的引擎ID(网络版) 状态未知 正在连接 正在断开连接 正在接收数据 正在发送数据 正在合成 空闲 6.本函数可以在初始化函数TTSInitializeEx之前调用,引擎ID由SEMFindFirstEngine、
InterPhonic语音合成系统开发手册
1. dwCommand可取值的引擎控制命令字如下:
引擎控制命令字 SEM_ENGINE_CTRL_LOAD 意义 加载引擎 SEM_ENGINE_CTRL_UNLOAD 卸载引擎,只有在没有任何合成实例时才允许卸载 SEM_ENGINE_CTRL_ENABLE 启用引擎,引擎可继续提供合成服务 SEM_ENGINE_CTRL_DISABLE 禁用引擎,引擎将不再提供新的合成服务,但现有合成实例不会受阻 2. 卸载引擎命令(SEM_ENGINE_CTRL_UNLOAD)通过wParam提供以下可选参数:
参数值 意义 SEM_ECTRL_UNLOAD_FORCE 强制卸载引擎,不管当前有没有合成实例 3. 引擎处理Disable状态时, 调用会失败的函数列表如下(返回TTSERR_FAIL):
引擎在Disable状态下调用会失败的函数 TTSInitializeEx() TTSConnect() 意义 未加载的引擎不能作加载操作 引擎不再提供新的合成服务 4. 本函数可以在初始化函数TTSInitializeEx之前调用,引擎ID可由SEMFindFirstEngine得到。
3.3开发指南
3.3.1搭建开发环境
在使用iFly SEM SDK开发接口进行应用开发之前,用户必须搭建SEM编程环境。 1. 如果是网络版SEM应用,则首先要安装iSP服务端
首先,应该在局域网内选定一或多台主机作为语音服务器,安装iSP平台的组件(至少要安装SES组件)和相应的语音合成系统(如InterPhonic CE 3.0)。这样,一个iSP服务支撑环境就创建好了。
2. 安装客户端
应用程序客户端主机上用户需要安装iSP平台客户端组件,安装目录下包含使用SEM接口所必须的头文件、动态引入库、客户端动态链接库和示例程序:
开发组件 头文件 列表 iFly_TTS.h iFly_SEM.h TTSErrorCode.h 动态引入库 客户端动态库 例程 的功能是否正确。
iFlyTTS.lib iFlyTTS.dll SEMApp 说明 包含基本的数据类型定义和TTS相关函数声明 包含所有SRM接口函数的声明和结构体定义 包含所有TTS系统、iSP系统返回的错误代码定义 隐式链接使用iFlyTTS.dll的动态引入库文件 客户端接口动态链接库 使用SEM开发接口的例程 安装完毕后,用户可以使用SPC控制台程序或SEMApp.exe检查iSP平台是否能够正常运行,各个函数
54
InterPhonic语音合成系统开发手册
3.3.2使用iFly SEM SDK开发
搭建好开发环境后就可以开始SEM应用程序的开发了,SEM应用程序的常规开发步骤可以按照以下顺序进行:
3.3.2.1枚举引擎
通过SEMFindFirstEngine、SEMFindNextEngine、SEMFindClose这三个接口函数,可以枚举出系统中所有符合指定条件的引擎,得到它们的引擎ID:
// 设置过滤条件, 搜索所有粤语合成引擎 TEngineFindFilter tFilter; ZeroMemory(&tFilter, sizeof(TEngineFindFilter)); tFilter.cbSize = sizeof(TEngineFindFilter); tFilter.dwFilterMask = SEM_EFIND_FILTER_LANGUAGE; tFilter.dwLanguage = TTS_LANG_ZHO_CAN; // 设置变量初始值 DWORD dwEgnID = 0; HSEMHANDLE hFindHandle = NULL; // 搜索第一个符合条件的引擎 TTSRETVAL nRet = SEMFindFirstEngine(&tFilter, &dwEgnID, &hFindHandle); while ( TTSERRCHECK(nRet) ) { ASSERT(dwEgnID && hFindHandle); CEngineInfo *pEgnInfo = new CEngineInfo; m_vEgnInfo.push_back(pEgnInfo); pEgnInfo->InitEgnInfoEx(dwEgnID); // 搜索下一个符合条件的引擎 nRet = SEMFindNextEngine(hFindHandle, &dwEgnID); } ASSERT(TTSGETERRCODE(nRet) == TTSERR_NOMOREDATA); if ( hFindHandle ) { // 关闭搜索句柄, 释放资源 nRet = SEMFindClose(hFindHandle); ASSERT(TTSERRCHECK(nRet)); hFindHandle = NULL; } 55
InterPhonic语音合成系统开发手册
3.3.2.2枚举Voice
通过SEMFindFirstVoice、SEMFindNextVoice、SEMFindClose这三个接口函数,可以枚举出系统中所有符合指定条件的Voice,得到它们的信息及所属的引擎ID:
// 设置过滤条件,搜索所有美式男声英语的Voice TVoiceFindFilter tFilter; ZeroMemory(&tFilter, sizeof(TVoiceFindFilter)); tFilter.cbSize = sizeof(TVoiceFindFilter); tFilter.dwFilterMask = SEM_VFIND_FILTER_GENDER | SEM_VFIND_FILTER_LANGUAGE; tFilter.dwGender = SEM_GENDER_MALE; tFilter.dwLanguage = TTS_LANG_ENG_USA; // 设置变量初始值 HSEMHANDLE hFindHandle = NULL; TVoiceInfo tVoiceInfo; ZeroMemory(&tVoiceInfo, sizeof(TVoiceInfo)); tVoiceInfo.cbSize = sizeof(TVoiceInfo); // 搜索第一个符合条件的Voice nRet = SEMFindFirstVoice(dwEgnID, &tFilter, &tVoiceInfo, &hFindHandle); while ( TTSERRCHECK(nRet) ) { ASSERT (hFindHandle && (sizeof(TVoiceInfo) == tVoiceInfo.cbSize)); // Processing voice information “tVoiceInfo”... // 搜索下一个符合条件的Voice nRet = SEMFindNextVoice(hFindHandle, &tVoiceInfo); } ASSERT ((TTSGETERRCODE(nRet) == TTSERR_NOMOREDATA)); if ( hFindHandle ) { // 关闭搜索句柄, 释放资源 nRet = SEMFindClose(hFindHandle); ASSERT(TTSERRCHECK(nRet)); hFindHandle = NULL; }
56
InterPhonic语音合成系统开发手册
3.3.2.3查询引擎信息
通过SEMGetEngineInfo接口函数可以查询引擎各方面的信息,这些信息可大致分为两部分:静态信息和动态信息。静态信息可以看作是引擎固有的属性和特征,如引擎名称、引擎版本、引擎授权数量等;动态信息是随引擎运行过程不断变化的、描述引擎运行状态的属性,如引擎状态、接收发送字节数、当前活动实例信息等。所以,应用程序运行过程中,静态信息只需取一次,反之动态信息则经常因为需要刷新而被多次获取。
引擎授权数是一个比较特殊的静态信息类型,由于只有在引擎启动后才能从引擎处获得引擎允许的授权数量,所以该信息只能在相应的引擎初始化后(通过调用TTSInitializeEx或SEMEngineCtrl的加载命令)才能获取。
// 获取引擎静态信息 BOOL CEngineInfo::GetEgnStaInfo(DWORD dwEgnID) { DWORD dwLen; TTSRETVAL nRet; // 引擎名称 dwLen = sizeof(m_szEgnName); nRet = SEMGetEngineInfo(dwEgnID, SEM_QUERY_EINFO_NAME, m_szEgnName, &dwLen); ASSERT ( TTSERR_OK == nRet ); // 引擎支持的代码页 m_dwCPCount = 0; dwLen = sizeof(m_arrCodepage); nRet = SEMGetEngineInfo(dwEgnID, SEM_QUERY_EINFO_CODEPAGE, m_arrCodepage, &dwLen); ASSERT ( TTSERR_OK == nRet && !(dwLen % sizeof(DWORD)) ); m_dwCPCount = dwLen/sizeof(DWORD); m_arrCodepage[m_dwCPCount] = 0; // 获取其它引擎静态信息… return TRUE; } // 刷新引擎动态信息 BOOL CEngineInfo::RefreshEgnDynInfo() { DWORD dwLen;
57
InterPhonic语音合成系统开发手册 TTSRETVAL nRet; // 引擎状态 m_dwEgnStatus = SEM_ENGINE_STATUS_UNKN; dwLen = sizeof(m_dwEgnStatus); nRet = SEMGetEngineInfo(dwEgnID, SEM_QUERY_EINFO_STATUS, &m_dwEgnStatus, &dwLen); ASSERT ( TTSERR_OK == nRet ); // 引擎授权数量 static BOOL bGotEgnLicense = FALSE; if ( ! bGotEgnLicense ) { dwLen = sizeof(m_dwLicense); nRet = SEMGetEngineInfo(dwEgnID, SEM_QUERY_EINFO_LICENSE, &m_dwLicense, &dwLen); if ( TTSERRCHECK(nRet) ) bGotEgnLicense = TRUE; } // 总接收字节数 m_dbTotalRecv = 0; dwLen = sizeof(m_dbTotalRecv); nRet = SEMGetEngineInfo(dwEgnID, SEM_QUERY_EINFO_TOTALRECV, &m_dbTotalRecv, &dwLen); ASSERT ( TTSERR_OK == nRet ); // 当前活动实例 m_dwActInstCount = 0; // 只需要设置缓冲区中第一个结构的cbSize成员就可以了! m_arrActInstInfo[0].cbSize = sizeof(TInstInfo); dwLen = sizeof(m_arrActInstInfo); nRet = SEMGetEngineInfo(dwEgnID, SEM_QUERY_EINFO_ACTINSTINFO, m_arrActInstInfo, &dwLen); if ( TTSERRCHECK(nRet) ) { ASSERT ( ! ( dwLen % sizeof ( TinstInfo ) ) ); m_dwActInstCount = dwLen / sizeof ( TinstInfo ); } // 刷新其它引擎动态信息…
58
InterPhonic语音合成系统开发手册 } return TRUE;
3.3.2.4多引擎语音合成
使用SEMFind*系列接口函数查找符合要求的引擎,再通过SEMGetEngineInfo接口函数根据引擎ID获取引擎的名称。通过引擎名称,应用程序可以使用已注册到多引擎管理的所有合成引擎,而不必关心使用引擎的具体位置。
应用iFly SEM SDK获取需要使用的引擎名称
char szEgnName_ce30[SEM_ENGINENAME_LEN_MAX ] ; char szEgnName_ct22[SEM_ENGINENAME_LEN_MAX ] ; // 应用SEM接口函数获取引擎名称...
根据引擎名称初始化需要使用的引擎
// 初始化多个引擎,引擎名称之间用分号分隔 char szInitEngines[SEM_ENGINENAME_LEN_MAX*3] = { 0 }; strcat(szInitEngines, szEgnName_ce30); strcat(szInitEngines, “;”); strcat(szInitEngines, szEgnName_ct22); TTSRETVAL nRet = TTSERR_OK; nRet = TTSInitializeEx(szInitEngines, 0); if ( ! TTSERRCHECK(nRet) ) { printf(“初始化引擎%s失败! 错误码: 0x%08x\\n”, szInitEgnines, nRet); // 错误处理… }
创建连接到指定引擎的合成实例:
// 创建连接到ce30引擎的合成实例 TTSConnectStruct TtsConnect; ZeroMemory(&TtsConnect, sizeof(TTSConnectStruct)); TtsConnect.dwSDKVersion = IFLYTTS_SDK_VER; strcpy(TtsConnect.szCompanyName, g_szCompanyName); strcpy(TtsConnect.szUserName, g_szUserName); strcpy(TtsConnect.szProductName, g_szProductName); strcpy(TtsConnect.szSerialNumber, g_szSerialNO); // 要连接的引擎通过szServiceUID设置 strcpy(TtsConnect.szServiceUID, szEgnName_ce30);
59
InterPhonic语音合成系统开发手册 HTTSINSTANCE hTTSInstance = TTSConnect(&TtsConnect); If ( hTTSInstance == 0 ) { printf(“创建合成实例失败! 错误码: 0x%08x\\n”, TtsConnect.dwErrorCode); // 错误处理… } // 同上创建到ct22的合成实例…
使用iFly TTS SDK 1.2接口函数进行语音合成调用 合成处理完毕后,逆初始化SDK库,如下:
nRet = TTSUninitialize(); if ( ! TTSERRCHECK(nRet) ) { printf(“逆初始化引擎失败! 错误码: 0x%08x\\n”, nRet); // 错误处理… }
3.3.2.5引擎控制
应用程序运行过程中的任何时刻,包括初始化SDK库之前及逆初始化SDK库之后,都可以使用SEMEngineCtrl接口函数对引擎实施控制操作。可以实施的控制操作主要是引擎的加载、卸载和禁用、恢复使用。多个引擎加载操作可代替TTSInitializeEx调用,同样多个引擎卸载操作可代替TTSUninitialize()调用。
// 加载引擎 void CSEMAppDlg::OnLoadEngine() { TTSRETVAL nRet = TTSERR_OK; nRet = SEMEngineCtrl(m_pCurEgnInfo->dwEgnID, SEM_ENGINE_CTRL_LOAD, 0, 0); If ( ! TTSERRCHECK(nRet) ) OutputMsg(\"加载引擎失败! 错误码: 0x%08x\} // 卸载引擎 void CSEMAppDlg::OnUnloadEngine() { DWORD dwParam = 0; if ( m_bUnloadForce ) dwParam = SEM_ECTRL_UNLOAD_FORCE; TTSRETVAL nRet = TTSERR_OK; nRet = SEMEngineCtrl(m_pCurEgnInfo->dwEgnID, SEM_ENGINE_CTRL_UNLOAD,
60
InterPhonic语音合成系统开发手册 dwParam, 0); If ( ! TTSERRCHECK(nRet) ) OutputMsg(\"卸载引擎失败! 错误码: 0x%08x\} // 启用引擎 void CSEMAppDlg::OnEnableEngine() { TTSRETVAL nRet = TTSERR_OK; nRet = SEMEngineCtrl(m_pCurEgnInfo->dwEgnID, SEM_ENGINE_CTRL_ENABLE, 0, 0); If ( ! TTSERRCHECK(nRet) ) OutputMsg(\"启用引擎失败! 错误码: 0x%08x\} // 禁用引擎 void CSEMAppDlg::OnDisableEngine() { TTSRETVAL nRet = TTSERR_OK; nRet = SEMEngineCtrl(m_pCurEgnInfo->dwEgnID, SEM_ENGINE_CTRL_DISABLE, 0, 0); If ( ! TTSERRCHECK(nRet) ) OutputMsg(\"禁用引擎失败! 错误码: 0x%08x\} 3.4开发包例程
3.4.1简介
在客户端安装包中提供了iFly SEM SDK的开发实例程序SEMApp,这个例程简单演示了iFly SEM SDK各个函数的用法。
SEMApp是基于对话框的Win32应用程序,这个例程使用MS Visual C++ 6.0开发,可以使用MS Visual C++ 6.0或者MS Visual C++ 7.x编译并执行通过。
3.4.2开发示例
所有与iFly SEM SDK接口相关的函数调用都位于SEMAppDlg.cpp/h文件中,下面列出了这个工程的源文件列表:
类型 SDK 头文件 例程
名称 iFly_TTS.h TTSErrorCode.h iFly_SEM.h SEMApp.h/.cpp 说明 包含了基本的数据类型定义和TTS相关函数声明。 包含了所有TTS系统、iSP系统返回的错误代码定义。 包含了所有SEM接口函数的声明和结构体定义。 包含了SEM初始化和逆初始化 61
InterPhonic语音合成系统开发手册 文件
SEMAppDlg.h/.cpp 包含了例程其它SEM函数调用 62
InterPhonic语音合成系统开发手册
第4章 语音资源管理接口
4.1 接口简介
语音资源管理接口是讯飞语音应用平台客户端提供的应用程序接口,用来管理语音应用平台上的所有资源,包含控制语音服务、获取网络中语音服务节点的信息,监控节点状态,并实现动态负载均衡的功能。语音资源管理接口支持C/C++、Delphi等语言的调用,但不支持VB、C#、java等高级语言的调用。 接口函数列表
在语音应用平台客户端开发包中提供如下函数调用: 函数名称 SRMInitialize SRMUninitialize SRMNodeEnum SRMGetIRS SRMGetBestServer SRMNodeQueryInfo SRMNodeGetLoad SRMAddMonitor SRMRemoveMonitor SRMNodeControl SRMSetParam SRMGetParam 开发包组件
Windows平台 开发组件 头文件 动态引入库 运行时刻库
UNIX/Linux平台 开发组件 头文件 组件组成 iFly_SRM.h、TTSErrorCode.h libiFlyTTS.so 说明 接口函数的声明 接口函数的具体实现 组件组成 iFly_SRM.h、TTSErrorCode.h iFlyTTS.lib iFlyTTS.lib 说明 接口函数的声明 包含接口函数的引入 接口函数的具体实现 功能简介 初始化客户端代理库 逆初始化客户端代理库 枚举ISP节点信息 获得主资源管理服务器和备份资源管理服务器的节点ID 获取服务的性能最佳(负载最轻)服务器 获取iSP节点的节点信息 获取iSP节点的当前负载状态 监控某个iSP节点的节点状态 取消对某个ISP节点的监控 对节点进行远程控制 设置iSP节点的参数 获取iSP节点的参数
运行时刻库 开发包支持情况
开发包类型 本地开发
Windows系统 不支持 63
InterPhonic语音合成系统开发手册 网络开发 支持 4.2函数调用
SRMInitialize 函数原型
int SRMInitialize(PVOID pvReserved); 功能
初始化SRM接口的全局信息。 参数
pvReserved 保留,必须为NULL。 返回值
如果函数调用成功返回0,否则返回错误代号;错误代号的具体值由TTSGETERRCODE(x)宏获得,可能的值如下:
返回值 TTSERR_OK TTSERR_CREATEOBJECT TTSERR_MALLOC TTSERR_SYNC 说明
1. 这个函数必须在调用其他SRM函数之前调用,一个进程可以调用SRMInitialize多次。
2. 如果调用了TTSInitializeEx函数,那么这个函数可以不调用而直接使用SRM接口其他的函数功能; SRMUninitialize 函数原型
int SRMUninitialize(); 功能
逆初始化SRM客户端代理库,释放全局资源。 参数
无。 返回值
如果函数调用成功返回0,否则返回错误代号;错误代号的具体值由TTSGETERRCODE(x)宏获得,可能的值如下:
意义 函数执行成功。 创建内部对象失败 分配内存失败 同步错,有其他线程在进行(逆)初始化工作 64
InterPhonic语音合成系统开发手册 返回值 TTSERR_OK TTSERR_NOTINIT TTSERR_SYNC 说明
1. 这个函数是SRM接口中最后一个调用的函数;
2. 在调用SRMInitialize之后,一个进程可以调用多次SRMUninitialize,但SRMInitialize的调用次数必须和SRMUninitialize()相等。
3. 如果调用了TTSUnitialize()函数,就不需要调用这个函数; SRMNodeEnum 函数原型
int SRMNodeEnum(TTSDWORD dwNodeType, PSRMNode pNodes,TTSDWORD* pdwCount); 功能
枚举网络中所有符合条件的节点信息。 参数
dwNodeType [in]
枚举过滤条件,可以是某种节点类型,也可以是节点类型的组合。如果为0,则枚举所有节点信息。有关节点类型的定义如下:
iSP平台的节点类型定义: enum ISP_NODE_TYPE { node_any = 0, /* any isp node */ node_srm = 1, /* speech resource manager */ node_ses = 2, /* speech engines server */ node_spw = 4, /* speech platform watcher */ node_spc = 8, /* speech platform console */ node_app = 0x10, /* speech applications */ node_none= -1, /* none node */ }; pNodes [out]
指向ISP节点信息数组的指针。如果只需要获得节点数目,该值为NULL。其各个成员定义以及其意义如下:
一个iSP节点就是运行在iSP平台中的某个进程,下面的结构体是ISP平台对一个节点的标识定义,在整个ISP网络中,这个信息结构唯一的标识了一个ISP节点。SRM接口的大多数函数都使用这个结构作为参数。 typedef struct tagSRMNode {
65 意义 函数执行成功。 没有初始化 同步错,有其他线程在进行(逆)初始化工作 InterPhonic语音合成系统开发手册 TTSDWORD ip; TTSWORD type; TTSWORD pid; } TSRMNode, *PSRMNode; ip [out] 该节点以网络字节序存放的IP地址,对于多个网卡的主机,返回该节点使用的IP地址。 type [out] 节点类型,iSP节点类型定义参考ISP_NODE_TYPE的说明,这里的type可以是多种类型的组合,例如:node_ses|node_srm就指明了只枚举SES和SRM节点。 pid [out] 该ISP节点的进程id,注意,在某个主机上运行的iSP节点唯一时,这个参数可以被忽略。 pdwCount [in/out]
作为输入参数,该指针指向节点数组的长度。作为输出参数,该指针指向网络中正在运行的ISP主机的数目。如果该值为NULL,将返回错误TTSERR_INVALIDPARA;如果该数组大小小于实际存在的ISP主机数目,将返回实际的ISP主机节点数目,并返回错误代码TTSERR_NOENOUGHBUF,不填充数组。 返回值
如果函数调用成功返回0,否则返回错误代号;错误代号的具体值由TTSGETERRCODE(x)宏获得,可能的值如下:
返回值 TTSERR_OK 意义 函数执行成功。 TTSERR_INVALIDPTR 参数指针无效。 TTSERR_NOENOUGHBUF 用户分配的数据空间不足,不能存放所有的节点信息。 TTSERR_MALLOC 说明
1. 如果存在主资源服务器,用户可以在需要的时候调用这个函数枚举网络中所有的iSP 节点;如果不存在主资源服务器,使用这个函数也可以列举出所有在本机上能够检测到的iSP节点; 2. 为了获得每个节点的详细信息,用户可以使用SRMNodeQueryInfo()函数; 3. 由于节点是动态变化的,使用这个函数的得到的节点ID不能长期保存; SRMGetIRS 函数原型
int SRMGetIRS(PSRMNode pIRSM, PSRMNode pIRSB); 功能
获取IRS节点信息,包括主IRS和备份IRS节点。 参数
pIRSM [out]
返回主资源服务器的节点ID,如果没有找到,返回ISP_ANY_NODE;
66
内部分配内存失败 InterPhonic语音合成系统开发手册
pIRSB [out]
返回备份资源服务器的节点ID,如果没有找到,返回ISP_ANY_NODE; 返回值
如果找到了主资源服务器,函数调用成功返回主资源服务器的节点ID,同时如果存在备份资源服务器,则返回备份资源服务器的节点ID。如果找不到主资源服务器则返回错误代码,错误代码的具体值由TTSGETERRCODE()获得,可能的值如下:
返回值 TTSERR_OK TTSERR_INVALIDPARA TTSERR_NOTFOUND 说明
1. 这个函数只能在网络中存在资源服务器的情况下才能够使用。 SRMGetBestServer 函数原型
int SRMGetBestServer(const char* pszSvcName, const char* pszFilter, 功能
获取指定服务类型的的当前性能最佳服务器的IP地址和服务端口。 参数
pszSvcName [in]
服务标识符,此值对任一服务均唯一且不为空。如果该值为NULL,系统将使用缺省的平台服务。服务标识符的取值目前是:“tts”;
pszFilter [in]
查询性能最佳(负载最轻)服务器上服务类型的过滤字串,目前可以取值为引擎名称。可以同时查询多个引擎名称,使用逗号“,”分隔。
pszServer [out]
返回支持指定服务的性能最佳(负载最轻)服务器的IP地址和端口号,形式为xxx.xxx.xxx.xxx:port。 返回值
如果函数调用成功返回0,否则返回错误代号;错误代号的具体值由TTSGETERRCODE(x)宏获得,可能的值如下:
返回值 TTSERR_OK TTSERR_INVALIDPARA TTSERR_SERVICEID TTSERR_PRECONDITION
意义 函数执行成功。 参数指针无效。 未找到该服务标识符,或者该服务标识符无效。 未找到资源服务器。 67
char* pszServer);
意义 函数执行成功。 传入参数无效。 当前不能找到资源服务器 InterPhonic语音合成系统开发手册 TTSERR_NOTFOUND 说明
1. 这个函数只能在网络中存在资源服务器的情况下才能够使用; 2. 有关引擎名称的查询请参考SEM SDK相关文档; SRMNodeQueryInfo 函数原型
int SRMNodeQueryInfo (PSRMNode pNode, TTSDWORD dwInfoType, void* pValue, TTSDWORD* pdwSize); 功能
获得某一ISP节点的节点信息。 参数
pNode [in]
指定的节点ID,如果该值为0,则返回错误TTSERR_INVALIDPARA。如果该值为ISP_ANY_NODE,则认为是获得本节点信息。
dwInfoType [in]
需要查询的节点信息类型。如果不是有效的查询类型,函数返回错误TTSERR_INVALIDPARA。 pValue [out]
返回查询信息的缓冲区,由调用者分配和释放。如果该值为NULL,则返回错误TTSERR_INVALIDPARA。 pdwSize [in/out]
调用时传入pValue缓冲区容量,返回信息真正的字节数。如果该值为NULL,则返回错误TTSERR_INVALIDPARA。 返回值
如果函数调用成功返回0,否则返回错误代号;错误代号的具体值由TTSGETERRCODE(x)宏获得,可能的值如下:
返回值 TTSERR_OK TTSERR_NOTFOUND TTSERR_INVALIDPARA TTSERR_NOTSUPP 说明
1. 这个函数不需要网络中存在资源服务器;
2. 可以查询的信息列表定义在iFly_SRM.h头文件中:
enum { SRM_NODEINFO_HOSTNAME
意义 函数执行成功。 该标识符标识的主机不存在。 参数无效。 不支持的节点信息类型。 未找到安装该服务的服务器。 = 1, 68
InterPhonic语音合成系统开发手册 }; SRM_NODEINFO_OS SRM_NODEINFO_CPU SRM_NODEINFO_MEM SRM_NODEINFO_SVCPORT SRM_NODEINFO_RRPORT SRM_NODEINFO_EVPORT = 2, = 3, = 4, = 5, = 6, = 7, 每个参数的具体含义: 参数值dwInfoType SRM_NODEINFO_HOSTNAME SRM_NODEINFO_OS SRM_NODEINFO_CPU SRM_NODEINFO_MEM SRM_NODEINFO_SVCPORT SRM_NODEINFO_RRPORT SRM_NODEINFO_EVPORT SRMNodeGetLoad 函数原型
int SRMNodeGetLoad (PSRMNode pNode, PSRMLoadInfo pLoad); 功能
获得某一服务器节点的实时负载信息,包含CPU利用率、可用内存数量、网络带宽使用、活动实例数量等。 参数
pNode [in]
需要查询的iSP节点标识符。如果该值为0,返回错误TTSERR_INVALIDPARA。如果该节点不是SRM或SES,则返回TTSERR_INVALIDOBJECT。
pLoad [out]
详细的负载信息。如果该值为0,返回错误TTSERR_INVALIDPARA。该结构体的定义为: typedef struct tagSRMLoadInfo { TTSDWORD cbSize; TTSDWORD bench; TTSDWORD cpu; TTSDWORD mem; TTSDWORD network;
参数值类型 字符串 字符串 字符串 无符号整型 无符号短整型 无符号短整型 无符号短整型 意义 节点所在的主机名称 节点所在的主机操作系统描述 节点所在的主机CPU描述 以MB为单位的节点所在主机的物理内存大小 该节点的服务端口,只有SES支持这个参数 该节点的平台请求处理端口,客户端节点不支持这个参数 该节点的事件通知端口,客户端节点不支持这个参数 /* sizeof this struct = sizeof(TSRMLoadInfo) */ /* benchmark of the host */ /* cpu use percent */ /* available memory size */ /* network use ratio */ 69
InterPhonic语音合成系统开发手册 TTSDWORD actinst; /* active instance count */ } TSRMLoadInfo, *PSRMLoadInfo; 其中: cbSize [in] 该结构体的大小,调用时请填入sizeof(TSRMLoadInfo)。 bench [out] 该节点的基准服务效率,也就是该节点的实时服务处理能力,该值越大就表明这个节点的处理能力越强,否则处理能力较弱。 cpu [out] 该ISP节点的实时CPU使用率。 mem [out] 该ISP节点的实时可用物理内存数量(单位MB)。 network [out] 该ISP节点的实时iSP平台网络流量。 actinst [out] 该ISP节点的实时活动实例数量。 返回值
如果函数调用成功返回0,否则返回错误代号;错误代号的具体值由TTSGETERRCODE(x)宏获得,可能的值如下:
返回值 TTSERR_OK TTSERR_NOTFOUND TTSERR_INVALIDPARA TTSERR_INVALIDOBJECT 说明
1. 在iSP平台中只有SES和SRM节点支持实时负载查询;
2. 负载信息中的网络流量仅是iSP平台使用的网络流量数值,不包含该主机上其他进程使用的网络流量; SRMNodeControl 函数原型
int SRMNodeControl (PSRMNode pNode, PSRMNodeCtrl pCtrlInfo); 功能
控制指定的iSP节点执行指定的操作。 参数
pNode [in]
ISP主机的节点标识结构指针。如果该值为0,返回错误TTSERR_INVALIDPARA。 pCtrlInfo
[in] 指向节点控制操作结构的指针。如果该值为0,返回错误TTSERR_INVALIDPARA。结构体的定义如
70
意义 函数执行成功。 该标识符标识的主机不存在。 负载信息类型无效。 该标识符标识的主机不是SES或SRM,不能获得负载信息 InterPhonic语音合成系统开发手册
下:
typedef struct tagSRMNodeCtrl { TTSDWORD dwCtrlParam; /* [in] control action */ void* pCtrlData; /* [in] data of control */ TTSDWORD dwDataSize; /* [in] size of pCtrlData */ BOOL bAsynch; /* [in] asynchronous or synchronous */ SRM_ROUTINE pfnCtrlRoutine; /* [in] the callback function of control routine */ void* pUserData; /* [in] user-supplied callback data, and will be passed to pfnCtrlRoutine */ TTSDWORD dwReserved; /* [in,out] reserved, must be 0 */ } TSRMNodeCtrl, *PSRMNodeCtrl; 其中: dwCtrlParam [in] 控制节点的操作类型,具体定义参考后面的表格。 pCtrlData [in] 执行操作需要的数据缓冲区指针。 dwDataSize [in] pCtrlData指向缓冲区的字节数。 bAsynch [in] 是否异步操作。如果指定为异步操作,需要通过pfnCtrlRoutine参数传入回调函数的指针。 pfnCtrlRoutine [in] 当指明操作为异步时,这个成员指向的函数就是执行过程的回调函数。回调函数的原型和具体的使用方法请参考说明节。 pUserData [in] 用户自定义数据,调用时传入,在回调函数被调用时系统将作为参数传入回调函数。 dwReserved [in/out] 系统保留成员,必须为0。 返回值
如果函数调用成功返回0,否则返回错误代号;错误代号的具体值由TTSGETERRCODE(x)宏获得,可能的值如下:
返回值 TTSERR_OK TTSERR_NOTFOUND TTSERR_INVALIDPARA TTSERR_INVALIDOBJECT TTSERR_NOTSUPP 说明
1. 控制参数(dwCtrlParam)具体含义:
71
意义 函数执行成功。 该标识符标识的主机不存在。 传入参数无效。 该标识符标识的主机不能进行控制。 不支持的控制参数类型。 InterPhonic语音合成系统开发手册 控制参数(dwCtrlParam) SRM_NODECTRL_START 意义 启动指定的iSP节点,调用这个操作时pNode参数的pid成员被系统忽略,用户只需要指定该节点的IP地址和类型,目前系统支持启动的节点只有SES和SRM。需要该节点的服务器上启动了SPW服务程序。 停止指定的iSP节点。该节点进程将被系统关闭,当前正在该主机上执行的服务实例将被强行结束。需要该节点的服务器上启动了SPW服务程序。 重新启动该节点,相当于执行SRM_NODECTRL_START和SRM_NODECTRL_STOP操作。需要该节点的服务器上启动了SPW服务程序。 SRM_NODECTRL_LBENABLE 启用SES节点的负载均衡支持。需要主资源服务器程序正常运行。 SRM_NODECTRL_LBDISABLE 禁用SES节点的负载均衡支持。当前正在该主机上执行的服务实例继续执行直到完毕,该SES节点的服务任务不再参与负载均衡系统。但应用程序可以直接指定该SES节点的ip地址和端口直接连接获得语音服务。需要主资源服务器程序正常运行。 SRM_NODECTRL_STARTSVC 启动指定SES节点上的某个服务,具体的服务类型。 SRM_NODECTRL_STOPSVC 果或者通知某个系统事件的发生。 函数原型:
typedef int (CALLBACK* SRM_ROUTINE)(PSRMEvent pEvent, void* pUserData); 有关该函数的使用方法说明请参考后续章节有关SRM_Routine_Proc的相关说明。 SRMAddMonitor 函数原型
int SRMAddMonitor(PSRMNode pNode, PSRMMonitorOpt pMonOpt, SRM_HANDLE* 功能
对ISP主机的运行状态进行监控。 参数
pNode [in]
需要监控的节点ID。如果需要监控平台整体事件例如SRM_MONITOR_OPT_UPDATE等,该参数可以为NULL或ISP_ANY_NODE,表示监控所有的节点。
pMonOpt [in]
指向节点监控参数的指针。如果该值为0,返回错误TTSERR_INVALIDPARA。具体结构如下: typedef struct tagSRMMonitorOpt
72
phHandle);
停止指定SES节点上的某个服务。 2. 事件回调函数的定义。在SRM接口中,所有的异步操作将使用回调函数通知调用者某个操作的执行结
SRM_NODECTRL_STOP SRM_NODECTRL_RESTART InterPhonic语音合成系统开发手册 { TTSDWORD dwOption; /* [in] monitor option */ void* pMonitorData; /* [in] data of monitor */ TTSDWORD dwDataSize; /* [in] size of pMonitorData */ SRM_ROUTINE pfnMonRoutine; /* [in] callback function of monitoring routinue */ void* pUserData; /* [in] User-supplied callback data, and will be passed to pfnMonRoutine*/ TTSDWORD dwReserved; /* [in,out] Reserved, must be 0 */ } TSRMMonitorOpt, *PSRMMonitorOpt; dwOption [in] 监控选项,可以监控的选项值参考后面的表格,这个选项可以使多个值的组合。 pMonitorData [in] 监控携带的数据。 dwDataSize [in] pMonitorData指向的以字节为单位的数据长度。 pfnMonRoutine [in] 监控事件响应的回调函数,使用方法请参考SRM_Routine_Proc的相关说明。 pUserData [in] 用户自定义数据,调用时传入,回调函数被调用时由系统回传给应用程序。 dwReserved [in/out] 保留,必须为0。 phHandle [out]
返回新创建监视器的句柄。如果该值为0,返回错误TTSERR_INVALIDPARA。 返回值
如果函数调用成功返回0,否则返回错误代号;错误代号的具体值由TTSGETERRCODE(x)宏获得,可能的值如下:
返回值 TTSERR_OK TTSERR_INVALIDPARA TTSERR_NOTFOUND TTSERR_INVALIDOBJECT 说明
1. 监控选项(dwOption)的定义:
监控等级(dwLevel) SRM_MONITOR_OPT_ALERT 意义 监控节点报警事件,当执行节点报警监控时,回调函数pEvent参数的event成员值为SRM_ EVENT_ ALERT,wParam成员为一个指向TSRMAlert结构的指针。 监控平台节点更新事件,当该事件发生时,回调函数pEvent参数的event成员值为SRM_EVENT_IRSM_CHANGED、SRM _EVENT_IRSB_CHANGED、SRM_EVENT_NODE_ADDED 或73
意义 函数执行成功。 参数无效。 该标识符标识的主机不存在。 该标识符标识的主机不能进行监控。 SRM_..._OPT_UPDATE
InterPhonic语音合成系统开发手册 SRM _EVENT_NODE_REMOVED,wParam成员为字符串形式的描述信息。 SRM_..._OPT_CFG SRM_..._OPT_SVC SRM_..._OPT_ALL 2. 报警事件
当系统发生警告、错误、严重错误等报警事件时,事件监视器的回调函数被调用,此时wParam成员为一个指向SRMAlert结构的指针,具体定义如下:
typedef struct tagSRMAlert { char name[20]; int error; SRM_ALERT_LVL level; char desc[100]; } TSRMAlert, *PSRMAlert; 其中: name [in] 该事件的名称。 error [in] 该事件的错误代码,具体的错误代码可以参考头文件TTSErrorCode.h中相关的定义。 level [in] 该事件的报警等级。 typedef enum tagSRM_ALERT_LVL { alert_none = 0, alert_warning, alert_error, alert_critical, } SRM_ALERT_LVL; desc [in] 该报警信息的描述字符串。 SRMRemoveMonitor 函数原型
int SRMRemoveMonitor(SRM_HANDLE hHandle); 功能
删除指定的监视器。 参数
hHandle [in]
74
监控指定节点的配置变化信息,目前不支持这个选项。 监控服务信息变化,目前不支持这个选项。 对所有的事件进行监控。 InterPhonic语音合成系统开发手册
由SRMAddMonitor返回的监视器句柄,如果该值为INVALID_HANDLE_VALUE则清除所有的事件监视器。 返回值
如果函数调用成功返回0,否则返回错误代码;错误原因的具体值TTSGETERRCODE(x)宏获得,可能的值如下:
返回值 TTSERR_OK TTSERR_INVALIDPARA 说明
由SRMAddMonitor添加的监视器必须使用这个函数删除,否则会造成系统资源泄露。 SRMSetParam 函数原型
int SRMSetParam(PSRMNode pNode, TTSDWORD dwParam, void* lpData, TTSDWORD dwSize); 功能
设置ISP节点的参数。 参数
pNode [in]
ISP主机标识符。该参数可以为NULL或NODE_ANY,表示本地节点。 dwParam [in]
参数类型,具体的取值见说明。 lpData [in] 参数数据指针。 dwSize [in]
参数数据长度(字节)。如果该值为0,返回错误TTSERR_INVALIDPARA。 返回值
如果函数调用成功返回0,否则返回错误代号;错误代号的具体值由TTSGETERRCODE(x)宏获得,可能的值如下:
返回值 TTSERR_OK TTSERR_INVALIDPARA TTSERR_NOTFOUND TTSERR_INVALIDOBJECT 说明
1. 使用这个函数实现iSP平台的参数配置,目前支持的参数有:
参数类型(dwParam) SRM_PARAM_CFG
意义 设置或获得节点的配置项,此时lpData参数指向一个类型为75
意义 函数执行成功。 传入参数无效。 该iSP节点不存在。 该iSP节点不支持参数设置。 意义 函数执行成功。 传入参数无效。 InterPhonic语音合成系统开发手册 TSRMConfig的结构体或者是该结构体的数组,dwSize为该结构体的长度乘以结构体数量,该结构体的说明在后面。 2. 获得或设置节点配置信息
当dwParam为SRM_PARAM_CFG时,lpData参数指向一个类型为TSRMConfig的结构体或者是该结构体的数组,该结构体的定义:
typedef struct tagSRMConfig { char szSection[SRM_MAXSECTION_LEN]; char szKey[SRM_MAXKEY_LEN]; char szValue[SRM_MAXVALUE_LEN]; } TSRMConfig, *PTSRMConfig; 其中: szSection [in] 需要设置配置项的section。 szKey [in] 配置项名称。 szValue [in/out] 配置项取值,在调用SRMSetParam函数时,这个成员必须包含具体的配置项取值;在调用SRMGetParam函数时,这个成员返回具体配置项的取值。 SRMGetParam 函数原型
int SRMGetParam(PSRMNode pNode, TTSDWORD dwParam, void* lpData, TTSDWORD *pdwSize); 功能
获取ISP主机的参数。 参数
pNode [in]
iSP节点标识符。该参数可以为NULL或NODE_ANY,表示本地节点。 dwParam [in]
参数类型;具体见SRMSetParam。 lpData [in] 存放参数数据的指针 pdwSize [in/out]
用户分配的参数数据空间大小/实际使用的数据空间大小。如果该空间不足,返回实际需要的空间大小,不填充lpData。 返回值
76
InterPhonic语音合成系统开发手册
如果函数调用成功返回0,否则返回错误代号;错误代号的具体值由TTSGETERRCODE(x)宏获得,可能的值如下:
返回值 TTSERR_OK 意义 函数执行成功。 TTSERR_INVALIDPARA 传入参数无效。 TTSERR_NOENOUGHBUF 用户分配的数据空间不足以填充实际的参数数据。 TTSERR_NOTSUPP TTSERR_NOTFOUND TTSERR_INVALIDOBJECT 说明
调用这个函数获取节点参数,目前支持的参数取值请参考SRMSetParam章节的说明。 这个函数支持批量获取节点参数。 SRM_Routine_Proc 函数原型
typedef int (CALLBACK* SRM_ROUTINE)(PSRMEvent pEvent, void* pUserData); int CALLBACK SRM_Routine_Proc(PSRMEvent pEvent, void* pUserData); 功能
响应iSP平台事件的回调函数。 参数
pEvent [in]
第一个参数是一个描述事件的结构体: typedef struct tagSRMEvent { ISP_EVENT_ID event; /* [in] event id */ TSRMNode node; /* [in] node id */ int result; /* [in] control result */ TTSDWORD wParam; /* [in] wParam of the event */ TTSDWORD lParam; /* [in] lParam of the event */ } TSRMEvent, *PSRMEvent; event [in] 当前事件的ID。 node [in] 事件发生节点的ID,如果是全局事件,该成员为ISP_ANY_NODE。 result [in] 事件的错误代码,如果该事件是某个操作的回调事件,这个成员就是该操作的返回值,可能的返回值可以查阅头文件TTSErrorcode.h。 wParam和lParam [in] 这个参数根据事件的不同意义也不同,具体含义参见后面的说明。
77 不支持的参数类型。 该iSP节点不存在。 该iSP节点不支持参数获取。 InterPhonic语音合成系统开发手册
pUserData [in]
用户自定义数据,在调用SRMNodeControl或SRMAddMonitor函数时传入。 返回值
如果函数调用成功返回0,否则返回错误代号; 说明
1. iSP事件定义
在一个异步操作完成时或者系统中某个事件发生时,将会激发一个iSP事件,目前系统支持的iSP事件有:
事件ID SRM_EVENT_CONTROL 意义 对于异步执行SRMNodeControl函数的结果响应消息,调用回调函数时,pEvent的event成员等于SRM_EVENT_CONTROL,node成员指明了操作返回的节点ID,result成员指明该操作的返回值,具体意义参考TTSErrorCode.h。 系统报警消息,node成员指明了报警的节点ID,result成员指明报警信息的错误代码,wParam成员为指向一个TSRMAlert结构体的指针,该结构体具体的定义和说明请参考SRMAddMonitor函数相关说明。 主资源管理器变化消息,node成员指明了新的主资源管理服务器ID。 备份资源管理器变化消息,node成员指明了新的备份资源管理服务器ID。 增加iSP节点的消息,node成员指明了新的iSP节点ID,wParam成员指向节点增加描述的字符串。 减少iSP节点的消息,node成员指明了减少的iSP节点ID,wParam成员指向节点删除描述的字符串。 SRM_EVENT_ALERT SRM_EVENT_IRSM_CHANGED SRM_EVENT_IRSB_CHANGED SRM_EVENT_NODE_ADDED SRM_EVENT_NODE_REMOVED 2. iSP事件的处理
在回调函数中处理事件时,回调函数传入的指针都是由SRM SDK分配的,用户不需要释放。但是要注意,回调函数和用户调用不在同一个线程,回调函数可能同时被多个线程调用,因此回调函数本身是要求可重入的。该函数中所有对于全局对象的操作必须使用互斥量等同步函数进行保护。
78
InterPhonic语音合成系统开发手册
4.3开发指南
4.3.1搭建开发环境
在使用SRM SDK开发接口进行应用开发之前,用户必须搭建SRM编程环境。 1. 安装服务端
首先,应该在局域网内选定一至两台主机作为资源管理服务器,安装iSP平台的SRM组件,然后,在需要作为语音服务器的主机上安装iSP平台的SES组件和相应的语音服务实现库(语音合成系统,例如InterPhonic CE 3.0)。这样,一个iSP服务支撑环境就创建好了。
2. 安装客户端
应用程序开发端主机上用户需要安装iSP平台客户端组件,安装目录下包含使用SRM接口所必须的头文件、动态引入库、客户端动态链接库和示例程序:
开发组件 头文件 列表 iFly_TTS.h iFly_SRM.h iFly_SEM.h 动态引入库 客户端动态库 例程 的功能是否正确。
TTSErrorCode.h iFlyTTS.lib iFlyTTS.dll SRMApp 说明 包含基本的数据类型定义和TTS相关函数声明。 包含所有SRM接口函数的声明和结构体定义。 包含多引擎管理相关的函数声明和相关定义。 包含所有TTS系统、iSP系统返回的错误代码定义。 隐式链接使用iFlyTTS.dll的动态引入库文件。 客户端代理实现动态链接库。 使用SRM开发接口的例程。 安装完毕后,用户可以使用SPC控制台程序或SRMApp.exe检查iSP平台是否能够正常运行,各个函数
4.3.2使用SRM SDK开发
搭建好开发环境后就可以开始SRM的开发了,以下将会介绍SRM的常规开发步骤。应用程序的开发请按照以下步骤进行:
1. 初始化
在应用程序初始化函数中调用TTSInitializeEx函数,完成SRM客户端运行库的初始化,这是使用SRM SDK的第一步工作:
// 初始化客户端运行库 int ret = TTSInitializeEx(NULL, NULL); if ( ret == 0 ) OutputMsg(\"初始化SRM运行库成功!\\r\\n\"); else OutputMsg(\"初始化SRM运行库失败,错误代码0x%x.\\r\\n\2. 检查网络中是否存在资源服务器
79
InterPhonic语音合成系统开发手册
用户可以在任一时刻检查网络中是否存在资源服务器(IRS),只有在存在资源服务器的情况下才可以使用负载均衡服务。
// COMMENT: 获得资源服务器节点ID CString sIrsm(\"未找到\"), sIrmb(\"未找到\"); TSRMNode irsm, irsb; int ret = SRMGetIRS(&irsm, &irsb); if ( ret == 0 ) { sIrsm = GetNodeIP(irsm); if ( irsb.ip != 0 ) sIrmb = GetNodeIP(irsb); } CString sText; sText.Format(\"主资源服务器%s,备份资源服务器%s。\3. 枚举iSP节点
如果初始化成功,现在可以枚举网络中所有的iSP节点,得到节点列表: // 枚举网络中所有的iSP节点 DWORD dwCount = 100; // 存放节点的内存需要用户分配 TSRMNode* pNodes = new TSRMNode[dwCount]; int ret = SRMNodeEnum(node_any, pNodes, &dwCount); if ( ret != 0 ) { OutputMsg(\"Enumerate iSP nodes failed, error code 0x%x.\\r\\n\ delete [] pNodes; return ret; } // 对于每个节点进行处理 for ( DWORD i = 0; i < dwCount; i++ ) { // 把每一个节点加入到列表中 list_new.AddTail(pNodes[i]); } // 释放内存 delete [] pNodes; 4. 获得服务的最佳服务器
SRM SDK提供的最重要功能就是负载均衡服务,获得最佳服务器要使用SRMGetBestServer函数,调用时需要指明服务名称和过滤条件:
80
InterPhonic语音合成系统开发手册 // 获得性能最佳的服务器 char szServer[100]; DWORD dwTick = GetTickCount(); // 目前支持的服务类型只有tts // 过滤条件可以是NULL,也可以是引擎名称,如果有多个引擎,可以使用逗号“,”分隔 static const char SVC[] = \"tts\"; int ret = SRMGetBestServer(SVC, m_sFilter, szServer); if ( ret != 0 ) { OutputMsg(\"SRMGetBestServer failed, service %s, filter %s, error code 0x%08x.\\r\\n\m_sFilter, ret); } else { OutputMsg(\"SRMGetBestServer successfully, service %s, filter %s, bestsvr %s.\\r\\n\m_sFilter, szServer); } 5. 控制节点
SRM SDK提供了控制任意iSP节点的功能。
// COMMENT: 控制指定的节点(异步模式) int CSRMAppDlg::ControlNode(int nItem, DWORD dwCtrl) { int ret = 0; if ( nItem >= 0 ) { TSRMNode node = GetItemNode(nItem); TSRMNodeCtrl ctrl; ZeroMemory(&ctrl, sizeof(ctrl)); ctrl.dwCtrlParam = dwCtrl; ctrl.bAsynch = TRUE; ctrl.pfnCtrlRoutine = SRM_Routine_Proc; ctrl.pUserData = this; ret = SRMNodeControl(&node, &ctrl); if ( ret != 0 ) { OutputMsg(\"SRMNodeControl node [%s] failed, error code 0x%x.\\r\\n\ GetNode(node), ret); } } return ret; }
81 InterPhonic语音合成系统开发手册 // COMMENT: 控制指定的节点(同步模式) TSRMNode node = GetNode(nItem); TSRMNodeCtrl ctrl; ZeroMemory(&ctrl, sizeof(ctrl)); ctrl.dwCtrlParam = dwCtrl; ret = SRMNodeControl(&node, &ctrl); if ( ret != 0 ) { OutputMsg(\"SRMNodeControl node [%s] failed, error code 0x%x.\\r\\n\ GetNode(node), ret); } 6. 监控节点或平台事件
使用SRMAddMonitor函数可以为指定的节点或者平台增加一个监视器,当有指定的事件发生时,系统会调用监视器的回调函数。用户在回调函数中可以对事件进行处理:
全局事件监视:
// COMMENT: 因为update是全局事件,所以无需指定节点ID TSRMMonitorOpt mopt; memset(&mopt, 0, sizeof(mopt)); mopt.dwOption = SRM_MONITOR_OPT_UPDATE; mopt.pfnMonRoutine = SRM_Routine_Proc; mopt.pUserData = this; ret = SRMAddMonitor(NULL, &mopt, &m_hUpdateMon); if ( ret != TTSERR_OK ) { OutputMsg(\"SRMAddMonitor failed, code = 0x%x.\\r\\n\} 节点事件监视: // COMMENT: 为指定的节点添加监视器 // 监视器句柄 SRM_HANDLE hMonitor; TSRMNode node = GetNode(nItem); TSRMMonitorOpt mopt; memset(&mopt, 0, sizeof(mopt)); mopt.dwOption = pTag->m_dwMonFlag; mopt.pfnMonRoutine = SRM_Routine_Proc; mopt.pUserData = this; // 添加监视
82
InterPhonic语音合成系统开发手册 ret = SRMAddMonitor(&node, &mopt, &hMonitor); if ( ret != TTSERR_OK ) { OutputMsg(\"SRMAddMonitor failed, code = 0x%x.\\r\\n\} 响应事件的回调函数必须为全局函数,注意回调函数和用户执行调用的操作不在同一个线程,因此编码时注意保证回调函数必须是可重入的。
// COMMENT: 事件处理的回调函数 static int CALLBACK SRM_Routine_Proc(PSRMEvent pEvent, void* pUserData) { CSRMAppDlg* pDlg = (CSRMAppDlg*)pUserData; ASSERT(pDlg); BOOL bNeedEnumNode = FALSE; CString sInfo; switch(pEvent->event) { case SRM_EVENT_CONTROL: if ( pEvent->result == 0 ) sInfo.Format(\"节点[%s]操作%d成功。\ pDlg->GetNode(pEvent->node), pEvent->wParam); else sInfo.Format(\"节点[%s]操作%d失败,返回%d。\ pDlg->GetNode(pEvent->node), pEvent->wParam, pEvent->result); break; case SRM_EVENT_ALERT: { PSRMAlert pAlert = (PSRMAlert)pEvent->wParam; sInfo.Format(\"报警信息,节点[%s], 名称%s, 等级%d, 信息[%s]\ pDlg->GetNode(pEvent->node), pAlert->name, pAlert->level, pAlert->desc); } break; case SRM_EVENT_IRSM_CHANGED: sInfo.Format(\"主资源服务器变化为%s。\ break; case SRM_EVENT_IRSB_CHANGED: sInfo.Format(\"备份资源服务器变化为%s。\ break; case SRM_EVENT_NODE_ADDED: sInfo.Format(\"增加了一个iSP节点%s, 描述%s。\
83
InterPhonic语音合成系统开发手册 } pDlg->GetNode(pEvent->node), pEvent->wParam); bNeedEnumNode = TRUE; break; case SRM_EVENT_NODE_REMOVED: sInfo.Format(\"减少了一个iSP节点%s, 描述%s。\ pDlg->GetNode(pEvent->node), pEvent->wParam); bNeedEnumNode = TRUE; break; default: break; } // 因为回调函数和主线程不在同一个线程,所以必须使用PostMessage char* pInfo = new char[sInfo.GetLength() + 1]; strcpy(pInfo, sInfo); pDlg->PostMessage(UM_SRM_EVENT, (WPARAM)pInfo, bNeedEnumNode); return 0; 当程序退出时或者不再需要该监视器时,必须删除监视器: // COMMENT: 删除监视器 int ret = SRMRemoveMonitor(hMonitor); if ( ret != TTSERR_OK ) { OutputMsg(\"SRMRemoveMonitor failed, code = 0x%x.\\r\\n\} 7. 设置或获取节点参数
用户可以调用SRMSetParam和SRMGetParam函数设置和获取节点的参数,目前系统支持配置文件中所有选项的设置和获取。
配置文件的格式使用ini格式,分为section、key、value,下面的代码将获得指定节点的日志输出形式的配置信息。
// 获得节点配置参数 TSRMNode node = GetNode(); TSRMConfig cfg; TTSDWORD dwSize = sizeof(cfg); strcpy(cfg.szSection, “logger”); strcpy(cfg.szKey, “output”); int ret = SRMGetParam(&node, SRM_PARAM_CFG, &cfg, &dwSize); if ( ret == 0 )
84
InterPhonic语音合成系统开发手册 { // 返回的所有配置项都是字符串形式的 OutputMsg(\"获得节点配置信息成功,该选项为%s。\\r\\n\} else OutputMsg(\"获得节点配置信息失败,错误代码0x%x.\\r\\n\如果要获得客户端运行库的配置信息,那么只需要在SRMGetParam函数的第一个参数node传递NULL即可。
设置节点配置信息的用法:
// 设置节点配置参数 TSRMNode node = GetNode(); TSRMConfig cfg; strcpy(cfg.szSection, “logger”); strcpy(cfg.szKey, “output”); strcpy(cfg.szValue, “3”); int ret = SRMSetParam(&node, SRM_PARAM_CFG, &cfg, sizeof(cfg)); if ( ret == 0 ) { OutputMsg(\"设置节点配置信息成功,该选项为%s。\\r\\n\} 8. 逆初始化SRM运行库
当应用程序退出时,用户必须调用SRMUninitialize函数,断开所有的连接,并释放所有分配的全局资源,否则会造成系统资源泄漏。
// 逆初始化客户端运行库 int ret = TTSUninitialize(); if ( ret == 0 ) OutputMsg(\"逆初始化SRM运行库成功!\\r\\n\"); else OutputMsg(\"逆初始化SRM运行库失败,错误代码0x%x.\\r\\n\
85
InterPhonic语音合成系统开发手册
4.4开发包例程
4.4.1简介
在客户端安装包中提供了SRM SDK的开发实例程序SRMApp,这个例程简单演示了SRM SDK各个函数的用法。
SRMApp是基于对话框的Win32应用程序,这个例程使用MS Visual C++ 6.0开发,可以使用MS Visual C++ 6.0或者MS Visual C++ 7.x编译并执行通过。
4.4.2开发示例
所有与SRM接口相关的函数调用都位于SRMAppDlg.cpp/h文件中,下面列出了这个工程的源文件列表: 类型 SDK 头文件 名称 iFly_TTS.h iFly_SRM.h iFly_SEM.h TTSErrorCode.h SRMApp.h/.cpp SRMAppDlg.h/.cpp 说明 包含了基本的数据类型定义和TTS相关函数声明。 包含了所有SRM接口函数的声明和结构体定义。 包含了多引擎管理相关的函数声明和相关定义。 包含了所有TTS系统、iSP系统返回的错误代码定义。 包含了SRM初始化和逆初始化 包含了例程其它SRM函数调用 例程 文件
86
InterPhonic语音合成系统开发手册
第5章 FAQ
1. 多线程开发时如何调用初始化和逆初始化函数?
在使用合成系统的标准接口进行开发时,首先需要在进程全局调用TTSInitializeEx函数,进行合成系统的初始化工作,把合成系统使用的一些全局数据装载到系统内存中。退出程序时需要调用TTSUninitialize函数进行合成系统的逆初始化,从系统内存中移出合成系统的数据。因此在应用程序中调用标准接口时,合成系统的初始化和逆初始化函数一般只允许调用一次。可以在程序开始进行时进行初始化,在程序退出时进行逆初始化。如果在多个线程中并发的进行初始化和逆初始化操作,那么会出现某一个连接正在合成,而另外一个连接却正在释放合成系统资源的情况,会使程序崩溃。 2. 为什么合成系统在多线程调用时出现声音数据混杂的情况?
这种情况一般是由于合成句柄使用不当造成的。合成系统通过调用TTSConnect函数得到的句柄,保存了当前合成任务相关的信息,在后面的合成函数调用中都要使用到这个句柄。在多线程的情况下,建议每个线程创建和使用独立的句柄实例,避免各线程的合成任务相互干扰。如果合成时句柄实例不区分,另外一个合成任务得到的语音数据会与当前合成任务的语音数据混合,造成声音数据混杂的情况。 3. 合成几次之后系统为什么出现授权不足的连接错误?
检查发现TTSConnect函数返回TTSERR_NOLICENCE(没有授权)的错误代码,这种情况有可能是合成系统的授权路数已经用完而造成的。在使用合成服务之前,必须使用TTSConnect函数建立与合成内核的连接。在TTSConnect的时候,合成系统将判断是否有空闲的合成授权,如果有,系统将分配一个授权给当前的连接,否则系统会返回TTSERR_NOLICENCE的连接错误。
因为授权数量有限,在使用合成系统时,合成结束之后,必须调用TTSDisconnect函数来释放当前的连接以及连接所占用的授权。如果没有调用TTSDisconnect的函数,在进行几次连接请求之后,合成授权就会被全部占用。所以新的连接请求就会被系统拒绝,出现授权不足的连接错误。 4. 合成函数中TTSData结构使用的注意事项?
在TTS的合成函数中,待合成的文字和合成后的语音数据通过指针pTTSData来传送,其中pTTSData是一个指向TTSData结构的指针,用来向TTS服务输入待合成的文本,以及TTS服务输出文本合成的语音数据。结构中的输入缓冲区szInBuf必须通过显式的内存分配函数调用分配。该函数等待当前缓冲区数据有效后即返回,既可能只合成部分文本(如一句话),剩余文本的合成语音数据可以通过调用TTSFetchNext来合成并取回。输出缓冲区pOutBuf是由系统内部进行分配和释放的,在调用之前应保证pOutBuf的值为NULL。所
87
InterPhonic语音合成系统开发手册
以TTSData结构在合成调用前必须清零。
5. 合成系统输出的语音文件播放时为什么会出现杂音?
在Microsoft定义的 Wav文件标准中,文件头有多种形式,例如线性PCM Wav文件的文件头长度为44字节,aLaw/uLaw Wav文件的文件头长度为58字节。如果Wav声音文件的头信息正确,Windows 就能正确识别该文件,否则播放就会出现语音数据损坏的错误或者播放为杂音。因此在用合成系统合成输出Wav文件时,需要根据语音格式的不同,选择合适的Wav文件头。
另外在电信领域使用的一些语音卡,要求的声音数据文件也各不相同,大多要求无文件头的纯声音数据文件。在进行语音合成系统的集成开发时,需要根据语音卡的说明,设定输出的语音数据格式以及输出的数据头格式。否则用语音卡播放出来的就是杂音或者会存在咔嗒声。 6. 用本地接口开发的程序改为网络调用应该注意哪些情况?
合成系统的网络接口和本地接口都满足iFly TTS SDK的接口规范,函数形式都是相同的。将本地开发的应用程序更改为网络方式调用,不需要对原程序进行大的修改,只需要将应用程序调用的本地iFlyTTS.dll动态链接库替换为网络版的iFlyTTS.dll即可。但是需要注意以下几点:
如果网络中运行有iSP语音平台,并且有SRM处于运行状态,那么原程序可以完全不用修改就可以在网络环境中使用;
如果iSP平台没有启动SRM,在调用TTSConnect函数进行连接时,应该在参数TTSConnectStruct结构的szServerIP域填入指定的语音合成服务器的IP地址,需要时可以指明端口,格式为: xxx.xxx.xxx.xxx:port;
另外需要注意的是,网络连接和本地连接对一些系统合成参数的支持情况不尽相同,需要由资源管理中心设置或者由应用程序对返回的声音文件头进行正确处理。
7. 为什么在网络调用时出现合成效率低及接受发送数据错误的现象?
合成系统完成从文本到语音数据的转化,生成的语音数据量是很大的。在网络调用的情况下,大量的语音数据都需要通过网络传输到客户端,如果网络带宽不够或者是网络设置有问题,就会影响合成服务的效率,甚至造成客户端应用程序出现网络发送数据错误的问题。强烈建议用户使用100Mbps以上的快速以太网,并且使用100Mbps交换机而不是集线器,以提供足够的网络带宽和网络交换速率。 8. 把标准接口封装改为单个函数进行合成需要注意哪些问题?
已有的IVR平台一般语音合成的外部扩展接口已经确定,需要在将iFlyTTS.dll封装为指定的接口形式。例如有些IVR平台要求的接口一般比较简单,往往只要求一个函数,完成从文本到语音文件的转化的功能,因此在集成中需要注意:
考虑TTSInitializeEx和TTSUninitialize函数需要在进程中全局执行一次,一般将这两个函数放到DllMain函数的DLL_PROCESS_ATTACH和DLL_PROCESS_DETACH事件处进行调用;
88
InterPhonic语音合成系统开发手册
封装的接口函数内部一般使用同步合成机制生成声音数据,并且拼接得到输出的语音文件; 在封装的接口函数内部,合成结束之后,必须调用TTSDisconnect函数中断合成连接,释放占用的合成授权;
根据语音卡的需要安装正确采样率的音库,并正确设置需要输出的声音数据格式,在进行声音数据拼接时注意声音数据头的设置;
在封装接口的导出函数声明时,注意extern “C”。
9. 调用合成系统的开发接口出现初始化失败的错误?
调用标准接口出现初始化失败的原因可能如下:
软件锁没有插或者软件锁驱动没有安装; 合成系统安装不正确,可能没有安装音库;
没有区分网络调用和本地调用使用的动态链接库,如在没有安装合成系统的服务器上使用本地调用的DLL;
使用的接口版本不对。
10. 在电话语音应用系统中如何实现合成与播放的同步进行?
建议使用语音数据双缓冲的方式实现合成与播放同步。即合成得到的语音数据保存在两个缓冲区中,如果为空或者已经播放过,该缓冲区可以写,否则该缓冲区只读。电话语音应用系统的每路需要使用两个线程,一个线程是用户交互线程,负责播放语音、接收用户按键;另一个线程是合成线程,用于后台合成。具体步骤如下:
用户交互线程需要语音合成时,将需要合成的文本传给合成线程,之后处于等待状态;
合成线程将文本送入语音合成系统(调用TTSSynthText等函数),将取得的语音数据交替保存在两个缓冲区中,并向用户交互线程发送“可以播放”的消息。如果缓冲区中的数据没有播放还不能写,合成线程处于等待状态;
用户交互线程得到“可以播放”的消息之后,使用缓冲区的数据进行播放,并且在每播放完一个缓冲区之后,通知合成线程该缓冲区可以写了。
两个线程相互配合,分别进行播放和合成,直到合成结束。
89
InterPhonic语音合成系统开发手册
第6章 技术支持
科大讯飞提供以下技术支持:
技术支持网站
网址:http://support.iflytek.com
您可以访问产品知识库、交互式答疑解难、常见问题(FAQ)等信息。 息。
电子邮件支持 电话支持
请于周一~周五,北京时间9:00~17:00间,拨打电话:086-0551-5331813获得技术支持信
请将问题的详细描述发至:tts_support@iflytek.com。
信件支持
请将问题的详细描述发至:
中国安徽省合肥市黄山路616号高新区信息化产业基地讯飞大厦 邮编:230088 或传真至:086-0551-5331801 5331802
90
因篇幅问题不能全部显示,请点此查看更多更全内容