利用IP网络进行语音通信是一种廉价方便的通信方式。其目前的技术已经为用户之间的通信提供了清晰、稳定、低时延的语音质量,支持语音、数据、图像等多媒体业务的传输。尤其是对于很多大中型企业来说,由于在各个省份或者不同国家都有办事处,每个月都会产生巨大的国际国内长途通信费用。同时,由于信息保密的要求,企业往往需要像VPN一样自建IP呼叫网络,以降低通信成本。这样组织会先建立自己的电话网络,同时通过VPN或者其他方式通过IP网络连接起来。整个系统能有效降低企业运营成本,提高工作效率。本文所描述的网络语音处理平台就是基于这一方案,主要通过VoIP网关模拟电话来实现。其中,VoIP网关的主要功能是信令处理、与ITU-T提出的H.323协议或IETF提出的SIP协议的通信、语音编解码处理等。

1结构体系介绍

网络语音处理平台的基本工作原理是先将模拟语音信号转换成数字信号,然后对输入的语音数据编码进行压缩。然后,基于H.323或SIP协议的框架,将这些语音数据包打包,通过IP网络发送到接收端。接收端再将这些语音数据包串起来,解压缩后还原成原始的语音信号,从而达到通过互联网传输语音的目的。本文将分为硬件和软件两部分来阐述网络语音平台的构建。

1.1硬件部分

整个硬件部分如图1所示。

整个系统包括语音处理部分和网络数据处理部分,其中语音处理部分分为FXO和FXS接口电路。FXO接口用于连接PSTN,可以模拟电话功能,提供闭环功能,检测来电振铃。FXS用于连接POT普通电话,模拟电话交换机的功能。

在VoIP网关中,FXS电路是在分组网络上建立去话呼叫和接收来话呼叫的基本接口。在CPE的应用中,FXS电路存在于网关中,可以提供拨号音、电池电流和振铃电压的功能,检测来自电话的环路闭合。因为交换功能是在CPE级,所以没有必要建立与PSTN的直接连接。FXS电路包括编解码器和SLIC(用户线接口电路)。编解码器由ADC和DAC组成。ADC将来自模拟电话的模拟信号转换成可以通过VoIP网络传输的数字信号。DAC将数字信号转换为模拟电平,以驱动模拟电话。为了实现4kHz的音频带宽,ADC的采样速率通常约为8kHz。SLIC模拟PSTN的电压电平,直接通过用户线给普通电话馈电,检测电话是挂机还是摘机,产生高达120V的振铃电压,并提供过压保护功能,防止用户线上的电压冲击或过压损坏设备。

SLIC芯片采用传奇的LE7947C。在控制器的控制下,它可以模仿电话局的功能,控制馈电电流,并提供挂机传输功能,如在电话线挂机时(被叫方未摘机时)提供振铃信号。监控用户线的通断状态,从而检测电话的摘机、挂机、拨号脉冲等用户线信号,并传送给控制设备,以指示用户的忙闲状态和连接要求。SLIC芯片的控制模式如表1所示。这些控制信号连接到IXP421的GPIO,以便IXP421发出控制信号。控制结果由引脚的电平值表示。

其中,开路是指当线路出现故障时,模块内部断开塞尖和塞环线。激活是指模块收到摘机信号(无论是作为主叫还是振铃)后,首先重新激活模块,然后开始呼叫。通话结束后,设置为待机状态。如果需要挂机传输功能,振铃1秒后状态值应设置为3(即011)(状态值为1),持续时间为4秒。在此期间,该模块可以将来电显示和其他信号传输到手机。待机意味着模块等待主叫方摘机或作为被叫方振铃。

编解码芯片采用轻巧的T8503。它是一种A律/律PCM编码器,包含A/D和D/A单元,可以实现声音和增益控制的数字化和重组。编解码器芯片有两个通道,每个通道包含一个用于语音编码或解码的滤波器。两个通道的PCM数据通过PCM同步接口收发,两个通道的帧同步由一对FSXn和FSRn控制,保证每个呼叫时隙的数据传输。

FXO电路包括编解码器和数据访问设备(DAA)。将模拟语音转换成数字信号再转换回来,并负责数据传输。DAA模拟(POTS)电话功能,其重要作用是消除高压DC偏置并闭合PSTN环路,从而只传输来自PSTN的模拟交流信号。它还具有极性保护电路,以确保电话在连接到外部线路时能够获得极性正确的DC工作电压。

FXO的部分电路主要采用SILICON LABS的SI3016和SI3021。SI3016是一种DAA电路,可以为线路上的信号提供光电隔离和2/4线转换,满足四线传输的编码、解码和数字交换的要求。并且可以实现振铃信号、来电显示、线路极性反转检测等功能。SI3021一方面提供了直接连接DSP的通信接口,另一方面也提供了控制接口。该电路可以在挂机(电话线可用)和摘机(电话线占线)状态下工作。通过设置SI3021

要控制的引脚电平:

高电平时,表示处于挂机状态,可以接听或发起呼叫;

低意味着它处于摘机状态,电话线占线。当线路上有振铃信号时通过。

引脚表示。串行数据接口的工作模式可以通过配置M1和M0引脚来选择。整个平台还配有CPLD电路来控制各个电话接口,协调端口之间的通信。

主处理器IXP421是INTEL公司IXP42x系列的网络处理器,在VoIP应用中有自己的特点。如果提供两个高速同步串口HSS,同时包含高速网络处理引擎NPE,在Xscale的配合下,可以实现DSP等高级数据处理应用。还配有基于Xscale的DSP软件库,支持2 ~ 4个语音信号的处理。网络处理方面,IXP421集成10 ~ 100兆MAC,通过MII/RMII接口连接通用PHY芯片,连接ip网络。

1.2软件部分

软件可以分为功能或者驱动模块,下面就从以上两个方面来分析。

1.2.1软件功能模块

从功能上来说,它可以分为如图2所示的模块结构。

其中,DSR模块是IXP421处理底层语音数据的模块,主要采用INTEL提供的DSR(DSP software release)软件库。一方面,它与上层应用程序通信,传输数据或响应来自上层的控制消息。另一方面与底层接口进行通信和控制。

编码部分负责对HSS到IP接口的数据包进行编码和打包,提供对G.711等音频标准的支持,并为自动电平控制ALC单元提供增益控制功能和VAD功能以区分背景噪声。并将多个语音帧组合成一个IP分组。语音分组被压缩并以特定的帧长度编码,并且压缩的语音分组被发送到网络处理单元。在语音中加入包头、时间戳和其他信息后,网络处理单元将数据放入可变长度的数据报或数据包中,然后将寻址和控制信息附加到每个数据报中,并通过网络将其发送到目的地。

解码部分负责打包从IP网络接收的语音数据包,将其转换为语音数据流,并将其发送到HSS接口。与编码部分类似,解码部分也包含G.711和G.729数据处理和ALC处理单元。不同的是,它包括产生适当背景噪声的CNG单元,消除网络丢包导致语音信息不完整问题的PLC单元,控制IP网络到HSS接口数据传输节奏的JitterBuffer单元。

电话信号音监测模块负责监测300 ~ 3500 Hz的电话信号音,如DTMF信号。主要采用快速傅立叶算法FFT来分析判断。电话信号音产生模块负责产生相应的电话信号音。网络节点是连接HSS端口和编解码器的程序模块,它将需要从HSS端口发送的数据放入HSS发送缓冲区,或者将需要从HSS端口接收的数据放入HSS接收缓冲区。

状态机的结构

为了模拟电话在正常状态下的工作流程,需要相应地建立几种不同的状态,并实现不同状态的转换。一般通话双方有空闲、拨号、信令、应答、建立连接、断开连接,所以可以定义以下状态值:call_idel、call_dial、call_cancel、call_invite、call_ack、call_connect、call_bye等等。例如,用户摘机后会有一个中断。如果终端的当前状态是call_ack,则表明终端用户是被动接收者,已经接收到invite信令,正在等待用户摘机。因此,此时,状态变为call_connect,并执行相关处理。当终端的当前状态不是call_ack时,表明终端用户是活动的呼叫者,并准备拨号。此时,状态变为call_dial,麦克风中产生等待音,DSR模块开始等待用户拨号。当用户完成拨号时,状态变为call_invite,并进行相关处理。一般过程如图3所示。

以确保状态功能可以在不同状态之间切换,并且便于控制和管理每个语音呼叫的信息。您还需要建立一些全局数据结构:

用于保存当前网关中每个语音的配置参数。num表示呼叫的本地号码和对方号码,addr表示呼叫对应的DSR中使用的本地和远端网络地址,status记录呼叫过程中状态机中本地终端的状态。设备上电后,需要逐步进行一系列的初始化工作。包括一些记录状态信息的全局变量,初始化SLIC接口、DSR模块、网络接口和信令处理模块,并启动所需的监控线程以等待控制状态的改变。

软件驱动模块

由于网络语音的底层平台使用嵌入式Linux作为其操作系统,所以需要划分如图4所示的几个模块,并编写相应的驱动程序。

内核态运行的程序主要包括SLIC控制模块、DSR控制模块、接口和DSR数据模块,基本完成了底层所需的功能需求。用户态程序都在上面运行,对它们进行管理和控制,实现上层应用。

(1)SLIC控制模块

由于整个平台包括FXS和FXO接口,因此SLIC控制模块可以相应地分为两部分。

对于FXS接口程序部分,主要模拟PSTN的本地功能,并据此控制拨号音、电池电流和振铃电压的提供以及来自电话的环路闭合检测。当有控制信息输出时,驱动器将相应的电平写入SLIC芯片的C1、C2和C3引脚,以控制SLIC(具体值见表1)。可以按照SLIC的状态来划分,可以设置以下四种状态:fxs_ring、fxs_take、fxs_onhook、fxs_offhook。当处于fxs_ring状态时,可以为fxs接口提供拨号音、振铃等信号。当处于fxs_take状态时,表示用户刚刚摘机;当处于fxs_offhook状态时,表示终端用户是主动主叫,需要处理摘机后的操作;当处于fxs_onhook状态时,表示用户挂机。

因此,当SLIC有中断输入时,中断处理程序将根据当前状态进行判断。如果确定用户进行了摘机或挂机操作,则查询上一次硬中断后该路的SLIC。

电平,0为摘机状态,否则为挂机状态。中断的处理在这里更重要。其内容包括:中断源从哪个FXS端口发出,根据状态启动相应状态的定时器,以保证状态变化的时间间隔。

对于FXO接口程序,主要是模拟电话的功能,所以功能比较简单。程序中主要有三种状态:fxo_ring、fxo_onhook和fxo_offhook。当它处于fxo_offhook状态时,表示用户摘机。当它处于fxo_onhook状态时,驱动程序将把DAA芯片的

引脚拉高,表示用户挂机。因此,当有控制信息要输入时,它检测DAA码片。

引脚来判断,这里也要启动相应的定时器,来判断环路上是否有振铃电平或者环路上的振铃信号何时结束。当程序判断处于fxo_ring状态时,表示线路上有振铃信号,并进行相关处理。

(2)DSR控制模块和接口

DSR控制模块和接口主要实现用户对串行语音数据通信接口HSS和底层引擎NPE的控制。它不仅与上层应用程序交换信息,还提供上层应用程序和SLIC硬件之间的控制接口。和一般的设备驱动一样,主要包括DSR_open()、DSR_close()、DSR_read()、DSR_write()和DSR_ioctl()。DSR_read()和DSR_write()主要负责从DSR读取消息和向DSR写入消息。DSR_ioctl()主要负责控制DSR相关配置参数的读取和读取,并向底层SLIC控制模块发送SLIC控制信息。参数包括根据当前状态在C1、C2和C3管脚上写入相应的电平值,查询SLIC的当前工作状态信息,产生和停止SLIC的振铃信号等。DSR的相关配置参数包括DSR的DSP通道数、通道编码器的类型、编解码器输出的语音数据帧的大小等等。

(3)DSR数据模块

DSR数据模块主要实现内核与用户态之间的语音数据交互。包括从内核读取数据和向内核发送数据。为了有效地把握数据传输的节奏,需要建立内部缓存机制。包括从DSR读取数据并将其发送到用户模式应用程序和缓冲区,在缓冲区中用户模式应用程序将数据发送到DSR。缓存中的数据查询也会定期进行。但注意缓存不要太大,以免增加呼叫延迟。为了消除网络丢包造成的语音信息不完整的问题,DSR数据模块也建立了相应的机制对其进行控制。

用户应用程序主要运行在用户态,处理DSR模块和网络收发的语音数据和控制信令。通过编程实现了直拨内线、呼叫转接网、呼叫等待、三方通话等功能。对于底层呼叫平台,主要关心的是处理电话与IP网络的连接,需要以下接口:DSR控制接口、DSR数据接口和网络接口,实现对语音数据收发、呼叫信令收发和DSR控制消息收发的管理。

网络接口模块用于接收网络传来的数据,进行相关处理后通过DSR数据接口将压缩后的语音数据传送给内核进行处理,同时负责将DSR数据接口传来的压缩后的语音数据发送给网络。如果网络传来的数据是呼叫信令,那么具体的控制信息经过相关处理后通过DSR控制接口发送给内核,或者根据底层操作的内容通过网络接口发送相应的信令信息给网络。例如,给DSR的相关控制消息包括打开和关闭DSR编码和解码功能、打开和关闭输出到电话的电话信令音、打开和关闭检测用户的键盘拨号的功能。

2测试

为了确保当前系统能够正常工作,有必要对其底层功能进行测试。因为编码和压缩的语音数据由实时传输协议RTP传送,所以它主要以用户数据UDP包的形式接收和发送。从这个角度来看,电话手柄的麦克风收集的声音可以返回到同一个电话手柄的接收器。首先编写一个小程序,将麦克风采集的语音数据发送到网络,同时接受网络传来的数据,还原成模拟语音。假设网络上有一台IP地址为192.168.0.1的主机。它运行UDP数据包回送程序,负责将在互联网上收到的UDP数据包转发回源发送方。在开始测试之前,设置一些必要的控制信息,比如对方的IP地址,语音编解码模式等。将网线和麦克风线连接到网口和RJ11接口,拨打IP地址为192.168.0.1的主机的电话,查看麦克风MIC采集的声音是否能在电话手柄的听筒里听到。如果语音正确,说明底层功能已经实现。

基于IXP421的网络语音平台方案实现底层相关功能,而上层应用灵活,扩展性强,如VPN功能、多媒体业务等,需要开发相应的软件,本文不涉及。随着网络语音相关技术的逐渐成熟,相信会有越来越多的人从中受益。