uis-rnn

GitHub
1.6k 320 简单 1 次阅读 1周前Apache-2.0开发框架
AI 解读 由 AI 自动生成,仅供参考

uis-rnn 是谷歌开源的一款基于“无界交错状态循环神经网络”算法的深度学习库,核心应用于说话人日记(Speaker Diarization)领域。它主要解决的是如何将一段连续的音频序列自动分割成不同片段,并准确聚类识别出每一段是由哪位说话人发出的这一难题。

与传统方法不同,uis-rnn 的独特亮点在于其能够通过学习示例数据,端到端地处理序列分割与聚类任务,特别适用于需要高精度区分多人对话场景的研究与开发。该工具基于 PyTorch 构建,提供了完整的模型训练、推理及评估接口,并附带了演示脚本和测试用例,方便用户快速上手验证。

需要注意的是,由于依赖谷歌内部基础设施和专有数据,此开源版本不包含论文中使用的完整说话人识别系统(如 d-vector 嵌入模型),且明确声明非谷歌官方正式产品。因此,uis-rnn 最适合具备一定机器学习基础的研究人员和开发者使用,用于算法复现、学术探索或作为构建自定义语音分析系统的核心组件。对于普通用户而言,直接使用封装好的成品软件可能更为便捷,但对于希望深入理解前沿语音分离技术的技术人员来说,这是一个极具参考价值的开源项目。

使用场景

某智能会议助手团队正在处理海量多人在线会议录音,急需将连续的音频流精准切割并区分出每位发言者,以生成结构化的会议纪要。

没有 uis-rnn 时

  • 无法应对动态人数:传统聚类算法需预先设定发言者数量,面对会议中随时加入或退出的参与者,系统往往直接崩溃或归类错误。
  • 长会议精度骤降:随着会议时长增加,基于静态规则的分割方法误差累积严重,导致同一个人的发言被误判为多个不同角色。
  • 开发门槛极高:团队需从零复现复杂的时序建模论文,花费数周调试递归神经网络的状态转移逻辑,难以快速落地业务。
  • 缺乏在线处理能力:现有方案多依赖离线全量数据,无法支持实时会议中的即时发言人追踪与标注。

使用 uis-rnn 后

  • 自适应无界状态:uis-rnn 独有的“无界交错状态”机制,无需预设人数即可自动识别新发言者,完美适配人员流动的开放场景。
  • 长序列稳定输出:通过学习序列数据的内在规律,即使在长达数小时的会议中,也能保持极高的说话人分离准确率,避免身份混淆。
  • 开箱即用加速研发:直接调用封装好的 PyTorch 接口和训练脚本,团队在两天内即可完成模型集成,将精力聚焦于上层应用优化。
  • 支持实时流式推断:算法天然适合在线处理,能够边接收音频边输出带说话人标签的文本流,满足实时字幕与纪要生成的需求。

uis-rnn 通过解决开放场景下的时序聚类难题,让高保真的全自动说话人分离技术从实验室论文真正走向了生产环境。

运行环境要求

GPU

未说明

内存

未说明

依赖
notes该库主要用于序列数据的分割和聚类(如说话人日志)。README 中明确指出此开源版本与论文中使用的内部版本略有不同,且不提供论文中使用的说话人识别系统(d-vector embeddings)的数据、代码或模型。Scipy 仅用于评估阶段。数据目录下的文件仅为演示用的手动生成玩具数据。
python3.5+
numpy==1.15.1
pytorch==1.3.0
scipy==1.1.0
uis-rnn hero image

快速开始

UIS-RNN

Python应用 PyPI版本 Python版本 下载量 codecov 文档

概述

这是用于*无界交错状态循环神经网络(UIS-RNN)*算法的库。UIS-RNN通过从示例中学习,解决了对序列数据进行分割和聚类的问题。

该算法最初在论文《完全监督的说话人日志》中提出(https://arxiv.org/abs/1810.04719)。

这项工作也曾在Google AI 博客上介绍过。

gif

免责声明

由于依赖于一些内部库,此开源实现与我们用于生成论文(https://arxiv.org/abs/1810.04719)结果的内部实现略有不同。

我们无法分享论文中使用的说话人识别系统(d-vector 嵌入)的数据、代码或模型,因为该说话人识别系统高度依赖于 Google 的内部基础设施和专有数据。

本库并非 Google 官方产品。

我们欢迎社区对 uisrnn/contrib 文件夹的贡献(贡献指南)。但我们不对任何社区贡献的正确性负责。

依赖项

本库依赖于以下内容:

  • Python 3.5+
  • NumPy 1.15.1
  • PyTorch 1.3.0
  • SciPy 1.1.0(仅用于评估)

快速入门

YouTube

安装包

无需下载仓库,您可以通过以下方式安装 package

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

如果您分叉了本库并进行了本地修改,请务必使用这些测试作为基本检查。

此外,这些测试也是学习 API 的绝佳示例,尤其是 tests/integration_test.py

核心 API

术语表

通用机器学习 说话人日志
序列 发言段
观测值 / 特征 嵌入 / 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)

args 的定义在 uisrnn/arguments.py 中有说明,请参阅 training_parser

fit() 函数接受两种类型的输入,如下所述。

输入为序列列表(推荐)

在此情况下,train_sequences 是一个观测序列的列表。每个观测序列是一个 2 维的 float 类型 NumPy 数组。

  • 第一维是该序列的长度,不同序列的长度可以不同。
  • 第二维是每个观测的维度,所有序列必须保持一致。对于说话人日志任务,观测可以是 d-vector 嵌入

train_cluster_ids 同样是一个列表,其长度与 train_sequences 相同。train_cluster_ids 中的每个元素是一个 1 维字符串列表或 NumPy 数组,包含对应于 train_sequences 中相应序列的真实标签。对于说话人日志任务,这些标签是每个观测对应的说话人标识符。

以这种方式调用 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() 时,我们会将所有序列和所有聚类标签拼接在一起,并交由下一部分处理。

输入为单个拼接后的序列

在此情况下,train_sequences 应该是一个 2 维的 float 类型 NumPy 数组,用于表示拼接后的观测序列。

例如,如果你有 M 个训练语音片段,每个片段包含 L 个嵌入向量,每个嵌入向量由 D 个数字组成,则 train_sequences 的形状为 N × D,其中 N = M × L

train_cluster_ids 是一个 1 维字符串列表或 NumPy 数组,长度为 N,它是所有训练数据的拼接后真实标签。

由于我们正在拼接观测序列,需要注意的是,train_cluster_ids 中不同序列的真实标签应当是全局唯一的。

例如,如果第一个序列的标签集是 {'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() 函数。

以下是我们的一些建议:

  1. 不要将不同的数据集分别传入不同的 fit() 调用中。相反,每次调用 fit() 时,输入应涵盖来自不同数据集的序列。
  2. 每次调用 fit() 函数时,尽量使输入大小大致相同,但也不要过小。

预测

训练完成后,我们可以使用训练好的模型对新序列进行推理,方法是调用 predict() 函数:

predicted_cluster_ids = model.predict(test_sequences, args)

这里,test_sequences 应该是一个 2 维 float 类型 NumPy 数组的列表,对应于用于测试的观测序列。

返回的 predicted_cluster_ids 是一个与 test_sequences 大小相同的列表。predicted_cluster_ids 中的每个元素是一个整数列表,其长度与相应的测试序列相同。

你也可以只使用一个测试序列作为 test_sequences,此时返回的 predicted_cluster_ids 将是一个单独的整数列表。

args 的定义同样在 uisrnn/arguments.py 中说明,请参阅 inference_parser

引用

我们的论文引用如下:

@inproceedings{zhang2019fully,
  title={Fully supervised speaker diarization},
  author={Zhang, Aonan and Wang, Quan and Zhu, Zhenyao and Paisley, John and Wang, Chong},
  booktitle={International Conference on Acoustics, Speech and Signal Processing (ICASSP)},
  pages={6301--6305},
  year={2019},
  organization={IEEE}
}

参考文献

基线日志系统

如需了解更多基于无监督聚类算法的基线日志系统,请访问此网站

本文中使用的谱聚类算法的 Python 重新实现版本可在此处找到。

NIST SRE 2000 数据集(Disk6 和 Disk8)的真实标签可在此处找到:https://github.com/google/speaker-id/tree/master/publications/LstmDiarization/evaluation/NIST_SRE2000

更多关于说话人日志的公开资源,请参阅 awesome-diarization

说话人识别器/编码器

如需了解更多关于我们说话人嵌入系统的相关信息,请访问此网站

我们了解到有几款第三方实现了这项工作:

请根据自己的判断决定是否使用这些实现。

我们不对任何第三方实现的正确性负责。

变体

这里列出了基于 UIS-RNN,但集成了其他技术或进行了一些改进的仓库。

链接 描述
taylorlu/Speaker-Diarization GitHub 星标 使用 UIS-RNN 和 GhostVLAD 进行说话人日志分割。一种更简便的方式来支持开放集说话人识别。
DonkeyShot21/uis-rnn-sml GitHub 星标 UIS-RNN 的一个变体,用于论文《面向多领域数据的带样本均值损失的监督在线日志分割》。

常见问题

相似工具推荐

openclaw

OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你

349.3k|★★★☆☆|1周前
Agent开发框架图像

stable-diffusion-webui

stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。

162.1k|★★★☆☆|1周前
开发框架图像Agent

everything-claude-code

everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上

158.1k|★★☆☆☆|今天
开发框架Agent语言模型

ComfyUI

ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。

108.3k|★★☆☆☆|6天前
开发框架图像Agent

gemini-cli

gemini-cli 是一款由谷歌推出的开源 AI 命令行工具,它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言,它提供了一条从输入提示词到获取模型响应的最短路径,无需切换窗口即可享受智能辅助。 这款工具主要解决了开发过程中频繁上下文切换的痛点,让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用,还是执行复杂的 Git 操作,gemini-cli 都能通过自然语言指令高效处理。 它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口,具备出色的逻辑推理能力;内置 Google 搜索、文件操作及 Shell 命令执行等实用工具;更独特的是,它支持 MCP(模型上下文协议),允许用户灵活扩展自定义集成,连接如图像生成等外部能力。此外,个人谷歌账号即可享受免费的额度支持,且项目基于 Apache 2.0 协议完全开源,是提升终端工作效率的理想助手。

100.8k|★★☆☆☆|1周前
插件Agent图像

markitdown

MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具,专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片(含 OCR)、音频(含语音转录)、HTML 乃至 YouTube 链接等多种格式的解析,能够精准提取文档中的标题、列表、表格和链接等关键结构信息。 在人工智能应用日益普及的今天,大语言模型(LLM)虽擅长处理文本,却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点,它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式,成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外,它还提供了 MCP(模型上下文协议)服务器,可无缝集成到 Claude Desktop 等 LLM 应用中。 这款工具特别适合开发者、数据科学家及 AI 研究人员使用,尤其是那些需要构建文档检索增强生成(RAG)系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性,但其核心优势在于为机器

93.4k|★★☆☆☆|1周前
插件开发框架