山大软院创新项目实训个人博客——诈骗克星(五)
·
一、本次进展
- Wav2Vec2 模型的训练与推理
- Flask 检测服务的构建与优化
- 与 Spring Boot 后端的对接
- 与微信小程序前端的连通
- 全链路数据流
二、系统架构
┌─────────────────────────────────────────────────────────────┐
│ 微信小程序 (WeChat) │
│ wechat-app/frontend/ │
│ 用户上传音频 → 展示检测结果 │
└──────────────────────┬──────────────────────────────────────┘
│ HTTP (localhost:8080)
▼
┌─────────────────────────────────────────────────────────────┐
│ Spring Boot 后端 (Java) │
│ backend/ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ DetectionController (/api/detection/audio) │ │
│ │ → DetectionService.detectAudio() │ │
│ │ → 调用 http://localhost:5000/audio/detect │ │
│ └──────────────────────────────────────────────────────┘ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ AudioTrainingController (/api/audio/*) │ │
│ │ → 音频检测、记录查询、统计、模型管理 │ │
│ └──────────────────────────────────────────────────────┘ │
└──────────────────────┬──────────────────────────────────────┘
│ HTTP (localhost:5000)
▼
┌─────────────────────────────────────────────────────────────┐
│ Python Flask 检测服务 │
│ audio-training/src/app.py │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ POST /audio/detect │ │
│ │ → 接收音频文件 → 特征提取 → Wav2Vec2 推理 │ │
│ │ → 返回 {label, spoof_prob, risk_level, ...} │ │
│ └──────────────────────────────────────────────────────┘ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ GET /health — 健康检查 │ │
│ │ GET / — 服务信息 │ │
│ └──────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
三、前后端对接
3.1 对接链路
微信小程序 Python Flask
│ │
│ 1. 用户选择音频文件 │
│ 2. wx.uploadFile → POST │
│ /api/detection/audio │
│ (localhost:8080) │
│ │
▼ │
┌──────────────────────┐ │
│ DetectionController │ │
│ (Spring Boot) │ │
│ │ │
│ 保存临时文件 │ │
│ 调用Python服务 │── HTTP POST ────►│
│ │ /audio/detect │
│ 解析JSON结果 │◄── JSON ─────────│
│ 返回给前端 │ │
└──────────────────────┘ │
│ │
▼ │
微信小程序展示结果 │
- 伪造概率进度条 │
- 风险等级标签 │
- 检测报告文本 │
- 防范建议列表 │
3.2 后端配置
# application.yml
audio:
service:
url: http://localhost:5000/audio/detect # 检测接口
detection:
api-url: http://localhost:5000/audio/detect # 同
health-url: http://localhost:5000/health # 健康检查
3.3 前端配置
// wechat-app/frontend/utils/config.js
const CONFIG = {
API_BASE_URL: 'http://localhost:8080', // Spring Boot 地址
DEV_MODE: false,
};
3.4 前端音频结果处理
前端 detection.js 新增 normalizeAudioResult() 方法,将后端返回的音频检测结果标准化为统一的展示格式:
normalizeAudioResult(raw) {
// 解析后端返回的 AudioDetectionResult
const spoof = raw.spoofProb || 0.5;
const bonafide = raw.bonafideProb || (1 - spoof);
return {
type: 'audio',
confidence: raw.confidence || 0.7,
label: raw.label || 'unknown',
riskLevel: raw.riskLevel || 'unknown',
spoofProb: spoof,
bonafideProb: bonafide,
probabilities: { real: bonafide, fake: spoof },
// 根据风险等级生成报告和建议
report: '...',
advice: ['不要轻信音频内容', '通过其他渠道核实', ...],
agentSteps: [...] // 展示检测流程步骤
};
}
四、数据库持久化
对接过程新增了 3 张数据库表用于持久化检测记录:
| 表名 | 用途 | 关键字段 |
|---|---|---|
audio_detection_record |
音频检测记录 | task_id, file_name, detection_result, spoof_probability, risk_level, model_version |
detection_record |
综合检测记录 | task_id, detection_type, status, result, risk_score |
audio_model |
音频模型信息 | name, model_version, model_type, accuracy, eer, is_active |
使用 MyBatis-Plus 替代原有的 JPA,Mapper 接口使用注解 SQL:
@Mapper
public interface AudioDetectionRecordMapper extends BaseMapper<AudioDetectionRecord> {
@Select("SELECT * FROM audio_detection_record WHERE task_id = #{taskId} AND deleted = 0")
AudioDetectionRecord findByTaskId(@Param("taskId") String taskId);
@Select("SELECT COUNT(*) FROM audio_detection_record WHERE detection_result = #{result} AND deleted = 0")
long countByDetectionResult(@Param("result") String result);
}
五、启动与验证
5.1 分步启动
# 步骤1:安装 Python 依赖
cd audio-training
pip install -r requirements.txt
# 步骤2:启动 Flask 检测服务
# (默认使用 pretrained/wav2vec2-base 演示模式)
python src/app.py
# 服务运行在 http://localhost:5000
# 步骤3:启动 Spring Boot 后端
cd backend
# 在 IDEA 中运行 SafeGuardApplication.main()
# 服务运行在 http://localhost:8080
# 步骤4:打开微信小程序
# 用微信开发者工具打开 wechat-app/ 目录
# 工具 → 构建 npm
# 编译运行
5.2 验证连通性
# 1. 验证 Flask 服务
curl http://localhost:5000/health
# → {"code":0,"message":"ok","data":{"device":"cuda","model_dir":"pretrained/wav2vec2-base"}}
# 2. 验证 Spring Boot 后端
curl http://localhost:8080/api/audio/status
# → {"code":200,"message":"success","data":{"serviceAvailable":true,"message":"音频检测服务正常运行"}}
# 3. 测试音频检测
python src/test_api.py --audio_path data/xxx.flac
# 4. 微信小程序端
# 上传音频文件 → 查看检测结果展示
5.3 调用链完整示例
微信小程序 Spring Boot Python Flask
│ │ │
│ POST /api/detection/audio │ │
│ (file=xxxx.wav) │ │
│─────────────────────────────►│ │
│ │ POST /audio/detect │
│ │ (file=xxxx.wav) │
│ │─────────────────────────────►│
│ │ │
│ │ ├── Wav2Vec2 特征提取
│ │ ├── 模型推理 (CUDA)
│ │ ├── 风险评估
│ │ │
│ │◄─────────────────────────────│
│ │ {"code":0,"data":{...}} │
│ │ │
│ {confidence, label, │ │
│ spoofProb, riskLevel, │ │
│ report, advice, ...} │ │
│◄─────────────────────────────│ │
│ │ │
├── 渲染检测结果 │ │
├── 概率进度条 → 92% 伪造 │ │
├── 风险等级 → 🔴 高风险 │ │
├── 检测报告 → 文本展示 │ │
└── 防范建议 → 列表展示 │ │
六、关键技术决策
6.1 架构选择:独立 Flask 服务 vs Java 直接加载模型
| 方案 | 说明 | 选择理由 |
|---|---|---|
| ✅ 独立 Flask 服务 | Python 运行模型推理,Java 通过 HTTP 调用 | Python 的 AI 生态成熟(PyTorch/HuggingFace) |
| ❌ Java 直接加载 | 用 ONNX Runtime / DJL 在 Java 中推理 | 模型转换复杂,调试困难 |
6.2 音频重采样方法
| 方法 | 质量 | 速度 | 依赖 |
|---|---|---|---|
| FFT 重采样 (scipy.signal.resample) | ⭐⭐⭐ 高 | 中等 | scipy |
| 线性插值 (np.interp) | ⭐⭐ 中等 | 快 | 无 |
代码自动检测 scipy 是否可用,优先使用 FFT 重采样,否则降级为线性插值。
6.3 模型加载容错
# 自动降级机制
MODEL_DIR = Path("outputs/wav2vec2-mid/best") # 首选路径
FALLBACK_MODEL_DIR = Path("pretrained/wav2vec2-base") # 备选演示路径
# 若首选路径不存在,自动使用 pretrained 模型演示
6.4 数据库持久化方案
| 方案 | 说明 |
|---|---|
| ORM | MyBatis-Plus(替代原 JPA) |
| 建表 | 手动执行 sql/schema.sql |
| 表结构 | 4 张核心表:knowledge_item, audio_detection_record, detection_record, audio_model |
七、完整文件清单
Python 端
| 文件 | 说明 |
|---|---|
src/app.py |
Flask 检测服务入口 |
src/utils.py |
公共工具:音频加载、模型加载、推理函数 |
src/train_wav2vec2.py |
Wav2Vec2 训练脚本 |
src/infer_audio.py |
单条音频推理 |
src/infer_audio_batch.py |
批量音频推理 + 评估 |
src/threshold_scan.py |
阈值扫描(调优决策边界) |
src/check_asvspoof_data.py |
数据集完整性检查 |
src/download_dataset.py |
ASVspoof2019 数据集下载/解压 |
src/test_api.py |
Flask 接口本地测试 |
requirements.txt |
Python 依赖清单 |
Java 后端(新增/修改)
| 文件 | 说明 |
|---|---|
entity/AudioDetectionRecord.java |
音频检测记录实体 |
entity/DetectionRecord.java |
综合检测记录实体 |
entity/AudioModel.java |
音频模型实体 |
mapper/AudioDetectionRecordMapper.java |
音频检测 Mapper |
mapper/DetectionRecordMapper.java |
综合检测 Mapper |
mapper/AudioModelMapper.java |
音频模型 Mapper |
service/AudioTrainingService.java |
音频训练服务(调用 Flask) |
controller/AudioTrainingController.java |
音频检测 API |
dto/AudioDetectionResult.java |
检测结果 DTO |
dto/AudioDetectionResponse.java |
检测响应 DTO |
config/MyBatisPlusConfig.java |
MyBatis-Plus 配置 |
sql/schema.sql |
数据库建表脚本 |
微信小程序(修改)
| 文件 | 说明 |
|---|---|
pages/detection/detection.js |
新增 normalizeAudioResult() 处理音频结果 |
八、总结
本次音频伪造检测模块的完整实现,打通了从 模型训练 → Flask 推理服务 → Spring Boot 后端 → 微信小程序前端 的完整链路。
| 阶段 | 完成内容 |
|---|---|
| 模型 | Wav2Vec2 ForSequenceClassification,基于 ASVspoof2019 训练 |
| Python 服务 | Flask 多线程安全服务,支持自动降级 |
| 后端 | 5 个 Java 类 + 3 个 Mapper + 配置 |
| 前端 | 音频检测结果标准化展示 |
| 数据库 | 3 张持久化表(MyBatis-Plus) |
| 依赖管理 | requirements.txt + npm install |
当前状态:所有组件已完成对接,Python 环境依赖已安装,只需启动三个服务即可运行端到端检测流程。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)