Wavesplit: End-to-End Speech Separation by Speaker Clustering

本文提出了一种名为Wavesplit的端到端声源分离系统,该系统能从混合语音中推断并估计每个声源的特征表示,解决了排列问题。Wavesplit通过聚类实现声源表示,对长语音序列的分离性能表现出色,且在多种环境(纯净、噪声、混响)下均达到最优性能。模型包括两个子网络,speakerstack和separationstack,前者学习说话人特征,后者用于生成分离语音。训练时采用说话人无关方法和聚类策略,以提高泛化能力。实验表明,Wavesplit在多种语音分离任务中达到最优水平。

在这里插入图片描述

0. Abstract

本文提出了一种端到端声源分离系统,Wavesplit。从混合语音中,模型推断每个声源的表示,然后根据每个声源的特征表示进一步估计声源,该模型经过训练,可以从原始波形中联合执行这两项任务。Wavesplit通过聚类推断一组声源的特征表示,其解决了声源分离的基本排列问题。在语音分离任务中,本文工作对长语音序列具有更加稳健的分离性能。本文模型在2人/3人纯净语音(WSJ0-2/3mix),以及带噪语音、混响语音数据集都获得STOA性能。

1. Introduction

设计的模型能够保持真实声源和预测声源之间的一致性分配,对局具有相似声源的任务至关重要(解决排列置换问题)。

本文工作旨在从混合信号中分离出具有相同性质的源(声源)。本文工作除了用于解决语音分离问题,还可应用于分离胎儿和母体心率。本文提出的Wavesplit用于解决说话人无关的语音分离问题,测试集中的声源未在训练时出现。具体来说,我们用于说话人识别和语音分离的联合训练程序不同于先前的研究。训练目标期望能够识别瞬时说话人的特征表示,以便(i) 这些表示可以分组到单个说话人集群中,并且 (ii) 集群质心为重建单个源提供长期说话人表示(long-term speaker representation)。对于每个声源的显式、长期表示的提取是一项新工作,其有利于语音和非语音的分离,这种表示限制了真实声源和预测声源之间不一致的问题。

本文贡献:

  • (1)实现说话人无关训练。
  • (2)aggregate information about sources over the whole input mixture which limits channel-swap.
  • (3)本文使用聚类获得输出集合的声源表示(与顺序无关的预测)
  • (4)在多个语音分离任务中获得STOA性能。for clean(WSJ0-2/3mix, Libri2/3mix clean) and noisy settings (WHAM and WHAMR, Libri2/3mix noisy)
  • (5)分析了方法的经验优势和缺点
  • (6)本文模型具有一定的通用性,也可应用到母体和胎儿的心率分离工作中。

2. Related work

2.1 Deep clustering approaches

这些方法设计了一种用于掩蔽的聚类模型:模型学习每个时频点的潜在特征表示,使得来自同一声源的时频点之间的距离低于来自不同声源的时频点之间的距离。然后通过聚类将这些特征表示聚类到组时频点。Deep Attractor Network 采用了类似的思路,并为每个源学习潜在吸引子特征表示,以便为每个时频点分配一个接近其源吸引子的表示【22,23】。论文【24】通过引入k-means的可微展开版本在训练时执行聚类。Wavesplit同样依赖于聚类来推断源的特征表示,但是这些特征表示不依赖频率点,且不执行掩码。该表示的作用为:
(1)预测训练说话者的身份
(2)为本文的分离卷积网络提供条件变量

[23] Y. Luo, Z. Chen, and N. Mesgarani, “Speaker-independent speech separation with deep attractor network,” IEEE/ACMTrans. Audio, Speech Lang. Process., vol. 26, no. 4, pp. 787–796, Apr. 2018.
[24] J. R. Hershey, J. L. Roux, S. Watanabe, S. Wisdom, Z. Chen, and Y. Isik, “Novel deep architectures in speech processing,” New Era Robust SpeechRecognition, ExploitingDeep Learn., 2017, pp. 135–164. [Online]. Available: https://doi.org/10.1007/978-3-319-64680-0_6

2.2 Permutation-Invariant Training

置换不变训练方法不需要聚类,而是直接预测多个掩码。通过搜索声源的不同排列,将预测与真实掩码进行比较,所有排列中,误差最小的一种用于模型训练。Wavesplit与PIT方法一样,在时域上对信号进行处理,但是本文方法在信号估计之前解决了标签置换问题:训练时,在调节分离网络之前对潜在声源的特征表示进行排序,从而与标签最佳匹配。

2.3 Discriminative speaker representations

论文【14】从纯净语音序列中提取目标说话人的特征表示,然后从混合语音中分离出该说话人。很多已有工作都是用于处理说话人相关的语音分离任务,wavesplit在训练中不需使用测试集中出现的说话人语音,即可实现语音分离。

2.4 Speaker separation in constrained settings

分离方法可能用于解决在线分离问题,这对于基于聚类的方法存在挑战性(效率限制因素)。此外,嘈杂环境中的语音分离同样是一个重要的应用领域。本文方法对于带噪以及混响环境数据集,实现了STOA性能。

2.5 Separation of fetal and maternal heart rates

3. Wavesplit

在这里插入图片描述
Wavesplit 包含两个卷积子网络:speaker stack 和 separation stack。speaker stack将混合语音映射到一组用于表示说话人的向量。后者处理混合语音以及speaker stack输出的说话人表示集合,进而产生分离语音。

后者是一种常用模型,类似于基于预训练的说话人向量【14】,或使用PIT训练的架构【11】。本文贡献的核心是speaker stack,该部分与后者进行联合训练。训练时,说话人标签用于学习每个说话人的向量表示,使得不同说话人之间的距离很大,而说话人内的距离很小。同时,这种特征表示还用于separation stack部分重建纯净信号。在测试阶段,speaker stack依赖于聚类来识别每个说话人的质心的表示。

3.1 Problem setting & notations

单声道语音的信号用向量yi∈χ1,Ty^i \in \chi^{1, T}yiχ1,T表示,其中i∈[1,N]i \in [1, N]i[1,N],表示声源索引,T表示序列长度。混合语音信号用x=∑i=1Nyix = \sum_{i=1}^{N}y^ix=i=1Nyi

分离模型fff预测每个源的估计值,将其与参考值{ yi}i=1N\{y^i\}^N_{i=1}{ yi}i=1N进行比较来评估质量:
在这里插入图片描述
其中q表示质量评价指标,SNS_N

提供的引用内容未涉及“Speaker-independent multi-talker speech separation with permutation invariant training of deep models”以及用于说话人无关的多说话人语音分离的深度模型的排列不变训练相关内容,因此无法根据引用准确回答该问题。 不过,说话人无关的多说话人语音分离的排列不变训练(Permutation Invariant Training,PIT)是一个重要的研究方向。在多说话人语音分离任务中,由于模型输出的分离结果和真实的源信号之间可能存在排列顺序的不确定性,PIT旨在解决这种排列不匹配的问题。 排列不变训练的基本思想是通过考虑所有可能的排列组合,找到使得损失函数最小的排列,从而让模型在训练过程中不依赖于特定的输出顺序。例如,对于有 $N$ 个说话人的分离任务,模型输出的 $N$ 个分离信号和真实的 $N$ 个源信号之间有 $N!$ 种排列可能,PIT会计算每种排列下的损失,然后选择损失最小的排列作为当前训练步骤的目标。 以下是一个简单的伪代码示例,展示了排列不变训练的基本流程: ```python import itertools import torch import torch.nn as nn # 假设模型输出和真实标签 model_output = torch.randn(3, 100) # 3 个分离信号,每个长度为 100 true_labels = torch.randn(3, 100) # 定义损失函数 criterion = nn.MSELoss() # 生成所有可能的排列 permutations = list(itertools.permutations(range(3))) # 计算每种排列下的损失 losses = [] for perm in permutations: permuted_labels = true_labels[list(perm)] loss = criterion(model_output, permuted_labels) losses.append(loss) # 选择最小损失 final_loss = min(losses) print("Final loss:", final_loss) ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aidanmomo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值