Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| from huggingface_hub import hf_hub_download | |
| from llama_cpp import Llama | |
| from faster_whisper import WhisperModel | |
| # ========================================== | |
| # 1. 初始化大语言模型 (反欺诈分析大脑) | |
| # ========================================== | |
| REPO_ID = "mradermacher/AntiFraud-SFT-GGUF" | |
| MODEL_FILE = "AntiFraud-SFT.Q4_K_M.gguf" | |
| print("正在下载 LLM 模型文件...") | |
| model_path = hf_hub_download(repo_id=REPO_ID, filename=MODEL_FILE) | |
| print("正在加载大语言模型...") | |
| # 移除之前的 Llava Handler,现在作为纯文本模型加载 | |
| llm = Llama( | |
| model_path=model_path, | |
| n_ctx=2048, # 上下文窗口 | |
| n_threads=4 # CPU 线程数 | |
| ) | |
| # ========================================== | |
| # 2. 初始化语音识别模型 (充当模型的"耳朵") | |
| # ========================================== | |
| print("正在加载 Whisper 语音识别模型...") | |
| # 使用 "base" 模型,体积小巧(约140MB),在免费 CPU 上运行飞快 | |
| asr_model = WhisperModel("medium", device="cpu", compute_type="int8") | |
| # ========================================== | |
| # 3. 核心处理逻辑:先听后想 | |
| # ========================================== | |
| def predict_fraud(audio_file, text_prompt): | |
| transcribed_text = "" | |
| # 步骤 A:语音转文字 (ASR) | |
| if audio_file is not None: | |
| print("开始提取音频文字...") | |
| # beam_size 适当调小加快 CPU 推理速度 | |
| segments, info = asr_model.transcribe(audio_file, beam_size=3, language="zh") | |
| transcribed_text = "".join([segment.text for segment in segments]) | |
| # 步骤 B:构建最终给大模型的 Prompt | |
| if transcribed_text: | |
| combined_prompt = ( | |
| f"以下是拦截到的通话录音文本:\n「{transcribed_text}」\n\n" | |
| f"用户指令:{text_prompt if text_prompt else '请分析这段对话是否存在电信诈骗风险,并指出可疑点。'}" | |
| ) | |
| else: | |
| combined_prompt = text_prompt if text_prompt else "请分析是否存在电信诈骗风险。" | |
| # 步骤 C:将拼接好的文本发给大模型进行反诈分析 | |
| messages = [ | |
| {"role": "system", "content": "你是一个专业的反电信诈骗分析专家。你的任务是根据通话文本识别潜在的诈骗风险,并给出客观的分析。"}, | |
| {"role": "user", "content": combined_prompt} | |
| ] | |
| print("开始进行反诈推理解析...") | |
| response = llm.create_chat_completion( | |
| messages=messages, | |
| max_tokens=512, | |
| temperature=0.2, | |
| ) | |
| analysis_result = response["choices"][0]["message"]["content"] | |
| # 返回两个结果:让用户看到转录文字,以及最终的分析报告 | |
| return transcribed_text if transcribed_text else "未检测到音频或上传为空", analysis_result | |
| # ========================================== | |
| # 4. 构建 Gradio 可视化界面 | |
| # ========================================== | |
| demo = gr.Interface( | |
| fn=predict_fraud, | |
| inputs=[ | |
| gr.Audio(type="filepath", label="1. 上传或录制可疑音频 (WAV/MP3等)"), | |
| gr.Textbox(label="2. 输入附加提示 (可选)", value="请分析这段对话是否存在电信诈骗。") | |
| ], | |
| outputs=[ | |
| gr.Textbox(label="🎧 Whisper 音频识别结果 (校对用)", lines=2), | |
| gr.Textbox(label="🛡️ 模型反欺诈分析报告", lines=6) | |
| ], | |
| title="AntiFraud-SFT 智能反欺诈检测站 (ASR级联版)", | |
| description="通过 Faster-Whisper 进行极速语音识别,再由 Qwen2-Audio 微调模型进行欺诈逻辑分析。完全兼容免费 CPU 部署。", | |
| api_name="analyze" | |
| ) | |
| if __name__ == "__main__": | |
| demo.launch() |