前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何将RTC中基于AI的音频算法有效的产品化

如何将RTC中基于AI的音频算法有效的产品化

作者头像
LiveVideoStack
发布2020-11-11 14:32:27
8010
发布2020-11-11 14:32:27
举报
文章被收录于专栏:音视频技术音视频技术

正文字数:4854 阅读时长:7分钟

将AI算法任务模块化是一种解决AI音频处理算法应用效果不够好、通用/扩展性差、计算开销大等问题的有效方法。网易云信 资深音频算法工程师 郝一亚在LiveVideoStackCon 2020北京站的演讲中就“模块化”是怎样解决上述问题的,“模块化”工程实现的可行性等问题进行详细解析,并举例介绍了目前市场中的几个“模块化”的成功案例。

文 / 郝一亚

整理 / LiveVideoStack

大家好,我是郝一亚,来自网易云信,目前主要负责网易云信在RTC领域的音频算法的研发。本次我想要分享的题目是如何将AI音频算法应用、结合到RTC中,我会结合自己在国外的一些研究和开发的经验,包括网易云信在AI音频算法应用实战当中的一些经验总结,和大家一起聊一聊如何将AI音频算法与RTC有机结合。

01

RTC中AI音频的现状

TITTLES

首先,第一个问题是RTC中AI音频到底是处于一个什么阶段?可能大家会接收到比较极端的两种不同信息:第一种就是目前AI算法如Deep Learning等在各行业都开始广泛应用,效果也比较好;另外一种就是大家在实际的工作当中,可能会感受到AI在某些情况下,比如说在训练集和一些特定Case下的感觉还不错,但很难落地、上线到实际的产品当中,存在着各种各样的问题和困难。那么首先我们来简单分析下目前AI音频到底是处于一个怎样的阶段。

1.1 音频处理中AI的力量

先来介绍一些好的方面,例如结合CNN的降噪,最早是因为AI在Computer vision领域成功的应用,我们就可以把这种语谱图(如图所示)作为一个图像的概念。这样的方式为CNN和降噪模块的有机结合提供了一个契机。

图中展示的就是一个CNN的降噪,我们可以看到,如左上角图所示,右边是传统的降噪方法,Noisy Speech相对于原始信号,它的信噪比已经很低了。而左边是一个MMSE的算法,相比于传统方法是有一定提升的,特别是非语音段。但我们可以从中看到特别是高频的部分,还是存在很多的残留。从横向对比来看,AI算法在基于传统的方法之上,可以让我们在非语音段有对噪声有一个非常好的抑制,其结果对比原始信号,可以看到其实相似度非常高,肉眼基本很难区别。

下面的例子是一个场景的分类,说到有关分类的问题,其实我个人觉得这是AI比较擅长的一个方向。我们可以看到Noise Suppression、Sound Classification、Acoustic Echo Control,Blind Source Separation这四种方式其实都是结合神经网络的方式。如图左下角所示的AI Sound Classification是一个基于简单的模型的方式,是不涉及任何神经网络的。我们可以看到尽管因为任务的难度较大,所能达到的只有百分之六十左右的准确率,但和传统方法相比还是有很大程度的提升。

之所以列举出这两个例子,是希望让大家知道其实我们在音频上有很多的模块已经可以用AI来解决,包括这两个例子在内,以及之前提到过的AEC,还有NLP(非线性处理)模块其实现在也有很多研究是在结合AI来做,除此之外还包括BSS (盲源分离),目前我知道有些落地的项目也是基于AI的。所以总得来说AI在音频算法中的应用是多种多样的,是多点开花的。

1.2 音频处理中AI的挑战与局限

接下来介绍AI音频的一些局限,在这里我主要总结了三点:第一点我们能想到的就是AI的计算量和计算复杂度的问题。通常来说AI的模型,特别是现在神经网络的模型,它的计算量平均来说会比传统算法更大一些。对于大部分终端设备来说,其算力是有限的,PC设备相对还好一些,但是我们还需要保证实时性,因此将AI的模型全部附加在终端设备上,对于设备的硬件来说还是有比较大的压力的。第二点是泛化能力。在数据驱动的方向上,泛化能力有限一直是一个问题。比如说我们有自己的数据集,那么我们该怎么用有限的数据来cover更多的结果,特别是由于RTC覆盖的业务场景会非常多,比如教育领域、泛娱乐领域,每个领域的场景都会有所不同,AI算法要cover所有场景更是难上加难;最后一点是鲁棒性,和泛化性略有相似,但更多的是指一些突发情况,比如在某些场景中突发的噪声、时间上的跳变、参考时间的不齐等等。在这些情况的影响下,系统够不够稳定?系统会不会犯错?犯的错会不会是一个大错?这其实很考验AI的算法,就相当于我们把所有的东西丢到一个黑盒子里面,看它是否能够全部的、真正的运行正常。

总结上面提到的两点,我认为AI的效果,它的优势其实已经被证实了,但由于算力和数据等各方面的问题以及AI模型本身的一些问题,它现在还达不到完全替换传统信号处理方法的阶段。

RTC领域的Tsahi专门就这一问题做了很多的评估,这里我们引用了Tsahi的一张图,根据他的分析目前我们的位置刚好是处于一个临界点。也就是从现在向后走,当我们的算力得到进一步提升,或者是我们在数学或各个基础学科上有所突破,可能会迎来整个AI的一个大爆发,但就目前看来看我们正处于一个临界的位置。所以今天我想和大家一起探讨的是如何在临界位置去扬长避短,如何应用AI的优势,然后将它有机的结合在我们的RTC里面。

02

“模块化”

TITTLES

“模块化”就是其中的一个有效途径,模块化对应的主要是:例如我们有一个端到端的长链路,有一个降噪的算法。长链路就是说从数据的输入一直到数据的输出,如果我们直接将其当成黑盒来训练,这就是一个非常长的端到端的算法。那对应的模块化就是我们“能不能将这个长链路分解成一些小的模块”,其中一些小的模块是很适合用AI去做的,我们用小的模块去做,既节省了开销,也能够解决很多之前我们提到的问题,就像是让专业的人去做对应专业的事情。

示例一:音频降噪中的AI算法

举个例子,这里是一个比较通用的端到端的AI降噪算法。我们来看如图下方所示的训练的过程,首先将输入的信号放到频域STFT,然后就直接拿它的Magnitude,先不用相位,直接把它的一些频点拿去,将它的一些Feature提取出来做Training,这是一个非常直观的训练过程。

训练完成后直接放在我们的实时的系统里面,在实时系统里进行同样的操作。然后我们将相位拿出来,先放在这里不做任何操作。接着我们可以通过做一个Noisy Floor 或者是简单的VAD判断一下,然后同样进行特征提取,放到预先训练并Frozen好的降噪的模块里进行处理,最后和我们的Phase结合,得到我们的输出。

其实很多的AI算法如果从宏观的角度来考虑,只需要有一个输入,有一个输出,其它的就都可以全部交给机器,让它自己去训练。但这就会遇到我们刚才提的三个问题:计算复杂度,泛化能力和鲁棒性,也许我们可以简单的做一些权衡,比如牺牲一些计算时间去换取更高鲁棒性,但其实整体上还是很难突破这个瓶颈。

那么,怎么有效的解决这个问题呢?这里我们看一个传统信号处理中的降噪算法,跟刚才介绍到的方法比较像,唯一不同的地方是它分别添加了一个Speech Estimation的模型和Noise Estimation模型,这里面会有比如说类似于先验概率(Prior-SNR)这样的计算,再通过后面的结合就会有类似于对于每个频点有一个gain计算出来,结合起来后处理然后再输出。

那我们看一下,这里的Noise Estimation模块,其实是比较适合拿出来单独做深度学习训练的小模块,特别是假设噪声是一个Stationary Noise的稳态噪声,是更适合的。在这里,我们可以不用端到端的去训练整个AI的模型,而是把这个noise estimation训练成一个噪声估计模型。后面我们在实时系统里面,每次遇到Noise Estimation,我们就不再是一个传统的Noise Estimation,我们就会用这个训练好的Model 去把我们想要的一些参数和feature都计算出来。

还有一个就是VAD模块,这里的VAD不是时域上的VAD,而是对于每个频点有一个判断。这种Classification的问题是很适合通过AI 的Model 来做的,这也是可以单独拿出来做训练的模块。

我们再回顾一下这三个问题:计算复杂度、鲁棒性和泛化能力,通过模块化,计算复杂度的问题我们可以用一个轻量级的网络来解决。刚才我们看了端到端的NS图,我们要解决这个问题,一般会用到层数稍微偏多的网络,因为我们要解决的问题是比较复杂的,需要从噪声和语音叠加的信号里面,将噪声给抑制掉。但是如果我们换作只对Noise 去进行一个Estimation,那本身的问题就会比较简单,也就是我们提到的一个简单的训练目标。对于这种训练目标,这些问题本身也会更适合DNN的Model 去学习。

示例二:声音场景检测

再来看一个例子,这个是一个声音的场景检测分类。刚才现场也有朋友提到过,如果回声消除里是音乐声怎么办?如果是场景检测的话,我们会有一个Music Detection,如果检测出是音乐类的场景,我们会有另外的一套机制来处理。例如我们NS中有一套对于音乐声的标准,最直观的就是弱处理,还可以通过NLP里面的一些相应的处理方式;第二个就是我们简单对Noise 进行分类,然后对应刚才提到的Noise Model的Training。比如说我们可以分类检测出现在平稳噪声是什么类型的平稳噪声,或者是检测出现一些非平稳的噪声的类型,我们会有针对不同噪声的预训练的Model,可以结合不同场景优化NS;第三个场景是针对底噪的估计,底噪是一个比较严重的问题,特别是在会议场景,开放的办公环境下。那么应该如何来估计底噪?因为底噪较常见的是平稳的噪声,如果我们有一个Noise Detection来辅助,底噪估计的准确性会大幅提高,对系统来说是一个整体的优化。在这里我列出了场景检测的三种不同形式,虽然场景检测是一个很小的模块,是原本不属于例如RTC的3A算法、长链路中的模板,是额外附加的子模块。但当我们有了这个模块后,可能会有更多的东西和更多的应用场景可以来优化我们的3A算法中的各个模块。

示例三:波到达方向估计

Direction of Arrival-DOA,

在现在的RTC中,DOA一般会搭载着Beamforming和Microphone Array

如图中Demo所示,使用的是圆阵,有八个麦克风,一般对应的是会议室的场景,大家可能会比较容易联想到类似形状的麦克风,或者是八爪鱼的形状的麦克风。除了这种形式之外,还有一些平板的电视一般是线阵的,也同样是阵列的麦克风。它是通过阵列麦克风形成不同的Beam,然后通过DOA来选择Active Speaker 是在哪个Beam上,并且增强它的SNR,而其它噪声的因为在旁瓣上,就会被自然地抑制掉。而且Beamforming是一个线性的,不存在非线性的失帧。

关于DOA, 其实传统算法有GCC-PHAT和SRP等,是高精度的,能够从数学上精确判断具体的多少度。

但在实际的场景中beamforming自己有宽度,一般我们会做二十多度,或者是十五度,相邻的beam会有一些重叠,其实我们不需要那么高的精度。现在有一个方法就是通过Beam Selection直接去判断应该选择哪个Beam。DOA会多出来这样的一个分支,在这个分支上有很多传统的算法。我自己在这方面也进行了很多的研究,比如在Beam的能量上,哪个能量大我就用哪个。我自己也提出过两个方法,都是关于频域信息提取的,但是后面通过对于传统算法和DNN算法的比较和研究,尝试了通过CNN、RNN或者CNN结合一些之前帧的信息的方式,也用不同的feature,lost function,基本上大部分的效果都会比传统的方法要好很多,包括一些轻量级的一些网络。

03

未来展望

TITTLES

刚才我们讲了几个例子,其实在整个的模块化当中还会有很多的一些其它小的子模块,可以拿出来,不仅限于之前提到的那些。比如说我们最近研究的AEC中的NLP(非线性处理)模块中,尝试的结合BSS的方法,比如ICA。ICA中有一些子模块可以提取出来,做一些AI 的Training,这个也是我们目前认为比较可行的路,从结果上来看效果都会比之前的好很多。

对于未来,分享开始的时候我们就提到了Tsahi的预测,未来可能会有更多的AI算法融合进来,未来的爆发点可能是更先进的神经网络模型,更高效的GPU,但是有一项关键点不会变,会一直被需要,那就是数据。

数据目前我们可以大致分为几个部分,比如Open Source,在学术界大家会分享,会推动整体的进程,可能会有第三方公司提供一些数据,同时我们自己可能也会收集一些数据。现在网易云信在做的就是针对很不同的NS场景进行AI的降噪,这一部分噪声对于我们而言其实是比较难寻找到的,尤其是前两个途径中。一是因为这些噪声本来就会很特别,Open Source很有限。如果和第三方合作,我们是考虑到验证和收集的过程中会有很多沟通成本。所以我们大部分都是自己收集的。自己收集就需要有自己的一些基础设备,可能会要求有自己的消声室,自己的录音棚环境,还有一些工具:人工头、人工嘴来播放,还需要一些收集的设备,比如标准麦克风等。还需要很多其他配套的自动化工具,比如Labeling的工具。目前我们网易云信已经配备了全套工具和环境,我们现在已经自己采集了很多数据集,并且应用到了我们AI算法中。

下面我们来给大家演示一个demo,大家可以体验一下从没有降噪到降噪的处理过程。

除了音频之外,在视频方面我们也有很多算法是由AI驱动的,以下是我们在视频超分方面的一个Demo演示视频,黄线右边是原始图像,左边是经过超分处理的,大家可以看到,左右两边的效果对比还是非常明显的。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 LiveVideoStack 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档