在上一期课程《音视频开发进阶课程|第二讲:回声消除》中,我们接触了音频前处理的概念,还认识了音频前处理的三剑客之一 AEC 回声消除。今天,我们继续来认识三剑客中的第二位:噪声抑制 ANS (Ambient Noise Suppression)。

经常被卷入在线会议的你,想必也曾抱怨过:“太嘈杂了,什么都听不清”、“周围比较吵闹,需要换个安静的地方”。这里导致“嘈杂”和“吵闹”的罪魁祸首,就是无所不在的噪声。噪声问题和回声问题一样,严重影响音视频场景下的用户体验,是所有开发者绕不开的槛。想要解决这个问题,“换个安静的地方”固然有效,但未免太原始且不够优雅,我们需要剑客“噪声抑制”的帮助。

一、什么是 RTC 场景下噪声

剑客“噪声抑制”,顾名思义是来帮助我们解决RTC场景的噪声问题的,想要好好认识它,第一步,就是要了解什么是噪声?

相较于回声,噪声在我们日常生活中更常见,比如办公室空调电机的低吼、隔壁装修电钻的轰鸣、机场飞机起降的呼啸、市场商贩的叫卖等等,可以说所有影响了我们正常的工作、学习、休息的声音都是噪声。所以噪声的定义没有那么严格,实际上除了“有用”的声音外,其他所有“无用”的声音都可以算是噪声,只不过不同的场景对于“有用”和“无用”的定义不同。

在 RTC 场景下,最基本的需求是保证语音沟通的质量,所以“有用”的声音一般指人说话的语音,而除了人声语音之外的其他信号,就可以算作“无用”的噪声。这些“无用”的噪声,根据它们随时间变化的特性,又可以分为两类:稳态噪声和非稳态噪声。

稳态噪声关键在稳。指的是那些在时间上连续、持续,且幅度和频谱等信号特征稳定或者变化缓慢的噪声。比如空调声、风扇声等,听起来是持续、平稳的“嗡嗡嗡”。

非稳态噪声是相对于稳态噪声而言的,它的信号特征不稳定,随时间变化的幅度较大,或者有间断出现、瞬发的情况。比如菜市场里嘈杂的人声、键盘的敲击声、关门声、烟花炮竹声等等,它们或是持续存在但变化不停,或是瞬发的、短暂存在后就消失。

稳态噪声相较于非稳态噪声,在抑制难度上更低,抑制方案也更成熟。而非稳态噪声则是音视频开发者的大难题,对非稳态噪声的抑制效果,是检验剑客能力重要指标。

需要强调的是,我们今天讨论的噪声,无论是稳态还是非稳态,都是相对于“有用的声音”(人声)的加性噪声。加性噪声和人声不相关,人声的存在与否不影响加性噪声的存在性,它们的混合信号可以通过相加得到。

注:那些因人声的存在才存在、通过“有用的人声”变化而来的噪声,比如房间混响,它们与人声满足“乘性关系”,不在今天的讨论范围内。

二、噪声抑制原理解析

已经认识了什么是RTC场景下的噪声,以及它的简单分类,接下来我们牵手“噪声抑制”,“真枪实弹”地处理它。第一步,要了解噪声抑制的基本原理。

1、噪声抑制原理的简单理解

​编辑

回想一下,我们在上一篇课程中学习的,回声消除的关键工作:使用待扬声器播放的远端参考信号,估计出回声信号,在麦克风采集的混合信号中将回声信号减去,保留近端语音。这一过程,只需要稍作调整就可以对应到噪声抑制上:估计出噪声信号,并将之从麦克风采集的混合信号中除去,得到降噪语音信号。如上图所示,稳态或非稳态的“加性噪声” B,和“有用信号”语音 A 相加,形成了混合的带噪语音 C1,经过 ANS 模块的处理后,最终输出降噪语音 A1。

即:

C = A + B

A1 = C - B1

虽然核心工作也就短短一句话,但其中玄机不少。传统 ANS 算法的核心工作可以拆解为两个模块:噪声估计模块 + 噪声滤除模块

​编辑

2、噪声估计模块

噪声估计模块的主要工作是:判断当前信号是语音还是噪声,以及噪声的量。相较于回声估计,噪声估计的差异在于:噪声并非由远端参考信号变化得到(加性噪声),而有其独立的发声源,无法像回声一样利用其和远端参考信号的相关性来估计,大多数情况下,我们的原材料是有混合带噪语音 C。噪声估计的准确性是至关重要的,但要从混合信号中,估计出其一部分,听起来似乎有些难为人?好在方法总比困难多,凡事都有两面性,既然无法利用“相关性”进行估计,不如试试从“不相关性”下手。

我们先看看下面两种噪声估计的方式:

1)基于谱减法的噪声估计

基于谱减法的噪声估计,一般会认为带噪语音的前几帧不包含语音活动,是纯净的噪声信号,因此,可以取这前几帧的平均信号谱(幅度谱或能量谱)作为噪声谱的估计。

(2)基于语音活动检测(VAD)的噪声估计

基于语言活动检测的噪声估计,会对混合信号 C 进行逐帧检测,如果某音频帧经VAD检测没有语音,则认为是噪声、并更新噪声谱,否则就沿用上一帧的噪声谱。

上面两种方法,往往都需要比较纯净的噪声段,并希望噪声尽可能的稳定,这对于待处理信号的要求就比较高,对于复杂多变的实际应用场景来说就显得尤其苛刻了。

(3)基于统计模型的噪声估计

在 RTC 场景下,通常会采用另一种方案:基于统计模型的噪声估计

基于统计模型的噪声估计,一般需要语音信号和噪声信号是统计独立的(不相关),并服从特定的分布,以将问题归入到统计学的估计框架中。开源 WebRTC 的降噪模块,也使用了基于统计模型的估计方式。我们不妨通过学习 WebRTC 的降噪模块的估计方案,来帮助了解。WebRTC的噪声估计过程如下:

  • 首先,进行初始噪声估计:使用分位数噪声估计法。基于一个共识,即使是语音段,输入信号在某些频带分量上也可能没有信号能量,可以对某个频带上所有语音帧的能量进行统计,设定一个分位数值,能量低于分位数值的认为是噪声,反之则认为是语音。这种方式,相比于 VAD 的逐帧判断,进一步细化了噪声统计的粒度,即使是语音帧也能提取到有效的噪声信息。
  • 然后,更新初始噪声估计:初始噪声估计的结果是不够准确的,但可以作为初始条件应用于噪声更新/估计的后续流程 – 基于似然比函数改造的噪声估计:将多个语音/噪声分类特征合并到一个模型中,结合模型以及初始噪声估计的先验/后验信噪比,对输入的每帧频谱进行分析,计算某一帧是音频/噪声的概率来判断是否为噪声,进一步更新初始噪声估计。
  • 更新后的噪声估计会比初始估计更准确,更新后需要重新计算一下先验/后验信噪比,再用于后续的噪声滤除模块

综上,就是WebRTC使用的一些噪声估计方案,我们从噪声估计模块得到了比较准确的噪声信息,接下来就是 ANS 的另一个关键步骤:噪声滤除模块。

3、噪声滤除模块

噪声滤除的方式也有多种,比如前面提到的谱减法,使用带噪语音的信号谱减去估计的噪声谱,就得到了估计的干净信号谱。但我们说过,这种方式不适用于复杂多变的 RTC 场景,所以干脆一步到位,直接来了解 WebRTC 使用的噪声滤除手段:基于维纳滤波器的噪声滤除

什么是维纳滤波器呢?

如下图所示:将带噪语音 A 输入一个噪声滤波器,如果期望的输出信号为 A1,实际的输出信号为 A2,通过计算得到 A1 和 A2 的估计误差 E。我们希望 A2 尽可能的逼近 A1,那么估计误差 E 就应该尽可能小,而能实现这个目标的最优滤波器就是维纳滤波器。

​编辑

维纳滤波器是一种线性滤波器,其数学表达式的推导需要用到语音信号的先验/后验信噪比,如此一来,前面噪声估计模块的输出信息就有了用武之地。通过这些信息,我们就可以将 WebRTC 的噪声估计模块、噪声滤除模块衔接起来了。

现在将两个模块结合起来,总结一下其核心逻辑

  • 首先利用分位数噪声估计法得到噪声的初始估计,并基于该估计计算后验/先验信噪比;
  • 接着,利用基于似然比函数的改造算法、以及整合了语音/噪声分类特征的模型,分析每帧频谱得到每帧语音/噪声的概率,利用概率判断噪声、进一步更新更准确的噪声估计;
  • 基于更准确的噪声估计重新算后验/先验信噪比、推演出维纳滤波表达式;
  • 最后,使用维纳滤波完成降噪,得到降噪语音。

三、WebRTC 降噪模块存在的一些问题

以上内容,我们通过学习 WebRTC 的一种降噪方案,大致了解了噪声抑制的基本原理。基于对这些原理的了解,我们可以进一步讨论WebRTC 降噪模块存在的一些问题:

1、对非稳态噪声的降噪效果不佳:

  • 如果噪声的统计特性不稳定,那么基于统计模型的噪声估计效果会大打折扣,也会影响降噪效果
  • 因为只有在概率足以判断当前音频帧为噪声时,算法才会更新初始噪声估计。如果噪声经常改变,而且在语音段有变化(比如有人说话的时候),可能就无法被判定出来,影响抑制效果

2、对低信噪比场景的降噪效果不佳:在大噪声/低语音能量的场景下,由于信噪比很低,对语音/噪声的概率判断成功率会下降,可能导致噪声抑制不干净,甚至可能错误抑制了语音造成语音损伤

大家在实际应用中,如果使用了WebRTC降噪、或者基于WebRTC降噪改良的降噪方案,遇到噪声抑制效果差的问题时,也可以参考上面两点进行初步分析。

四、AI 降噪 — 弥补传统算法的不足

对于非稳态噪声、低信噪比等复杂场景的降噪效果不佳,其实是传统降噪算法的通病,也是对各大 RTC 厂商的技术挑战。如何弥补传统算法的不足呢?AI,可能是一个正确的答案。

随着深度学习的广泛应用,业界涌现了大量基于神经网络的音频降噪算法,这些算法在降噪效果、泛化能力上都有比较好的表现,但也存在一些无法忽略的问题。比如一些算法的算力要求比较高,很难应用到实际的用户设备上,尤其是一些低端设备来说,将 AI 算法跑起来简直是奢望。即使是在高端设备上,如何合理地分配算力资源避免性能浪费也是个难题。另外,AI 算法在不同场景、尤其是在 Training Data 未涉及的场景下,其降噪效果可能无法保证鲁棒性。

基于这些问题,ZEGO 提出了一个轻量级的神经网络降噪方法 —— ZegoAIDenoise,该算法对于稳态/非稳态噪声都有很好的降噪效果,保证了语音的质量和可懂度,同时将性能开销控制在一个很低的量级:在 1.4G Hz主频的 iPhone 6上,CPU 性能开销为 1% 左右,与 WebRTC 的通用降噪相当,可以覆盖大部分中低端机型(对于ZegoAIDenoise原理感兴趣的同学,可以阅读之前发布的文章:消灭非稳态噪音的利器 - AI 降噪_ZEGO即构科技的博客-CSDN博客_ai音频降噪 )。

有ZegoAIDenoise 加持,再结合原有的自研改良降噪算法,开发者使用 ZEGO SDK 时,可以在良好消除稳态噪声的基础上,同步处理非稳态噪声(包括鼠标点击声、键盘声、敲击声、空调声、厨房碗碟碰撞声、餐厅嘈杂声、环境风声、咳嗽声、吹气声等非人声噪声),为语音聊天、线上会议、连麦开黑等场景带来更好的通话效果。能在不增加性能负担、处理时延的前提下优化实际通话体验,有利于远程通话在更多环境苛刻的场景中发挥作用,拓宽RTC的实际应用场景。更多即构音视频RTC SDK的AI降噪能力

五、总结

至此,以 WebRTC 的降噪模块为媒介,我们关于剑客 AEC 的了解就告一段落了。由于在讲述过程中,我们尽可能剥离了复杂的数学演算过程,仅对核心逻辑进行梳理和总结,对于实际做底层算法研究的开发者来说,很多地方可能略显浅显或不甚严谨,如果你有兴趣,可以尝试研究开源的 WebRTC 源码做进一步学习。对于没有接触过音频降噪算法的应用开发者,希望大家对平时调用几个 SDK API 就能开启的音频降噪功能,能有进一步的认识,帮助你更好的理解和解决应用开发中的问题。

编辑

编辑

思考题

噪声抑制可能会损伤“有用信号”,这一现象在音乐场景尤为明显,原因是什么呢

音视频基础知识|ANS 噪声抑制原理解析的更多相关文章

  1. 直播软件开发之Java音视频解决方案:音视频基础知识

    概念 从信息论的观点来看,描述信源的数据是信息和数据冗余之和,即:数据=信息+数据冗余.音频信号在时域和频域上具有相关性,也即存在数据冗余.将音频作为一个信源,音频编码的实质是减少音频中的冗余. 拟信 ...

  2. ffmpeg音视频基础学习

    ffmpeg音视频基础学习 从去年开始了解音视频,中间也由于项目的需要,学习过ffmpeg.live555.以及QTAV框架,一直没总结过,现在大致总结下音视频中的常见词汇,后续慢慢更新添加!博客也会 ...

  3. HTML躬行记(4)——Web音视频基础

    公司目前的业务会接触比较多的音视频,所以有必要了解一些基本概念. 文章涉及的一些源码已上传至 Github,可随意下载. 一.基础概念 本节音视频的基础概念摘自书籍<FFmpeg入门详解 音视频 ...

  4. 视频基础知识:浅谈视频会议中H.264编码标准的技术发展

    浅谈视频会议中H.264编码标准的技术发展 浅谈视频会议中H.264编码标准的技术发展 数字视频技术广泛应用于通信.计算机.广播电视等领域,带来了会议电视.可视电话及数字电视.媒体存储等一系列应用,促 ...

  5. php基础知识(语法与原理)

    一.php简介 PHP超文本预处理器.是嵌入HTML文件中的服务器脚本程序. PHP代码标记:<?php …. ?> PHP文件的扩展名:.php PHP文件的执行:必须从域名开始访问 P ...

  6. ffmpeg实战-音视频基础概念

    转发自白狼栈:查看原文 关于音视频,相信大家都看过电影(视频),听过音乐(音频),至少应该都知道mp4是视频文件,mp3是音频文件. 对于一个音视频文件,都有哪些属性呢?以视频为例,我们可以通过 ff ...

  7. 【基础知识】CPU原理之减法、乘法和除法

    中介绍了布尔逻辑.数学和电路的关系,我们也得到了与门.或门.非门.或非门.与非门.异或门等门电路以及一个加法器,并且了解了计算机是如何做加法的,这篇文章介绍一下计算机是如何做减法以及乘除法的. 0x0 ...

  8. 音视频处理基础知识扫盲:数字视频YUV像素表示法以及视频帧和编解码概念介绍

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt+moviepy音视频剪辑实战 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一. ...

  9. 音视频开发之H.264 入门知识

    大家如果有做过音视频相关的项目,那么肯定对 H.264 相关的概念了解的比较通透,这里我为什么还要写这样一篇文章呢?一来是为了对知识的总结,二来是为了给刚入门音视频的同学一个参考. 基础概念 H.26 ...

  10. android音视频点/直播模块开发

      音视频 版权声明:本文为博主原创文章,未经博主允许不得转载. 前言 随着音视频领域的火热,在很多领域(教育,游戏,娱乐,体育,跑步,餐饮,音乐等)尝试做音视频直播/点播功能,那么作为开发一个小白, ...

随机推荐

  1. Vscode控制台乱码的最终解决方案

    Vscode控制台乱码的最终解决方案 vscode运行项目时控制台打印日志乱码.网上也有许多解决办法. 方法一[管用]推荐,避免过多设置 Java项目时,像Springboot微服务项目默认使用的是l ...

  2. [oeasy]python0051_ 转义_escape_字符_character_单引号_双引号_反引号_ 退格键

    转义字符 回忆上次内容 上次研究的是进制转化 10进制可以转化为其他形式 bin oct hex 其他进制也可以转化为10进制 int 可以设置base来决定转为多少进制 回忆一下 我们为什么会有八进 ...

  3. 技术文档必备工具:注释目录树神器 Annotree,我的第一个正式开源项目

    hi,大家好,我是爱听书的程序员阿超 非常开心能在这里介绍我的第一个正式开源项目 Annotree,项目具体情况如下,请继续阅读~ Annotree 注释树 一款生成带注释的目录树工具,大大方便技术文 ...

  4. FFmpeg开发笔记(四十一)结合OBS与MediaMTX实现SRT直播推流

    ​<FFmpeg开发实战:从零基础到短视频上线>一书的"10.2  FFmpeg推流和拉流"提到直播行业存在RTSP和RTMP两种常见的流媒体协议.除此以外,还有于20 ...

  5. 【JavaScript】从N个下拉动态监听改变的option值

    同事因为这个问题人傻了,是从Ajax请求获取的动态数据遍历的表格 然后表格行的单元格又有下拉选择,有N个下拉,要取出选择的值进行二次请求 <select name="A" i ...

  6. 【Linux】真机安装CentOS8

    先制作启动U盘 https://www.cnblogs.com/mindzone/p/12961506.html 插入电脑,开机[这里我是把电脑硬盘格式化了,不会在电脑磁盘上找到任何系统,直接跳到启动 ...

  7. 【ECharts】01 快速上手

    简单介绍: ECharts 是一个使用 JavaScript 实现的开源可视化库,涵盖各行业图表,满足各种需求. ECharts 遵循 Apache-2.0 开源协议,免费商用. ECharts 兼容 ...

  8. 为什么要使用工业仿真软件? —— CAE(Computer Aided Engineering)工程设计中的计算机辅助工程

    CAE技术: 引自: https://baike.baidu.com/item/CAE技术/18884456?fr=ge_ala 引自: https://www.mscsoftware.com.cn/ ...

  9. pytorch不像TensorFlow那样有专用的文件存储格式真的是不足吗?pytorch该如何处理大量小文件的读取呢?

    偶然发现前文: [转载] PyTorch下训练数据小文件转大文件读写(附有各种存储格式对比) 在谈论pytorch的文件读取问题,因为以前是搞TensorFlow的,后来由于编写效率和生态环境问题转为 ...

  10. nvidia显卡的售后真的是不敢要人恭维——拆机箱时误拧显卡自身挡板螺丝被拒保

    事情比较简单,单位在nvidia的经销商那里购买的nvidia titan rtx显卡,保修期内坏掉,拆下来的过程中误拧了挡板的螺丝,结果被拒保,这里就是单纯的记录这件事情. 这件事确实我这方面有不对 ...