This is the library for the Unbounded Interleaved-State Recurrent Neural Network (UIS-RNN) algorithm, corresponding to the paper Fully Supervised Speaker Diarization.
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 1 年前 | ||
| 7 年前 | ||
| 7 年前 | ||
| 3 年前 | ||
| 7 年前 | ||
| 1 年前 | ||
| 1 年前 | ||
| 7 年前 | ||
| 7 年前 | ||
| 6 年前 | ||
| 7 年前 | ||
| 3 年前 | ||
| 6 年前 | ||
| 7 年前 | ||
| 1 年前 | ||
| 3 年前 | ||
| 5 年前 | ||
| 6 年前 |
UIS-RNN
概览
这是*无界交织状态递归神经网络(UIS-RNN)*算法的库。 UIS-RNN通过从示例学习来解决序列数据分割和聚类的问题。
此工作由[谷歌人工智能博客]介绍, (https://ai.googleblog.com/2018/11/accurate-online-speaker-diarization.html)。

免责声明
开源实现与我们用于生成论文结果的内部版本略有不同, ,原因在于依赖一些内部库。
由于说话人识别系统(使用[d-vector嵌入]) 严重依赖于谷歌的内部基础设施和专有数据, 因此我们无法分享数据、代码或模型。
本库非官方谷歌产品。
我们欢迎社区对uisrnn/contrib文件夹的贡献(请参考[指南])。
(CONTRIBUTING.md)
但我们不对任何社区贡献的正确性负责。
依赖项
本库依赖以下软件:
- Python 3.5 及以上
- Numpy 1.15.1
- PyTorch 1.3.0
- Scipy 1.1.0 (仅限评估)
开始使用
安装包
pip3 install uisrnn
或者,
python3 -m pip install uisrnn
运行演示
运行以下命令即可启动:
python3 demo.py --train_iteration=1000 -l=0.001
这将使用data/toy_training_data.npz训练一个UIS-RNN模型,
然后将模型存储到磁盘上,在data/toy_testing_data.npz上执行推理,
打印推理结果,并在文本文件中保存平均精度。
注:data/下的文件是人工生成的“玩具”数据,仅供演示之用。
这些数据非常简单,所以理论上我们应该能够在测试数据上获得100%的准确率。
运行测试
要验证库的正确性,可运行以下命令:
bash run_tests.sh
如果你分叉此库并作出本地更改,务必以这些测试作为安全检查工具。
此外,这些测试也是学习APIs的好例子,特别是tests/integration_test.py。
核心APIs
术语表
| 通用机器学习 | 说话人辨识 |
|---|---|
| 序列 | 发音 |
| 观测值/特征 | 嵌入/d-vector |
| 标签/簇ID | 说话者 |
参数设置
在主脚本中,调用以下函数获取参数:
model_args, training_args, inference_args = uisrnn.parse_arguments()
构建模型
所有算法均被实现在UISRNN类中。首先,创建一个UISRNN对象:
model = uisrnn.UISRNN(args)
参数定义见uisrnn/arguments.py中的model_parser。
训练
接下来,通过调用fit()方法训练模型:
model.fit(train_sequences, train_cluster_ids, args)
参数定义见uisrnn/arguments.py中的training_parser。
fit()方法接受两种输入格式,具体如下所述。
将序列表格化输入(推荐)
这里,train_sequences是观测序列的列表。
每个观测序列是由类型为float的二维数组构成。
train_cluster_ids也是一个列表,其长度与train_sequences相同。该列表中的每一个元素都是包含字符串的一维列表或numpy数组,记载着对应序列的真实标签信息。在说话人辨识情境下,这些标签即为每个观测记录对应的说话人的身份标识。
当你按照这种方式调用fit()时,务必小心对待参数--enforce_cluster_id_uniqueness。
例如:
假设
train_cluster_ids = [['a', 'b'], ['a', 'c']]
如果来自两个序列的不同'a'其实指向的是整个数据集内相同的簇,则应设定enforce_cluster_id_uniqueness=False; 否则,若'a'只是局部指示符,用以区分第一个序列中的'b'以及第二个序列中的'c',那么应当设定enforce_cluster_id_uniqueness=True。
另外需要注意,当以此方式调用fit()时,我们将合并所有的序列及其簇ID,并转交给下文所描述的方式去处理。
单独连接序列
此处,train_sequences应该是一个单一的类型为float的二维数组,其中包含了连接后的观测序列。
例如,假如你有M个训练发音,每个发音是一系列L个嵌入。每个嵌入是一个D维的向量。那么train_sequences的形状将是N x D,其中N = M x L。
train_cluster_ids是一个长度为N的字符串一维列表或numpy数组,它记述了所有训练数据的合并后真实标签。
既然我们正在连接观测序列,故重要的是要知道,不同序列中的train_cluster_id内的真实标签应该具有全局唯一性。
例如,如果第一组标签集合是{'A', 'B', 'C'},第二组标签集合是{'B', 'C', 'D'}。那么在连接之前,我们应当重命名它们为类似{'1_A', '1_B', '1_C'}和{'2_B', '2_C', '2_D'}的形式,除非两序列中的'B'和'C'真正意义上是同一的(在说话人辨识环境中,意味着这两者跨越发音都属于同一个说话人)。这部分将自动由参数--enforce_cluster_id_uniqueness处理,参照前文中所述情形。
我们将所有训练序列连结起来的原因在于,我们将对此数据进行重抽样和块级洗牌的过程,以此作为数据增强过程的一部分,从而即使在训练序列数量不足的情况下也能得到稳健的模型。
大规模数据集上的训练
针对大规模数据集,通常情况下一次性无法将全部数据加载至内存中。
在此种情况下,需要多次调用fit()方法。
以下是我们的几点建议:
- 不要将不同的数据集分别送入不同的
fit()调用中。相反,每次调用fit()时,输入的数据应当涵盖来自不同数据集中的序列。 - 对于每一次
fit()函数的调用,使输入数据量大致相等。并且,别让输入数据量过于小。
预测
完成训练后,我们可以使用训练好的模型对新的序列进行推理,通过调用predict()函数实现:
predicted_cluster_ids = model.predict(test_sequences, args)
这里,test_sequences应该是一个由二维浮点型numpy数组组成的列表,对应于测试用的观察序列。
返回的predicted_cluster_ids与test_sequences大小相同,它包含了一系列整数列表。每个元素都是一个整数列表,其长度与相应的测试序列相同。
你也可以将单个测试序列作为test_sequences。这种情况下,predicted_cluster_ids也将是一个单一的整数列表。
关于args参数的定义,请参考uisrnn/arguments.py中的inference_parser部分。
引用
我们的论文引用格式如下:
@inproceedings{zhang2019fully,
title={完全监督说话者分离},
author={张敖楠和王泉和朱甄瑶和佩斯利约翰和王冲},
booktitle={国际声学、语音与信号处理会议(ICASSP)},
pages={6301--6305},
year={2019},
organization={IEEE}
}
参考文献
基线聚类系统
想了解更多基于无监督聚类算法的基线分离系统,请访问 这个网站。
本文中使用的谱聚类算法的Python重新实现可在此处找到: 此处。
关于 NIST SRE 2000 数据集(磁盘6和磁盘8)的真实标签信息, 可以在这里获取: 此处。
更多有关说话人分离的公开资源,请查看awesome-diarization。
说话人识别/编码器
要了解更多信息,关于我们所采用的说话人嵌入系统,请访问 这个网站。
我们注意到有几个第三方实现了这一工作:
- Resemblyzer:resemble-ai的PyTorch实现
- janghyun1230的TensorFlow实现
- HarryVolek的PyTorch实现,集成UIS-RNN
- SV2TTS项目中的PyTorch实现
请根据自身判断决定是否使用这些实现。
我们不对任何第三方实现的正确性负责。
变体
这里列出了一些基于UIS-RNN但整合了其他技术或进行了改进的仓库。
| 链接 | 描述 |
|---|---|
| taylorlu/Speaker-Diarization |
使用UIS-RNN和GhostVLAD的说话人分离,提供了一种更简单的方式来支持开放集的说话人。 |
| DonkeyShot21/uis-rnn-sml |
UIS-RNN的一个变种,用于论文《带有样本均值损失的多域数据监督在线分离》的研究。 |
项目介绍
这是面向无界交错状态循环神经网络(UIS-RNN)算法的库,与论文《完全监督说话人分割》相对应。【此简介由AI生成】
