引言
传统的车载导航系统采用录音技术进行语音导航。由于城市道路信息量过于庞大,无法一一录音,因而只能播放简单有限的语音提示。近年来,随着包括语音合成在内的智能语音技术的进一步发展与成熟,车载语音导航领域迎来一个更加灵活与人性化的时代。
语音合成也称为“文本到语音”技术,简称TTS(TextToSpeech)。它把文本信息作为输入,经过合成处理后转化为声音信息。与传统录音技术相比,它具有无可比拟的灵活性。然而由于最初几年语音合成的语音效果远差于录音效果,使其应用受到了较大限制。
XFS4240模块是安徽科大讯飞信息科技股份有限公司基于自行开发的新一代语音合成引擎(InterSound KT)而推出的一款中文语音合成模块。其语音合成效果已经基本达到录音的效果。该模块采用COB(Chip On Board)封装,可以方便地集成到嵌入式系统中,主要面向中高端嵌入式应用。
1XFS4240模块简介
1.1XFS4240模块的功能特点
XFS4240模块可以合成任意的中文文本,其支持的文本编码格式包括GB2312、GBK、BIG5和UNICODE四种,同时也支持英文字母的合成,遇单词时按字母发音;集成有智能文本分析算法,可以对时间日期、度量衡符号、电话号码等格式文本做出正确识别与处理;内带音效提示音,用于铃声和信息提醒;支持在文本中插入特殊控制标志,用于产生静音间隔、支持合成拼音等。
1.2XFS4240模块的硬件接口
XFS4240模块采用COB(Chip On Board)封装。其尺寸为42 mm×38 mm,通过16脚双列插针来引入电源、输出音频信号以及与主机通信。标准的工作电压为DC 3.3 V,音频最大输出幅度为3.0 V,提供UART、SPI和I2C三种通信接口。它支持休眠功能,在休眠状态时功耗仅为15 mA。引脚排列如图1所示,引脚说明如表1所列。
图1XFS4240引脚图
表1XFS4240引脚说明
1.3XFS4240模块的通信方式
1.3.1通信接口
XFS4240模块提供了3种通信接口: 异步串口(UART)、SPI接口和I2C总线。本车载导航终端系统使用了I2C总线方式。
XFS4240模块采用标准的I2C总线协议,并且设计为I2C总线的从设备。它使用了7个数据位作为设备地址,因而同一总线可以挂接多达127个此类模块。XFS4240模块出厂时默认地址为0x80,如需在I2C总线上挂接多个模块,用户可以联系厂商修改设备地址。
1.3.2通信协议
无论使用何种通信接口方式,XFS4240模块都使用统一的协议进行通信。通信协议包括两部分: 主机(host)发送到XFS4240模块的控制命令或待合成文本数据;XFS4240模块的反馈信息。前者以命令帧为基本的数据传输单元,而后者则以一个字节为基本单元。
(1) 主机发送的控制命令或数据
命令帧由帧头标志、数据区长度和数据区3个部分组成。数据区长度用2个字节表示,高字节在前,低字节在后,其值要小于1 024个字节。命令帧格式如下:
数据区由命令字和命令参数两部分内容组成。总共有6种命令,除了语音合成命令外,其他命令均不带参数。语音合成命令帧的格式如下:
其中,文本编码格式表明本帧待合成文本的编码方式: 0x00为GB2312;0x01为GBK;0x02为BIG5;0x03为UNICODE。
(2) XFS4240模块的反馈信息
接收到命令帧后,XFS4240会判断当前帧是否正确,并返回一个字节的帧检测信息。如果正确,XFS4240会执行指定的操作,然后根据命令类型返回相应信息。
2XFS4240模块在车载导航终端中的应用实例
本导航系统采用GPSONE技术。GPSONE是美国高通公司基于位置业务开发的定位技术,采用Client/Server方式。它将无线辅助AGPS和高级前向链路AFLT三角定位法两种定位技术有机结合,实现高精度、高可用性和较高速度定位。GPSONE定位方式可以在现代建筑物的内部深处或市区的楼群间正常工作,从而很好地满足车辆在高建筑物群间行驶时的定位要求。
2.1车载导航终端系统组成
本车载导航终端在硬件平台上以Philips公司的LPC2210(ARM7TDMI)为主控芯片,并采用美国AnyDATA公司的DTGS800芯片来实现CDMA通信以及GPSONE定位。在软件平台方面,操作系统采用目前比较普及的μClinux系统(无内存管理单元的嵌入式Linux系统),用户图形界面使用北京飞漫公司的MiniGUI。图2为车载导航终端的硬件系统框图。
图2车载导航终端硬件系统框图
2.2语音合成模块的实现
2.2.1硬件设计
XFS4240模块作为从设备通过I2C总线与主控芯片LPC2210相连接,如图3所示,其地址默认为0x80。XFS4240模块合成语音后,将通过引脚Line_out输出声音信号。本系统采用TEA2025B组成的功放电路对声音信息进行放大,如图4所示。
图3与主控芯片的连接图
图4功放电路图
2.2.2软件设计
由于本终端系统采用μClinux操作系统,因而程序设计上要遵守Linux系统的编程规范。
Linux系统把设备抽象为特殊的文件,称为“设备文件”。对设备文件的读写,即对相应设备的读写。每一个设备文件都两个设备号: 一个是主设备号,标志此类设备的驱动程序;另一个是从设备号,用来标志使用同一个设备驱动程序的、不同的硬件设备。主设备号要与驱动程序登记时申请的主设备号相一致。
使用设备之前,需要先完成以下两项工作:
① 编写、编译生成并加载I2C设备驱动程序。在程序中指定I2C设备驱动的主设备号为122,从设备号用来标志I2C器件的从地址。设编译生成的二进制文件为i2c,用insmod命令来加载:
insmod i2c
② 创建设备节点文件。在/dev文件目录下创建对应设备文件节点。I2C设备属于字符类设备;主设备号与设备驱动的相一致,都为122。XFS4240模块作为I2C从设备时的地址为0x80,转化为十进制数(即128)。用mknod命令来创建:
mknod /dev/xfs4240 c 122 128
在Redhat9.0系统平台下开发,使用Gedit文本编辑器。Gedit的编码方式已设置为GB2312。如要合成一段文本“距离前方路口200米,左转,即将进入中山二路”,可用下面代码来组合成一个语音合成命令帧:
char frame[256];
/*存放一个命令帧,注意待合成文本长度小于125*/
int frame_length = 0; /*命令帧长度*/
char voiceContext[] = “距离前方路口200米,左转,即将进入中山二路”;
memset(frame, 0, sizeof(frame));
frame[0] = 0xFD; /*帧头标志*/
frame[2] = strlen(voiceContext) + 2;
/*数据区长度=待合成文本长度+2*/
frame[3] = 0x01; /*语音合成命令*/
frame[4] = 0x00; /*文本编码格式为GB2312*/
memcpy(&frame[5], voiceContext, strlen(voiceContext));/*组成一个语音合成命令帧*/
frame_length = strlen(voiceContext) + 5;/*命令帧长度*/
在一个语音合成命令帧组合完毕后,就可以将这个命令帧发送给XFS4240模块了。如前所述,在Linux系统可以像读写文件一样操作设备。在此,需要先打开XFS4240设备文件,接着设置I2C总线速率,然后将上述命令帧写入该文件(即发送命令帧到XFS4240),最后关闭设备文件。相关代码如下:
int fd = 0; /*文件描述符*/
fd = open("/dev/xfs4240", O_WRONLY);
/*以只写方式打开xfs4240文件*/
if (fd == 1)return 1; /*如打开时出错,则返回*/
ioctl(fd,I2C_SET_CLH, ((11059200/100000)+1)/2);
/*设置I2C总线速率*/
ioctl(fd,I2C_SET_CLL, (11059200/100000)/2);
/*详情见参考文献[2]*/
write(fd, frame, frame_length);/*写命令帧*/
close(fd);/*关闭设备文件*/
结语
XFS4240模块具有模块化特点,易于系统集成;它还提供多种通信接口,协议简单,操作非常方便。此外实验还表明,XFS4240模块的语音合成效果清晰自然,与真人录音效果的差别很小。这些特点使得它在诸如车载GPS导航、公交车语音报站、车载短信播报等领域具有很好的应用前景。