一、本次进展

  • 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 环境依赖已安装,只需启动三个服务即可运行端到端检测流程。


Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐