赵付轩,杨斌
(西南交通大学 信息科学与技术学院,成都 610031)
基于Internet的语音传输是一项应用极其广泛的技术,传统意义上的语音通信都以 Windows操作系统为平台,而且采用有线电缆的方式进行传输。目前随着Linux桌面系统应用的普及,特别是在手持嵌入式设备上的应用,使得Linux上应用软件和系统的开发变得日益重要。Linux是完全开源的代码体系,具有强大的网络支持功能、各种硬件平台的适用性以及完善的文档和低廉的开发成本。随着IEEE 802.11标准WiFi技术的兴起,无线网络便捷的特性在应用嵌入式手持设备中得到充分体现,而本设计正是基于Linux下无线网络方式的语音信息终端,它可以满足无线局域网内端对端的语音对话需要。
整个系统由语音采集模块、网络收发模块和语音处理模块组成。语音采集模块由采集终端ARM9开发板组成,负责对语音信号的采集、处理;网络收发模块负责开发板与语音处理模块的数据报传送;语音处理模块负责语音信号的处理、存储和播放功能。系统结构如图1所示。
系统采用嵌入式Linux操作系统,连入网络并启动任务后,ARM9开发板将话筒传入的数据经暂存后再将其封装成IP包,由无线网接口发送到无线网络,同时解析接收到的语音包并由耳机送出,实现实时语音通信。
图1 系统结构
音频采集部分采用了ARM9开发板mini2440,应用基于I2S总线的UDA1341采集芯片,将采集到的音频信号转化为PCM码格式保存下来,并送入SDRAM内进行存储。语音信号的系统采样频率为16ks/s,开发板每秒发送50个包,解码每个包PCM数据的长度为640个字节。
在嵌入式系统中实现的TCP/IP协议都是面向数据采集和传输的,所以大部分实现都是IP协议、ARP协议、UDP协议或者是TCP协议。本文完成的是IP协议、ARP协议和UDP协议。协议栈结构如图2所示。
图2 协议栈结构
UDP用户数据报协议可以实现网络上发送和接收数据,它实际上是直接利用IP协议进行数据报的传输,UDP的数据传输不建立连接,不保证可靠交付,不需要维护复杂的链接状态表。它不对要发送的数据进行缓冲,直接把应用层收到的数据加上UDP首部发送出去。这对于编写简单的请求/响应模式的应用是很方便的,而且利用UDP协议对传输速率也没有太大影响。
系统程序设计分为客户端和服务器端程序设计,客户端完成数据采集后发送给PC机,服务器端完成数据的接收、存储和播放工作。本设计采用UDP协议、Socket编程方式。程序流程如图3所示。
图3 程序流程图
1.5.1 单工通信
消息只能单方向传输,发送端和接收端是固定的,发送端只能发送信息,不能接收信息;接收端只能接收信息,不能发送信息。语音信号仅从一端传送到另一端,信息流是单方向的。本设计所实现的是单工通信方式。单工模式的实时语音通信模式如图4所示。
单工模式的实时语音通信,由一对程序AudioServer(服务器端)和AudioClient(客户端)来完成。这两个程序需要在一台主机上首先运行AudioServer,然后在另外一台主机上运行AudioClient。在AudioClient端用麦克风说话,在AudioServer端能听到说话内容。
图4 单工模式的实时语音通信模式
1.5.2 半双工通信
语音信号可以沿两个方向传输,通信系统的每一端都可以发送和接收数据,但两个方向不能同时发送数据,必须交替进行。在QT中可以创建两个套接字和两个线程来实现数据的双向传输,但为了避免这两个线程出现竞争,需要引入线程互斥与同步对其进行协调。继承QThread类可以创建线程,重写虚函数run()即可。QMutex类的lock()函数可以实现对一端只能进行读或写,即半双工通信。
1.5.3 全双工通信
通信的任意时刻,线路上存在A到B和B到A的双向信号传输。全双工通信允许数据同时在两个方向上传输,又称为双向同时通信,即通信的双方可以同时发送和接收数据。这样在QT中创建两个套接字和两个线程来实现数据的双向传输即可。继承QThread类可以创建线程,重写虚函数run()即可。
本设计采用Friendly ARM Mini2440开发板,该开发板CPU采用Samsung S3C2440A处理器,主频400MHz,最高533MHz,具有丰富的内外设资源。
本开发板采用 Linux-2.6.32.2内核,它已包含了多种型号的USB无线网卡驱动,其中包括目前流行的、性价比高的TP-Link USB WiFi无线网卡。
本开发板采用基于I2S总线的UDA1341芯片实现音频解码,该芯片内部寄存器的初始化和设置采用L3-bus总线连接控制器实现。音频系统的输出为开发板上常用的3.5mm孔径插座。输入分为两路,一路为板载麦克风,另一路通过CON10白色2.0mm插座引出。
本系统软件可以分为3个功能模块:语音信息处理模块、无线通信模块和QT控制模块。其中QT控制模块负责图形界面显示和人机接口控制。为了便于实现系统管理,采用基于Linux操作系统的应用程序开发模式,操作系统内核则选用Linux-2.6.32.2版本。系统程序流程如图5所示。
图5 系统程序流程图
声音的录制和播放,即要实现往麦克风里说话时能够在耳塞里听到说话的内容。首先是打开声音设备/dev/audio,并设置采样的量化位数、声道数目、采样频率;接着从声卡里读话音数据(录制声音),并存放到一个缓冲区里;然后把刚刚读入的话音数据往声卡里写(播放声音)。
(1)设置采样的量化位数、声道数目、采样频率
(2)设置PCM编码方式
(3)读取声卡
在客户端,把录制下来的声音存放在一个比较大的缓冲区里,然后发送出去;服务器端收到后,播放该数据就可以了。
实时语音通信需要声音连续、清晰。于是在客户端,要不停地把录制下来的声音数据发送出去;在服务器端,不停地把接收到的话音数据播放出来。这里涉及到如何选择缓冲区大小的问题。如果缓冲区太大,录制声音的时间过长,而且sendto()函数不能够一次发送完数据,这样会影响声音的连续性和完整性。经过多次测试和调整,最后取缓冲区的大小为1 024字节。
无线通信模块相关程序如下所示。
(1)建立UDP套接字并绑定对方IP
客户端:
服务器端:
(2)客户端和服务器端数据报收发
设置缓冲区:
客户端发送数据:
服务器端接收数据:
播放语音:
QT是一款跨平台的C++图形用户界面应用程序框架,具有优良的封装机制和高度的模块化结构,只需在一个平台下编写,就可在多个平台下编译运行,可移植性很强。本设计采用4.5.3版 Qt-x86和 Qt-arm分别进行界面和程序的设计与编译。
在完成必要的软硬件初始化后,系统进入QT界面控制程序,QT界面控制程序实现两大功能:
①语音编解码处理。语音信号的处理通过DSP内核完成。采集终端负责语音编码处理,此时DSP内核采用双缓存机制保存ARM9送入的本地语音数据,然后送给ARM9内核。
② 无线语音和声卡数据的收发。它由ARM9内核完成。ARM9内核与DSP内核的通信通过DSP Gateway双核通信机制方式实现,由ARM9内核负责控制。对于语音编码,ARM9负责把UDA1341采集的缓存数据写入到DSP的编码器中,编码完的数据放入发送缓存单元。当发送缓冲区放满之后,ARM端就会将数据通过网口发送出去。
性能测试系统的有效带宽是保证用户语音通话的前提。基于UDP的传输速度,两点间的平均速度可达3.4 Mbps。这个实时语音通信软件的功能是实现端到端的实时语音聊天。也就是说当A与B在进行语音聊天时,A不能同时与C进行语音聊天。A只能先断开与B的语音聊天,然后才可以与C进行语音聊天。
语音聊天的QT界面设计如图6、图7所示。
图6 服务器端界面
图7 客户端界面
通过开发板的话筒讲话,在PC端能清晰听到语音。通过在PC机上专业软件对收到的语音信号进行分析,该语音系统在采样频率8 000~192 000Hz时均能正常工作。测试结果表明语音发送和接收正常,整个系统的功能与性能基本达到设计要求。另外,该设计还增加了语音存储功能,能够将对话语音保存成本地文件,以便重复收听,能够较好地应用到具体的工程项目中。
本文在成熟的嵌入式Linux操作系统下,采用QT跨平台的C++图形用户界面应用程序框架,设计了基于WiFi的语音通信系统。该系统可以实现较高的语音通话质量,能在多个平台下编译运行,可移植性很强。
[1] 蔡志明,卢传富,李立夏.精通Qt4编程[M].北京:电子工业出版社,2008.
[2] 宋敬彬,孙海滨.Linux网络编程[M].北京:清华大学出版社,2010.
[3] 胥光辉,张涛译.TCP/IP协议详解(卷1:协议)[M].北京:机械工业出版社,2000.
[4] 广州友善之臂计算机科技有限公司.FriendlyARM mini2440用户手册,2010.
[5] 温斌泽.VOIP:IP语音技术[M].北京:机械工业出版社,2000.