IBM ViaVoiceTTS 语音库开发 SDK
IBM ViaVoiceTTS 文本转语音合成系统开发工具包手册
【张赐荣 / 译】
详细文档请参阅:
https://web.archive.org/web/20260307082024/prc.cx/archive/docs/tts/IBM_ECI_ViaVoice_API_docs.txt
版本 ViaVoiceTTS 6.4.1.0
自述文件(win32.readme.6.4.1.0.txt)
版权所有 ? IBM 公司,2002 年。保留所有权利。
开发sdk包下载:
IBM ViaVoice TTS SDK (6.4) 下载地址: https://web.archive.org/web/20260216121304if_/prc.cx/archive/download/tts/ViaVoiceTTS_6.4.zip
目录
-
公司信息
-
产品说明
-
版本信息
-
产品描述
-
联系方式
-
升级信息
-
新增功能
-
安装要求
-
终端用户安装指南
-
独立软件开发商(ISV)安装指南
-
拼接语音的使用
-
卸载指南
-
通用限制与说明
-
已知问题与常见问题解答(F.A.Q.)
-
开发者须知
-
内存与性能工具
-
日志工具
-
商标信息
1. 公司信息
国际商业机器公司(International Business Machines Corporation,简称 IBM)
2. 产品说明
IBM 文本转语音(Text-to-Speech)运行时工具包
3. 版本信息
IBM 文本转语音 TTS 运行时工具包,版本 6.4.1.0
4. 产品描述
IBM 文本转语音运行时工具包为应用程序提供语音合成引擎及必要组件,使其能够生成语音输出。版本 6.4.1.0 采用基于人类语音单元录音的合成技术:系统首先将待合成文本进行语言学分析,生成相应的语音单元(如音素、音节、单词或短语),再依据语言学规则将这些单元拼接(concatenate)成完整语音。当所录制的语音单元为完整短语或句子时,合成输出可达到高度自然、接近真人发音的效果。
文本转语音运行时工具包包含以下组件:
-
语音合成引擎
-
数据集(按语言区分):
-
语音 1:成年男性,8 kHz 采样率
-
语音 2:成年女性,8 kHz 采样率
-
语音 4:成年男性,8 kHz 采样率(仅限美式英语)
该语音合成引擎及数据集同时支持拼接语音(concatenative voice)与共振峰合成语音(formant synthesis)两种表示方式。拼接语音源自专业发音人,以其特定语言及方言、在特定采样率下录制而成。当客户端程序切换语言并采用拼接合成时,若目标语音数据集尚未缓存于内存中,系统需从磁盘将其加载至内存。
系统将自动判断是否采用拼接合成:若当前所选语言、语音及采样率存在对应的语音数据集,则优先使用拼接合成。例如,若您使用 8 kHz 采样率的英语,并已安装语音 1(美式英语,8 kHz),系统将自动启用拼接合成;否则,将回退至共振峰合成。
在拼接合成过程中,ECI 语音选择操作对拼接引擎而言,相当于在已加载的语音数据集之间切换;而语音属性设置则体现为引擎接收到的音韵与声学数据的相应调整。
5. 联系方式
如需获取文本转语音产品的增强功能与更新信息,请访问官方网站:
http://www.software.ibm.com/speech/dev
6. 完整版本升级路径
当前版本已包含完整功能。
7. 新增功能
本版本文本转语音工具包新增对自定义过滤器(custom filters)的支持。系统预置一封邮件过滤器,可将电子邮件内容转换为更自然的语音朗读格式。有关自定义过滤器的实现与使用方法,请参阅《文本转语音 SDK 开发文档》。
8. 安装要求
硬件配置要求
共振峰合成(Formant)模式:
-
处理器:性能相当于 Intel Pentium 133MHz(带 MMX 技术,256KB L2 缓存)
-
内存:总计 48 MB RAM
-
硬盘空间:10 MB 可用空间
-
声卡:兼容的 16 位声卡
-
光驱:CD-ROM 驱动器
注意:共振峰合成功能支持以下操作系统:
Windows 98
Windows 2000
Windows NT 4.0
Windows Millennium
Windows XP
拼接合成(Concatenative)模式:
-
处理器:性能相当于 Intel Pentium III 266MHz
-
内存:48 MB 基础 RAM + 每加载一个拼接语音额外占用 150 MB RAM
-
硬盘空间:10 MB 基础空间 + 每个拼接语音额外占用 150 MB(中文语音每个需 300 MB)
-
声卡:兼容的 16 位声卡
-
光驱:CD-ROM 驱动器
注意:拼接合成功能仅支持以下操作系统:
Windows 2000(需安装 Service Pack 1)
Windows NT 4.0(需安装 Service Pack 6)
Windows XP
9. 终端用户安装指南
-
运行安装介质中的
setup.exe文件; -
按照安装向导提示完成操作;
-
系统可能提示您安装拼接语音;
-
选择您希望用于拼接语音合成的语音包。
10. 独立软件开发商(ISV)安装指南
若您计划基于 IBM 文本转语音运行时工具包部署应用程序,须事先向 IBM 申请再分发许可(redistribution license)。
此外,建议您将本产品安装流程与您自身产品的安装程序进行集成。具体操作包括:将可再分发的 TTS 驱动程序复制至您的安装介质,并调用 setup.exe。
IBM 文本转语音运行时工具包安装程序 setup.exe 支持以下命令行参数:
setup.exe [installPath] [/silent] [/hideaddremove] [/nr] [/ns]
[/nl] [/nk] [-SMS] [/statusnone] [/statusold] [/concatall]
[/concatnone] -lXXXX
-l(小写字母 L):后接四位语言代码(XXXX),示例如下:
| 代码 | 语言 | 代码 | 语言 |
|---|---|---|---|
| 0003 | 加泰罗尼亚语 | 0005 | 捷克语 |
| 0006 | 丹麦语 | 0007 | 德语 |
| 0008 | 希腊语 | 0009 | 英语 |
| 000a | 西班牙语 | 000b | 芬兰语 |
| 000e | 匈牙利语 | 0010 | 意大利语 |
| 0011 | 日语 | 0012 | 韩语 |
| 0013 | 荷兰语 | 0014 | 挪威语 |
| 0015 | 波兰语 | 0019 | 俄语 |
| 001a | 克罗地亚语 | 001b | 斯洛伐克语 |
| 001d | 瑞典语 | 001e | 泰语 |
| 001f | 土耳其语 | 0021 | 印度尼西亚语 |
| 0024 | 斯洛文尼亚语 | 002d | 巴斯克语 |
| 0404 | 中文(台湾) | 040c | 法语(标准) |
| 0416 | 葡萄牙语(巴西) | 0804 | 中文(中国大陆) |
| 0816 | 葡萄牙语(标准) | 0c0c | 法语(加拿大) |
重要提示:受 InstallShield 限制,若您使用
DoInstall方式调用安装程序,必须指定与主安装程序相同的语言代码。详见 IBM 支持文档 Q144122。
-
<installPath>:安装路径,可为含空格的完整路径,无需添加引号。若系统中已存在 TTS 安装,则该参数将被忽略;若命令行中指定了路径,安装程序将跳过目录选择对话框。 -
/silent:静默安装模式,仅显示路径选择对话框(若检测到语音数据,仍会提示选择待安装的语音包,此参数无法抑制该提示)。 -
/hideaddremove:安装完成后,不在”控制面板 > 添加/删除程序”中创建卸载入口。 -
/nr:禁止显示重启提示及自动重启。若调用安装程序的应用具备图形界面,建议由其自行判断是否需重启(参见附录 2 判断 TTS 是否要求重启)。注意:在未完成所需重启前,TTS 功能将无法正常使用。若已使用/silent参数,则/nr为冗余选项。 -
[-SMS]:防止安装过程中建立网络连接或提前关闭Setup.exe。适用于从 Windows NT 服务器通过网络发起的安装场景。注意:SMS必须为大写,该参数区分大小写。 -
/statusold:默认安装时显示大型进度条对话框;使用此参数可切换为小型对话框。 -
/statusnone:完全隐藏状态对话框。 -
/concatall:安装全部拼接语音包。请检查返回码以确认磁盘空间是否充足。 -
/concatnone:不安装任何拼接语音包。
以下参数为向后兼容保留,已非必需但仍受支持:
/nk:不隐藏”添加/删除程序”入口(现为默认行为)
/nl:跳过许可协议(当前安装包已不含许可协议文件)
/ns:静默安装(功能同/silent)重要提示:语言参数(
-lXXXX)为必填项。若需兼容旧版安装脚本,仅需做最小化调整即可。
11. 拼接语音的使用
安装过程中,您可从提供的列表中选择安装拼接语音包。出于磁盘空间管理或定期更新需要,您可能希望后续添加、移除或迁移拼接语音。
-
添加语音:重新运行安装程序,勾选需新增的语音包。
-
移除语音:需先注销该语音,再手动删除其文件,路径格式为:
<安装目录>\voices\<语言>\<语音编号>
- 迁移或更新语音:若语音文件来自下载包或需变更存储位置,须使用
inivoice.exe工具注册新路径:
inivoice.exe [-u] <语音编号> <synthinfo 文件的完整路径>
示例:将语音 1 从默认安装路径迁移至 F:\TTSVoices\us\1
-
先移动相关数据文件;
-
执行以下命令:
C:> inivoice.exe 1 "F:\TTSVoices\us\1at8000KHz_1_0\synthinfo"
注销语音:使用 -u 参数:
C:> inivoice.exe -u 1 "F:\TTSVoices\us\1at8000KHz_1_0\synthinfo"
注意:拼接语音支持在运行时动态调整以下参数:
音量(Volume)
音高基准(Pitch Baseline)*
语速(Speed)
音高波动(Pitch Fluctuation)*
- 仅部分语音支持
以下参数对拼接语音不可调整:
性别(Gender)
采样率(Sample Rate,参见第 4 节)
头部尺寸(Head Size)
粗糙度(Roughness)
气息感(Breathiness)
若尝试修改上述不可调参数,系统不会报错,但语音合成效果亦不会发生变化。
语言切换时的行为说明:在拼接 TTS 中,切换语言时,语音特性参数将自动重置为当前激活语音的默认值。因此,若您此前修改过语速或音量,切换语言后这些参数将恢复为默认设置。
12. 卸载指南
如需卸载文本转语音运行时工具包,请按以下步骤操作:
-
打开”控制面板”;
-
选择”添加/删除程序”;
-
找到对应语言的”IBM Text-to-Speech Runtime”条目;
-
按向导提示完成卸载流程。
13. 通用限制与说明
本节内容适用于文本转语音运行时工具包的整体使用,非针对特定模块。请务必重视以下警告并严格遵循相关指引,以避免出现异常或不可预测的结果。
-
采样率限制:当前仅提供 8 kHz 采样率的拼接语音。若应用程序需更高音质,请升级语音数据集。详情请访问 IBM 文本转语音官网。
-
语言支持(版本 6.4.1.0):
以下语言支持共振峰语音;带 * 标记的语言同时支持共振峰与拼接语音:
| 语言 | 拼接支持 |
|---|---|
| 巴西葡萄牙语 | * |
| 法语(标准) | * |
| 法语(加拿大) | * |
| 芬兰语 | ? |
| 德语 | * |
| 英语(美国) | * |
| 英语(英国) | * |
| 西班牙语(西班牙) | * |
| 西班牙语(墨西哥) | ? |
| 意大利语 | * |
| 中文(简体) | * |
| 中文(繁体) | * |
| 日语 | * |
-
邮件过滤器限制:当前预置的邮件过滤器仅支持英语。
-
邮件过滤器识别的关键词及对应行为:
| 关键词 | 处理行为 |
|---|---|
Subject: |
提取邮件主题,向客户端应用返回格式化后的主题字符串 |
To: |
过滤该行,直至遇到其他已知关键词 |
From: |
提取发件人信息,返回格式化字符串 |
Date: / Sent: |
提取邮件发送时间,返回格式化日期字符串 |
Alternate-Recipient: / Mime-Version: / Return-Path: / MR-Received: / Content-Transfer-Encoding: / Posting-Date: / Importance: / Priority: / Sensitivity: / UA-Content-ID: / X400-MTS-Identifier: / A1-Type: / Hop-Count: / Content-Disposition: / Delivered-To: / X-Originating-IP: / X-OriginalArrivalTime: / Full-Name: / X-Mailer: / CC: / Filetime= / X-Apparently-To: / Content-Length: / Auto-Submitted: / Status: |
直接过滤当前行 |
Content-Type: / Received: |
过滤该行,直至遇到其他已知关键词 |
- 表情符号过滤:预置邮件过滤器还可识别并过滤以下常见”表情符号”(emoticons):
(R) (C) :-) :-( :-] :) ;) :-#| :( :-> :-< :-\
(-: >:-< :-| :-o :-c |-) |-O :-# :-% :-& :-'| :-)'
:-)8 :-* :-/ :-: :-? :-@ (:I :-[ *:o) +-(:-).-) <:I
@:I [:-|] 8-# 8:-) }(:-( :-{ :-{( :-} :-O :-6 :-8( :-9
:-D :-e :-i :-p :-t :-v ::-) 8-) :<| :=) :>) :~)
;-) %-) (-) (:-) )8-) *-( *<|:-)-:-) ;-\ =:-) [:-) O-)
8-| {(:-){:-) <g> <G>
-
过滤器配置限制:预置邮件过滤器的
eciUpdateFilter函数仅支持修改From:、Date:和Subject:三个字段的处理行为。 -
邮件处理优化建议:文本转语音 SDK 附带
maildict.dct词典文件,内含常见邮件术语与缩写对照表。为获得最佳邮件朗读效果,建议将该词典与预置邮件过滤器配合使用。
附:inifilter 工具说明
inifilter 工具用于注册或注销过滤器,这些过滤器可作为 ECI 的预处理插件,用于文本内容修正。
inifilter [-ul] /filter:[filterNum] /path:[filterPath] /autoload:[y/n]
/lang:[lang] /ECIINI:[IniPath]
| 参数 | 说明 |
|---|---|
-u |
禁用指定过滤器 |
-l |
显示指定过滤器的统计信息 |
filter |
过滤器编号 |
path |
过滤器文件的完整路径 |
autoload |
是否在选定语言时自动加载过滤器(y=是,n=否) |
lang |
过滤器适用的语言/方言(有效值见下表) |
ECIINI |
ECIINI 配置文件路径(Windows 平台无需指定;其他平台若省略则使用 ECIINI 环境变量) |
支持的语言/方言代码:
| 代码 | 语言/方言 |
|---|---|
| 1.0 | 美式英语 |
| 1.1 | 英式英语 |
| 2.0 | 西班牙语(卡斯蒂利亚) |
| 2.1 | 西班牙语(墨西哥) |
| 3.0 | 法语(标准) |
| 3.1 | 法语(加拿大) |
| 4.0 | 德语(标准) |
| 5.0 | 意大利语(标准) |
| 6.0 | 中文(普通话) |
| 6.1 | 中文(台湾) |
| 7.0 | 葡萄牙语(巴西) |
| 8.0 | 日语(标准) |
| 9.0 | 芬兰语(标准) |
| 13.0 | 挪威语(标准) |
| 14.0 | 瑞典语(标准) |
| 15.0 | 丹麦语(标准) |
注意:若指定
-u参数,则仅需提供语言、过滤器编号及 INI 文件路径。
14. 已知问题与常见问题解答(F.A.Q.)
已知问题
-
版本升级兼容性:若从 TTS 4.7 升级至 6.4.1.0,须先完全卸载 4.7 版本,再安装新版。
-
权限问题(Windows XP / 2000):非管理员用户安装时,可能收到”InstallShield 引擎注册失败”错误。请确保当前用户具备足够安装权限。
-
命令行工具权限:在 Windows XP / 2000 下运行
inicache、inifilter、inivoice、initrace等工具时,需具备相应访问权限。若权限不足,系统将不报错但修改不会生效。 -
参数设置顺序:在特定场景下,先设置”头部尺寸”再调整”音高基准”可能返回错误。
-
安装过程提示:安装程序需从介质复制大量数据,此过程屏幕活动较少,属正常现象,请耐心等待。
-
多版本共存:若需在同一系统安装多个 TTS 版本,建议全部安装至同一目录,以避免冲突。
常见问题解答(F.A.Q.)
Q:为何我的应用程序仍在使用共振峰合成?
A:安装 8 kHz 拼接语音后,系统仅对明确请求 8 kHz 采样率的应用启用拼接合成。默认情况下,系统输出音频采样率为 11 kHz。若需启用拼接合成,请通过 eciSetParam 接口将采样率设为 8 kHz。此外,若同一机器共存 5.0 与 6.4.1.0 版本,请确认 6.4.1.0 为最后安装的版本。
15. 开发者须知
-
开发起点建议:文本转语音 SDK 是开发相关应用的理想起点,建议优先参考。
-
SAPI 程序与拼接合成的兼容性:
若已安装 8 kHz 拼接语音,并在 SAPI 中选择针对电话优化的语音(名称或说话人字段含”tel”,且”可用功能”字段为 0x200),首次调用时将因加载语音数据至内存而产生短暂延迟。得益于 IBM 拼接内存管理器(CMM)的缓存机制,后续访问同一语音时延迟将显著缩短。
- 拼接内存管理器(CMM)命令行工具
cmmcmd:
该工具用于与 CMM 交互,定位为技术支持工具,非终端用户工具。
使用方法:
cmmcmd shutdown // 立即关闭 CMM 服务
cmmcmd timeout ## // 设置 CMM 超时时间为 ## 秒
16. 内存与性能工具
鉴于拼接语音合成对计算资源与内存的高需求,IBM 文本转语音采用共享内存与语音缓存机制,以优化系统资源占用。
- 内存共享机制:
拼接 TTS 引擎需更多物理内存存储自然语音合成所需数据。由于服务器多进程可能访问相同语音数据,IBM TTS 采用单实例加载 + 多进程共享策略。此外,系统支持配置数据在末次访问后的驻留时长(默认:每个拼接语音缓存 10 分钟)。
使用 cmmcmd.exe 工具可管理 CMM 行为:
cmmcmd { shutdown | timeout [secs] }
-
shutdown:立即关闭 CMM 服务 -
timeout [secs]:获取/设置服务超时时间(秒);若secs为 0 或省略,则返回当前超时值 -
语音缓存机制:
拼接 TTS 引擎计算开销高于共振峰引擎。鉴于多数 TTS 应用场景词汇量有限,IBM TTS 提供”语音缓存”功能:对已处理文本跳过重复复杂计算。
系统支持按语言配置”预合成短语缓存数量”,并可选启用缓存持久化(退出时保存、初始化时重载)。默认禁用缓存。
使用 inicache.exe 工具配置语音缓存:
inicache [-ul] [-p][-n] lang [phrases] [INI]
| 参数 | 说明 |
|---|---|
-u |
禁用语音缓存 |
-l |
显示当前缓存配置值 |
-p |
启用缓存持久化(退出时保存) |
-n |
禁用缓存持久化(默认) |
lang |
缓存适用的语言/方言(有效值同第 13 节 inifilter 说明) |
phrases |
缓存中允许存储的最大短语数量 |
INI |
ECIINI 配置文件路径(Windows 平台无需指定) |
注意:若指定
-u参数,则仅需提供语言及 INI 文件路径。
17. 日志工具
为满足审计、技术支持及故障诊断需求,IBM 文本转语音提供详细日志功能(默认输出级别较高,主要面向技术支持场景)。
使用 initrace.exe 工具启用并配置日志:
initrace level [file] [INI]
| 参数 | 说明 |
|---|---|
level |
日志级别(0 = 关闭,1 = 启用) |
file |
日志文件名;若 level=0 则无需指定 |
INI |
ECIINI 配置文件路径(Windows 平台无需指定;其他平台若省略则使用 ECIINI 环境变量) |
注意:若路径中包含空格,须使用英文双引号包裹。
18. 商标信息
-
IBM 是国际商业机器公司在美国及其他国家/地区的注册商标。
-
Microsoft、Windows、Windows NT、Windows 95、Windows 98、Windows XP、Windows 2000 及其徽标是微软公司在美国及/或其他国家/地区的注册商标。
-
其他所有名称均为其各自公司的注册商标、商标或服务标志。
文档编号:win32.readme.6.4.1.0.txt.081302
最后更新日期:2002 年 8 月 13 日
附录: “eci.h” 头文件。
/*=========================================================================*/
/* */
/* eci.h */
/* */
/* Licensed Materials - Property of IBM */
/* (C) Copyright IBM Corp. 1998, 2002 All Rights Reserved. */
/* US Government Users Restricted Rights - Use, duplication or disclosure */
/* restricted by GSA ADP Schedule Contract with IBM Corp. */
/* */
/* The following IBM source code is provided to assist you in your */
/* 以下 IBM 源代码旨在协助您的开发工作。您仅可根据 IBM 许可协议使用此代码。 */
/* development. You may use this code only in accordance with the */
/* */
/* IBM License Agreement. */
/* */
/* This copyright statement may not be removed. */
/* 此版权声明不得移除。 */
/* */
/*=========================================================================*/
/* 防止头文件被重复包含的标准include guard机制 */
#ifndef __ECI_H
#define __ECI_H
/* 如果未定义 MOTIF 宏,则定义 Boolean 类型为 int,用于跨平台兼容 */
#ifndef MOTIF
typedef int Boolean;
#endif
/* 定义布尔值的真值常量,1 代表真 */
#define ECITrue 1
/* 定义布尔值的假值常量,0 代表假 */
#define ECIFalse 0
/* 如果未声明 ECIFNDECLARE 宏,则根据编译器环境定义数据类型和调用约定 */
#ifndef ECIFNDECLARE
/* 定义 32 位有符号整数类型,确保跨平台整数长度一致 */
typedef signed long ECIint32;
/* 针对 Microsoft Visual C++ 编译器 */
#ifdef _MSC_VER
/* 针对 Windows CE 嵌入式系统 */
#ifdef _WIN32_WCE
/* 在 WinCE 上,系统字符类型定义为 char */
typedef char ECIsystemChar;
/* 定义函数调用约定为 stdcall,这是 Windows API 的标准调用方式 */
#define ECIFNDECLARE __stdcall
/* 针对标准的 Win32 桌面环境 */
#elif defined _WIN32
/* 包含 TCHAR 定义,支持 Unicode 或多字节字符集 */
#include <tchar.h>
/* 定义系统字符类型为 TCHAR,自动适配 Unicode 设置 */
typedef _TCHAR ECIsystemChar;
/* 定义函数调用约定为 stdcall */
#define ECIFNDECLARE __stdcall
#endif
/* 针对 Borland Turbo C 编译器 */
#elif defined __TURBOC__
/* 针对 Win32 环境 */
#ifdef __WIN32__
/* 包含 TCHAR 定义 */
#include <tchar.h>
/* 定义函数调用约定为 stdcall */
#define ECIFNDECLARE __stdcall
/* 定义系统字符类型为 TCHAR */
typedef _TCHAR ECIsystemChar;
#endif
/* 针对其他编译器或平台(如 Linux/Unix) */
#else
/* 默认不指定特殊调用约定(通常为 cdecl) */
#define ECIFNDECLARE
/* 默认系统字符类型为 char */
typedef char ECIsystemChar;
#endif
#endif
/* 定义空句柄常量,用于表示无效的 ECI 句柄 */
#ifndef NULL_ECI_HAND
#define NULL_ECI_HAND 0
#endif
/* 定义预设语音包的最大数量 */
#define ECI_PRESET_VOICES 8
/* 定义用户自定义语音包的最大数量 */
#define ECI_USER_DEFINED_VOICES 8
/* 定义语音名称字符串的最大长度(包含结束符) */
#define ECI_VOICE_NAME_LENGTH 30
/* ================= 错误代码定义 ================= */
/* 以下宏定义了 ECI 引擎可能返回的各种错误状态码,采用位掩码形式 */
/* 无错误,操作成功 */
#define ECI_NOERROR 0x00000000
/* 系统级错误,通常指操作系统层面的故障 */
#define ECI_SYSTEMERROR 0x00000001
/* 内存错误,指内存分配失败或内存不足 */
#define ECI_MEMORYERROR 0x00000002
/* 模块加载错误,指无法加载必要的语音合成模块 */
#define ECI_MODULELOADERROR 0x00000004
/* 增量错误,通常指语音数据增量处理失败 */
#define ECI_DELTAERROR 0x00000008
/* 合成错误,指语音合成核心引擎发生错误 */
#define ECI_SYNTHERROR 0x00000010
/* 设备错误,指音频输出设备发生错误 */
#define ECI_DEVICEERROR 0x00000020
/* 词典错误,指访问或操作发音词典时发生错误 */
#define ECI_DICTERROR 0x00000040
/* 参数错误,指传递给函数的参数无效 */
#define ECI_PARAMETERERROR 0x00000080
/* 合成中错误,指在合成过程中发生的错误 */
#define ECI_SYNTHESIZINGERROR 0x00000100
/* 设备忙,指音频设备正被其他程序占用 */
#define ECI_DEVICEBUSY 0x00000200
/* 合成已暂停,指合成过程当前处于暂停状态 */
#define ECI_SYNTHESISPAUSED 0x00000400
/* 重入调用错误,指在不允许的时机递归调用了引擎函数 */
#define ECI_REENTRANTCALL 0x00000800
/* 罗马音转换错误,指文本到拼音/罗马音转换失败 */
#define ECI_ROMANIZERERROR 0x00001000
/* 正在合成中,表示引擎当前正在处理合成任务(状态标志) */
#define ECI_SYNTHESIZING 0x00002000
/* 定义音素字符串的最大长度 */
#define eciPhonemeLength (4)
/* C++ 兼容性处理,确保在 C++ 编译器中以 C 链接方式编译 */
#ifdef __cplusplus
extern "C" {
#endif
/* 定义 ECI 引擎句柄类型,为不透明指针,用户不应直接操作其内部结构 */
typedef void* ECIHand;
/* 定义输入文本类型,为常量 void 指针,支持多种字符编码 */
typedef const void* ECIInputText;
/* ================= 引擎参数枚举 (ECIParam) ================= */
/* 用于 eciGetParam 和 eciSetParam 函数,控制引擎的行为 */
enum ECIParam {
eciSynthMode, /* 合成模式:控制合成方式(如实时、文件等) */
eciInputType, /* 输入类型:指定输入文本的编码格式 */
eciTextMode, /* 文本模式:控制文本处理方式(如是否处理标记) */
eciDictionary, /* 词典:设置当前使用的词典句柄 */
eciSampleRate = 5, /* 采样率:设置输出音频的采样率(如 8kHz, 11kHz, 22kHz) */
eciWantPhonemeIndices = 7, /* 音素索引:启用后回调将返回音素索引信息 */
eciRealWorldUnits, /* 现实世界单位:控制参数单位是否为物理单位 */
eciLanguageDialect, /* 语言方言:设置当前合成使用的语言和方言 */
eciNumberMode, /* 数字模式:控制数字的读法(如逐个读或按数值读) */
eciWantWordIndex = 12, /* 单词索引:启用后回调将返回单词边界索引信息 */
eciNumDeviceBlocks, /* 设备块数量:设置音频缓冲区块的数量 */
eciSizeDeviceBlocks, /* 设备块大小:设置每个音频缓冲区块的大小 */
eciNumPrerollDeviceBlocks, /* 预滚动块数量:用于初始化的缓冲块数 */
eciSizePrerollDeviceBlocks,/* 预滚动块大小:用于初始化的缓冲块大小 */
eciNumParams /* 参数总数,用于边界检查 */
};
/* ================= 语音参数枚举 (ECIVoiceParam) ================= */
/* 用于 eciGetVoiceParam 和 eciSetVoiceParam 函数,控制语音特征 */
enum ECIVoiceParam {
eciGender, /* 性别:设置语音的性别特征(男/女) */
eciHeadSize, /* 头部大小:模拟声道长度,影响音色厚重感 */
eciPitchBaseline, /* 音高基准:设置语音的基础音高 */
eciPitchFluctuation, /* 音高波动:设置语音音高的变化幅度(情感表现) */
eciRoughness, /* 粗糙度:设置声音的粗糙程度 */
eciBreathiness, /* 气息感:设置声音中的气息成分 */
eciSpeed, /* 语速:设置语音合成的速度 */
eciVolume, /* 音量:设置输出语音的音量大小 */
eciNumVoiceParams /* 语音参数总数,用于边界检查 */
};
/* ================= 词典错误枚举 (ECIDictError) ================= */
/* 用于词典操作函数的返回值 */
enum ECIDictError {
DictNoError, /* 无错误 */
DictFileNotFound, /* 未找到词典文件 */
DictOutOfMemory, /* 内存不足 */
DictInternalError, /* 词典内部错误 */
DictNoEntry, /* 未找到词条 */
DictErrLookUpKey, /* 查找键错误 */
DictAccessError, /* 访问权限错误 */
DictInvalidVolume /* 无效的词典卷 */
};
/* 定义词典句柄类型 */
typedef void* ECIDictHand;
/* 定义空词典句柄常量 */
#define NULL_DICT_HAND 0
/* ================= 词典卷枚举 (ECIDictVolume) ================= */
/* 指定操作哪个词典卷 */
enum ECIDictVolume {
eciMainDict = 0, /* 主词典:包含标准发音规则 */
eciRootDict = 1, /* 根词典:包含基础词根信息 */
eciAbbvDict = 2, /* 缩写词典:包含缩写词扩展规则 */
eciMainDictExt = 3 /* 主词典扩展:用户自定义扩展词典 */
};
/* ================= 语言方言枚举 (ECILanguageDialect) ================= */
/* 定义支持的语言和方言代码,用于 eciSetParam(eciLanguageDialect) */
/* 代码结构通常为:高字节表示语言,低字节表示方言或编码 */
enum ECILanguageDialect {
NODEFINEDCODESET = 0x00000000, /* 未定义代码集 */
eciGeneralAmericanEnglish = 0x00010000, /* 美式英语 */
eciBritishEnglish = 0x00010001, /* 英式英语 */
eciCastilianSpanish = 0x00020000, /* 卡斯蒂利亚西班牙语(西班牙) */
eciMexicanSpanish = 0x00020001, /* 墨西哥西班牙语 */
eciStandardFrench = 0x00030000, /* 标准法语 */
eciCanadianFrench = 0x00030001, /* 加拿大法语 */
eciStandardGerman = 0x00040000, /* 标准德语 */
eciStandardItalian = 0x00050000, /* 标准意大利语 */
eciMandarinChinese = 0x00060000, /* 普通话(默认编码) */
eciMandarinChineseGB = eciMandarinChinese, /* 普通话(GB 编码) */
eciMandarinChinesePinYin = 0x00060100, /* 普通话(拼音输入) */
eciMandarinChineseUCS = 0x00060800, /* 普通话(UCS/Unicode 编码) */
eciTaiwaneseMandarin = 0x00060001, /* 台湾普通话 */
eciTaiwaneseMandarinBig5 = eciTaiwaneseMandarin, /* 台湾普通话(Big5 编码) */
eciTaiwaneseMandarinZhuYin = 0x00060101, /* 台湾普通话(注音输入) */
eciTaiwaneseMandarinPinYin = 0x00060201, /* 台湾普通话(拼音输入) */
eciTaiwaneseMandarinUCS = 0x00060801, /* 台湾普通话(UCS/Unicode 编码) */
eciBrazilianPortuguese = 0x00070000, /* 巴西葡萄牙语 */
eciStandardJapanese = 0x00080000, /* 标准日语(默认编码) */
eciStandardJapaneseSJIS = eciStandardJapanese, /* 标准日语(Shift-JIS 编码) */
eciStandardJapaneseUCS = 0x00080800, /* 标准日语(UCS/Unicode 编码) */
eciStandardFinnish = 0x00090000, /* 标准芬兰语 */
eciStandardKorean = 0x000A0000, /* 标准韩语(默认编码) */
eciStandardKoreanUHC = eciStandardKorean, /* 标准韩语(UHC 编码) */
eciStandardKoreanUCS = 0x000A0800, /* 标准韩语(UCS/Unicode 编码) */
eciStandardCantonese = 0x000B0000, /* 标准粤语(默认编码) */
eciStandardCantoneseGB = eciStandardCantonese, /* 标准粤语(GB 编码) */
eciStandardCantoneseUCS = 0x000B0800, /* 标准粤语(UCS/Unicode 编码) */
eciHongKongCantonese = 0x000B0001, /* 香港粤语 */
eciHongKongCantoneseBig5 = eciHongKongCantonese, /* 香港粤语(Big5 编码) */
eciHongKongCantoneseUCS = 0x000B0801, /* 香港粤语(UCS/Unicode 编码) */
eciStandardDutch = 0x000C0000, /* 标准荷兰语 */
eciStandardNorwegian = 0x000D0000, /* 标准挪威语 */
eciStandardSwedish = 0x000E0000, /* 标准瑞典语 */
eciStandardDanish = 0x000F0000 /* 标准丹麦语 */
};
/* ================= 词性枚举 (ECIPartOfSpeech) ================= */
/* 主要用于日语等需要词性辅助发音的语言 */
enum ECIPartOfSpeech {
eciUndefinedPOS = 0, /* 未定义词性 */
eciFutsuuMeishi = 1, /* 普通名词(日语) */
eciKoyuuMeishi, /* 专有名词(日语) */
eciSahenMeishi, /* 沙变名词(日语) */
eciMingCi /* 名词(通用) */
};
/* 结构体内存对齐处理,确保在不同平台上二进制兼容 */
#if defined(WIN32)
/* Windows 平台强制 1 字节对齐 */
#pragma pack(push, 1)
#elif defined(UNDER_CE) && (defined(MIPS) || defined(SH3))
/* Windows CE 特定架构强制 4 字节对齐 */
#pragma pack(push, 4)
#endif
/* ================= 口型数据结构 (ECIMouthData) ================= */
/* 用于视觉同步,提供合成语音时的口型参数(Viseme 数据) */
typedef struct {
union {
/* 单字节字符数组,存储音素字符串 */
unsigned char sz[eciPhonemeLength+1];
/* 宽字符数组,支持 Unicode 音素表示 */
unsigned short wsz[eciPhonemeLength+1];
} phoneme;
/* 当前语音对应的语言方言代码 */
enum ECILanguageDialect eciLanguageDialect;
/* 口型高度:0-255,表示嘴巴张开的高度 */
unsigned char mouthHeight;
/* 口型宽度:0-255,表示嘴巴张开的宽度 */
unsigned char mouthWidth;
/* 嘴角上扬度:0-255,表示微笑程度 */
unsigned char mouthUpturn;
/* 下巴张开度:0-255,表示下巴下垂程度 */
unsigned char jawOpen;
/* 上齿可见度:0-255,表示上齿露出的程度 */
unsigned char teethUpperVisible;
/* 下齿可见度:0-255,表示下齿露出的程度 */
unsigned char teethLowerVisible;
/* 舌头位置:0-255,表示舌头的前后高低位置 */
unsigned char tonguePosn;
/* 嘴唇紧张度:0-255,表示嘴唇的紧绷程度 */
unsigned char lipTension;
} ECIMouthData;
/* 恢复默认的内存对齐方式 */
#if defined(WIN32) || ( defined(UNDER_CE) && (defined(MIPS) || defined(SH3)) )
#pragma pack(pop)
#endif
/* ================= 回调消息枚举 (ECIMessage) ================= */
/* 定义回调函数中可能接收到的消息类型 */
enum ECIMessage {
eciWaveformBuffer, /* 波形缓冲区:提供合成的音频数据 */
eciPhonemeBuffer, /* 音素缓冲区:提供音素数据 */
eciIndexReply, /* 索引回复:返回用户插入的索引标记 */
eciPhonemeIndexReply, /* 音素索引回复:返回音素及其时间戳 */
eciWordIndexReply /* 单词索引回复:返回单词边界及其时间戳 */
};
/* ================= 回调返回值枚举 (ECICallbackReturn) ================= */
/* 定义回调函数应返回的状态,控制引擎行为 */
enum ECICallbackReturn {
eciDataNotProcessed, /* 数据未处理:引擎继续正常处理 */
eciDataProcessed, /* 数据已处理:引擎跳过默认处理 */
eciDataAbort /* 数据中止:引擎停止合成 */
};
/* 定义回调函数指针类型 */
/* hEngine: 引擎句柄 */
/* Msg: 消息类型 */
/* lParam: 消息附加参数(如缓冲区大小) */
/* pData: 消息数据指针(如音频缓冲区) */
typedef enum ECICallbackReturn (*ECICallback)(ECIHand hEngine, enum ECIMessage Msg, long lParam, void *pData);
/* Windows 平台特有的对话框枚举,用于显示内置 UI */
#if defined(_WIN32) || defined(_Windows)
enum ECIDialogBox {
eciGeneralDB, /* 通用设置对话框 */
eciAboutDB, /* 关于对话框 */
eciVoicesDB, /* 语音选择对话框 */
eciReadingDB, /* 朗读设置对话框 */
eciMainDictionaryDB, /* 主词典编辑对话框 */
eciRootDictionaryDB, /* 根词典编辑对话框 */
eciNumDialogBoxes /* 对话框总数 */
};
#endif
/* 结束 C++ 兼容性块 */
#ifdef __cplusplus
}
#endif
/* 开始 C 链接块,声明 API 函数 */
#ifdef __cplusplus
extern "C" {
#endif
/* ================= 引擎管理函数 ================= */
/* 创建一个新的 TTS 引擎实例 */
/* 返回值:成功返回引擎句柄,失败返回 NULL */
ECIHand ECIFNDECLARE eciNew(void);
/* 创建一个新的 TTS 引擎实例,并指定初始语言方言 */
/* Value: 初始化的语言方言代码(见 ECILanguageDialect 枚举) */
/* 返回值:成功返回引擎句柄,失败返回 NULL */
ECIHand ECIFNDECLARE eciNewEx(enum ECILanguageDialect Value);
/* 获取系统可用的语言列表 */
/* aLanguages: 输出数组,接收可用的语言代码 */
/* nLanguages: 输入/输出参数,输入数组大小,输出实际可用语言数量 */
/* 返回值:成功返回非零,失败返回 0 */
int ECIFNDECLARE eciGetAvailableLanguages(enum ECILanguageDialect *aLanguages, int *nLanguages);
/* 删除引擎实例,释放相关资源 */
/* hEngine: 引擎句柄 */
/* 返回值:成功返回非零,失败返回 0 */
ECIHand ECIFNDECLARE eciDelete(ECIHand hEngine);
/* 重置引擎状态,清除所有 pending 的文本和参数设置 */
/* hEngine: 引擎句柄 */
/* 返回值:成功返回 ECITrue,失败返回 ECIFalse */
Boolean ECIFNDECLARE eciReset(ECIHand hEngine);
/* 检查引擎是否正处于重入调用状态 */
/* hEngine: 引擎句柄 */
/* 返回值:是返回 ECITrue,否返回 ECIFalse */
Boolean ECIFNDECLARE eciIsBeingReentered(ECIHand hEngine);
/* 获取引擎版本号 */
/* pBuffer: 接收版本字符串的缓冲区 */
void ECIFNDECLARE eciVersion(char *pBuffer);
/* 获取引擎当前的进度状态 */
/* hEngine: 引擎句柄 */
/* 返回值:返回当前合成进度百分比或状态码 */
int ECIFNDECLARE eciProgStatus(ECIHand hEngine);
/* 获取详细的错误信息字符串 */
/* hEngine: 引擎句柄 */
/* buffer: 接收错误描述字符串的缓冲区 */
void ECIFNDECLARE eciErrorMessage(ECIHand hEngine, void* buffer);
/* 清除引擎内部的所有错误标志 */
/* hEngine: 引擎句柄 */
void ECIFNDECLARE eciClearErrors(ECIHand hEngine);
/* 测试短语合成,用于验证引擎是否正常工作 */
/* hEngine: 引擎句柄 */
/* 返回值:成功返回 ECITrue,失败返回 ECIFalse */
Boolean ECIFNDECLARE eciTestPhrase(ECIHand hEngine);
/* ================= 语音合成控制函数 ================= */
/* 直接合成并朗读文本(阻塞或非阻塞取决于模式) */
/* pText: 要合成的文本指针 */
/* bAnnotationsInTextPhrase: 是否文本中包含标注标记 */
/* 返回值:成功返回 ECITrue,失败返回 ECIFalse */
Boolean ECIFNDECLARE eciSpeakText(ECIInputText pText, Boolean bAnnotationsInTextPhrase);
/* 扩展版合成文本函数,可指定语言方言 */
/* pText: 要合成的文本指针 */
/* bAnnotationsInTextPhrase: 是否文本中包含标注标记 */
/* Value: 指定此次合成使用的语言方言 */
/* 返回值:成功返回 ECITrue,失败返回 ECIFalse */
Boolean ECIFNDECLARE eciSpeakTextEx(ECIInputText pText, Boolean bAnnotationsInTextPhrase, enum ECILanguageDialect Value);
/* 获取引擎参数值 */
/* hEngine: 引擎句柄 */
/* Param: 参数类型(见 ECIParam 枚举) */
/* 返回值:参数当前值,出错返回 -1 */
int ECIFNDECLARE eciGetParam(ECIHand hEngine, enum ECIParam Param);
/* 设置引擎参数值 */
/* hEngine: 引擎句柄 */
/* Param: 参数类型(见 ECIParam 枚举) */
/* iValue: 要设置的参数值 */
/* 返回值:成功返回非零,失败返回 0 */
int ECIFNDECLARE eciSetParam(ECIHand hEngine, enum ECIParam Param, int iValue);
/* 获取参数的默认值 */
/* parameter: 参数类型 */
/* 返回值:参数的默认值 */
int ECIFNDECLARE eciGetDefaultParam(enum ECIParam parameter);
/* 设置参数的默认值(影响后续新建的引擎实例) */
/* parameter: 参数类型 */
/* value: 要设置的默认值 */
/* 返回值:成功返回非零,失败返回 0 */
int ECIFNDECLARE eciSetDefaultParam(enum ECIParam parameter, int value);
/* ================= 语音管理函数 ================= */
/* 复制语音配置,将一个语音槽的设置复制到另一个 */
/* hEngine: 引擎句柄 */
/* iVoiceFrom: 源语音索引 */
/* iVoiceTo: 目标语音索引 */
/* 返回值:成功返回 ECITrue,失败返回 ECIFalse */
Boolean ECIFNDECLARE eciCopyVoice(ECIHand hEngine, int iVoiceFrom, int iVoiceTo);
/* 获取语音名称 */
/* hEngine: 引擎句柄 */
/* iVoice: 语音索引 */
/* pBuffer: 接收名称字符串的缓冲区 */
/* 返回值:成功返回 ECITrue,失败返回 ECIFalse */
Boolean ECIFNDECLARE eciGetVoiceName(ECIHand hEngine, int iVoice, void *pBuffer);
/* 设置语音名称 */
/* hEngine: 引擎句柄 */
/* iVoice: 语音索引 */
/* pBuffer: 包含新名称的字符串指针 */
/* 返回值:成功返回 ECITrue,失败返回 ECIFalse */
Boolean ECIFNDECLARE eciSetVoiceName(ECIHand hEngine, int iVoice, const void *pBuffer);
/* 获取语音特征参数 */
/* hEngine: 引擎句柄 */
/* iVoice: 语音索引 */
/* Param: 语音参数类型(见 ECIVoiceParam 枚举) */
/* 返回值:参数值 */
int ECIFNDECLARE eciGetVoiceParam(ECIHand hEngine, int iVoice, enum ECIVoiceParam Param);
/* 设置语音特征参数 */
/* hEngine: 引擎句柄 */
/* iVoice: 语音索引 */
/* Param: 语音参数类型 */
/* iValue: 参数值 */
/* 返回值:成功返回非零,失败返回 0 */
int ECIFNDECLARE eciSetVoiceParam(ECIHand hEngine, int iVoice,
enum ECIVoiceParam Param, int iValue);
/* ================= 文本输入与合成流程函数 ================= */
/* 向引擎输入缓冲区添加文本 */
/* hEngine: 引擎句柄 */
/* pText: 要添加的文本指针 */
/* 返回值:成功返回 ECITrue,失败返回 ECIFalse */
Boolean ECIFNDECLARE eciAddText(ECIHand hEngine, ECIInputText pText);
/* 在文本流中插入索引标记,用于回调同步 */
/* hEngine: 引擎句柄 */
/* iIndex: 用户定义的索引值 */
/* 返回值:成功返回 ECITrue,失败返回 ECIFalse */
Boolean ECIFNDECLARE eciInsertIndex(ECIHand hEngine, int iIndex);
/* 开始合成已输入的文本 */
/* hEngine: 引擎句柄 */
/* 返回值:成功返回 ECITrue,失败返回 ECIFalse */
Boolean ECIFNDECLARE eciSynthesize(ECIHand hEngine);
/* 将合成音频直接保存到文件 */
/* hEngine: 引擎句柄 */
/* pFilename: 输出文件路径 */
/* 返回值:成功返回 ECITrue,失败返回 ECIFalse */
Boolean ECIFNDECLARE eciSynthesizeFile(ECIHand hEngine, const void *pFilename);
/* 清除输入缓冲区中尚未合成的文本 */
/* hEngine: 引擎句柄 */
/* 返回值:成功返回 ECITrue,失败返回 ECIFalse */
Boolean ECIFNDECLARE eciClearInput(ECIHand hEngine);
/* 生成音素数据而不合成音频 */
/* hEngine: 引擎句柄 */
/* iSize: 缓冲区大小 */
/* pBuffer: 接收音素数据的缓冲区 */
/* 返回值:成功返回 ECITrue,失败返回 ECIFalse */
Boolean ECIFNDECLARE eciGeneratePhonemes(ECIHand hEngine, int iSize, void *pBuffer);
/* 获取当前处理的索引值 */
/* hEngine: 引擎句柄 */
/* 返回值:当前索引值 */
int ECIFNDECLARE eciGetIndex(ECIHand hEngine);
/* 停止当前合成操作 */
/* hEngine: 引擎句柄 */
/* 返回值:成功返回 ECITrue,失败返回 ECIFalse */
Boolean ECIFNDECLARE eciStop(ECIHand hEngine);
/* 检查引擎是否正在说话 */
/* hEngine: 引擎句柄 */
/* 返回值:正在说话返回 ECITrue,否则返回 ECIFalse */
Boolean ECIFNDECLARE eciSpeaking(ECIHand hEngine);
/* 同步等待,直到所有 pending 的音频播放完毕 */
/* hEngine: 引擎句柄 */
/* 返回值:成功返回 ECITrue,失败返回 ECIFalse */
Boolean ECIFNDECLARE eciSynchronize(ECIHand hEngine);
/* ================= 输出控制函数 ================= */
/* 设置自定义输出音频缓冲区 */
/* hEngine: 引擎句柄 */
/* iSize: 缓冲区大小(样本数) */
/* psBuffer: 指向 short 类型音频缓冲区的指针 */
/* 返回值:成功返回 ECITrue,失败返回 ECIFalse */
Boolean ECIFNDECLARE eciSetOutputBuffer(ECIHand hEngine, int iSize, short *psBuffer);
/* 设置合成音频输出到文件 */
/* hEngine: 引擎句柄 */
/* pFilename: 输出文件路径 */
/* 返回值:成功返回 ECITrue,失败返回 ECIFalse */
Boolean ECIFNDECLARE eciSetOutputFilename(ECIHand hEngine, const void *pFilename);
/* 设置音频输出设备编号 */
/* hEngine: 引擎句柄 */
/* iDevNum: 设备编号 */
/* 返回值:成功返回 ECITrue,失败返回 ECIFalse */
Boolean ECIFNDECLARE eciSetOutputDevice(ECIHand hEngine, int iDevNum);
/* 暂停或恢复合成 */
/* hEngine: 引擎句柄 */
/* On: ECITrue 为暂停,ECIFalse 为恢复 */
/* 返回值:成功返回 ECITrue,失败返回 ECIFalse */
Boolean ECIFNDECLARE eciPause(ECIHand hEngine, Boolean On);
/* 注册回调函数,用于接收合成事件和数据 */
/* hEngine: 引擎句柄 */
/* Callback: 回调函数指针 */
/* pData: 用户自定义数据指针,将在回调中返回 */
void ECIFNDECLARE eciRegisterCallback(ECIHand hEngine, ECICallback Callback, void *pData);
/* ================= 词典管理函数 ================= */
/* 创建新的词典实例 */
/* hEngine: 引擎句柄 */
/* 返回值:词典句柄 */
ECIDictHand ECIFNDECLARE eciNewDict(ECIHand hEngine);
/* 获取引擎当前使用的词典句柄 */
/* hEngine: 引擎句柄 */
/* 返回值:词典句柄 */
ECIDictHand ECIFNDECLARE eciGetDict(ECIHand hEngine);
/* 设置引擎使用的词典 */
/* hEngine: 引擎句柄 */
/* hDict: 词典句柄 */
/* 返回值:错误代码(见 ECIDictError 枚举) */
enum ECIDictError ECIFNDECLARE eciSetDict(ECIHand hEngine, ECIDictHand hDict);
/* 删除词典实例 */
/* hEngine: 引擎句柄 */
/* hDict: 词典句柄 */
/* 返回值:词典句柄(通常为 NULL) */
ECIDictHand ECIFNDECLARE eciDeleteDict(ECIHand hEngine, ECIDictHand hDict);
/* 从文件加载词典内容 */
/* hEngine: 引擎句柄 */
/* hDict: 词典句柄 */
/* DictVol: 词典卷类型 */
/* pFilename: 词典文件路径 */
/* 返回值:错误代码 */
enum ECIDictError ECIFNDECLARE eciLoadDict(ECIHand hEngine, ECIDictHand hDict, enum ECIDictVolume DictVol, ECIInputText pFilename);
/* 保存词典内容到文件 */
/* hEngine: 引擎句柄 */
/* hDict: 词典句柄 */
/* DictVol: 词典卷类型 */
/* pFilename: 目标文件路径 */
/* 返回值:错误代码 */
enum ECIDictError ECIFNDECLARE eciSaveDict(ECIHand hEngine, ECIDictHand hDict, enum ECIDictVolume DictVol, ECIInputText pFilename);
/* 更新词典中的词条 */
/* hEngine: 引擎句柄 */
/* hDict: 词典句柄 */
/* DictVol: 词典卷类型 */
/* pKey: 原始文本(键) */
/* pTranslationValue: 发音或翻译值 */
/* 返回值:错误代码 */
enum ECIDictError ECIFNDECLARE eciUpdateDict(ECIHand hEngine, ECIDictHand hDict,
enum ECIDictVolume DictVol, ECIInputText pKey, ECIInputText pTranslationValue);
/* 查找词典中的第一个词条 */
/* hEngine: 引擎句柄 */
/* hDict: 词典句柄 */
/* DictVol: 词典卷类型 */
/* ppKey: 输出参数,接收键指针 */
/* ppTranslationValue: 输出参数,接收值指针 */
/* 返回值:错误代码 */
enum ECIDictError ECIFNDECLARE eciDictFindFirst(ECIHand hEngine,
ECIDictHand hDict, enum ECIDictVolume DictVol,
ECIInputText *ppKey, ECIInputText *ppTranslationValue);
/* 查找词典中的下一个词条 */
/* hEngine: 引擎句柄 */
/* hDict: 词典句柄 */
/* DictVol: 词典卷类型 */
/* ppKey: 输出参数,接收键指针 */
/* ppTranslationValue: 输出参数,接收值指针 */
/* 返回值:错误代码 */
enum ECIDictError ECIFNDECLARE eciDictFindNext(ECIHand hEngine,
ECIDictHand hDict, enum ECIDictVolume DictVol,
ECIInputText *ppKey, ECIInputText *ppTranslationValue);
/* 查找特定键的翻译值 */
/* hEngine: 引擎句柄 */
/* hDict: 词典句柄 */
/* DictVol: 词典卷类型 */
/* pKey: 要查找的键 */
/* 返回值:找到的翻译值字符串,未找到返回 NULL */
const char *ECIFNDECLARE eciDictLookup(ECIHand hEngine,
ECIDictHand hDict, enum ECIDictVolume DictVol,
ECIInputText pKey);
/* ================= 扩展词典管理函数(支持词性) ================= */
/* 更新词典词条(带词性) */
/* PartOfSpeech: 词性类型 */
/* 返回值:错误代码 */
enum ECIDictError ECIFNDECLARE eciUpdateDictA(ECIHand hEngine,
ECIDictHand hDict, enum ECIDictVolume DictVol,
ECIInputText pKey, ECIInputText pTranslationValue, enum ECIPartOfSpeech PartOfSpeech);
/* 查找第一个词条(带词性) */
/* pPartOfSpeech: 输出参数,接收词性 */
/* 返回值:错误代码 */
enum ECIDictError ECIFNDECLARE eciDictFindFirstA(ECIHand hEngine,
ECIDictHand hDict, enum ECIDictVolume DictVol,
ECIInputText *ppKey, ECIInputText *ppTranslationValue, enum ECIPartOfSpeech *pPartOfSpeech);
/* 查找下一个词条(带词性) */
/* pPartOfSpeech: 输出参数,接收词性 */
/* 返回值:错误代码 */
enum ECIDictError ECIFNDECLARE eciDictFindNextA(ECIHand hEngine,
ECIDictHand hDict, enum ECIDictVolume DictVol,
ECIInputText *ppKey, ECIInputText *ppTranslationValue, enum ECIPartOfSpeech *pPartOfSpeech);
/* 查找词条(带词性) */
/* ppTranslationValue: 输出参数,接收值指针 */
/* pPartOfSpeech: 输出参数,接收词性 */
/* 返回值:错误代码 */
enum ECIDictError ECIFNDECLARE eciDictLookupA(ECIHand hEngine,
ECIDictHand hDict, enum ECIDictVolume DictVol,
ECIInputText pKey, ECIInputText *ppTranslationValue, enum ECIPartOfSpeech *pPartOfSpeech);
/* ================= 宏定义 ================= */
/* 以下宏用于简化词典查找函数的调用,自动处理指针类型转换 */
/* 查找第一个词条的宏包装 */
#define eciDictFindFirst(eciHandle, dictHandle, dictVolume, ppkey, pptranslation) \
eciDictFindFirst((eciHandle), (dictHandle), (dictVolume), (ECIInputText *) (ppkey), (ECIInputText *) (pptranslation))
/* 查找下一个词条的宏包装 */
#define eciDictFindNext(eciHandle, dictHandle, dictVolume, ppkey, pptranslation) \
eciDictFindNext((eciHandle), (dictHandle), (dictVolume), (ECIInputText *) (ppkey), (ECIInputText *) (pptranslation))
/* 防止过滤器头文件重复包含 */
#ifndef __ECIFILTER_H
#define __ECIFILTER_H
/* 定义过滤器句柄类型 */
typedef void *ECIFilterHand;
/* 定义空过滤器句柄常量 */
#define NULL_FILTER_HAND 0
/* ================= 过滤器错误枚举 (ECIFilterError) ================= */
typedef enum ECIFilterError {
FilterNoError, /* 无错误 */
FilterFileNotFound, /* 未找到过滤器文件 */
FilterOutOfMemory, /* 内存不足 */
FilterInternalError, /* 过滤器内部错误 */
FilterAccessError /* 访问错误 */
};
/* 停用过滤器 */
/* eciHandle: 引擎句柄 */
/* pFilter: 过滤器句柄 */
/* 返回值:错误代码 */
ECIFilterError ECIFNDECLARE eciDeactivateFilter(ECIHand eciHandle, ECIFilterHand pFilter);
/* 创建新过滤器 */
/* eciHandle: 引擎句柄 */
/* filterNum: 过滤器编号(默认 0) */
/* 返回值:过滤器句柄 */
ECIFilterHand ECIFNDECLARE eciNewFilter(ECIHand eciHandle, unsigned int filterNum = 0);
/* 激活过滤器 */
/* eciHandle: 引擎句柄 */
/* whichFilterHand: 要激活的过滤器句柄 */
/* 返回值:错误代码 */
ECIFilterError ECIFNDECLARE eciActivateFilter(ECIHand eciHandle, ECIFilterHand whichFilterHand);
/* 删除过滤器 */
/* eciHandle: 引擎句柄 */
/* whichFilterHand: 要删除的过滤器句柄 */
/* 返回值:过滤器句柄 */
ECIFilterHand ECIFNDECLARE eciDeleteFilter(ECIHand eciHandle, ECIFilterHand whichFilterHand);
/* 更新过滤器规则(键值对) */
/* eciHandle: 引擎句柄 */
/* whichFilterHand: 过滤器句柄 */
/* key: 匹配键 */
/* translation: 替换值 */
/* 返回值:错误代码 */
ECIFilterError ECIFNDECLARE eciUpdateFilter(ECIHand eciHandle, ECIFilterHand whichFilterHand,
ECIInputText key, ECIInputText translation);
/* 获取过滤后的文本 */
/* eciHandle: 引擎句柄 */
/* whichFilterHand: 过滤器句柄 */
/* input: 输入文本 */
/* filteredText: 输出参数,接收过滤后的文本 */
/* 返回值:错误代码 */
ECIFilterError ECIFNDECLARE eciGetFilteredText(ECIHand eciHandle, ECIFilterHand whichFilterHand,
ECIInputText input, ECIInputText *filteredText);
#endif
/* 结束 C++ 兼容性块 */
#ifdef __cplusplus
}
#endif
/* 结束头文件保护 */
#endif
译者介绍
张赐荣,视障者,信息无障碍软件优化解决方案资深研发专家。
多年来,从事Web/PC/移动端无障碍解决方案研究工作,对跨平台 可访问性优化实践拥有独特的理论和丰富的实战经验。
精通视障用户交互设计,致力于改善、提升产品可及性与易用性体验。
更多推荐
所有评论(0)