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