前言

RTC(实时音视频通信)技术的快速发展,助力了直播、短视频等互动娱乐形式的普及;在全球疫情持续蔓延的态势下,云会议需求呈现爆发式增长,进一步推动了 RTC 行业的快速发展。为了给客户提供稳定可靠的服务,网络系统方面需要不断提升频道连通率,降低会议过程中的断流率,增强抗弱网能力;视频方面需要提升视频清晰度,降低视频卡顿率等,音频方面在追求端到端 MOS 的同时,也要重点关注音频 3A 算法的效果,这些都是各厂家必须修炼的 “内功”,也是最终沉淀下来的核心竞争力。本文将重点阐述硬件设备采集的音频质量对 RTC 端到端音频体验的重要性。

采集质量不佳,会有什么影响?

在 RTC 架构中,端到端的音频信号处理流程大致如下图,上行分别经过了音频信号的采集,音频 3A(AEC: 回声消除、ANS: 自适应降噪和 AGC: 自动增益控制)和编码;下行分别经过丢包恢复,解码,混音和播放。



端到端的音频信号处理流程

不难看出,音频信号经过模数转换,再经过设备集成的音频信号处理芯片,最后才传递给 RTC SDK。由于硬件厂商的不同,音频采集解决方案参差不齐,因此采集到的音频质量的好坏直接影响着 3A 算法拿到的生产资料的可用性,同时也决定这最终用户接收到音频信号质量的上限。根据实际工作中遇到的音频问题,因为设备采集引起的问题基本可以归纳为如下几类:

举几个例子:

(1)采集异常

采集异常主要体现在频谱 “模糊”,严重的会导致无法听懂语义,影响正常交流。如下语谱图。

另外,采集异常后,播放的信号被麦克风采集后也会表现出异常,从而引起严重的非线性失真,影响回声消除效果,如下图。

(2) 采集抖动

常见的就是采集丢数据,听感上会听到有很多高频噪点(下图为上图中噪点放大后的局部图),严重的会影响 AEC 算法中对延时估计准确性和远近端非因果问题,严重的会导致漏回声。

(3)爆音和音量小问题

采集爆音问题主要发生在 PC,也是 PC 端设备最应该避免的问题,影响较大,除了截顶导致的频谱失真之外,严重的非线性失真会影响回声消除效果。爆音问题需要 AGC 算法通过自适应调节 PC 端模拟增益以及麦克风加强解决。

(4)频谱缺失

频谱缺失主要是硬件回调的音频采样率与实际的频谱分布不一致,即使编码器给到很高的编码码率,听感上也没有高音质的效果,如下图,采集信号采样率为 48kHz,但是频谱上限却只有 8k。

改善采集音质,硬件层面我们能做什么?

具备 RTC 能力的硬件设备早已渗透我们生活的方方面面,常见的如移动端手机和 PC,现在甚至连儿童电话手表,天猫精灵以及各种高端的指纹密码锁等设备都支持了 RTC。然而,设备的多样性直接决定这采集能力的差异性,抛开声学元器件设计差异这一因素,就 Android 端而言,芯片和软件系统的差异使得同一品牌的手机,也没办法用同一种配置适配所有型号的手机。

另外,现在绝大多数的移动端设备都自带硬件音频信号处理(后称硬件 3A)能力,不同芯片效果方面也是千差万别的同时,更严重的是经过硬件处理的音频信号频谱往往会有缺失,如开启硬件 3A 后回调到 RTC SDK 的音频信号频谱上限仅支持到 8k,相当于 16kHz 采样的音频信号,尤其在娱乐方面根本无法满足我们对高音质的追求。因此,做好硬件层的适配工作,是保障 RTC 高质量音频体验的基础。

Android 端

(1)需要搞清楚 javaaudioclass 和 opensles 这两种模式的差异,以及各自需要适配的参数,掌握关闭硬件 3A 的配置。

(2)采集抖动或音频音量异常,可以试试更改请求的采样率,通常设置的 48k 采样不会适用于所有的 android 设备。

Windows 端

(1)当前很多 Windows 设备会在屏幕顶端内置麦克风阵列,提供音频增强功能,开启方式如下图。这个功能默认屏幕正前方夹角区域为拾音区域,通过麦克风阵列技术可以有效的增强拾音区域内发言人语音,“隔离” 拾音区域以外的 “噪声”,其主要的弊端就在于开启此功能后仅支持 8k 频谱,且各厂家增强算法存在差异,效果也参差不齐。因此,软件需要具备能够 bypass 硬件自带音频增强功能的能力,为高音质做保障。



Windows 设备自带的双麦阵列(图片来源于网络)



音频设置中的增强功能开关



开启音频增强后,带来的频谱缺失

(2)音量方面,PC 端设备都支持模拟增益调节,大多数带有阵列的 Windows 设备都有额外的麦克风加强(如下图)。软件算法层面(3A 中的 AGC)需要具备自适应调节他们的能力,保障音频采集音量的平稳以控制采集底噪水平。初值设置或自适应调节不当都会导致音量小和爆音等问题,严重的会影响回声消除和降噪的效果,带来影响可用性的风险。



模拟增益与麦克风加强

苹果设备

(1)ios 端适配工作较少,需要熟悉关闭硬件 3A 的配置,因为 ios 设备自带的硬件 3A 频谱也只能支持到 10k-12k。

(2)Mac 笔记本设备比较简单,仅提供了模拟增益调节。但是有一点需要注意,RTC 在支持双声道播放时,由于麦克风会与某个扬声器在同一侧,导致播放音频时附近的麦克风采集爆音问题,一般只能优化软件 AEC 算法解决。

总结

当 48k 高音质成了刚需,为了保障采集环节的高质量,一方面需要投入时间去掌握 Android 参数适配的规律,同时市面上出现的越来越多的定制化的 android 设备(手表,智能音箱等),也必不可少的需要先确定好配置参数;另一方面关闭硬件设备自带的音频处理功能,启用 RTC 自带的纯软 3A 算法也是一种趋势,前提是要优化好软件 3A 算法整体效果以及控制好功耗,这也是客户评测各厂家之间音频体验的必测项,也是各厂家的核心竞争力之一。

「视频云技术」你最值得关注的音视频技术公众号,每周推送来自阿里云一线的实践技术文章,在这里与音视频领域一流工程师交流切磋。公众号后台回复【技术】可加入阿里云视频云产品技术交流群,和业内大咖一起探讨音视频技术,获取更多行业最新信息。

提升 RTC 音频体验 - 从搞懂硬件开始的更多相关文章

  1. 真正“搞”懂http协议01—背景故事

    去年读了<图解HTTP>.<图解TCP/IP>以及<图解网络硬件>但是读了之后并没有什么深刻的印象,只是有了一层模糊的脉络,刚好最近又接触了一些有关http的相关内 ...

  2. 搞懂分布式技术28:微服务(Microservice)那点事

    搞懂分布式技术28:微服务(Microservice)那点事 微服务(Microservice)那点事 肥侠 2016-01-13 09:46:53 浏览58371 评论15 分布式系统与计算 微服务 ...

  3. 搞懂分布式技术9:Nginx负载均衡原理与实践

    搞懂分布式技术9:Nginx负载均衡原理与实践 本篇摘自<亿级流量网站架构核心技术>第二章 Nginx负载均衡与反向代理 部分内容. 当我们的应用单实例不能支撑用户请求时,此时就需要扩容, ...

  4. iOS 用RunTime来提升按钮的体验

    用RunTime来提升按钮的体验 载请标明出处:http://blog.csdn.net/sk719887916/article/details/52597388,作者:Ryan 经常处理按钮问题都是 ...

  5. (转)从一道面试题彻底搞懂hashCode与equals的作用与区别及应当注意的细节

    背景:学习java的基础知识,每次回顾,总会有不同的认识.该文系转载 最近去面试了几家公司,被问到hashCode的作用,虽然回答出来了,但是自己还是对hashCode和equals的作用一知半解的, ...

  6. c#代码 天气接口 一分钟搞懂你的博客为什么没人看 看完python这段爬虫代码,java流泪了c#沉默了 图片二进制转换与存入数据库相关 C#7.0--引用返回值和引用局部变量 JS直接调用C#后台方法(ajax调用) Linq To Json SqlServer 递归查询

    天气预报的程序.程序并不难. 看到这个需求第一个想法就是只要找到合适天气预报接口一切都是小意思,说干就干,立马跟学生沟通价格. ​ ​不过谈报价的过程中,差点没让我一口老血喷键盘上,话说我们程序猿的人 ...

  7. 机器学习:让我们彻底搞懂CNN【转】

    本文转载自:http://115.com/182920/T1266078.html 机器学习:让我们彻底搞懂CNN 上世纪科学家们发现了几个视觉神经特点,视神经具有局部感受眼,一整张图的识别由多个局部 ...

  8. 搞懂分布式技术21:浅谈分布式消息技术 Kafka

    搞懂分布式技术21:浅谈分布式消息技术 Kafka 浅谈分布式消息技术 Kafka 本文主要介绍了这几部分内容: 1基本介绍和架构概览 2kafka事务传输的特点 3kafka的消息存储格式:topi ...

  9. 搞懂分布式技术10:LVS实现负载均衡的原理与实践

    搞懂分布式技术10:LVS实现负载均衡的原理与实践 浅析负载均衡及LVS实现 原创: fireflyc 写程序的康德 2017-09-19 负载均衡 负载均衡(Load Balance,缩写LB)是一 ...

随机推荐

  1. 微信小程序的发布流程

    一.背景 在中大型的公司里,人员的分工非常仔细,一般会有不同岗位角色的员工同时参与同一个小程序项目.为此,小程序平台设计了不同的权限管理使得项目管理者可以更加高效管理整个团队的协同工作 以往我们在开发 ...

  2. 基于jpa的specification实现动态查询

    spring data jpa为我们实现简单的crud操作提供了极大的方便.但大部分情况下,系统中都存在大量的动态查询操作,这个时候就可以借助spring data jpa的 Specificatio ...

  3. hdu 3635 Dragon Balls(并查集)

    题意: N个城市,每个城市有一个龙珠. 两个操作: 1.T A B:A城市的所有龙珠转移到B城市. 2.Q A:输出第A颗龙珠所在的城市,这个城市里所有的龙珠个数,第A颗龙珠总共到目前为止被转移了多少 ...

  4. JAVA笔记14__多线程共享数据(同步)/ 线程死锁 / 生产者与消费者应用案例 / 线程池

    /** * 多线程共享数据 * 线程同步:多个线程在同一个时间段只能有一个线程执行其指定代码,其他线程要等待此线程完成之后才可以继续执行. * 多线程共享数据的安全问题,使用同步解决. * 线程同步两 ...

  5. spring mvc 原理(快速理解篇)

    这两张图大家应该都不陌生. 从图上来看就是:一个请求过来,front controller根据具体的请求路径分派到具体的controller,具体的controller处理请求并把处理结果返回给fro ...

  6. Vue&Element开发框架中增加工作流处理,工作流的各个管理页面的界面处理

    我在起前面的几篇随笔中,大概介绍了工作流的一些场景化处理,包括如何把具体业务表单组件化,并在查看和编辑界面中,动态加载组件内容,以及对于查看申请单的主页面,把审批.取消.发起会签.会签.批示分阅.阅办 ...

  7. IP基础 & 子网划分 & 路由寻址

    IP地址详解 IP地址概念 就像用身份证号码来区别毎个人一样,为了区别 网上的每台计算机,我们给因特网上的每一台计算机一个唯一的编号 ,我们把它称为IP地址 IP地址就是一个唯一标识 ,是一段网络编码 ...

  8. Qt 隐藏标题栏后实现窗口拖动、设置窗口透明

    隐藏标题栏 setWindowFlags(Qt::CustomizeWindowHint); setWindowFlags(Qt::FramelessWindowHint); 两个函数都可以去掉标题栏 ...

  9. 【Python+postman接口自动化测试】(8)以青云客机聊天器人和图灵聊天机器人接口示范python发送get和post

    以青云客机器人和图灵机器人接口示范python发送get和post 发送请求,我们这里主要使用Python的一个第三方包(需要先安装):requests. Python3自带的http.client和 ...

  10. springboot注解之容器功能

    添加组件 @Configuration.@Bean //以swagger为例 @Configuration(proxyBeanMethods = false) @EnableSwagger2 //使用 ...