▏什么是语音降噪模型?我们日常可能会碰到一些录音质量不佳的场景。比如,想录制一段干净的语音却发现周围都很吵,录制的语音里往往混杂着噪声。当我们在噪杂的地铁或者巴士上通电话,为了让对方听清楚,不得不提高嗓门和音量。这都是因为环境噪声的影响,使我们在使用语音应用时出现障碍。这是语音通讯中一个普遍存在且又非常棘手的问题。语音质量(quality)和可懂度(intelligibility)容易受到环境噪声、拾音设备、混响及回声的干扰,使通话质量和交流效率大幅降低,如何在嘈杂的环境中保持较高的语音质量和可懂度一直以来是众多企业和学者追求的目标。语音降噪问题通过多年研发积累,已经取得一定的突破,尤其针对复杂环境中的语音降噪问题,通过融入复数域深度学习算法,在性能上获得大幅度的提升,在保障更小语音失真度的情况下,最大限度地消除背景噪声,还原目标语音的清晰度,因而语音降噪模型也通常被叫做语音增强模型。
▏语音降噪模型能做什么?
语音降噪模型的作用是从污染的语音中提取目标语音,还原目标语音质量和可懂度,同时提升语音识别的效果和性能。我们的语音降噪模型只需要输入单麦克风的录音音频,便能够输出降噪后的干净语音音频,即保持音频的格式不变,仅消除音频中的噪声和混响部分,最大限度地保留原始语音。▏语音降噪模型是如何工作的?
近期,我们在ModelScope上开放的FRCRN语音降噪-16K模型,是基于频率循环 CRN (FRCRN) 新框架开发出来的。该框架是在卷积编-解码(Convolutional Encoder-Decoder)架构的基础上,通过进一步增加循环层获得的卷积循环编-解码(Convolutional Recurrent Encoder-Decoder)新型架构,可以明显改善卷积核的视野局限性,提升降噪模型对频率维度的特征表达,尤其是在频率长距离相关性表达上获得提升,可以在消除噪声的同时,对语音进行更针对性的辨识和保护。
另外,我们引入前馈序列记忆网络(Feedforward Sequential Memory Network: FSMN)来降低循环网络的复杂性,以及结合复数域网络运算,实现全复数深度网络模型算法,不仅更有效地对长序列语音进行建模,同时对语音的幅度和相位进行同时增强。相关模型在IEEE/INTERSpeech DNS Challenge上有较好的表现。该模型神经网络结构如下图所示。
▏如何快速体验模型效果?
1.在线体验
您可以在ModelScope官网,降噪模型页面上(复制该链接在浏览器中打开:https://modelscope.cn/models/damo/speech_frcrn_ans_cirm_16k/summary)在线体验模型效果。体验界面在页面右侧,可以在“测试内容”栏内看到我们预先准备的一段很短的音频,点击播放按钮可以试听。也可以直接点击“执行测试”按钮执行降噪处理,生成的新音频会显示在下面“测试结果”栏中,供试听效果。示例音频的处理前后频谱对比如下图。
请注意以上操作需要的前提条件:
①注册一个阿里云账号
②注册一个ModelScope网站账号
先登录ModelScope账号,点击模型页面右上角的“在Notebook中打开”按钮出现对话框。首次使用会提示您关联阿里云账号,按提示操作即可。
如果您有多个音频文件要处理,只要循环调用ans对象即可:
from modelscope.pipelines import pipelinefrom modelscope.utils.constant import Tasks ans = pipeline( Tasks.acoustic_noise_suppression, model='damo/speech_frcrn_ans_cirm_16k') wav_dict = {'/data/input/a1.wav': '/data/output/a1.wav', '/data/input/a2.wav': '/data/output/a2.wav'} for f1, f2 in wav_dict.items(): result = ans(f1, output_path=f2)
▏如何训练自有的智能降噪模型?
1.进行模型训练
- 环境准备
目前降噪模型仅支持Linux系统。如果您想在自己的程序里使用模型推理功能,可以使用ModelScope网站官方提供的Notebook环境,直接使用下面“运行模型”中给出的代码。环境准备完毕后,可以运行以下示例代码进行官方模型的推理验证。
from modelscope.pipelines import pipelinefrom modelscope.utils.constant import Tasks ans = pipeline( Tasks.acoustic_noise_suppression, model='damo/speech_frcrn_ans_cirm_16k')result = ans( 'https://modelscope.oss-cn-beijing.aliyuncs.com/test/audios/speech_with_noise.wav', output_path='output.wav')
- 数据准备
魔搭社区默认模型训练音频总时长约1200小时,全部是由程序生成的,大致过程是准备原始的纯净语音和纯噪声音频,由程序混合两种音频模拟出带噪声的语音作为输入数据,而对应的纯净语音作为期望结果,分别保存为16000Hz单通道wav文件。原始音频和数据生成脚本全部来自Deep Noise Suppression (DNS) Challenge 2021。为便于用户使用,相关脚本已经整合进 ModelScope Dataset。用户可以按照数据集页面上的说明,下载数据集脚本,运行donwnload脚本把原始音频下载到本地,再运行生成脚本生成训练所需的数据。数据准备完毕后的目录格式如下图。
- 模型训练
开始训练之前,请先参照「在Notebook中开发」章节,验证官方模型运行成功,可生成降噪后的音频文件。
①复制官方模型
要训练您自己的降噪模型,首先需要一份官方模型的副本。ModelScope 框架默认把官方模型保存在本地缓存中,可以把本地缓存的模型目录copy一份到您的工作目录。
检查目录./speech_frcrn_ans_cirm_16k,其中的 pytorch_model.bin 就是模型文件。如果想从头开始训练一个全新的模型,请删除掉这里的 pytorch_model.bin,避免程序运行时加载;如果想基于官方模型继续训练则不要删除。
cp -r ~/.cache/modelscope/hub/damo/speech_frcrn_ans_cirm_16k ./cd ./speech_frcrn_ans_cirm_16krm pytorch_model.bin
目录中的configuration.json文件中是模型和训练的配置项,建议用户对代码逻辑非常熟悉以后再尝试修改。
②运行训练代码
以下列出的为训练示例代码,其中有两个地方需要替换成您的本地路径:
a)用您前面下载的本地数据集路径替换
'/your_local_path/ICASSP_2021_DNS_Challenge'
b)用您复制的官方模型路径替换模型路径model='/your_local_path/speech_frcrn_ans_cirm_16k'
import os from datasets import load_dataset from modelscope.metainfo import Trainersfrom modelscope.msdatasets import MsDatasetfrom modelscope.trainers import build_trainerfrom modelscope.utils.audio.audio_utils import to_segment tmp_dir = './checkpoint'if not os.path.exists(tmp_dir): os.makedirs(tmp_dir) hf_ds = load_dataset( '/your_local_path/ICASSP_2021_DNS_Challenge', 'train', split='train')mapped_ds = hf_ds.map( to_segment, remove_columns=['duration'], num_proc=8, batched=True, batch_size=36)mapped_ds = mapped_ds.train_test_split(test_size=3000)mapped_ds = mapped_ds.shuffle()dataset = MsDataset.from_hf_dataset(mapped_ds) kwargs = dict( model='your_local_path/speech_frcrn_ans_cirm_16k', train_dataset=dataset['train'], eval_dataset=dataset['test'], work_dir=tmp_dir)trainer = build_trainer( Trainers.speech_frcrn_ans_cirm_16k, default_args=kwargs)trainer.train()
训练按照默认配置共200轮,每轮2000个batch,训练出的模型文件会保存在代码中tmp_dir = './checkpoint'
指定的目录。目录下还有一个log文件,记录了每个模型的训练和测试loss数据。
2.使用您的模型
从您训练出的模型中选择效果最好的,把模型文件copy到
/your_local_path/speech_frcrn_ans_cirm_16k,重命名为pytorch_model.bin。把以下代码中模型路径 '/your_local_path/speech_frcrn_ans_cirm_16k' 替换为您复制的模型目录,就可以测试您的模型效果了。
from modelscope.pipelines import pipelinefrom modelscope.utils.constant import Tasks ans = pipeline( Tasks.acoustic_noise_suppression, model='/your_local_path/speech_frcrn_ans_cirm_16k')result = ans( 'https://modelscope.oss-cn-beijing.aliyuncs.com/test/audios/speech_with_noise.wav', output_path='output.wav')
代码中的http地址也可以换成您的本地音频文件路径,注意模型支持的音频格式是采样率16000,16bit的单通道wav文件。也可参考「在Notebook中开发」章节进行批量的音频文件处理。
▏语音降噪模型的典型应用场景
首先是语音识别 (ASR) 场景。用户不管在办公室里 (电脑风扇、通风设备和空调噪声、同事的谈话背景声等),百货商场(人流和脚步声、笑声和交谈声等),还是在车内(汽车引擎噪声、音乐声、风噪等),大街上(车辆噪声、施工噪声等),噪声都以不同的形式存在着,目标语音经常受到附加背景噪声的严重污染,另外,在封闭的环境中,声音的反射也会造成混响污染,如果不预先进行净化处理,会严重损坏语音的感知质量和可理解性,以及降低自动语音识别 (ASR) 性能。
其次是实时语音通信(RTC)场景。会议场景中语音增强的目标是抑制目标说话人语音以外的其他各类环境噪声(比如啸叫,手机铃声,键盘声,背景人声,吃零食声,关门声等)。具体挑战包括音视频会议模型参数量、计算量、和实时性要求高;由于音视频会议的交流性质,对语音的质量和可懂度要求高;语音的噪声环境复杂,噪声类型多样,对模型的泛化能力要求高;说话人和麦克风距离不固定,语音存在大小音量的变化,对模型的辨识能力要求高;根据接入设备不同,存在语音采样率的变化(包含8kHz, 16kHz, 48kHz等),对模型可处理不同频率段的要求高。开发者可以在魔搭社区官方模型的基础上调整模型参数来训练自己的模型应对这些挑战。
开发者也可以探索智能降噪模型在诸如录音美声、歌曲分离等其他场景中的应用,比如以下示例中的歌曲人声提取。