趙付軒,楊斌
(西南交通大學(xué) 信息科學(xué)與技術(shù)學(xué)院,成都 610031)
基于Internet的語音傳輸是一項應(yīng)用極其廣泛的技術(shù),傳統(tǒng)意義上的語音通信都以 Windows操作系統(tǒng)為平臺,而且采用有線電纜的方式進(jìn)行傳輸。目前隨著Linux桌面系統(tǒng)應(yīng)用的普及,特別是在手持嵌入式設(shè)備上的應(yīng)用,使得Linux上應(yīng)用軟件和系統(tǒng)的開發(fā)變得日益重要。Linux是完全開源的代碼體系,具有強大的網(wǎng)絡(luò)支持功能、各種硬件平臺的適用性以及完善的文檔和低廉的開發(fā)成本。隨著IEEE 802.11標(biāo)準(zhǔn)WiFi技術(shù)的興起,無線網(wǎng)絡(luò)便捷的特性在應(yīng)用嵌入式手持設(shè)備中得到充分體現(xiàn),而本設(shè)計正是基于Linux下無線網(wǎng)絡(luò)方式的語音信息終端,它可以滿足無線局域網(wǎng)內(nèi)端對端的語音對話需要。
整個系統(tǒng)由語音采集模塊、網(wǎng)絡(luò)收發(fā)模塊和語音處理模塊組成。語音采集模塊由采集終端ARM9開發(fā)板組成,負(fù)責(zé)對語音信號的采集、處理;網(wǎng)絡(luò)收發(fā)模塊負(fù)責(zé)開發(fā)板與語音處理模塊的數(shù)據(jù)報傳送;語音處理模塊負(fù)責(zé)語音信號的處理、存儲和播放功能。系統(tǒng)結(jié)構(gòu)如圖1所示。
系統(tǒng)采用嵌入式Linux操作系統(tǒng),連入網(wǎng)絡(luò)并啟動任務(wù)后,ARM9開發(fā)板將話筒傳入的數(shù)據(jù)經(jīng)暫存后再將其封裝成IP包,由無線網(wǎng)接口發(fā)送到無線網(wǎng)絡(luò),同時解析接收到的語音包并由耳機送出,實現(xiàn)實時語音通信。
圖1 系統(tǒng)結(jié)構(gòu)
音頻采集部分采用了ARM9開發(fā)板mini2440,應(yīng)用基于I2S總線的UDA1341采集芯片,將采集到的音頻信號轉(zhuǎn)化為PCM碼格式保存下來,并送入SDRAM內(nèi)進(jìn)行存儲。語音信號的系統(tǒng)采樣頻率為16ks/s,開發(fā)板每秒發(fā)送50個包,解碼每個包PCM數(shù)據(jù)的長度為640個字節(jié)。
在嵌入式系統(tǒng)中實現(xiàn)的TCP/IP協(xié)議都是面向數(shù)據(jù)采集和傳輸?shù)模源蟛糠謱崿F(xiàn)都是IP協(xié)議、ARP協(xié)議、UDP協(xié)議或者是TCP協(xié)議。本文完成的是IP協(xié)議、ARP協(xié)議和UDP協(xié)議。協(xié)議棧結(jié)構(gòu)如圖2所示。
圖2 協(xié)議棧結(jié)構(gòu)
UDP用戶數(shù)據(jù)報協(xié)議可以實現(xiàn)網(wǎng)絡(luò)上發(fā)送和接收數(shù)據(jù),它實際上是直接利用IP協(xié)議進(jìn)行數(shù)據(jù)報的傳輸,UDP的數(shù)據(jù)傳輸不建立連接,不保證可靠交付,不需要維護(hù)復(fù)雜的鏈接狀態(tài)表。它不對要發(fā)送的數(shù)據(jù)進(jìn)行緩沖,直接把應(yīng)用層收到的數(shù)據(jù)加上UDP首部發(fā)送出去。這對于編寫簡單的請求/響應(yīng)模式的應(yīng)用是很方便的,而且利用UDP協(xié)議對傳輸速率也沒有太大影響。
系統(tǒng)程序設(shè)計分為客戶端和服務(wù)器端程序設(shè)計,客戶端完成數(shù)據(jù)采集后發(fā)送給PC機,服務(wù)器端完成數(shù)據(jù)的接收、存儲和播放工作。本設(shè)計采用UDP協(xié)議、Socket編程方式。程序流程如圖3所示。
圖3 程序流程圖
1.5.1 單工通信
消息只能單方向傳輸,發(fā)送端和接收端是固定的,發(fā)送端只能發(fā)送信息,不能接收信息;接收端只能接收信息,不能發(fā)送信息。語音信號僅從一端傳送到另一端,信息流是單方向的。本設(shè)計所實現(xiàn)的是單工通信方式。單工模式的實時語音通信模式如圖4所示。
單工模式的實時語音通信,由一對程序AudioServer(服務(wù)器端)和AudioClient(客戶端)來完成。這兩個程序需要在一臺主機上首先運行AudioServer,然后在另外一臺主機上運行AudioClient。在AudioClient端用麥克風(fēng)說話,在AudioServer端能聽到說話內(nèi)容。
圖4 單工模式的實時語音通信模式
1.5.2 半雙工通信
語音信號可以沿兩個方向傳輸,通信系統(tǒng)的每一端都可以發(fā)送和接收數(shù)據(jù),但兩個方向不能同時發(fā)送數(shù)據(jù),必須交替進(jìn)行。在QT中可以創(chuàng)建兩個套接字和兩個線程來實現(xiàn)數(shù)據(jù)的雙向傳輸,但為了避免這兩個線程出現(xiàn)競爭,需要引入線程互斥與同步對其進(jìn)行協(xié)調(diào)。繼承QThread類可以創(chuàng)建線程,重寫虛函數(shù)run()即可。QMutex類的lock()函數(shù)可以實現(xiàn)對一端只能進(jìn)行讀或?qū)?,即半雙工通信。
1.5.3 全雙工通信
通信的任意時刻,線路上存在A到B和B到A的雙向信號傳輸。全雙工通信允許數(shù)據(jù)同時在兩個方向上傳輸,又稱為雙向同時通信,即通信的雙方可以同時發(fā)送和接收數(shù)據(jù)。這樣在QT中創(chuàng)建兩個套接字和兩個線程來實現(xiàn)數(shù)據(jù)的雙向傳輸即可。繼承QThread類可以創(chuàng)建線程,重寫虛函數(shù)run()即可。
本設(shè)計采用Friendly ARM Mini2440開發(fā)板,該開發(fā)板CPU采用Samsung S3C2440A處理器,主頻400MHz,最高533MHz,具有豐富的內(nèi)外設(shè)資源。
本開發(fā)板采用 Linux-2.6.32.2內(nèi)核,它已包含了多種型號的USB無線網(wǎng)卡驅(qū)動,其中包括目前流行的、性價比高的TP-Link USB WiFi無線網(wǎng)卡。
本開發(fā)板采用基于I2S總線的UDA1341芯片實現(xiàn)音頻解碼,該芯片內(nèi)部寄存器的初始化和設(shè)置采用L3-bus總線連接控制器實現(xiàn)。音頻系統(tǒng)的輸出為開發(fā)板上常用的3.5mm孔徑插座。輸入分為兩路,一路為板載麥克風(fēng),另一路通過CON10白色2.0mm插座引出。
本系統(tǒng)軟件可以分為3個功能模塊:語音信息處理模塊、無線通信模塊和QT控制模塊。其中QT控制模塊負(fù)責(zé)圖形界面顯示和人機接口控制。為了便于實現(xiàn)系統(tǒng)管理,采用基于Linux操作系統(tǒng)的應(yīng)用程序開發(fā)模式,操作系統(tǒng)內(nèi)核則選用Linux-2.6.32.2版本。系統(tǒng)程序流程如圖5所示。
圖5 系統(tǒng)程序流程圖
聲音的錄制和播放,即要實現(xiàn)往麥克風(fēng)里說話時能夠在耳塞里聽到說話的內(nèi)容。首先是打開聲音設(shè)備/dev/audio,并設(shè)置采樣的量化位數(shù)、聲道數(shù)目、采樣頻率;接著從聲卡里讀話音數(shù)據(jù)(錄制聲音),并存放到一個緩沖區(qū)里;然后把剛剛讀入的話音數(shù)據(jù)往聲卡里寫(播放聲音)。
(1)設(shè)置采樣的量化位數(shù)、聲道數(shù)目、采樣頻率
(2)設(shè)置PCM編碼方式
(3)讀取聲卡
在客戶端,把錄制下來的聲音存放在一個比較大的緩沖區(qū)里,然后發(fā)送出去;服務(wù)器端收到后,播放該數(shù)據(jù)就可以了。
實時語音通信需要聲音連續(xù)、清晰。于是在客戶端,要不停地把錄制下來的聲音數(shù)據(jù)發(fā)送出去;在服務(wù)器端,不停地把接收到的話音數(shù)據(jù)播放出來。這里涉及到如何選擇緩沖區(qū)大小的問題。如果緩沖區(qū)太大,錄制聲音的時間過長,而且sendto()函數(shù)不能夠一次發(fā)送完數(shù)據(jù),這樣會影響聲音的連續(xù)性和完整性。經(jīng)過多次測試和調(diào)整,最后取緩沖區(qū)的大小為1 024字節(jié)。
無線通信模塊相關(guān)程序如下所示。
(1)建立UDP套接字并綁定對方IP
客戶端:
服務(wù)器端:
(2)客戶端和服務(wù)器端數(shù)據(jù)報收發(fā)
設(shè)置緩沖區(qū):
客戶端發(fā)送數(shù)據(jù):
服務(wù)器端接收數(shù)據(jù):
播放語音:
QT是一款跨平臺的C++圖形用戶界面應(yīng)用程序框架,具有優(yōu)良的封裝機制和高度的模塊化結(jié)構(gòu),只需在一個平臺下編寫,就可在多個平臺下編譯運行,可移植性很強。本設(shè)計采用4.5.3版 Qt-x86和 Qt-arm分別進(jìn)行界面和程序的設(shè)計與編譯。
在完成必要的軟硬件初始化后,系統(tǒng)進(jìn)入QT界面控制程序,QT界面控制程序?qū)崿F(xiàn)兩大功能:
①語音編解碼處理。語音信號的處理通過DSP內(nèi)核完成。采集終端負(fù)責(zé)語音編碼處理,此時DSP內(nèi)核采用雙緩存機制保存ARM9送入的本地語音數(shù)據(jù),然后送給ARM9內(nèi)核。
② 無線語音和聲卡數(shù)據(jù)的收發(fā)。它由ARM9內(nèi)核完成。ARM9內(nèi)核與DSP內(nèi)核的通信通過DSP Gateway雙核通信機制方式實現(xiàn),由ARM9內(nèi)核負(fù)責(zé)控制。對于語音編碼,ARM9負(fù)責(zé)把UDA1341采集的緩存數(shù)據(jù)寫入到DSP的編碼器中,編碼完的數(shù)據(jù)放入發(fā)送緩存單元。當(dāng)發(fā)送緩沖區(qū)放滿之后,ARM端就會將數(shù)據(jù)通過網(wǎng)口發(fā)送出去。
性能測試系統(tǒng)的有效帶寬是保證用戶語音通話的前提。基于UDP的傳輸速度,兩點間的平均速度可達(dá)3.4 Mbps。這個實時語音通信軟件的功能是實現(xiàn)端到端的實時語音聊天。也就是說當(dāng)A與B在進(jìn)行語音聊天時,A不能同時與C進(jìn)行語音聊天。A只能先斷開與B的語音聊天,然后才可以與C進(jìn)行語音聊天。
語音聊天的QT界面設(shè)計如圖6、圖7所示。
圖6 服務(wù)器端界面
圖7 客戶端界面
通過開發(fā)板的話筒講話,在PC端能清晰聽到語音。通過在PC機上專業(yè)軟件對收到的語音信號進(jìn)行分析,該語音系統(tǒng)在采樣頻率8 000~192 000Hz時均能正常工作。測試結(jié)果表明語音發(fā)送和接收正常,整個系統(tǒng)的功能與性能基本達(dá)到設(shè)計要求。另外,該設(shè)計還增加了語音存儲功能,能夠?qū)υ捳Z音保存成本地文件,以便重復(fù)收聽,能夠較好地應(yīng)用到具體的工程項目中。
本文在成熟的嵌入式Linux操作系統(tǒng)下,采用QT跨平臺的C++圖形用戶界面應(yīng)用程序框架,設(shè)計了基于WiFi的語音通信系統(tǒng)。該系統(tǒng)可以實現(xiàn)較高的語音通話質(zhì)量,能在多個平臺下編譯運行,可移植性很強。
[1] 蔡志明,盧傳富,李立夏.精通Qt4編程[M].北京:電子工業(yè)出版社,2008.
[2] 宋敬彬,孫海濱.Linux網(wǎng)絡(luò)編程[M].北京:清華大學(xué)出版社,2010.
[3] 胥光輝,張濤譯.TCP/IP協(xié)議詳解(卷1:協(xié)議)[M].北京:機械工業(yè)出版社,2000.
[4] 廣州友善之臂計算機科技有限公司.FriendlyARM mini2440用戶手冊,2010.
[5] 溫斌澤.VOIP:IP語音技術(shù)[M].北京:機械工業(yè)出版社,2000.