山大软院创新项目实训个人博客——诈骗克星(五)

山大软院创新项目实训个人博客——诈骗克星(五) 一、本次进展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.ymlaudio: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.jsconstCONFIG{API_BASE_URL:http://localhost:8080,// Spring Boot 地址DEV_MODE:false,};3.4 前端音频结果处理前端detection.js新增normalizeAudioResult()方法将后端返回的音频检测结果标准化为统一的展示格式normalizeAudioResult(raw){// 解析后端返回的 AudioDetectionResultconstspoofraw.spoofProb||0.5;constbonafideraw.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_versiondetection_record综合检测记录task_id, detection_type, status, result, risk_scoreaudio_model音频模型信息name, model_version, model_type, accuracy, eer, is_active使用MyBatis-Plus替代原有的 JPAMapper 接口使用注解 SQLMapperpublicinterfaceAudioDetectionRecordMapperextendsBaseMapperAudioDetectionRecord{Select(SELECT * FROM audio_detection_record WHERE task_id #{taskId} AND deleted 0)AudioDetectionRecordfindByTaskId(Param(taskId)StringtaskId);Select(SELECT COUNT(*) FROM audio_detection_record WHERE detection_result #{result} AND deleted 0)longcountByDetectionResult(Param(result)Stringresult);}五、启动与验证5.1 分步启动# 步骤1安装 Python 依赖cdaudio-training pipinstall-rrequirements.txt# 步骤2启动 Flask 检测服务# 默认使用 pretrained/wav2vec2-base 演示模式python src/app.py# 服务运行在 http://localhost:5000# 步骤3启动 Spring Boot 后端cdbackend# 在 IDEA 中运行 SafeGuardApplication.main()# 服务运行在 http://localhost:8080# 步骤4打开微信小程序# 用微信开发者工具打开 wechat-app/ 目录# 工具 → 构建 npm# 编译运行5.2 验证连通性# 1. 验证 Flask 服务curlhttp://localhost:5000/health# → {code:0,message:ok,data:{device:cuda,model_dir:pretrained/wav2vec2-base}}# 2. 验证 Spring Boot 后端curlhttp://localhost:8080/api/audio/status# → {code:200,message:success,data:{serviceAvailable:true,message:音频检测服务正常运行}}# 3. 测试音频检测python src/test_api.py--audio_pathdata/xxx.flac# 4. 微信小程序端# 上传音频文件 → 查看检测结果展示5.3 调用链完整示例微信小程序 Spring Boot Python Flask │ │ │ │ POST /api/detection/audio │ │ │ (filexxxx.wav) │ │ │─────────────────────────────►│ │ │ │ POST /audio/detect │ │ │ (filexxxx.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_DIRPath(outputs/wav2vec2-mid/best)# 首选路径FALLBACK_MODEL_DIRPath(pretrained/wav2vec2-base)# 备选演示路径# 若首选路径不存在自动使用 pretrained 模型演示6.4 数据库持久化方案方案说明ORMMyBatis-Plus替代原 JPA建表手动执行sql/schema.sql表结构4 张核心表knowledge_item, audio_detection_record, detection_record, audio_model七、完整文件清单Python 端文件说明src/app.pyFlask 检测服务入口src/utils.py公共工具音频加载、模型加载、推理函数src/train_wav2vec2.pyWav2Vec2 训练脚本src/infer_audio.py单条音频推理src/infer_audio_batch.py批量音频推理 评估src/threshold_scan.py阈值扫描调优决策边界src/check_asvspoof_data.py数据集完整性检查src/download_dataset.pyASVspoof2019 数据集下载/解压src/test_api.pyFlask 接口本地测试requirements.txtPython 依赖清单Java 后端新增/修改文件说明entity/AudioDetectionRecord.java音频检测记录实体entity/DetectionRecord.java综合检测记录实体entity/AudioModel.java音频模型实体mapper/AudioDetectionRecordMapper.java音频检测 Mappermapper/DetectionRecordMapper.java综合检测 Mappermapper/AudioModelMapper.java音频模型 Mapperservice/AudioTrainingService.java音频训练服务调用 Flaskcontroller/AudioTrainingController.java音频检测 APIdto/AudioDetectionResult.java检测结果 DTOdto/AudioDetectionResponse.java检测响应 DTOconfig/MyBatisPlusConfig.javaMyBatis-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 环境依赖已安装只需启动三个服务即可运行端到端检测流程。