svoice - 我们提供了论文语音分离的 PyTorch 实现,在其中,我们提出了一种分离混合音频序列的新方法,其中多个语音同时说话。

Created at: 2020-11-20 00:37:28
Language: Python
License: NOASSERTION

SVoice:使用神经网络的说话人语音分离

我们提供了我们的说话人语音分离研究工作的PyTorch实现。在具有未知数量的多个说话者的语音分离中,我们提出了一种分离混合音频序列的新方法,其中多个声音同时说话。新方法采用门控神经网络,这些网络经过训练可以在多个处理步骤中分离语音,同时保持每个输出通道中的扬声器固定。为每个可能的说话者数量训练一个不同的模型,并使用具有最大说话者数量的模型来选择给定样本中的实际说话者数量。我们的方法大大优于当前最先进的方法,正如我们所展示的,对于两个以上的演讲者来说,它没有竞争力。请注意,此实现不包含论文中描述的“IDloss”。

音频样本可以在这里找到:样本

我们网络的架构。 音频与一堆 1D 卷积进行卷积,并通过及时切割长度为 K 的重叠段来重新排序,以获得 3D 张量。 在我们的方法中,RNN 块是乘法和加法的类型。 在每对块之后,我们将卷积 D 应用于激活的副本,并通过对块重新排序然后使用重叠和加法运算符来获得输出通道。

安装

首先,安装 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
等选项对实验名称没有影响。

设置新数据集

如果你想使用新数据集进行训练,你可以:

  1. 为它创建一个单独的配置文件。
  2. 将新的配置文件放在
    dset
    文件夹下。检查conf/dset/debug.yaml 以获取有关配置数据集的更多详细信息。
  3. 在通用配置文件中或通过命令行指向它,例如
    ./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

用法

玩具示例快速入门

  1. 运行
    ./make_debug.sh
    以生成玩具数据集的 json 文件。
  2. python train.py

注意,我们已经为它提供了 yaml 文件。可以在 下找到

conf/dset/debug.yaml

数据结构

数据加载器读取名为: 的混合和分离的 json 文件

mix.json
s<id>.json
where
<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(编码器内核大小)获得的:

我们模型的训练曲线。 我们模型的 SI-SNRi 曲线。

引文

如果你发现我们的代码或模型对你的研究有用,请将其引用为:

@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存储库中借用和修改了几个输入操作函数。