写点什么

荔枝音质高保真的降噪技术实践与研究

邱威

  • 2022-08-24
    北京
  • 本文字数:2492 字

    阅读完需:约 8 分钟

荔枝音质高保真的降噪技术实践与研究

当前直播行业愈发火热,用户通常处于不同的环境中,身边的键盘声,敲击声,空调声,喧哗声等噪声有时会对实时互动产生严重的干扰。然而传统的降噪算法针对平稳噪声有比较好的降噪效果,针对上述这一类非平稳噪声,比较难处理,收效甚微,降噪效果很差。

 

随着近年深度学习的广泛应用,使用神经网络的降噪算法喷涌而出,而且这类算法不管是在降噪力度上,还是鲁棒性上,都要优于传统降噪,是当前处理各种不同场景噪音的首选方案。

 

但是,在实时互动环境下,对于音频实时处理和性能要求比较高,这对于 AI 模型的设计和效果的平衡带来了的巨大的挑战。

 

基于上述挑战,荔枝集团音频团队提出了一种轻量的降噪方案--LizhiAiDenoiser,该方案不仅能处理日常生活中常见的平稳和非平稳噪声,而且能很好的保留语音的音质,同时该 AI 降噪模型在运行时占用的内存和 cpu 消耗都极低,满足了全量 iPhone 机型以及大部分 Android 中低端机型。

一、基本原理


LizhiAiDenoiser 采用传统算法和深度学习结合的混合结构。为了可实际在移动端部署,LizhiAiDenoiser 采用了比较精细的模型结构,主要使用低性能消耗的 CNN-RNN 结构。


1. 数据和增强


训练深度学习降噪模型的数据集是通过混合纯净语音和噪音音频的方式。纯净语音主要使用的是开源数据集,包括英文数据集和中文数据集,英文数据集 300 小时,中文数据集 200 小时。噪音音频由两部分构成,一部分是开源噪音集 audioset,大约 120 小时,一部分是自己录制的噪音集,大约 60 小时。数据增强的方法被应用于语音和噪声样本,目的是进一步扩展模型在训练的过程中看到的数据分布。当前,LizhiAiDenoiser 支持以下随机增强的方法:


○ 重采样速度和改变 pitch

○ 添加混响,在纯净语音中添加少量混响

○ 使用[-5,25]的信噪比来混合纯净语音和噪音

 

2. 模型目标


语音降噪通常采用有噪声语音的短时傅里叶变换(STFT),只增强幅度谱,而保持相位谱不变。这样做是因为人们相信,相位谱对语音增强并不重要。然而,最近的研究表明,相位对感知质量很重要。我们的方法使用深度神经网络来估计在复数域中的理想比值 Mask 的实部分量和虚部分量,这种方法更好的保留了语音的质量

 

同时以更小的模型参数达到了大模型同样的降噪效果。原始的 AI 降噪模型,模型大小大概 3M,固定测试集 mos 分为 3.1。对模型做一些剪枝同时调整模型结构,再针对模型输出目标进行调整,在保持 3.1 的 mos 的情况下,最终模型大小降为 900k。

 

复数理想比值 Mask 的推导过程如下:


S(t,f) = M(t,f) * Y(t,f) .........(1)

 

公式(1)中 S(t,f)代表纯净语音,Y(t,f)代表带噪语音,M(t,f)代表模型估计出来的复数域中的理想比值 Mask。

为了方便起见,上式没有体现出时间和频率的下标,但给出了每个 T-F 单元的定义。公式(1)可以扩展为:

 

S(r)+iS(i)= (M(r) +iM(i)*(Y(r)+iY(i))=(M(r)Y(r)-M(i)Y(i)+i(M(r)Y(i)+M(i)Y(r)) .........(2)


纯净语音的实部分量和虚部分量为:


S(r) = M(r)Y(r) - M(i)Y(i) .........(3)

S(i) = M(r)Y(i) + M(i)Y(t) .........(4)


根据公式(3)和公式(4)可以得到 M 的实部和虚部分量:


M(r)=(Y(r)S(r)+Y(i)S(i))/(Y(r)2+Y(i)2).........(5)

M(i)=(Y(r)S(i)-Y(i)S(r))/(Y(r)2+Y(i)2).........(6)


从而得到复数域理想比值的 Mask:


M=(Y(r)S(r)+Y(i)S(i))/(Y(r)2+Y(i)2)+i((Y(r)S(i)-Y(i)S(r))/(Y(r)2+Y(i)2)).........(7)


3. 网络模型


从上图可以看出,我们使用的模型结构极其简单,并且 CNN 能够很好的提取 local feature,GRU 能够学习时序上的特征,这对于模型的泛化和推理实时性都起到了很好的正向作用。

二、效果和性能


效果


在效果验证上,我们采用日常常见的八种噪音不同的信噪比与传统降噪进行对比测试,使用 POLQA 测试降噪后的音频 mos 分,对比结果如下:

如上效果所示,LizhiAiDenoiser 在不同信噪比和场景下,取得了不错的效果。这里测试 40db 和 50db 的音频,主要是为了测试 LizhiAiDenoiser 对近乎纯净语音有没有损伤,从最终结果能够看出,LizhiAiDenoiser 对于纯净语音几乎不产生损伤情况。


音质保护示例


结论:在语音的中频部分能看到 LizhiAiDenoiser 降噪后对语音保留的更好。


降噪示例


性能


在 LizhiDenoiser 的模型前向推理过程中,我们没有使用开源的推理框架,而是使用自研的推理框架,不使用开源推理框架原因有:


• 不依赖第三方推理框架,使得前向推理更加灵活多变;

• 减少 LizhiDenoiser 模块占包大小;

• 更加自由灵活的针对模型结构做极致的推理速度优化

分别测试了 iPhone 和 Android 较低机型的性能,这里主要采用 cpu 消耗和实时率来度量 LizhiAiDenoiser 的性能。


cpu 消耗


因为模型设计比较精细,参数占用比较小,cpu 占用不超过 3%。


实时率


实时率是指处理每帧音频所要花费的时间,通常是处理整个音频来统计总的耗时,再除以音频的总帧数,得到平均每帧耗时,这种方式在实时率要求比较高的任务中是很难有说服力的,因为此时任务比较单一,CPU 利用率比较高,所以总的耗时统计大大减少。


我们在统计实时率时采用最真实的统计方法,即在 RTC 应用中统计每帧音频的真实耗时情况。统计情况如下:


说明:上图中横坐标是音频帧数,每一帧 10 毫秒,纵坐标是每一帧经过 LizhiAiDenoiser 降噪耗时,单位是微秒


从图中可以看出,android 较低机型实时率不超过 0.3,iPhone 较低机型实时率不超过 0.2。

三、规划


AI 降噪在 RTC 任务中还有很多优化的空间:


1. 实时率的优化

进一步对模型进行剪枝和使用更低计算消耗的网络,同时进一步优化我们的 AI 推理框架,以及对模型进行量化,通过这几个维度的优化来进一步提升我们 AI 降噪的实时率。


2. 全频带 AI 降噪

因为全频带 AI 降噪不管是在特征输入上还是网络结构设计上都比较大,很难在 RTC 这种对实时率要求比较高的任务达到好的效果,所以我们接下来准备将音频转换到比较小的特征维度上,通过设计比较小的网络来拟合该任务。


3. 模型的压缩

在算法落地上,对于模型大小有时也有一定的要求,同时也是模型轻量的一个体现,更少的占用设备资源。所以在模型落地时,一般会对模型大小进行压缩,接下来我们会使用占用内存更小的数据类型来存储数据,优化模型存储的格式以进一步减少模型存储的大小。

 

作者:

邱威:荔枝音视频研发中心高级音频算法工程师,主要从事音频相关 AI 算法研究和 AI 模型在移动端部署的工作。

 

2022-08-24 18:085031

评论 2 条评论

发布
用户头像
荔枝的技术低调大气有实力,可以给外界多多分享干货!
2022-08-26 10:53 · 广东
回复
用户头像
公式很长
2022-08-24 22:56 · 广东
回复
没有更多了
发现更多内容

云知声 Atlas 超算平台: 基于 Fluid + Alluxio 的计算加速实践

阿里巴巴云原生

阿里云 云原生 实践 Fluid Alluxio

不敢想,做个博客竟如此简单!

程序员鱼皮

博客

CRM WebClient UI的浏览器打印实现

汪子熙

JavaScript CRM SAP UI5 JavaScript图表库 11月日更

Eureka 源码之客户端注册

悟空聊架构

Eureka 源码剖析 注册中心 悟空聊架构

十年数据库专家,呕心力作MySQL技术精粹,薪资直涨3K其实很轻松

数据库 程序员 MySQL 数据库

pygame 小游戏前的准备工作要做足

梦想橡皮擦

11月日更

大牛呕心力作——Kafka开发实战,助你徜徉大数据时代

redis 程序员 java编程

2021年10月云主机性能评测报告

博睿数据

SAP CRM和C4C的内容管理(Content Management)

汪子熙

内容 CRM C4C 11月日更

电商秒杀系统

伏波

架构

新消费:如何度过从0到1的破局期?

石云升

学习笔记 11月日更 新消费

RadonDB ClickHouse on K8s 2.1.0 发布!

RadonDB

数据库 Kubernetes Clickhouse RadonDB

杂谈—程序人生第一份工作

思想者杰克

程序人生 新手指南 程序

赋能优秀传统文化,区块链助力讲好中国故事

CECBC

区块链+农业开启智能化生产时代 解决世界性食品及粮食安全问题

CECBC

Bash 脚本简介

码语者

bash Shell

阿里大牛教你如何用Dubbox+SpringBoot+Docker架构,实现双11项目

编程 程序员 springboot

如何在实际场景中使用异常检测?阿里云Prometheus智能检测算子来了

阿里巴巴云原生

阿里云 云原生 Prometheus 异常检测

软件架构治理 之 架构混沌之谜

码猿外

架构 软件架构治理

央行数字货币即将破茧,一场大变局,震撼全球!

CECBC

模块七作业

Geek_fc100d

「架构实战营」

杂谈——程序人生我的大学

思想者杰克

北鲲云超算平台如何成为就生命科学云计算领域先行者?

北鲲云

布局人工智能,银行有的不只是智能客服

CECBC

架构课毕业总结

伏波

架构

前后端、多语言、跨云部署,全链路追踪到底有多难?

阿里巴巴中间件

阿里云 云原生 中间件 全链路追踪

20道阿里面试必问JVM面试专题(文末附送答案及JVM学习文档)

编程 程序员 JVM

【死磕Java并发】-----深入分析synchronized的实现原理

chenssy

死磕 Java 死磕 Java 并发

端开发技术——5个高效的Flutter开发工具

思想者杰克

区块链的抽象与演进

CECBC

面试必备!阿里内部Java面试八股文出炉,教科书式完美回答

Sakura

Java 程序员 架构 面试

荔枝音质高保真的降噪技术实践与研究_移动_InfoQ精选文章