我们提供了我们的说话人语音分离研究工作的PyTorch实现。在具有未知数量的多个说话者的语音分离中,我们提出了一种分离混合音频序列的新方法,其中多个声音同时说话。新方法采用门控神经网络,这些网络经过训练可以在多个处理步骤中分离语音,同时保持每个输出通道中的扬声器固定。为每个可能的说话者数量训练一个不同的模型,并使用具有最大说话者数量的模型来选择给定样本中的实际说话者数量。我们的方法大大优于当前最先进的方法,正如我们所展示的,对于两个以上的演讲者来说,它没有竞争力。请注意,此实现不包含论文中描述的“IDloss”。
音频样本可以在这里找到:样本
首先,安装 Python 3.7(推荐使用 Anaconda)。
克隆此存储库并安装依赖项。我们建议使用全新的 virtualenv 或 Conda 环境。
git clone git@github.com:fairinternal/svoice.git
cd svoice
pip install torch==1.6.0+cu101 torchvision==0.7.0+cu101 -f https://download.pytorch.org/whl/torch_stable.html
pip install -r requirements.txt
我们使用Hydra来控制所有训练配置。如果你不熟悉 Hydra,我们建议你访问 Hydra网站。通常,Hydra 是一个开源框架,它通过提供动态创建分层配置的能力来简化研究应用程序的开发。
可以在
conf文件夹下找到包含用于训练模型的所有相关参数的配置文件。请注意,在
conf文件夹下,该
dset文件夹包含不同数据集的配置文件。你应该会看到一个以
config.yaml调试示例集的相关配置命名的文件。
你可以通过命令行传递选项,例如
python train.py lr=1e-4. 请参阅conf/config.yaml以获取可能选项的参考。你也可以直接编辑
config.yaml文件,但由于实验是自动命名的方式,不建议这样做,如下所述。
每个实验都将根据你传递的命令行选项获得一个唯一名称。如果可能,重新启动相同的命令将重用现有文件夹并自动从上一个检查点开始。为了忽略以前的检查点,你必须传递该
restart=1选项。请注意,诸如
device、
num_workers等选项对实验名称没有影响。
如果你想使用新数据集进行训练,你可以:
dset文件夹下。检查conf/dset/debug.yaml 以获取有关配置数据集的更多详细信息。
./train.py dset=name_of_dset.
你还需要
.json在
egs/文件夹中生成相关文件。为此,你可以使用
python -m svoice.data.audio将扫描给定文件夹并将所需元数据输出为 json 的命令。例如,如果你的混合文件位于
$mix并且分离的文件位于
$spk1和
$spk2,你可以这样做
out=egs/mydataset/tr
mkdir -p $out
python -m svoice.data.audio $mix > $out/mix.json
python -m svoice.data.audio $spk1 > $out/s1.json
python -m svoice.data.audio $spk1 > $out/s1.json
我们提供了一个数据集生成脚本,用户可以在其中创建自己的嘈杂和混响数据集。此数据集生成脚本遵循我们最近的 ICASSP-2021 论文中所述的相同方法:混响和噪声设置下未知数量扬声器的单通道语音分离。生成脚本可以在以下位置找到:
scripts/make_dataset.py. 此数据生成脚本将干净的录音以及一组噪声作为输入,并使用这些录音生成噪声混响数据集。我们使用以下RIR-Generator包合成房间脉冲响应,该包使用Allen 和 Berkley 在 1979 年提出的图像方法. 该方法是声学信号处理社区中最常用的方法之一,用于创建合成房间脉冲响应。
在生成混响数据的情况下,需要首先安装RIR-Generator包。
有关可能的论点的更多详细信息,请参阅:
usage: Mode [-h] [--in_path IN_PATH] [--out_path OUT_PATH] [--noise_path NOISE_PATH] [--num_of_speakers NUM_OF_SPEAKERS] [--num_of_scenes NUM_OF_SCENES] [--sec SEC] [--sr SR] optional arguments: -h, --help show this help message and exit --in_path IN_PATH --out_path OUT_PATH --noise_path NOISE_PATH --num_of_speakers NUM_OF_SPEAKERS no of speakers. --num_of_scenes NUM_OF_SCENES no of examples. --sec SEC --sr SR
./make_debug.sh以生成玩具数据集的 json 文件。
python train.py
注意,我们已经为它提供了 yaml 文件。可以在 下找到
conf/dset/debug.yaml。
数据加载器读取名为: 的混合和分离的 json 文件
mix.json,
s<id>.jsonwhere
<id>是运行标识符。这些文件应包含用于优化和测试模型的 wav 文件的所有路径及其大小(以帧为单位)。你可以使用
python -m svoice.data.audio FOLDER_WITH_WAV1 [FOLDER_WITH_WAV2 ...] > OUTPUT.json生成这些文件。你应该为训练集和测试集(以及验证集,如果提供)生成上述文件。完成此操作后,你应该
conf/dset/debug.yaml使用数据集文件夹的更新路径创建一个 yaml(类似于)。请检查conf/dset/debug.yaml以获取更多详细信息。
如果你可以访问原始 wsj0 数据(球体格式),你可以使用以下存储库中提供的工具生成混合物(请参阅自述文件中的使用部分)。你可以从以下示例页面访问包含用于生成混合物的所有元数据的 csv 文件。
只需启动
train.py脚本即可完成训练:
python train.py
这将自动从
conf/config.yaml文件中读取所有配置。你可以从命令覆盖不同的配置参数,这将使用覆盖参数自动生成新文件夹。
python train.py lr=0.001 python train.py dset=librimix lr=0.001 swave.R=8
要启动分布式训练,你应该打开分布式训练标志。这可以按如下方式完成:
python train.py ddp=1
日志默认存储在
outputs文件夹中。查找匹配的实验名称。在实验文件夹中,你将找到训练检查点
checkpoint.th(包含最后状态和最佳状态)以及带有指标的日志
trainer.log。所有指标也被提取到
history.json文件中,以便于解析。增强示例存储在
samples文件夹中(如果
mix_dir或
mix_json在数据集配置 yaml 文件中设置)。
可以通过启动以下操作来评估模型:
python -m svoice.evaluate <path to the model> <path to folder containing mix.json and all target separated channels json files s<ID>.json>
有关可能的论点的更多详细信息,请参阅:
usage: Evaluate separation performance using MulCat blocks [-h] [--device DEVICE] [--sdr SDR] [--sample_rate SAMPLE_RATE] [--num_workers NUM_WORKERS] [-v] model_path data_dir positional arguments: model_path Path to model file created by training data_dir directory including mix.json, s1.json, s2.json, ... files optional arguments: -h, --help show this help message and exit --device DEVICE --sdr SDR --sample_rate SAMPLE_RATE Sample rate --num_workers NUM_WORKERS -v, --verbose More loggging
可以通过启动以下命令来分离文件:
python -m svoice.separate <path to the model> <path to store the separated files> --mix_dir=<path to the dir with the mixture files>
请注意,你可以提供
mix_dir或
mix_json用于测试数据。有关可能的论点的更多详细信息,请参阅:
usage: Speech separation using MulCat blocks [-h] [--mix_dir MIX_DIR] [--mix_json MIX_JSON] [--device DEVICE] [--sample_rate SAMPLE_RATE] [--batch_size BATCH_SIZE] [-v] model_path out_dir positional arguments: model_path Model name out_dir Directory putting enhanced wav files optional arguments: -h, --help show this help message and exit --mix_dir MIX_DIR Directory including mix wav files --mix_json MIX_JSON Json file including mix wav files --device DEVICE --sample_rate SAMPLE_RATE Sample rate --batch_size BATCH_SIZE Batch size -v, --verbose More loggging
使用默认配置(与我们的 [paper][arxiv] 中介绍的相同),结果应该类似于以下内容。所有报告的数字都是输入混合的尺度不变信噪比改进 (SI-SNRi)。
模型 | #参数 | 2spk | 3spk | 4spk | 5spk |
---|---|---|---|---|---|
艾达网 | 9.1M | 10.5 | 9.1 | —— | —— |
DPCL++ | 13.6M | 10.8 | 7.1 | —— | —— |
CBLDNN-GAT | 3950万 | 11.0 | —— | —— | —— |
塔斯网 | 32.0M | 11.2 | —— | —— | —— |
IBM | —— | 13.0 | 12.8 | 10.6 | 10.3 |
风险管理 | —— | 12.7 | 12.5 | 9.8 | 9.6 |
转换网络 | 5.1M | 15.3 | 12.7 | 8.5 | 6.8 |
FurcaNeXt | 51.4M | 18.4 | —— | —— | —— |
神经网络 | 3.6M | 18.8 | 14.7 | 10.4 | 8.7 |
我们的 | 7.5M | 20.1 | 16.9 | 12.9 | 10.6 |
以下学习方法是使用 L=8(编码器内核大小)获得的:
如果你发现我们的代码或模型对你的研究有用,请将其引用为:
@inproceedings{nachmani2020voice, title={Voice Separation with an Unknown Number of Multiple Speakers}, author={Nachmani, Eliya and Adi, Yossi and Wolf, Lior}, booktitle={Proceedings of the 37th international conference on Machine learning}, year={2020} }
如果你发现我们的数据集生成管道有用,请将其引用为:
@inproceedings{chazan2021single, title={Single channel voice separation for unknown number of speakers under reverberant and noisy settings}, author={Chazan, Shlomo E and Wolf, Lior and Nachmani, Eliya and Adi, Yossi}, booktitle={ICASSP 2021-2021 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP)}, pages={3730--3734}, year={2021}, organization={IEEE} }
该存储库在 CC-BY-NC-SA 4.0 下发布。在LICENSE文件中找到的许可证。
该文件:
svoice/models/sisnr_loss.py并
svoice/data/preprocess.py改编自kaituoxu/Conv-TasNet存储库。它是Conv-TasNet: Surpassing Ideal Time-Frequency Magnitude Masking for Speech Separation论文的非官方实现,在 MIT 许可下发布。此外,在 CC BY-NC-SA 3.0 许可下发布的yluo42/TAC存储库中借用和修改了几个输入操作函数。