SincNet

GitHub
1.2k 269 中等 1 次阅读 4天前MIT音频开发框架
AI 解读 由 AI 自动生成,仅供参考

SincNet 是一款专为高效处理原始音频样本而设计的神经网络架构。它主要解决了传统卷积神经网络(CNN)在音频处理中需要学习大量滤波器参数、导致模型冗余且难以解释的问题。与标准 CNN 不同,SincNet 创新性地引入了参数化的 sinc 函数作为第一层卷积核,直接构建带通滤波器。该方法仅需从数据中学习滤波器的低频和高频截止频率,从而自动生成针对特定任务优化的自定义滤波器组。这种设计不仅大幅减少了参数量,提升了计算效率,还让网络能够更专注于提取具有物理意义的声学特征。

SincNet 特别适合从事语音识别、说话人识别及相关音频分析领域的研究人员和开发者使用。项目提供了基于 PyTorch 的完整代码库及实用工具,并包含在 TIMIT 数据集上进行说话人识别的示例,方便用户快速上手实验。此外,SincNet 的核心算法也已集成到功能更全面的 SpeechBrain 语音处理工具包中,支持包括语音增强、分离及多麦克风信号处理在内的多种任务。对于希望深入探索端到端音频处理技术或需要轻量化高效模型的专业人士而言,SincNet 是一个极具价值的开源选择。

使用场景

某安防科技公司的算法团队正在开发一套基于声音的远程身份验证系统,需要从原始录音中精准识别说话人身份。

没有 SincNet 时

  • 特征工程繁琐:团队必须依赖人工设计的梅尔频率倒谱系数(MFCC)等手工特征,流程复杂且容易丢失原始波形中的细微鉴别信息。
  • 模型效率低下:传统卷积神经网络需要学习滤波器中的每一个参数,导致模型参数量巨大,训练收敛慢且推理延迟高。
  • 泛化能力受限:手工提取的特征往往针对特定噪声环境优化,一旦遇到未见过的新场景或背景噪音,识别准确率大幅下降。
  • 可解释性差:黑盒式的滤波器学习过程让开发人员难以理解模型究竟捕捉了哪些频段的声音特征,调试困难。

使用 SincNet 后

  • 端到端自动学习:SincNet 直接处理原始音频样本,利用参数化的 sinc 函数自动发现最具意义的带通滤波器,无需任何人工特征提取步骤。
  • 计算高效紧凑:仅需学习滤波器的低频和高频截止频率,大幅减少了可训练参数,使训练速度提升且更适合部署在资源受限的边缘设备上。
  • 定制化滤波更强:生成的自定义滤波器组能根据数据自适应调整,专门捕捉对说话人区分度最高的频段,显著提升了复杂环境下的鲁棒性。
  • 物理意义明确:由于滤波器基于明确的数学函数构建,开发人员可以直观地分析模型关注的频率范围,便于针对性优化。

SincNet 通过将信号处理先验知识融入深度学习架构,实现了从原始波形到高精度说话人识别的高效、可解释的端到端解决方案。

运行环境要求

操作系统
  • Linux
GPU

需要 NVIDIA GPU(文中提及使用 nvidia TITAN X),具体显存大小和 CUDA 版本未说明

内存

未说明

依赖
notes建议使用 Anaconda 环境管理。代码在集群运行时,需将归一化后的数据集复制到本地节点以提高读取速度。训练时间较长(使用 TITAN X 约需 24 小时)。若用于其他数据集,需手动修改标签字典和配置文件中的类别数量。
python3.6 或 2.7
pytorch 1.0
pysoundfile
SincNet hero image

快速开始

SincNet

SincNet 是一种用于处理 原始音频样本 的神经网络架构。它是一种新颖的卷积神经网络(CNN),旨在促使第一层卷积层发现更具 语义意义的滤波器。SincNet 基于参数化的 sinc 函数,这些函数实现了带通滤波器。

与标准 CNN 不同,标准 CNN 会学习每个滤波器的所有参数,而所提出的 SincNet 方法仅直接从数据中学习低频和高频截止频率。这种方法提供了一种非常紧凑且高效的方式来构建一个专门为特定应用量身定制的 自定义滤波器组

本项目发布了一系列代码和工具,用于使用 SincNet 进行说话人识别。我们提供了一个基于 TIMIT 数据集的说话人识别示例。如果您对 SincNet 在语音识别中的应用感兴趣,可以查看 PyTorch-Kaldi GitHub 仓库(https://github.com/mravanelli/pytorch-kaldi)

观看我们的 SincNet 介绍视频

引用我们

如果您使用了此代码或其中的一部分,请引用我们!

Mirco Ravanelli, Yoshua Bengio, “Speaker Recognition from raw waveform with SincNet” Arxiv

先决条件

  • Linux
  • Python 3.6/2.7
  • PyTorch 1.0
  • PySoundFile( conda install -c conda-forge pysoundfile
  • 我们还建议使用 Anaconda 环境。

SpeechBrain

SincNet 也在 SpeechBrain(https://speechbrain.github.io/)项目中实现。我们也鼓励您了解一下!SpeechBrain 是一个基于 PyTorch 的一体化语音处理工具包,目前支持语音识别、说话人识别、任务型语言理解(SLU)、语音增强、语音分离以及多麦克风信号处理等功能。该工具包设计灵活、易于使用、模块化且文档完善。立即查看

更新

2019年2月16日:

  • 我们已将旧的“sinc_conv”替换为“SincConv_fast”。后者速度提升了50%。
  • 在不久的将来,我们计划在 PyTorch-Kaldi 项目 中支持基于 SincNet 的说话人识别功能(当前版本的项目仅支持 SincNet 用于语音识别实验)。这将使用户能够在更快速、更灵活的环境中进行说话人识别实验。不过,当前的代码库仍将继续作为示例展示。

如何运行 TIMIT 实验

尽管代码可以轻松适配任何语音数据集,但在文档的下一部分,我们提供了一个基于流行 TIMIT 数据集的示例。

1. 运行 TIMIT 数据准备。

此步骤是必要的,用于存储一个去除了起始和结束静音并归一化了每个语音片段幅度的 TIMIT 版本。为此,请运行以下代码:

python TIMIT_preparation.py $TIMIT_FOLDER $OUTPUT_FOLDER data_lists/TIMIT_all.scp

其中:

  • $TIMIT_FOLDER 是原始 TIMIT 语料库的文件夹
  • $OUTPUT_FOLDER 是将存储归一化 TIMIT 的文件夹
  • data_lists/TIMIT_all.scp 是用于训练/测试说话人识别系统的 TIMIT 文件列表。

2. 运行说话人识别实验。

  • 根据您的路径修改 cfg/SincNet_TIMIT.cfg 文件中的 [data] 部分。特别是,将 data_folder 修改为在 TIMIT 准备过程中指定的 $OUTPUT_FOLDER。配置文件的其他参数属于以下部分:

    1. [windowing],定义如何将每句话分割成更小的块。
    2. [cnn],指定 CNN 架构的特征。
    3. [dnn],指定 CNN 层之后的全连接 DNN 架构的特征。
    4. [class],指定 softmax 分类部分。
    5. [optimization],报告用于训练架构的主要超参数。
  • 配置好 cfg 文件后,您可以使用以下命令运行说话人识别实验:

python speaker_id.py --cfg=cfg/SincNet_TIMIT.cfg

网络可能需要几个小时才能收敛(取决于您的 GPU 卡的速度)。在我们的例子中,使用 nvidia TITAN X 显卡,整个训练大约花费了 24 小时。如果您在集群中使用该代码,务必将归一化的数据集复制到本地节点上,因为当前版本的代码需要频繁访问存储的 wav 文件。请注意,有几个可能的优化措施可以提高代码速度,但在此版本中并未实现,因为它们超出了本工作的范围。

3. 结果。

结果会保存到 cfg 文件中指定的 output_folder 中。在这个文件夹中,您可以找到一个文件 (res.res),总结了训练和测试的错误率。模型 model_raw.pkl 是在最后一次迭代后保存的 SincNet 模型。 使用上述配置文件,我们得到了以下结果:

epoch 0, loss_tr=5.542032 err_tr=0.984189 loss_te=4.996982 err_te=0.969038 err_te_snt=0.919913
epoch 8, loss_tr=1.693487 err_tr=0.434424 loss_te=2.735717 err_te=0.612260 err_te_snt=0.069264
epoch 16, loss_tr=0.861834 err_tr=0.229424 loss_te=2.465258 err_te=0.520276 err_te_snt=0.038240
epoch 24, loss_tr=0.528619 err_tr=0.144375 loss_te=2.948707 err_te=0.534053 err_te_snt=0.062049
epoch 32, loss_tr=0.362914 err_tr=0.100518 loss_te=2.530276 err_te=0.469060 err_te_snt=0.015152
epoch 40, loss_tr=0.267921 err_tr=0.076445 loss_te=2.761606 err_te=0.464799 err_te_snt=0.023088
epoch 48, loss_tr=0.215479 err_tr=0.061406 loss_te=2.737486 err_te=0.453493 err_te_snt=0.010823
epoch 56, loss_tr=0.173690 err_tr=0.050732 loss_te=2.812427 err_te=0.443322 err_te_snt=0.011544
epoch 64, loss_tr=0.145256 err_tr=0.043594 loss_te=2.917569 err_te=0.438507 err_te_snt=0.009380
epoch 72, loss_tr=0.128894 err_tr=0.038486 loss_te=3.009008 err_te=0.438005 err_te_snt=0.019481
....
epoch 320, loss_tr=0.033052 err_tr=0.009639 loss_te=4.076542 err_te=0.416710 err_te_snt=0.006494
epoch 328, loss_tr=0.033344 err_tr=0.010117 loss_te=3.928874 err_te=0.415024 err_te_snt=0.007215
epoch 336, loss_tr=0.033228 err_tr=0.010166 loss_te=4.030224 err_te=0.410034 err_te_snt=0.005051
epoch 344, loss_tr=0.033313 err_tr=0.010166 loss_te=4.402949 err_te=0.428691 err_te_snt=0.009380
epoch 352, loss_tr=0.031828 err_tr=0.009238 loss_te=4.080747 err_te=0.414066 err_te_snt=0.006494
epoch 360, loss_tr=0.033095 err_tr=0.009600 loss_te=4.254683 err_te=0.419954 err_te_snt=0.005772

收敛最初非常迅速(见前 30 个 epoch)。此后,性能提升逐渐减缓,并且句子级错误率出现了波动。尽管存在这些波动,后续的各个 epoch 仍呈现出平均性能提升的趋势。在本次实验中,我们于第 360 个 epoch 停止了训练。 res.res 文件中的字段含义如下:

  • loss_tr:是在每一帧上计算的平均训练损失(即交叉熵函数)。
  • err_tr:是训练数据的分类错误率(以帧为单位测量)。请注意,我们将语音信号分割成 200 毫秒的块,重叠 10 毫秒。错误率是对训练数据集中所有块的平均值。
  • loss_te:是在每一帧上计算的平均测试损失(即交叉熵函数)。
  • err_te:是测试数据的分类错误率(以帧为单位测量)。
  • err_te_snt:是测试数据的分类错误率(以句子为单位测量)。请注意,我们将语音信号分割成 200 毫秒的块,重叠 10 毫秒。对于每个块,我们的 SincNet 模型都会对一组说话人进行预测。为了计算这个错误率,我们对所有预测进行了平均,并根据每个句子中最高平均概率的说话人进行投票。

您可以在这里找到我们为 TIMIT 训练的模型。

SincNet 在哪里实现?

要查看 SincNet 的实现,您应该打开 dnn_models.py 文件,并阅读 SincNetsinc_conv 类以及 sinc 函数。

如何将 SincNet 应用到其他数据集?

在本仓库中,我们使用 TIMIT 数据集作为教程,展示 SincNet 的工作原理。 借助当前版本的代码,您可以轻松地使用其他语料库。为此,您需要提供特定于该语料库的输入文件(WAV 格式)以及您自己的标签。因此,您需要修改 data_lists 文件夹中的 .scp 文件中的路径。

为了为每句话分配正确的标签,您还需要修改名为 TIMIT_labels.npy 的字典文件。 标签以 Python 字典的形式指定,其中句子 ID 作为键(例如 si1027),说话人 ID 作为值。每个说话人 ID 是一个整数,范围从 0 到 N_spks-1。在 TIMIT 数据集中,您可以很容易地从文件路径中提取说话人 ID(例如,train/dr1/fcjf0/si1027.wav 表示由说话人 fcjf0 发音的句子 ID 为 si1027)。对于其他数据集,您也应能以类似方式构建包含说话人和句子 ID 对应关系的字典。

接下来,您需要根据新的路径修改配置文件 (cfg/SincNet_TIMIT.cfg)。同时,请务必根据您数据集中说话人的数量 N_spks 修改 class_lay=462 这一字段。

论文中使用的 Librispeech 数据集版本可按需提供。在我们的研究中,我们仅为每个说话人使用了 12–15 秒的训练材料,并对原始的 Librispeech 句子进行了处理以进行幅度归一化。此外,我们还使用了一个基于能量的简单 VAD 检测器,以去除每句话开头和结尾的静音,并将包含较长静音的句子拆分为多个片段。

参考文献

[1] Mirco Ravanelli, Yoshua Bengio, “Speaker Recognition from raw waveform with SincNet” Arxiv

常见问题

相似工具推荐

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 真正成长为懂上

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

ComfyUI

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

108.3k|★★☆☆☆|1周前
开发框架图像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周前
插件开发框架