现在的位置: 首页 > 综合 > 正文

iOS即时语音聊天技术实践

2013年10月15日 ⁄ 综合 ⁄ 共 5292字 ⁄ 字号 评论关闭

CMDN Club第十五期活动已于3月15日顺利举行,本次活动以“移动平台语音技术的应用与实践”主题,以语音技术开发为焦点,从语音基础服务、语音产品开发、语音技术实现等多个维度,探索语音产品创新和技术实践的热点话题。我们邀请了北京爱图腾科技高级iOS开发工程师张天虹,为大家带来iOS即时语音聊天技术实践演讲。

图:北京爱图腾科技高级iOS开发工程师张天虹在做演讲

以下是文字实录:

张天虹:大家好我是来自爱图腾的张天虹,大家可能对爱图腾有些人比较熟悉,有些人比较陌生,爱图腾是主要以移动外包为主的一个公司,我们的特点是比较开放,因为我们在平时开发中包括我们开发人员、设计人员还有一些各种平台开发的时候一些人员他们在技术方面都是共享的一个思想,包括你可以去我们官方博客上可以看到,我们的很多实现一些技术的实现我们已经贴到博客上了大家可以讨论。还有我们公司每周五下午都有一个技术交流会,之前我们也告诉大家可以到我们公司一起去研究这些技术、一起讨论、一起踢馆现在也可以去,每周五下午都可以去看一看。(主持人:我补充一下,爱图腾也是工程式文化的公司,所以我们可以从爱图腾里面淘出又会技术又可以有这样人出来,所以很鼓励自己公司可以在自己公司内部以合作的方式有这样的技术分享,无论是博客或者是线下活动。)

DEMO介绍:主要就是一个功能,我不知道效果好不好,因为这个跟网络有关。现在可以看看效果,这就是IPHONE4S手机,我做这个DEMO就是这个,我们按住录音发送出去,它可以根据我声音的大小,我放手之后这个语音就发出去了,因为这是受网络的限制,我不知道效果好不好。因为这个跟网络有关,因为我们数据发出去以后。大家可以说一下结果是什么?他说话可以在上面就跟我们平时播放的米聊一样的效果。我们看完了这个DEMO之后,大家已经知道它的基本功能了,我们知道DEMO实现功能第一是录制,录制完了之后通过网络发送到服务器,然后服务器把这个语音传回来之后,到另外一台设备上进行播放,知道这个之后我们看看它是怎么去实现的。

从技术上讲主要就是录音:把录音文件发到服务器,再从服务器传到另外一个设备进行播放,这个过程是非常简单的,但是考虑一个问题就是要适合网络传输,因为网络是特别脆弱的,不管是发的时候还是收的时候它会占到我们手机的流量,这个流量是大家比较关心的,因为这个网络确实太贵了,为了便于网络传输我们进行一个压缩和解压的过程,知道这个过程之后,我们可以进入我们iOS平台要讲的东西。第一个是语音录制、语音编解码、语音播放,还有Audaio Session还有语音实践。

这个项目开发中会有加密和解密这些东西,我们现在就不提它了,我们现在看看语音的录制,在语音录制里面我们会讲哪几个,我们比较想了解就是IOS里面录制哪些语音格式,还有我们的API怎么去使用,还有录制的音量怎么样,录制的时候波浪会随着我们声音大小变换,这个是IOS也支持的。

我们看看iOS支持默认语音录制格式,他支持的格式不是很多,很多我们想要可能没有,但是我们可以给大家介绍基本的格式它是支持的AAC压缩比较高,效果比较好。还有ALAC,还有ILBC,这个用于网络传输的一个语音格式。IMA4这是一个压缩效率很高,但是各方面因为效率高了,可能别的算法、复杂度可能降一点,要求效率比较高考虑这种格式,还有LINEAR PCM,这个是无压缩的,还有U—LAW和ALAW。

我们知道它默认的语音格式之后,就看看它怎么去录制,我们这里面有一个很简单的类叫AVAudioRecorder,设置录音的目标文件,还有设置录音的文件信息,录音方式很多种,得到格式也有很多种,在初始化的时候可以设置一个录音的基本信息,包括录音格式,这里面在API里面提供了很多格式支持,比如说PCM,以及刚才所提到的支持的格式都可以放到这个里面可以生成。还有录音采样率,还有录音通道有单通道和双通道,还有线性采样位数,这是我们可以根据我们的需要设置。

我们知道我们想要录音的设置之后,我们实例AVAudioRecorder,创建录音文件,准备录音,开始录音。我们先创建再录音这样效率更高一些。

这是整个录音的过程,受到指定任何一个本地文件,苹果比较建议是放在TEMP文件里面,然后还有是录音的设置,这里可以设置录音格式,就是PCM的录音格式,采用率,通道数还有位数,我们把这几个参数传进去创建录音文件,录音就这么简单,我们录音一个过程就可以实现了。苹果的API比较规范的,很简单就可以达到我们想要的效果。

录音:录音的时候捕捉话筒的音量,可能大家没看的很清楚,就是话筒音量大要的播放,我们这个也很简单,MeteringEnabled,也是属于CODER的方法,很简单通过两个方法拿到这段时间一个音量的平均值,以及音量的峰值,这两个值出来以后音量很显然出来了。这是我们录音时捕捉音量的方式。

还有就是面向音频流的录音方式。因为面向音频流不是你录的时候直接生成一个文件,你想边录制边传输就可以面向音频流录制这个文件,这个不细讲了,因为这里面内容很多,你们可以上苹果里面下一个SPEAKhereDemo。我们可以一起交流它怎么去使用,它的原理是什么,我们如果灵活用它,也可以实现很多很强大的功能。

录完了声音,刚才我们只是说把录音录完了生成一个文件过程,这时候我们想把通过文件的方式发出去就要进行云的编解码,我们看一张图,这张图展示了从录音到最后保存到硬盘文件的过程,录音它最先录制成PCM的格式,再转成AAC,中间经过CODEC这里面就是一个编码解码器主要作用是对音频信号进行压缩和解压缩。我们讲讲它一个基本过程,首先从话筒里面录制PCM出去,这个CODEC把PCM转换成AAC格式,把AAC写成硬盘文件,就三步就可以达到一个效果,中间一个CODEC起到转码的过程,就了解到它怎么录出数据格式的办法。

刚刚讲CODEC,重点转移到CODEC里面,这个CODEC我们在录制的声音可能很多我们想要的声音并不是IOS支持的,我们看看IOS支持的这些CODEC,包括我们刚刚提到这些格式这是默认的CODEC,而我们在平时的应用中或者说开发中可能我们想要提供更加广泛的比如说MP3、WMA、MIDI、OGG、Speex可能大家之前不了解,但是我们今天了解一下到底是什么样的语音格式。我们想要录制这些格式,但是IOS没有默认支持的CODEC,怎么办呢?我们可以用开源的CODEC,因为CODEC是一些服务商提供的,他可能是收费的,我们这里可以看看哪些开源的CODEC可以使用,它的工程在网上有很多开源的厂商提供了都是免费的,我们看Speex。

Speex是一个压缩比较好的、便于网络传输的,而且有一些降噪的功能,这个就是说他比较适合的语音聊天,还有LAME这个格式,还有苹果的Lossless,这是去年年底才开源一个项目,这是苹果无损压缩的CODEC。还有FLAC这个是免费的无损CODEC,还有LBC也是适合于网络传输的CODEC。

我们下载到CODEC以后这时候有一个比较难的技术门槛,有了CODEC以后我们怎么编程我们IOS连接库呢?因为要用PCM,要拿到链接库,这就需要编译了,我们先了解Xcode,我们Xcode为了让我们支持更好的IOS设备,比如说IPHONE2或者3,更低版设备我们就需要更多的处理器架构。首先我们看Xcode需要哪些处理架构呢?I386、ARMv6、ARMv7。我们知道这个处理架构以后,我们就要编译我们的CODEC,首先编译一个适合I386的CODEC,还有V6、和v7的,我们编译好了以后才能拿来具体使用。编译的方式我再跟大家提一下。

我们有了编译好的链接库以后就可以使用CODEC编码器和解码器。编码过程是这样的,首先录制完了以后,因为我们想录制成为我们自己的CODEC地所以我们默认为PCM文件,PCM在IOS录制出来是一个WAV的文件格式,因为它不仅是一个数据,还要成为一个文件在我们播放器里播放的。我们看WAV格式,我们可以看到在网上可以搜到资料,这里面的数据结构有很多块信息,但是我们最后可以了解到,我们真正需要的是这个块数据,我们通过数据格式最后拿到这个,我们知道数字结构以后我们可以拿到采样数据,这个我相信大家知道一点,知道怎么去拿,不知道也可以线下交流一下。然后我们拿采样数据已经扣上了,压缩成我们想要的目标格式。最后我们压缩的数据格式还不行,因为我们录制好的格式不光是用设备传输,可能我们还用别的平台,比如说IPHONE给ANDROID传送的文件,因为不知道压缩是什么东西,这时候加一个文件结构,我们重新组装压缩后的文件结构,这样别人才知道我压缩后的文件是什么格式。这是一个编码过程。

这个编码完成之后,我们就可以把这个数据放在另外一个设备了,编码结束了。别人拿了数据以后肯定考虑播放了,这个数据怎么处理之前我们先讲讲IOS播放怎么实现,IOS支持播放的格式,跟录音的格式是差不多,只是多了一个MP3和ILBC的格式,多了MP3解码的一个支持。我们看看播放怎么用,相对录来说播放简单多了,首先这个传输的值可以从文件里面提取过来的数据就可以了,然后准备播放开始播放,就可以播放出来了,很简单。

AAC文件播放过程是怎么做的?首先跟录音过程是相反的,首先是解码,解码放到里面播放,读取AAC,播放PCM文件。

知道播放原理以后,把我们刚才那多的CODEC到另外一个客户端去解码,解码怎么办呢?这就是我们拿到一个数据,刚才编码完成的数据是这样的,发过来数据就应该这样的,我们的解码过程中又需要把这个信息去掉了,因为我们只需要解码中间的数据而不需要解析文件具体的结构,而是关心编码后的数据,这个也很简单,CODECDecode的方法,因为PCM最后格式是WAVE文件才能播放。这是一个解码的过程。

整个过程大家应该了解了,我们想要用自己的一个CODEC录音播放的过程。下面了解一下AUDIO Session。AUDIO Session是IOS中用于处理应用,比如说如何处理多个应用的音频输出,比如说我听APPLE,这时候开启另外一个应用,另外一个也有声音的播放,这个时候怎么处理呢?还有我们在锁屏情况下我们的应用和播放声音这时候我锁屏了,还有我把音量键关到最小的时候有一些应用就不让关,即使你玩游戏音量键也关不了。还有就是是否在应用里面支持录音,还有是否支持语音的播放。AUDIO Session是管理这些过程的,我给大家一个比较直观的图,我这个应用,这是飞机一个控制台应用,首先第一架飞机正在飞,就是正在播放声音,另外一个应用说我也要播放声音了,这时候控制台把它记录下来说它要播放声音了,这个SPEAKHERE说也要播放声音了,就是告诉控制台,我AUDIO
Session要播放声音了,那控制台就告诉SpeakHere关闭声音。

应用中可以设置的几种音频模式:你声音调到静音以及锁屏的情况下声音是否播放,另外一个情况就是我这个应用在使用的时候,是否支持别的应用,同时在使用这个声音。还也就是我这个应用是否支持声音的录制或者播放,还有不同的组合,我们在应用里面就是说我在锁屏情况下不允许播放声音,或者可以播放声音。它怎么使用呢?看看最下面这一行代码,我们设置它一个模式就可以了,也是一句话事情,用起来非常方便。

我们讲完了AUDIO Session,下面具体讲讲我们刚才的DEMO是怎么做的?首先跟我们刚才讲的过程是一样的。

第一步要去下载Speex的CODEC,它的网页里面可以下载下来了,下载下来是一个C的工程,这时候我们编译适合我们Xcode开发的一个Speex CODEC LIB就是开发库。这里举一个例子在我们编译一个基于模拟器的DEMO怎么做,我们可以直接在这里打包Host和build,就可以了。将LIBSpeex.A引入Xcode开发环境中,这个设置要非常细心,指定好头文件,指定好了以后,我们可以引入Speex.H文件。

我们有了我们文件库以后,获取录制的PCM文件的音频数据把这个代码提取出来,就是采样的文件提取出来,这个过程可能相对繁琐一点,只要找到这个块就可以把采样数据拿到。拿到这个采样数据以后我们才对它进行一个编码。Speex一个编码的函数,这种方法是基于帧的,并不是一个文件一个文件处理,而是定一个帧的长度基于帧的编码为你想要的一个Speex格式,最后Speex添加Speex文件的头信息,然后通过Socket发送Speex文件数据到服务器,服务器传到另外一台设备,设备接受为Speex文件并解码为PCM音频数据。这个Speex还有很多很多的功能,包括录制之前的设置和降噪都可以设置。通过解码将PCM数据恢复为WAVE文件格式,可以播放这个文件。今天讲主要是这么多。

线下希望共同的交流包括技术上的问题,因为我看现在语音发展特别快,我看讯飞和UC做的非常好了,非常人性化,包括这方面的技术到底怎么去实现和解决的技术交流,我们可以一起交流,不管是微博各种平台都可以交流,谢谢大家。

抱歉!评论已关闭.