当前位置: 首页 > news >正文

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

一、本次进展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 环境依赖已安装只需启动三个服务即可运行端到端检测流程。
http://www.zskr.cn/news/1373332.html

相关文章:

  • 2026职场差旅装备指南:商务出差拉杆箱选型避坑与实测推荐
  • b4a用VB语言开发安卓APP-图片缩放库ZoomImageView讲解-双指缩放 + 单指拖动核心源码
  • 项目经理的终极困境:资源永远不够,高手靠取舍赢结果
  • AArch64异常处理机制详解与ARMv8架构实践
  • MyBatis:复杂结果集映射与分步查询
  • CentOS 7服务器管理员的福音:手把手配置fbterm终端,实现中英文无缝切换
  • 简历写“熟练Office”算造假?HR公认的真实标准,别再踩坑
  • 2026年蒸发式冷却塔怎么选:闭式冷却塔、不锈钢冷却塔、冷却塔填料、凉水塔、圆形冷却塔、横流式冷却塔、玻璃钢冷却塔选择指南 - 优质品牌商家
  • 2026双头超声波机厂家怎么选:非标订做超声波清洗机/伺服超声波/包布热压机/单头高周波机/双头高周波机/同步熔断机/选择指南 - 优质品牌商家
  • Ubuntu 22.04蓝牙开关秒关?别慌,先看dmesg日志里的这个Intel固件报错
  • 项目上传到gitee的两种方式,ssh和https
  • 面试题——全局邮件的设计
  • 从‘光程差为零’出发:手把手推导超透镜的相位公式(附Python验证代码)
  • 如何用pyTMD实现高精度潮汐预测:从入门到实战的完整指南
  • 用“挑西瓜”讲透《机器学习》第六章-支持向量机
  • Java内部类全解析:四种类型核心原理与实战理解
  • 腾讯云TRTC、声网、即构三款实时音视频SDK怎么选?2026实测对比
  • 2026高压发泡机技术解析:弹性体发泡机/方向盘高压泡机/水箱PU发泡机/热水器发泡机/热水器环戊烷发泡机/环戊烷发泡机/选择指南 - 优质品牌商家
  • 新电脑到手第一件事:关闭Windows 11/10的自动BitLocker加密(附详细路径图)
  • 保姆级教程:手把手教你用NVIDIA Surround搞定Prepar3D多屏显示(Win10/Win11通用)
  • 别再死记硬背!用Python代码和D-Separation定理,5分钟搞懂贝叶斯网络的4种基本结构
  • 位置编码——给序列安上坐标
  • 接入内网工具删除
  • 从Stata/R代码实操出发:手把手教你用双重差分法(DID)评估一个‘政策’的真实效果
  • 不只是编译:在龙芯3A4000的银河麒麟V10上,给FileZilla解决gnutls和wxWidgets依赖的完整思路
  • ARM SVE指令集:ST3B与ST3D存储指令详解
  • 企业级Gemini投资回报率坍塌预警:5个高危信号+2个紧急干预阈值,今日不查,下季度预算或被砍30%
  • Leetcode 剑指 Offer II 172. 统计目标成绩的出现次数
  • 想找适合孩子独自参加的北京研学,有没有师生配比高的好机构 - 品牌2025
  • 告别‘芝麻开门’:用Python和PyTorch搭建一个文本无关的声纹验证系统(附VoxCeleb数据集实战)