写点什么

移动端短语音消息音频格式选择

用户头像
轻口味
关注
发布于: 1 小时前
移动端短语音消息音频格式选择

1. 移动端原生音频支持

1.1 android Supported media formats

https://developer.android.com/guide/topics/media/media-formats



1.2 Supported Audio File and Data Formats in OS X

https://developer.apple.com/library/content/documentation/MusicAudio/Conceptual/CoreAudioOverview/SupportedAudioFormatsMacOSX/SupportedAudioFormatsMacOSX.html

Allowable data formats for each file format.



Core Audio includes a number of audio codecs that translate audio data to and from Linear PCM. Codecs for the following audio data type are available in OS X v10.4. Audio applications may install additional encoders and decoders.



1.3 总结:

  1. android/ios 都可以对 mp3 解码,但不能编码,编码依赖 lame;

  2. android/ios 支持对 aac 进行编解码;

  3. mp3,aac 均是音乐编码器,android 支持对 amr 窄带与宽带编解码,ios 文档显示对窄带支持编解码,但有人说 ios4.3.x 版本之后不再支持 AMR,剔除了 AMR 的硬解,如需使用依赖 libopencore 库;

结论:

  1. h5 audio 标签对 mp3 支持最好(audio 标签除了 firefox 与 opera 都支持 mp3,ogg,wav;flash 播放器可以支持到 mp3,aac,speex,nellymoser),考虑对纯 web 的兼容性,使用 mp3;

  2. android,ios 硬件对 aac 支持最好,考虑硬编码的性能与效率,使用 aac;

  3. amr 是语音编码器,考虑使用场景,推荐 amr.

对比微信,微信短语音,6.0 之前用的 amr,6.0 之后用的 silk_v3.

2.音频基础概念

2.1 声音三要素

声音的特性可由三个要素来描述,即响度、音调和音色。

  • 响度:人耳对声音强弱的主观感觉称为响度。响度和声波振动的幅度有关。一般说来,声波振动幅度越大则响度也越大。当我们用较大的力量敲鼓时,鼓膜振动的幅度大,发出的声音响;轻轻敲鼓时,鼓膜振动的幅度小,发出的声音弱。音叉振动时发出的声波为单音,即只有一个频率成分。若设法将音叉的振动规律记录下来,可发现其振动波形为一正弦波。当用不同力量敲击某个音叉时,音叉发出的声波幅度不同,这意味着声音的响度不同。给出了两个声音波形,其幅度一大一小,幅度大的波形其声音响度大,幅度小的波形其声音响度小。另外,人们对响度的感觉还和声波的频率有关,同样强度的声波,如果其频率不同,人耳感觉到的响度也不同。

  • 音调:人耳对声音高低的感觉称为音调。音调主要与声波的频率有关。声波的频率高,则音调也高。当我们分别敲击一个小鼓和一个大鼓时,会感觉它们所发出的声音不同。小鼓被敲击后振动频率快,发出的声音比较清脆,即音调较高;而大鼓被敲击后振动频率较慢,发出的声音比较低沉,即音调较低。如果分别敲击一个小音叉和一个大音叉时,同样会感觉到小音叉所发声音的音调较高,大音叉所发声音音调较低。如果设法把大、小音叉所发出的声波记录下来,可发现小音叉在单位时间内振动的次数多,即频率高,大音叉在单位时间内振动的次数少,即频率低。给出了两个频率不同的声音波形,从声音可听出,频率高的声音波形听起来音调较高,而频率低的声音波形听起来则音调较低。

  • 音色:音色是人们区别具有同样响度、同样音调的两个声音之所以不同的特性,或者说是人耳对各种频率、各种强度的声波的综合反应。音色与声波的振动波形有关,或者说与声音的频谱结构有关。前面说过,音叉可产生一个单一频率的声波,其波形为正弦波。但实际上人们在自然界中听到的绝大部分声音都具有非常复杂的波形,这些波形由基波和多种谐波构成。谐波的多少和强弱构成了不同的音色。各种发声物体在发出同一音调声音时,其基波成分相同。但由于谐波的多少不同,并且各次谐波的幅度各异,因而产生了不同的音色。例如当我们听胡琴和扬琴等乐器同奏一个曲子时,虽然它们的音调相同,但我们却能把不同乐器的声音区别开来。这是因为,各种乐器的发音材料和结构不同,它们发出同一个音调的声音时,虽然基波相同,但谐波构成不同,因此产生的波形不同,从而造成音色不同。给出了小提琴和钢琴的波形和声音,这两个声音的响度和音调都是相同的,但听起来却不一样,这就是因为这两个声音的音色不同(波形不同)。

2.2 采样率和采样大小

声音其实是一种能量波,因此也有频率和振幅的特征,频率对应于时间轴线,振幅对应于电平轴线。波是无限光滑的,弦线可以看成由无数点组成,由于存储空间是相对有限的,数字编码过程中,必须对弦线的点进行采样。采样的过程就是抽取某点的频率值,很显然,在一秒中内抽取的点越多,获取得频率信息更丰富,**为了复原波形,一次振动中,必须有 2 个点的采样**,人耳能够感觉到的最高频率为 20kHz,因此要满足人耳的听觉要求,则需要至少每秒进行 40k 次采样,用 40kHz 表达,这个 40kHz 就是采样率。我们常见的 CD,采样率为 44.1kHz。光有频率信息是不够的,我们还必须获得该频率的能量值并量化,用于表示信号强度。量化电平数为 2 的整数次幂,我们常见的 CD 位 16bit 的采样大小,即 2 的 16 次方。采样大小相对采样率更难理解,因为要显得抽象点,举个简单例子:假设对一个波进行 8 次采样,采样点分别对应的能量值分别为 A1-A8,但我们只使用 2bit 的采样大小,结果我们只能保留 A1-A8 中 4 个点的值而舍弃另外 4 个。如果我们进行 3bit 的采样大小,则刚好记录下 8 个点的所有信息。采样率和采样大小的值越大,记录的波形更接近原始信号。

2.3 有损和无损

根据采样率和采样大小可以得知,相对自然界的信号,音频编码最多只能做到无限接近,至少目前的技术只能这样了,相对自然界的信号,任何数字音频编码方案都是有损的,因为无法完全还原。在计算机应用中,能够达到最高保真水平的就是 PCM 编码,被广泛用于素材保存及音乐欣赏,CD、DVD 以及我们常见的 WAV 文件中均有应用。因此,PCM 约定俗成了无损编码,因为 PCM 代表了数字音频中最佳的保真水准,并不意味着 PCM 就能够确保信号绝对保真,PCM 也只能做到最大程度的无限接近。我们而习惯性的把 MP3 列入有损音频编码范畴,是相对 PCM 编码的。强调编码的相对性的有损和无损,是为了告诉大家,要做到真正的无损是困难的,就像用数字去表达圆周率,不管精度多高,也只是无限接近,而不是真正等于圆周率的值。

2.4 频率与采样率的关系

采样率表示了每秒对原始信号采样的次数,我们常见到的音频文件采样率多为 44.1KHz,这意味着什么呢?假设我们有 2 段正弦波信号,分别为 20Hz 和 20KHz,长度均为一秒钟,以对应我们能听到的最低频和最高频,分别对这两段信号进行 40KHz 的采样,我们可以得到一个什么样的结果呢?结果是:20Hz 的信号每次振动被采样了 40K/20=2000 次,而 20K 的信号每次振动只有 2 次采样。显然,在相同的采样率下,记录低频的信息远比高频的详细。这也是为什么有些音响发烧友指责 CD 有数码声不够真实的原因,CD 的 44.1KHz 采样也无法保证高频信号被较好记录。要较好的记录高频信号,看来需要更高的采样率,于是有些朋友在捕捉 CD 音轨的时候使用 48KHz 的采样率,这是不可取的!这其实对音质没有任何好处,对抓轨软件来说,保持和 CD 提供的 44.1KHz 一样的采样率才是最佳音质的保证之一,而不是去提高它。较高的采样率只有相对模拟信号的时候才有用,如果被采样的信号是数字的,请不要去尝试提高采样率。

亨利·奈奎斯特(Harry Nyquist)采样定理:当对连续变化的信号波形进行采样时,若采样率 fs 高于该信号所含最高频率的两倍,那么可以由采样值通过插补技术正确的回复原信号中的波形,否则将会引起频谱混叠(Aliasing),产生混叠噪音(Aliasing Noise),而重叠的部分是不能恢复的.(同样适用于模拟视频信号的采样)

根据人声语音的特点,人类的听力感知范围是从 20Hz 到 20kHz。这个频宽范围被划分成四个频宽类别:窄带、宽带、超宽带和全带。



  1. 窄带(narrowband)普通电话所覆盖的频宽,从 300Hz 到 3.4kHz,对应采样率 6.8kHz。普通电话的采样率是 8kHz,对应频宽 4kHz,对于人声语音是足够的。

  2. 宽带(wideband)从 50Hz 到 7kH 的频宽,对应采样率 14khz,可以很好地捕捉和还原人声,然而对于音乐声还是不够的。这是在人声语音通话场景下的所谓高清语音。

  3. 超宽带(super-wideband)从 50Hz 到 14kHz,对应采样率 28kHz,基本可以覆盖人声和音乐声,对于非专业音乐人的用户来说,不管是人声通话还是音乐直播,这样的频宽都是足够的。

  4. 全带(fullband)从 20Hz 到 20kHz,对应 40kHz 采样率,全面覆盖人类的听觉范围,能够满足音乐发烧友或者专业音乐人的需求。超过 40Hz 都可以称作全带语音。CD 的采样率就是 44.1kHz。

因此,窄带(narrowband)的音质是能满足人声录制回放的。

从四个角度衡量音频编码:

  • 成本:开发成本,服务器流量成本

  • 音质:

  • 系统影响:对系统资源的暂用,软编解码器比硬编解码器占用更多 cpu

  • 兼容性:对移动端以及 web 端的兼容

适合产品场景的编码器具备以下四个特点

  • 码率相对低,满足成本可控的要求,一般不要超过 16kbps。一个 sample 用 1bit 就能编好,那么 8kHz 采样率(narrowband)对应 8kbps 的码率,16kHz 采样率(wideband)对应 16kbps 的码率。码率的本质就是成本。

  • 算法复杂度要比较低,对系统 CPU、内存和电量消耗少,对系统影响要尽量低。

  • 音质可以适当作出牺牲,以保障上面三个因素,8kHz 采样率对人声场景是够用的,16kHz 采样率可以提供高清语音。

  • 兼顾兼容性

3.主流音频编码器

音频编码格式的比较:https://zh.wikipedia.org/wiki/%E9%9F%B3%E9%A2%91%E7%BC%96%E7%A0%81%E6%A0%BC%E5%BC%8F%E7%9A%84%E6%AF%94%E8%BE%83

下图列举一组主流的音频编解码器,展示了随着码率变化,音质相应变化的情况。这是基于编解码器听音测试的结果绘画出来的,对选取音频编解码器有参考意义。根据上面的分析并且参照下图,发现码率低于 16kbps 的低码率人声编解码器(speech codecs)包含:Opus(SILK),Speex,AMR-NB,AMR-WB,和 iLBC。



下图是另外一组主流的音频编解码器,展示了随着码率的变化,算法延迟时间相应变化的情况。根据上面的分析并且参照下图,发现算法延迟时间低于 60 毫秒,码率低于 16kbps 的人声编解码器(speech codecs)包含:Opus(SILK)、Speex(NB,WB)、G.729、和 G.729.1。



从图中我们可以获得如下几方面信息:

  • 对于固定码率的编码标准:如 G.711 或者 G.722,图中采用单点表示,说明这两个编码标准是固定码率编码标准。其他如 Opus、Speex,它们的曲线是连续的,说明这类编码标准是可变码率的编码标准。

  • 从频带方面看:G.711、G.722、AMR 和 iLBC 等标准适用于 narrowband(8khz 采样率)和 wideband(16khz 采样率)范围,针对普通的语音通话场景。AAC 和 MP3 适用于 fullband(48khz 采样率)范围,针对特殊的音乐场景。而 Opus 适用于整个频带,可以进行最大范围的动态调节,适用范围最广。

  • 从标准的收费情况看:适用于互联网传输的 iLBC、Speex 和 Opus 都是免费且开源的;适用于音乐场景的 MP3 和 AAC,需要 license 授权,而且不开源。

综合上面的两个图,我们可以大致总结,比较适合人声短语音的音频编解码器包含 Opus(SILK)、Speex(NB,WB)、AMR-NB、AMR-WB、iLBC、G.729、和 G.729.1。



短语音不同于实时语音,可以忽略延迟

上面都是为人声场景设计的低码率音频编解码器,具有码率低(16kbps 以下),算法延迟低(大部分在 40ms 以下),和采样率在 8kHz 和 16kHz 之间的特点,都可供短语音编码方案选择。其中,有几个语音编解码器值得在这里稍作介绍:

Opus(SILK)

https://en.wikipedia.org/wiki/Opus_(audio_format)

完全开源而且免费,包含了 SILK、CELT、以及两者的混合模式,是目前最为兼容并包的音频编解码器。在处理窄带和宽带人声语音(speech)的时候,采用 SILK; 在处理超宽带和全带音乐声音(music)的时候,采用 CELT。在人声和音乐声混合的场景中,甚至可以智能切换两个编解码器。WebRTC 就采用了 Opus 作为语音编解码器。而 SILK 是 Skype 网络电话所用的语音编解码器。Opus 真可谓是久经考验的名门精品。根据即构科技的测试结果,Opus 虽然在音乐场景中表现并非首选,但是在人声场景中表现十分出色。

iLBC

完全开源而且免费的,由 GIPS 开发并被 IETF 标准化,曾经被 QQ 和 Skype 使用过,现在被 WebRTC 使用,是被世界顶级产品证明过的窄带实时语音编解码器。iLBC 能够通过平滑降低语音质量的方式来处理 IP 网络丢包。由于 iLBC 的语音帧块之间是相互独立的,在丢帧出现的时候也不会导致错误蔓延,因此具有较强的抗丢包能力。在窄带应用环境中,iLBC 具有延迟低,无断续或杂音的特点,通话效果可以和移动电话媲美。

Speex

免费的人声音频编解码器。因为 Speex 是为 VoIP 专门设计的,所以 Speex 对 IP 网络有很强的抗丢包能力。为了达到这个目的,Speex 采用了 CELP 算法。市场上狼人杀产品的游戏实时语音技术,厂商自研的方案采用了 Speex。

Codec2

开源并且专利免费,码率超低的人声语音编解码器。码率在 0.7 kbps 至 3.2 kbps。Codec2 填补了开源编码器在 5 kbps 码率以下的空白。


评估音频编码指标,除码率、采样率、和算法延迟以外,还要参考 MOS、VBR/CBR、和基础算法等。其中,MOS (Mean Opinion Score)是语音编解码器的主观评估指标。MOS 是一个广为接受的有统计意义的主观听音指标。上面音视频编解码器的列表没有把它包含进去,是因为同一个编解码器,在不同码率下,表现出来的 MOS 值是会变化的。对一个音频编解码器给出一个固定的 MOS 值,反而会起误导的作用。另外,虽然 MOS 值已经是主观的听觉测试评估结果,但是音频工程师在选用音频编解码器的时候,还要以自己亲身的听感作为最终的依据。

下图是 Nokia 在 2011 年的时候对 Opus、AMR、和 G.722.1C 等音频编解码器在无噪音和有噪音的环境里做的 MOS 语音测试的结果。我们可以从语音测试的结果看出:

1)MOS 值会随着码率变化。固定的 MOS 值并没有绝对的参考意义。

2)在低码率情况下,AMR-NB 和 AMR-WB 都表现相对出色。




参考:

1.Getting Started with Audio & Video:https://developer.apple.com/library/content/referencelibrary/GettingStarted/GS_MusicAudio/_index.html

2.Opus ios:https://github.com/chrisballinger/Opus-iOS

3.android opus:https://gitlab.com/axet/android-opus

4.opus_android:https://github.com/louisyonge/opus_android

5.opuscodec:https://github.com/martoreto/opuscodec

6.与大家讨论如何用 opencore amr 在 iOS 上 decode:https://blog.csdn.net/devday/article/details/6804553


7. ios 支持https://developer.apple.com/library/archive/documentation/MusicAudio/Conceptual/CoreAudioOverview/CoreAudioEssentials/CoreAudioEssentials.html#//apple_ref/doc/uid/TP40003577-CH10-SW13

用户头像

轻口味

关注

100位签约计划优质创作者 2017.10.17 加入

Android音视频、AI相关领域从业者

评论

发布
暂无评论
移动端短语音消息音频格式选择