模型简介
模型特点
模型能力
使用案例
🚀 Frame-VAD多语言MarbleNet v2.0
Frame-VAD多语言MarbleNet v2.0是一个用于语音活动检测(VAD)的卷积神经网络,是语音识别和说话人分离的第一步。它是一个基于帧的模型,为输入音频的每20毫秒帧输出一个语音概率。该模型仅有91.5K个参数,轻量级且适用于实时应用。
✨ 主要特性
- 轻量级模型,仅91.5K个参数
- 能有效抵抗误报错误
- 为每20毫秒音频帧输出语音概率
- 支持多语言:中文、英文、法语、德语、俄语和西班牙语
此模型可用于商业用途。
📄 许可证
适用条款:您使用此模型需遵循 NVIDIA开放模型许可协议。
部署范围
全球
使用场景
开发者、语音处理工程师和AI研究人员会将其作为其他语音处理模型的第一步。
参考资料
[1] Jia, Fei, Somshubra Majumdar, and Boris Ginsburg. "MarbleNet: Deep 1D Time-Channel Separable Convolutional Neural Network for Voice Activity Detection." ICASSP 2021 - 2021 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP). IEEE, 2021. [2] NVIDIA NeMo Toolkit
模型架构
属性 | 详情 |
---|---|
模型类型 | 卷积神经网络(CNN) |
网络架构 | MarbleNet |
参数数量 | 91.5K |
输入
属性 | 详情 |
---|---|
输入类型 | 音频 |
输入格式 | .wav文件 |
输入参数 | 一维 |
其他输入属性 | 16000 Hz单声道音频,无需预处理 |
输出
属性 | 详情 |
---|---|
输出类型 | 每个20毫秒帧的语音概率序列 |
输出格式 | 浮点数组 |
输出参数 | 一维 |
其他输出属性 | 可能需要后处理,如平滑处理(减少检测到的语音概率的突然波动,实现更自然的过渡)和阈值处理(设置一个临界值,根据概率确定一个帧是否包含语音,例如将概率高于0.5的帧分类为语音,其他分类为静音或噪声) |
我们的AI模型设计和/或优化为在NVIDIA GPU加速系统上运行。通过利用NVIDIA的硬件(如GPU核心)和软件框架(如CUDA库),与仅使用CPU的解决方案相比,该模型实现了更快的训练和推理时间。
💻 使用示例
基础用法
要训练、微调或使用该模型,您需要安装 NVIDIA NeMo。
pip install -U nemo_toolkit['asr']
该模型可在NeMo工具包 [2] 中使用,并可作为预训练检查点进行推理。
自动加载模型
import torch
import nemo.collections.asr as nemo_asr
vad_model = nemo_asr.models.EncDecFrameClassificationModel.from_pretrained(model_name="nvidia/frame_vad_multilingual_marblenet_v2.0")
# Move the model to GPU if available
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
vad_model = vad_model.to(device)
vad_model.eval()
使用PyTorch进行推理
首先,获取一个样本
wget https://dldata-public.s3.us-east-2.amazonaws.com/2086-149220-0033.wav
然后运行以下代码:
import librosa
# Load the audio
input_signal = librosa.load("2086-149220-0033.wav", sr=16000, mono=True)[0]
input_signal = torch.tensor(input_signal).unsqueeze(0).float()
input_signal_length = torch.tensor([input_signal.shape[1]]).long()
# Perform inference
with torch.no_grad():
torch_outputs = vad_model(
input_signal=input_signal.to(device),
input_signal_length=input_signal_length.to(device)
).cpu()
导出为ONNX
import onnx
from nemo.core import typecheck
typecheck.set_typecheck_enabled(False)
vad_model = vad_model.cpu()
ONNX_EXPORT_PATH = "frame_vad_multilingual_marblenet_v2.0.onnx"
# Preprocess input signal
processed_signal, processed_signal_length = vad_model.preprocessor(
input_signal=input_signal,
length=input_signal_length
)
# Define input example for ONNX export
inputs = {
"processed_signal": processed_signal,
"processed_signal_length": processed_signal_length
}
# Export
torch.onnx.export(
model=vad_model,
args=inputs,
f=ONNX_EXPORT_PATH,
input_names=list(inputs.keys()),
output_names=["output"],
dynamic_axes={
"processed_signal": {0: "batch_size", 2: "sequence_length"},
"processed_signal_length": {0: "batch_size"},
"output": {0: "batch_size", 1: "sequence_length"}
}
)
使用ONNX Runtime进行推理
import onnxruntime
# Load the ONNX model
session = onnxruntime.InferenceSession(
ONNX_EXPORT_PATH,
providers=["CPUExecutionProvider"]
)
# Prepare input for ONNX Runtime
ort_inputs = {
input.name: inputs[input.name].numpy()
for input in session.get_inputs()
}
# Run inference
onnx_outputs = session.run(None, ort_inputs)[0]
从帧级语音预测生成RTTM输出
要使用预训练模型从音频生成RTTM(丰富转录时间标记)文件,请执行以下命令:
python <NEMO_ROOT>/examples/asr/speech_classification/frame_vad_infer.py \
--config-path="../conf/vad" \
--config-name="frame_vad_infer_postprocess.yaml" \
vad.model_path="nvidia/frame_vad_multilingual_marblenet_v2.0" \
vad.parameters.shift_length_in_sec=0.02 \
prepare_manifest.auto_split=True \
prepare_manifest.split_duration=7200 \
input_manifest=<评估数据清单文件的路径,其中音频文件应具有唯一名称> \
out_manifest_filepath=<输出清单文件的路径>
软件集成
属性 | 详情 |
---|---|
运行时引擎 | NeMo - 2.3.0 |
支持的硬件微架构兼容性 | NVIDIA Ampere、NVIDIA Blackwell、NVIDIA Jetson、NVIDIA Hopper、NVIDIA Lovelace、NVIDIA Pascal、NVIDIA Turing、NVIDIA Volta |
首选/支持的操作系统 | Linux |
模型版本 | Frame-VAD多语言MarbleNet v2.0 |
训练、测试和评估数据集
训练数据集
数据集链接 | 数据收集方法 | 标注方法 | 属性 |
---|---|---|---|
ICSI (en) | 混合:人工、标注、合成 | 混合:人工、标注、合成 | 2600小时的真实世界数据、1000小时的合成数据和330小时的噪声数据 |
AMI (en) | 混合:人工、标注、合成 | 混合:人工、标注、合成 | 2600小时的真实世界数据、1000小时的合成数据和330小时的噪声数据 |
MLS (fr, es) | 混合:人工、标注、合成 | 混合:人工、标注、合成 | 2600小时的真实世界数据、1000小时的合成数据和330小时的噪声数据 |
MCV7 (de, ru) | 混合:人工、标注、合成 | 混合:人工、标注、合成 | 2600小时的真实世界数据、1000小时的合成数据和330小时的噪声数据 |
RULS (ru) | 混合:人工、标注、合成 | 混合:人工、标注、合成 | 2600小时的真实世界数据、1000小时的合成数据和330小时的噪声数据 |
SOVA (ru) | 混合:人工、标注、合成 | 混合:人工、标注、合成 | 2600小时的真实世界数据、1000小时的合成数据和330小时的噪声数据 |
Aishell2 (zh) | 混合:人工、标注、合成 | 混合:人工、标注、合成 | 2600小时的真实世界数据、1000小时的合成数据和330小时的噪声数据 |
Librispeech (en) | 混合:人工、标注、合成 | 混合:人工、标注、合成 | 2600小时的真实世界数据、1000小时的合成数据和330小时的噪声数据 |
Fisher (en) | 混合:人工、标注、合成 | 混合:人工、标注、合成 | 2600小时的真实世界数据、1000小时的合成数据和330小时的噪声数据 |
MUSAN (noise) | 混合:人工、标注、合成 | 混合:人工、标注、合成 | 2600小时的真实世界数据、1000小时的合成数据和330小时的噪声数据 |
Freesound (noise) | 混合:人工、标注、合成 | 混合:人工、标注、合成 | 2600小时的真实世界数据、1000小时的合成数据和330小时的噪声数据 |
Vocalsound (noise) | 混合:人工、标注、合成 | 混合:人工、标注、合成 | 2600小时的真实世界数据、1000小时的合成数据和330小时的噪声数据 |
Ichbi (noise) | 混合:人工、标注、合成 | 混合:人工、标注、合成 | 2600小时的真实世界数据、1000小时的合成数据和330小时的噪声数据 |
Coswara (noise) | 混合:人工、标注、合成 | 混合:人工、标注、合成 | 2600小时的真实世界数据、1000小时的合成数据和330小时的噪声数据 |
测试数据集
数据集链接 | 数据收集方法 | 标注方法 | 属性 |
---|---|---|---|
Freesound (noise) | 混合:人工、标注 | 混合:人工、标注 | 约100小时的多语言(中文、英文、法语、德语、俄语、西班牙语)音频数据 |
MUSAN (noise) | 混合:人工、标注 | 混合:人工、标注 | 约100小时的多语言(中文、英文、法语、德语、俄语、西班牙语)音频数据 |
Librispeech (en) | 混合:人工、标注 | 混合:人工、标注 | 约100小时的多语言(中文、英文、法语、德语、俄语、西班牙语)音频数据 |
Fisher (en) | 混合:人工、标注 | 混合:人工、标注 | 约100小时的多语言(中文、英文、法语、德语、俄语、西班牙语)音频数据 |
MLS (fr, es) | 混合:人工、标注 | 混合:人工、标注 | 约100小时的多语言(中文、英文、法语、德语、俄语、西班牙语)音频数据 |
MCV7 (de, ru) | 混合:人工、标注 | 混合:人工、标注 | 约100小时的多语言(中文、英文、法语、德语、俄语、西班牙语)音频数据 |
AMI (en) | 混合:人工、标注 | 混合:人工、标注 | 约100小时的多语言(中文、英文、法语、德语、俄语、西班牙语)音频数据 |
Aishell2 (zh) | 混合:人工、标注 | 混合:人工、标注 | 约100小时的多语言(中文、英文、法语、德语、俄语、西班牙语)音频数据 |
CH109 (en) | 混合:人工、标注 | 混合:人工、标注 | 约100小时的多语言(中文、英文、法语、德语、俄语、西班牙语)音频数据 |
评估数据集
数据集链接 | 数据收集方法 | 标注方法 | 属性 |
---|---|---|---|
VoxConverse-test | 混合:人工、标注 | 混合:人工、标注 | 约182小时的多语言(中文、英文)音频数据 |
VoxConverse-dev | 混合:人工、标注 | 混合:人工、标注 | 约182小时的多语言(中文、英文)音频数据 |
AMI-test | 混合:人工、标注 | 混合:人工、标注 | 约182小时的多语言(中文、英文)音频数据 |
Earnings21 | 混合:人工、标注 | 混合:人工、标注 | 约182小时的多语言(中文、英文)音频数据 |
AISHELL4-test | 混合:人工、标注 | 混合:人工、标注 | 约182小时的多语言(中文、英文)音频数据 |
CH109 | 混合:人工、标注 | 混合:人工、标注 | 约182小时的多语言(中文、英文)音频数据 |
AVA-SPEECH | 混合:人工、标注 | 混合:人工、标注 | 约182小时的多语言(中文、英文)音频数据 |
推理
属性 | 详情 |
---|---|
推理引擎 | NVIDIA NeMo |
测试硬件 | RTX 5000、A100、V100 |
性能
ROC - AUC性能如下表所示。ROC - AUC值越高,性能越好。
评估数据集 | ROC - AUC |
---|---|
VoxConverse - test | 96.65 |
VoxConverse - dev | 97.59 |
AMI - test | 96.25 |
Earnings21 | 97.11 |
AISHELL4 - test | 92.27 |
CH109 | 94.44 |
AVA - SPEECH | 95.26 |
伦理考量
NVIDIA认为可信AI是一项共同责任,我们已经制定了政策和实践,以支持各种AI应用的开发。当按照我们的服务条款下载或使用该模型时,开发者应与他们的内部模型团队合作,确保该模型满足相关行业和用例的要求,并解决意外的产品滥用问题。
有关此模型伦理考量的更多详细信息,请参阅 模型卡片++可解释性、偏差、安全与保障以及隐私子卡片。
请 在此 报告安全漏洞或NVIDIA AI相关问题。
偏差
领域 | 响应 |
---|---|
模型设计和测试中受不利影响群体 受保护类别 的参与考量 | 无 |
为减轻不必要偏差所采取的措施 | 为减少误报错误(即模型在没有语音时错误检测到语音的情况),该模型使用白噪声和真实世界噪声扰动进行训练。在训练过程中,音频的音量也会变化。此外,训练数据包括非语音音频样本,以帮助模型区分语音和非语音声音(如咳嗽、笑声和呼吸声等) |
偏差指标(如果测量) | 误报率 |
可解释性
领域 | 响应 |
---|---|
预期领域 | 语音活动检测(VAD) |
模型类型 | 卷积神经网络(CNN) |
预期用户 | 开发者、语音处理工程师、AI研究人员 |
输出 | 每个20毫秒音频帧的语音概率序列 |
描述模型如何工作 | 该模型通过提取频谱图特征来处理输入音频,然后将其传递给MarbleNet(一个专为VAD设计的轻量级基于CNN的模型)。CNN学习检测与语音活动相关的模式,并输出一个概率分数,指示每个20毫秒帧中语音的存在 |
列出已测试以确保无论何种情况都能提供可比结果的受不利影响群体 | 不适用 |
技术限制 | 该模型以20毫秒帧为单位运行。虽然它可以通过将较长的帧拆分为较小的段来支持较长的帧,但它不支持粒度小于20毫秒的输出 |
已验证符合规定的NVIDIA质量标准 | 是 |
性能指标 | 准确性(误报率、ROC - AUC分数)、延迟、吞吐量 |
潜在已知风险 | 虽然该模型在包括中文、英文、法语、西班牙语、德语和俄语在内的有限数量的语言上进行了训练,但对于训练数据集中未包含的语言和口音,模型的质量可能会下降 |
许可 | NVIDIA开放模型许可协议 |
隐私
领域 | 响应 |
---|---|
是否可生成或逆向工程个人数据 | 无 |
是否使用个人数据创建此模型 | 无 |
数据集审查频率 | 发布前 |
训练中使用的所有数据集是否有来源证明 | 是 |
数据标注(注释、元数据)是否符合隐私法 | 是 |
如果提出数据更正或删除请求,数据是否符合数据主体的请求 | 是 |
安全
领域 | 响应 |
---|---|
模型应用 | 自动语音识别、说话人分离、语音处理、语音活动检测 |
列出模型可集成的特定高风险AI系统类型(如果有),从以下选项中选择:[生物识别] 或 [关键基础设施] 或 [机械和机器人] 或 [医疗设备] 或 [车辆] 或 [航空] 或 [教育和职业培训] 或 [就业和工人管理] | |
描述生命关键影响(如果存在) | 不适用 |
使用场景限制 | 遵守 NVIDIA开放模型许可协议 |
模型和数据集限制 | 应用最小权限原则(PoLP),限制数据集生成和模型开发的访问权限。在训练期间实施数据集访问限制,并遵守数据集许可约束 |



