ECAPA-TDNN 音频欺骗检测系统
基于ECAPA-TDNN架构的音频欺骗检测系统,专为区分真实人声和AI合成/伪造语音而设计。在使用了四个先进的TTS开源模型创建的开源数据集 AudioSpoof 上进行了训练和测试,取得了较好的效果; 同时,模型较为轻量,且所需有效音频仅为3秒,便于实时监测; 提供了预训练模型于 pretrained_models/run 文件夹下 。
项目介绍
随着AI语音合成技术的快速发展,区分真实人声和人工合成语音变得越来越困难。本项目基于ECAPA-TDNN(强调通道注意力、传播和聚合的时延神经网络)架构,开发了一个高效、准确的音频欺骗检测系统,可以有效识别当前主流的语音合成技术生成的伪造语音。
本系统可应用于:
- 语音验证系统的安全防护
- 音频内容审核
- 数字取证和真实性鉴别
- 声纹识别系统的防欺骗层
结果展示
在开源数据集 AudioSpoof 上训练和预测的结果如下:
测试集评估结果:
- 准确率(ACC): 92.76%
- 精确率(P): 92.68%
- 召回率(R): 98.75%
- F1分数: 95.62%
- 等错误率(EER): 8.89%
安装方法
从源码安装
git clone https://github.com/username/ECAPA_TDNN.git
快速开始
模型训练
使用命令行
# 方法1:使用python直接运行脚本
python train.py --data_dir /path/to/dataset --output_dir /path/to/save/model --epochs 50
# 方法2:在Python代码中调用
from train import main
import argparse
# 创建参数对象
args = argparse.Namespace(
data_dir="/path/to/dataset",
output_dir="/path/to/save/model",
epochs=50,
batch_size=16,
lr=1e-4,
channels=512,
emb_size=192,
device="auto",
val_ratio=0.1,
sample_rate=16000,
audio_length=3, # 处理3秒的音频
spoof_models="sparktts,cosyvoice", # 可选,指定欺骗模型
weight_decay=1e-5,
num_workers=4,
seed=42
)
main(args)
训练参数说明
| 参数 | 描述 | 默认值 |
|---|---|---|
| --data_dir | 数据集根目录 | - |
| --output_dir | 模型保存目录 | models/ |
| --batch_size | 批次大小 | 16 |
| --epochs | 训练轮数 | 50 |
| --lr | 学习率 | 1e-4 |
| --channels | ECAPA-TDNN通道数 | 512 |
| --emb_size | 嵌入特征维度 | 192 |
| --device | 计算设备(auto, cuda, cpu, mps) | auto |
| --val_ratio | 验证集比例 | 0.1 |
| --audio_length | 处理音频的长度(秒) | 3 |
| --sample_rate | 音频采样率 | 16000 |
| --spoof_models | 欺骗模型列表,逗号分隔 | sparktts,cosyvoice,f5tts,naturalspeech3 |
模型推理
使用命令行
# 方法1:使用python直接运行脚本处理单个文件
python infer.py /path/to/audio.wav --model_path /path/to/model.pth
# 方法2:在Python代码中调用
import argparse
from infer import main
# 创建参数对象
args = argparse.Namespace(
input="/path/to/audio.wav", # 输入音频文件或目录
model_path="/path/to/model.pth",
output="results.csv", # 可选的输出CSV文件
sample_rate=16000,
audio_length=3, # 处理3秒的音频
device="auto"
)
main(args)
推理参数说明
| 参数 | 描述 | 默认值 |
|---|---|---|
| input | 输入音频文件或目录 | - |
| --model_path | 模型文件路径 | pretrained_models/run/best_model.pth |
| --output | 输出CSV文件路径 | - |
| --audio_length | 处理音频的长度(秒) | 3 |
| --sample_rate | 音频采样率 | 16000 |
| --device | 计算设备(auto, cuda, cpu, mps) | auto |
项目结构
/
├── models/ # 模型定义
│ ├── __init__.py
│ ├── ecapa_tdnn.py # ECAPA-TDNN模型定义
│ └── classifier.py # 分类器定义
├── data/ # 数据处理
│ ├── __init__.py
│ ├── processor.py # MFCC特征处理
│ └── dataset.py # 数据集类定义
├── utils/ # 工具函数
│ ├── __init__.py
│ ├── metrics.py # 评估指标
│ ├── io.py # 文件IO操作
│ ├── mp3-wav.ipynb # MP3转WAV转换工具
│ └── vedio2wav.ipynb # 视频提取音频工具
├── pretrained_models/ # 预训练模型目录
├── train.py # 训练脚本
├── infer.py # 推理脚本
├── __init__.py # 包初始化文件
└── README.md # 项目说明
工具脚本
音频格式转换 (mp3-wav.ipynb)
该Jupyter笔记本提供了将MP3文件批量转换为WAV格式的功能:
- 支持单个文件或整个目录的转换
- 保持目录结构
- 自动处理采样率转换
- 进度条显示处理状态
使用方法:
- 在笔记本中设置输入目录和输出目录
- 运行所有单元格
- 转换完成后会显示成功转换的文件数量和失败的文件列表
视频提取音频 (vedio2wav.ipynb)
该Jupyter笔记本用于从视频文件中提取音频并转换为WAV格式:
- 支持多种视频格式(mp4, avi, mkv等)
- 批量处理功能
- 可设置输出音频的采样率和声道数
- 自动处理文件名冲突
使用方法:
- 在笔记本中设置视频源目录和音频输出目录
- 配置采样率和声道数(默认16kHz, 单声道)
- 运行所有单元格
- 处理完成后会生成提取报告
数据集格式
训练数据集应按以下格式组织:
dataset/
├── wav/
│ ├── train/ # 真实语音训练集
│ ├── dev/ # 真实语音开发集
│ ├── test/ # 真实语音测试集
│ ├── train-sparktts/ # SparkTTS生成的虚假语音
│ ├── train-cosyvoice/ # CosyVoice生成的虚假语音
│ ├── train-f5tts/ # F5TTS生成的虚假语音
│ ├── train-naturalspeech3/# NaturalSpeech3生成的虚假语音
│ └── ... (类似的dev和test目录)
注意:dataset 可以更换为任意名字,下面的文件夹必须严格按照要求命名,wav 文件夹必须存在
系统会自动处理以下内容:
- 收集所有真实和虚假音频
- 过滤无效文件
- 按指定比例划分训练集和验证集
- 支持所有主流音频格式(自动重采样)
添加新的欺骗模型
如需添加新的欺骗模型,您可以:
- 创建相应的数据目录:
train-[新模型名]、dev-[新模型名]和test-[新模型名] - 在训练时通过
--spoof_models参数指定要包含的模型数据集:python train.py --data_dir /path/to/dataset --spoof_models sparktts,cosyvoice,f5tts,naturalspeech3,新模型名
系统会自动检测目录是否存在,如果不存在会给出警告但不会中断训练。
评估指标
系统使用以下指标评估模型性能:
- 等错误率(EER): 评估二分类器在假阳率等于假阴率时的性能
- 准确率(ACC): 正确分类的样本比例
- 精确率(Precision): 在预测为虚假的样本中,真正虚假的比例
- 召回率(Recall): 被正确识别的虚假样本占所有虚假样本的比例
- F1分数: 精确率和召回率的调和平均值
- AUC: ROC曲线下面积,反映分类器的整体性能
开发者指南
扩展模型
如需添加新的特征提取器或分类器,可以继承现有类并重写相关方法:
from models import ECAPA_TDNN
class MyCustomClassifier(ECAPA_TDNN):
def __init__(self, input_size=80, channels=512, emb_size=192):
super().__init__(input_size, channels, emb_size)
# 添加自定义层...
def forward(self, x):
# 自定义前向传播逻辑...
pass
自定义数据预处理
可以通过继承MFCCProcessor类来实现自定义的特征提取:
from data import MFCCProcessor
class MyProcessor(MFCCProcessor):
def __init__(self, sample_rate=16000, n_mfcc=80):
super().__init__(sample_rate, n_mfcc)
# 添加自定义处理步骤...
def __call__(self, waveform, apply_augment=True):
# 自定义特征提取流程...
pass
Inference Providers
NEW
This model isn't deployed by any Inference Provider.
🙋
Ask for provider support