本次发布为上一代单声道语音分离算法MossFormer的升级版。并在单声道语音分离任务上比MossFormer取得显著的性能提升。MossFormer模型主要采用了基于自注意力的MossFormer模块,倾向于强调较长范围、粗粒度的依赖关系,在有效建模较细粒度的循环模式方面存在不足。在MossFormer2模型中,我们引入了一种新颖的混合模型,通过将一个循环模块集成到MossFormer框架中,从而具备了同时建模较长范围、粗粒度依赖关系和较细粒度循环模式的能力。为了减轻非并行循环神经网络(RNN)的局限性,我们提出了一种基于前馈顺序记忆网络(FSMN)的非RNN循环模块。该循环模块包含一个基于扩张(dilated)机制的FSMN块,不仅通过扩张机制增强感受野,同时通过密集连接(Dese Coectio)提高信息流动性。另外,我们还使用门控卷积单元(GCU)来设计循环模块,以便在降低嵌入维度和提高模型效率的同时,促进相关背景信息的门控控制。该循环模块依靠线性投影(Liear Projectio)和卷积来实现对整个序列的无缝并行处理。MossFormer2模型在WSJ0-2/3mix、Libri2Mix和WHAM!/WHAMR!基准测试中表现出色,超越了MossFormer和其他最先进的方法。 模型pipelie 输入为个16000Hz采样率的单声道wav文件,内容是两个人混杂在一起的说话声,输出结果是分离开的两个单声道音频。 本模型训练虽然尽量涵盖各类噪声和混响场景,我们也加入一定的电话通道数据,但由于训练数据有限,无法完全覆盖所有噪声、混响场景和电话场景,因而无法保障对各种混合数据上的分离效果! 本模型训练时使用了包括WSJ0-2Mix和 Libri2Mix的干净语音混合数据,以及WHAMR、DNS Challege 2020带噪声及混响数据。 MossFormer2模型与其它SOTA模型在公开数据集WSJ0-2mix/3mix、Libri2Mix和 WHAM!/WHAMR!上的对比结果如下,注意:该对比结果使用的是MossFormer2模型在相应的数据集上训练后的参考测试结果,并非本次发布模型的测试结果。 Zhao, Shegkui ad Ma, Bi et al, “MossFormer2: Combiig Trasformer ad RNN-Free Recurret Network for Ehaced Time-Domai Moaural Speech Separatio”, submittig to ICASSP 2024.主要改动
这个模型是mossformer2,2说话人,支持单声道,16k音频,同时发现模型在说话人分离的同时具备很强的降噪效果。
建议使用GPU进行推理,经过测试,GPU的推理速度是CPU的数十倍。
3-6说话人分离 视情况发布。
MossFormer2语音分离模型介绍
模型的使用方式
环境准备
sudo apt-get update
sudo apt-get istall libsdfile1
代码范例
import ox
import oxrutime as ort
import umpy as p
import soudfile as sf
def save_result(est_source):
result = []
for s i rage(2):
sigal = est_source[0, :, s]
sigal = sigal / p.abs(sigal).max() * 0.5
sigal = sigal[p.ewaxis, :]
# covert umpy array to pcm
output = (sigal * 32768).astype(p.it16).tobytes()
result.apped(output)
save_file = f'output_spk{s}.wav'
sf.write(save_file, p.frombuffer(output, dtype=p.it16), 16000)
ox_model_path = 'simple_model.ox'
ox_model = ox.load(ox_model_path)
ox.checker.check_model(ox_model)
ort_sessio = ort.IfereceSessio(ox_model_path)
iput_data,sr = sf.read('mix_speech1_16000.wav')
if sr!=16000:raise 'Oly supports 16000 Hz'
if iput_data.dim>1:raise 'Oly supports 1 chael'
iput_data = p.expad_dims(iput_data, axis=0).astype(p.float32)
iput_ame = ort_sessio.get_iputs()[0].ame
outputs = ort_sessio.ru(Noe, {iput_ame: iput_data})
output_data = outputs[0]
save_result(output_data)
模型局限性
训练数据介绍
数据评估及结果
指标说明:
相关论文以及引用信息
点击空白处退出提示










评论