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


目录

  1. 公司信息

  2. 产品说明

  3. 版本信息

  4. 产品描述

  5. 联系方式

  6. 升级信息

  7. 新增功能

  8. 安装要求

  9. 终端用户安装指南

  10. 独立软件开发商(ISV)安装指南

  11. 拼接语音的使用

  12. 卸载指南

  13. 通用限制与说明

  14. 已知问题与常见问题解答(F.A.Q.)

  15. 开发者须知

  16. 内存与性能工具

  17. 日志工具

  18. 商标信息


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. 终端用户安装指南

  1. 运行安装介质中的 setup.exe 文件;

  2. 按照安装向导提示完成操作;

  3. 系统可能提示您安装拼接语音;

  4. 选择您希望用于拼接语音合成的语音包。


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

  1. 先移动相关数据文件;

  2. 执行以下命令:


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. 卸载指南

如需卸载文本转语音运行时工具包,请按以下步骤操作:

  1. 打开”控制面板”;

  2. 选择”添加/删除程序”;

  3. 找到对应语言的”IBM Text-to-Speech Runtime”条目;

  4. 按向导提示完成卸载流程。


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 下运行 inicacheinifilterinivoiceinitrace 等工具时,需具备相应访问权限。若权限不足,系统将不报错但修改不会生效。

  • 参数设置顺序:在特定场景下,先设置”头部尺寸”再调整”音高基准”可能返回错误。

  • 安装过程提示:安装程序需从介质复制大量数据,此过程屏幕活动较少,属正常现象,请耐心等待。

  • 多版本共存:若需在同一系统安装多个 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/移动端无障碍解决方案研究工作,对跨平台 可访问性优化实践拥有独特的理论和丰富的实战经验。

精通视障用户交互设计,致力于改善、提升产品可及性与易用性体验。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐