一種基于移動(dòng)終端的局域網(wǎng)集群雙工語(yǔ)音通信方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及一種集群語(yǔ)音通信的方法,尤其是針對(duì)局域網(wǎng)環(huán)境中,使用安卓移動(dòng)終端進(jìn)行集群語(yǔ)音通信的方法。
【背景技術(shù)】
[0002]隨著智能手機(jī)的性能和網(wǎng)絡(luò)的速度不斷提高,人們希望借助手機(jī)和身邊隨處可見(jiàn)的局域網(wǎng)來(lái)進(jìn)行更加多樣化的語(yǔ)音通信,而集群語(yǔ)音通信就是其中的一種。傳統(tǒng)的集群通信系統(tǒng)是在特定的頻段上利用對(duì)講機(jī)進(jìn)行單工或者半雙工的通信,這種通信方式不僅占據(jù)寶貴的頻率資源,而且需要攜帶笨重的無(wú)線電臺(tái)作為發(fā)射設(shè)備,非常不方便。而且單工或者半雙工的通信方式效率非常低,不適用于實(shí)時(shí)通信的應(yīng)用場(chǎng)景。而新型的網(wǎng)絡(luò)電話VoIP則拋棄了這些笨重的設(shè)備,其便攜性、實(shí)時(shí)性和廉價(jià)的特點(diǎn)使得其成為理想的替代方案。
[0003]VoIP技術(shù)在創(chuàng)建之初是為了替代傳統(tǒng)的運(yùn)營(yíng)商電話網(wǎng)絡(luò),所以它解決的是點(diǎn)對(duì)點(diǎn)的語(yǔ)音通信問(wèn)題,要想實(shí)現(xiàn)集群的語(yǔ)音通信,仍然需要對(duì)現(xiàn)有的技術(shù)進(jìn)行改進(jìn)。
【發(fā)明內(nèi)容】
[0004]發(fā)明目的:為了克服現(xiàn)有技術(shù)中存在的不足,本發(fā)明根據(jù)局域網(wǎng)的傳輸特點(diǎn),提供了一種在實(shí)時(shí)語(yǔ)音通信系統(tǒng)中進(jìn)行集群通信的方法,對(duì)點(diǎn)對(duì)點(diǎn)的語(yǔ)音通信進(jìn)行擴(kuò)展,使得人們可以使用智能手機(jī)在局域網(wǎng)環(huán)境中進(jìn)行集群語(yǔ)音通信,其中每一個(gè)智能手機(jī)都能夠同時(shí)與其他所有智能手機(jī)進(jìn)行全雙工的通信。
[0005]技術(shù)方案:為實(shí)現(xiàn)上述目的,本發(fā)明采用的技術(shù)方案為:
[0006]一種基于移動(dòng)終端的局域網(wǎng)集群雙工語(yǔ)音通信方法,采用服務(wù)器/客戶端架構(gòu),以安卓手機(jī)作為客戶端,以計(jì)算機(jī)作為服務(wù)器,客戶端和服務(wù)器在局域網(wǎng)內(nèi)進(jìn)行通信;客戶端分為發(fā)送部分和接收部分,發(fā)送部分包括拾音模塊、采樣模塊、壓縮編碼模塊和發(fā)送模塊四個(gè)主要部分,接收部分包括接收模塊、數(shù)據(jù)分路模塊、解碼模塊和語(yǔ)音合成模塊成四個(gè)主要部分;
[0007]客戶端發(fā)送部分的工作過(guò)程為:客戶端首先通過(guò)拾音模塊獲取模擬語(yǔ)音數(shù)據(jù),然后經(jīng)過(guò)采樣模塊進(jìn)行量化得到PCM語(yǔ)音數(shù)據(jù),接著使用壓縮編碼模塊對(duì)PCM語(yǔ)音數(shù)據(jù)進(jìn)行壓縮編碼,最后壓縮編碼形成的數(shù)據(jù)包經(jīng)由發(fā)送模塊的IP鏈路以UDP包的形式發(fā)送給服務(wù)器;
[0008]服務(wù)器的工作過(guò)程為:服務(wù)器首先將多個(gè)客戶端發(fā)送來(lái)的數(shù)據(jù)包拼接為一個(gè)大數(shù)據(jù)包,然后將大數(shù)據(jù)包安排給各個(gè)目標(biāo)客戶端,同時(shí)將大數(shù)據(jù)包中目標(biāo)客戶端自身發(fā)送的數(shù)據(jù)置0,避免客戶端接收到自身發(fā)出的數(shù)據(jù)導(dǎo)致回聲,最后將大數(shù)據(jù)包以UDP包的形式發(fā)送給各個(gè)目標(biāo)客戶端;
[0009]客戶端接收部分的工作過(guò)程為:客戶端首先通過(guò)接收模塊接收到服務(wù)器發(fā)送來(lái)的大數(shù)據(jù)包,然后通過(guò)數(shù)據(jù)分路模塊將大數(shù)據(jù)包切分為多路小數(shù)據(jù)塊,接著使用解碼模塊分別解碼各路小數(shù)據(jù)塊得到PCM語(yǔ)音數(shù)據(jù),最后使用語(yǔ)音合成模塊將所有路的PCM語(yǔ)音數(shù)據(jù)按采樣點(diǎn)疊加得到合成語(yǔ)音,最終完成集群語(yǔ)音的目標(biāo)。
[0010]該方法具體包括如下步驟:
[0011](I)拾音模塊首先啟動(dòng)壓縮編碼模塊,并初始化待編碼數(shù)據(jù)隊(duì)列為壓縮編碼做準(zhǔn)備,所述隊(duì)列滿足先進(jìn)先出的原則;然后拾音模塊不斷從麥克風(fēng)中獲取模擬語(yǔ)音數(shù)據(jù);
[0012](2)采樣模塊首先將模擬語(yǔ)音數(shù)據(jù)量化為數(shù)字?jǐn)?shù)據(jù),得到數(shù)字語(yǔ)音流,再將數(shù)字語(yǔ)音流切分成待編碼數(shù)據(jù)塊,再依次添加進(jìn)待編碼數(shù)據(jù)隊(duì)列;
[0013](3)壓縮編碼模塊首先啟動(dòng)發(fā)送模塊,并初始化待發(fā)送數(shù)據(jù)隊(duì)列為發(fā)送數(shù)據(jù)做準(zhǔn)備,所述隊(duì)列滿足先進(jìn)先出的原則;然后壓縮編碼模塊依次從待編碼數(shù)據(jù)隊(duì)列的頭部將待編碼數(shù)據(jù)塊取出進(jìn)行壓縮編碼,再依次添加進(jìn)待發(fā)送數(shù)據(jù)隊(duì)列;
[0014](4)發(fā)送模塊依次從待發(fā)送數(shù)據(jù)隊(duì)列的頭部將待發(fā)送數(shù)據(jù)取出并發(fā)送到服務(wù)器,數(shù)據(jù)發(fā)送采用的是UDP協(xié)議;
[0015](5)服務(wù)器同時(shí)接收一個(gè)以上客戶端發(fā)送來(lái)的數(shù)據(jù),并根據(jù)發(fā)送客戶端的不同對(duì)接收到的數(shù)據(jù)分別做臨時(shí)存儲(chǔ):為了實(shí)現(xiàn)集群通信的目標(biāo),服務(wù)器為每個(gè)客戶端維護(hù)一個(gè)數(shù)據(jù)隊(duì)列,將各個(gè)發(fā)送客戶端發(fā)送的數(shù)據(jù)臨時(shí)存儲(chǔ)在各自的數(shù)據(jù)隊(duì)列中;
[0016](6)服務(wù)器首先將多個(gè)客戶端發(fā)送來(lái)的數(shù)據(jù)包拼接為一個(gè)大數(shù)據(jù)包,然后為每個(gè)目標(biāo)客戶端分別產(chǎn)生一個(gè)相應(yīng)的大數(shù)據(jù)包,具體實(shí)現(xiàn)方法是:服務(wù)器從所有數(shù)據(jù)隊(duì)列中取出位于隊(duì)列頭部的數(shù)據(jù)包,將其拼接為一個(gè)大數(shù)據(jù)包;對(duì)于某一個(gè)目標(biāo)客戶端,將該大數(shù)據(jù)包中,該目標(biāo)客戶端自身發(fā)送的數(shù)據(jù)置0,形成對(duì)應(yīng)該目標(biāo)客戶端的相應(yīng)的大數(shù)據(jù)包;服務(wù)器將相應(yīng)的大數(shù)據(jù)包發(fā)送給對(duì)應(yīng)的目標(biāo)客戶端;
[0017](7)接收模塊首先啟動(dòng)解碼模塊,并初始化待解碼數(shù)據(jù)隊(duì)列為解碼做準(zhǔn)備,所述隊(duì)列滿足先進(jìn)先出的原則;然后不斷從服務(wù)器處接受大數(shù)據(jù)包并交由數(shù)據(jù)分路模塊;解碼模塊為每個(gè)客戶端維護(hù)一個(gè)待解碼數(shù)據(jù)隊(duì)列;
[0018](8)數(shù)據(jù)分路模塊對(duì)大數(shù)據(jù)包進(jìn)行切分形成多路小數(shù)據(jù)塊,多路小數(shù)據(jù)塊根據(jù)發(fā)送客戶端的不同分別添加進(jìn)不同的待解碼數(shù)據(jù)隊(duì)列;
[0019](9)解碼模塊首先啟動(dòng)語(yǔ)音合成模塊,并初始化待合成數(shù)據(jù)隊(duì)列為語(yǔ)音播放做準(zhǔn)備,然后將所有待解碼數(shù)據(jù)隊(duì)列中位于隊(duì)列頭部的小數(shù)據(jù)塊進(jìn)行解碼,并將解碼后的數(shù)據(jù)依次分別添加進(jìn)不同的待合成數(shù)據(jù)隊(duì)列;語(yǔ)音合成模塊為每個(gè)客戶端維護(hù)一個(gè)待合成數(shù)據(jù)隊(duì)列;
[0020](10)語(yǔ)音合成模塊將所有待合成數(shù)據(jù)隊(duì)列中位于隊(duì)列頭部的數(shù)據(jù)按采樣點(diǎn)進(jìn)行疊加,將疊加后數(shù)據(jù)添加進(jìn)待播放數(shù)據(jù)隊(duì)列;依次取出待播放數(shù)據(jù)隊(duì)列中的數(shù)據(jù),不斷寫(xiě)入播放緩存中。
[0021]經(jīng)過(guò)以上步驟,客戶端在發(fā)出語(yǔ)音的同時(shí),可以接收并聽(tīng)到其余客戶端發(fā)送的語(yǔ)音,并除去本機(jī)回聲,完成集群通信的場(chǎng)景需求。
[0022]所述步驟(10)中,將所有待合成數(shù)據(jù)隊(duì)列中位于隊(duì)列頭部的數(shù)據(jù)按采樣點(diǎn)進(jìn)行疊加,具體方法為:將兩路數(shù)據(jù)疊加為一路后再與另一路疊加,直至將所有路數(shù)據(jù)疊加為一路數(shù)據(jù):對(duì)于η比特量化的語(yǔ)音幅度數(shù)據(jù),若兩路數(shù)據(jù)分別為A和B,則疊加的方法為:
[0023]當(dāng)Α〈0 且 Β〈0 時(shí):Y = Α+Β-(ΑΧΒ/(-(2~(η-1)-1)))
[0024]其他情況:Y= Α+Β-(ΑΧΒ/(2~ (η_1))
[0025]其中為Y為疊加后的語(yǔ)音數(shù)據(jù)。
[0026]有益效果:本發(fā)明提供的基于移動(dòng)終端的局域網(wǎng)集群雙工語(yǔ)音通信方法,經(jīng)過(guò)服務(wù)器處理和轉(zhuǎn)發(fā)的通信系統(tǒng)實(shí)現(xiàn)了多個(gè)客戶端之間的全雙工語(yǔ)音通信,任一客戶端可以接收集群內(nèi)其他客戶端發(fā)出的語(yǔ)音數(shù)據(jù),實(shí)時(shí)重現(xiàn)多路語(yǔ)音的合成音效,并且沒(méi)有回聲;經(jīng)理論分析和實(shí)際測(cè)試表明,采用本發(fā)明所述方法,可以滿足集群通信中實(shí)時(shí)語(yǔ)音通信的要求。
【附圖說(shuō)明】
[0027]圖1為客戶端中對(duì)語(yǔ)音數(shù)據(jù)的具體處理流程;
[0028]圖2為服務(wù)器端對(duì)數(shù)據(jù)進(jìn)行處理的示意圖。
【具體實(shí)施方式】
[0029]下面結(jié)合附圖對(duì)本發(fā)明作更進(jìn)一步的說(shuō)明。
[0030]一種基于移動(dòng)終端的局域網(wǎng)集群雙工語(yǔ)音通信方法,采用服務(wù)器/客戶端架構(gòu),以安卓手機(jī)作為客戶端,以筆記本電腦作為服務(wù)器,客戶端和服務(wù)器在無(wú)線局域網(wǎng)內(nèi)進(jìn)行通信;筆記本電腦作為控制中心,負(fù)責(zé)對(duì)多個(gè)安卓手機(jī)發(fā)送來(lái)的數(shù)據(jù)進(jìn)行處理和轉(zhuǎn)發(fā);安卓手機(jī)作為用戶持有的終端,充當(dāng)語(yǔ)音通信中話筒和聽(tīng)筒的角色;客戶端分為發(fā)送部分和接收部分,發(fā)送部分包括拾音模塊、采樣模塊、壓縮編碼模塊和發(fā)送模塊四個(gè)主要部分,接收部分包括接收模塊、數(shù)據(jù)分路模塊、解碼模塊和語(yǔ)音合成模塊成四個(gè)主要部分。
[0031]如圖1所示,客戶端發(fā)送部分的工作過(guò)程為:客戶端首先通過(guò)拾音模塊獲取模擬語(yǔ)音數(shù)據(jù),然后經(jīng)過(guò)采樣模塊進(jìn)行量化得到PCM語(yǔ)音數(shù)據(jù),接著使用壓縮編碼模塊對(duì)PCM語(yǔ)音數(shù)據(jù)進(jìn)行壓縮編碼,最后壓縮編碼形成的數(shù)據(jù)包經(jīng)由發(fā)送模塊的IP鏈路以UDP包的形式發(fā)送給服務(wù)器。
[0032]如圖2所示,服務(wù)器的工作過(guò)程為:服務(wù)器首先將多個(gè)客戶端發(fā)送來(lái)的數(shù)據(jù)包拼接為一個(gè)大數(shù)據(jù)包,然后將大數(shù)據(jù)包安排給各個(gè)目標(biāo)客戶端,同時(shí)將大數(shù)據(jù)包中目標(biāo)客戶端自身發(fā)送的數(shù)據(jù)置0,避免客戶端接收到自身發(fā)出的數(shù)據(jù)導(dǎo)致回聲,最后將大數(shù)據(jù)包以UDP包的形式發(fā)送給各個(gè)目標(biāo)客戶端。
[0033]如圖1所示,客戶端接收部分的工作過(guò)程為:客戶端首先通過(guò)接收模塊接收到服務(wù)器發(fā)送來(lái)的大數(shù)據(jù)包,然后通過(guò)數(shù)據(jù)分路模塊將大數(shù)據(jù)包切分為多路小數(shù)據(jù)塊,接著使用解碼模塊分別解碼各路小數(shù)據(jù)塊得到PCM語(yǔ)音數(shù)據(jù),