张家口市网站建设_网站建设公司_云服务器_seo优化
2026/1/18 5:27:16 网站建设 项目流程

FunASR语音识别部署教程:基于speech_ngram_lm_zh-cn的二次开发详解

1. 引言

随着语音交互技术的快速发展,高精度、低延迟的语音识别系统在智能客服、会议记录、教育辅助等场景中展现出巨大价值。FunASR 是由阿里云推出的一套开源语音识别工具包,具备高性能、易扩展的特点,广泛应用于中文语音处理任务。

本文将详细介绍如何基于speech_ngram_lm_zh-cn模型对 FunASR 进行二次开发,并构建一个功能完整的 WebUI 系统。该系统由开发者“科哥”完成前端界面与后端逻辑整合,支持模型切换、实时录音、标点恢复、时间戳输出及多格式结果导出,极大提升了使用便捷性。

本教程面向有一定 Python 和深度学习基础的开发者,旨在提供从环境配置到功能调用的完整实践路径,帮助读者快速部署并定制属于自己的语音识别服务。


2. 技术架构与核心组件解析

2.1 整体架构设计

本系统采用前后端分离架构:

  • 前端:基于 Gradio 构建 WebUI,提供用户友好的图形化操作界面。
  • 后端:集成 FunASR 核心推理引擎,加载 Paraformer-Large 和 SenseVoice-Small 两种主流 ASR 模型。
  • 语言模型增强:引入speech_ngram_lm_zh-cn作为外部 N-gram 语言模型,用于提升中文语义连贯性和识别准确率。
  • 设备适配层:自动检测 CUDA 支持状态,优先使用 GPU 加速推理。
[用户上传/录音] ↓ [Gradio WebUI] → [参数配置] ↓ [FunASR 推理引擎 + speech_ngram_lm_zh-cn] ↓ [文本输出 + 时间戳 + JSON/SRT 导出]

2.2 关键技术选型说明

组件选型理由
Paraformer-Large高精度非自回归模型,适合对准确率要求高的场景
SenseVoice-Small轻量级模型,响应速度快,适用于实时交互
Gradio快速构建可交互 Web 界面,无需前端开发经验
speech_ngram_lm_zh-cn中文领域预训练 N-gram LM,有效纠正语法错误和同音词误识别

2.3 外部语言模型的作用机制

speech_ngram_lm_zh-cn是一个基于大规模中文文本训练的三元组(Trigram)语言模型,其主要作用是在声学模型输出候选序列时,通过计算语言概率进行重排序,从而选出最符合中文语法习惯的结果。

例如,在识别“你好啊朋友”时,声学模型可能因发音相似输出“你好牙朋友”,而 N-gram LM 会判断“牙朋友”出现概率极低,最终修正为“啊朋友”。

该模型以 KenLM 格式存储,可通过 FunASR 的rescore_model参数加载,在解码阶段参与联合打分。


3. 部署步骤详解

3.1 环境准备

确保系统已安装以下依赖:

# 推荐使用 Conda 创建独立环境 conda create -n funasr python=3.9 conda activate funasr # 安装 PyTorch(根据是否有GPU选择) # CUDA 版本: pip install torch torchaudio --index-url https://download.pytorch.org/whl/cu118 # CPU 版本: # pip install torch torchaudio # 安装 FunASR 主库 pip install funasr # 安装 Gradio 用于 WebUI pip install gradio # 可选:安装 soundfile 支持更多音频格式 pip install soundfile

3.2 下载模型文件

创建项目目录并下载所需模型:

mkdir -p models/paraformer models/sensevoice models/ngram_lm cd models # 下载 Paraformer-Large 模型 git lfs install git clone https://www.modelscope.cn/damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch.git paraformer/ # 下载 SenseVoice-Small 模型 git clone https://www.modelscope.cn/damo/speech_SenseVoice_small_zh-cn_asr-phone-punc-vocab8404-onnx.git sensevoice/ # 下载中文 N-gram 语言模型 wget https://modelscope.cn/api/v1/models/damo/speech_ngram_lm_zh-cn/file?fileName=speech_ngram_lm_zh-cn.tar.gz -O ngram_lm.tar.gz tar -xzf ngram_lm.tar.gz -C ngram_lm/

3.3 启动 WebUI 服务

编写主程序入口app.py

import gradio as gr from funasr import AutoModel import os from datetime import datetime # 初始化模型字典 models = { "Paraformer-Large": AutoModel( model="paraformer", model_revision="v2.0.0", rescore_model="ngram_lm/speech_ngram_lm_zh-cn" ), "SenseVoice-Small": AutoModel( model="SenseVoice-small", model_revision="v1.0.0" ) } current_model_name = "SenseVoice-Small" model = models[current_model_name] def transcribe(audio_path, language="auto", batch_size_s=300): global model result = model.generate( input=audio_path, batch_size_s=batch_size_s, lang=language ) return result[0]["text"] def load_model(model_name, device): global model, current_model_name if model_name != current_model_name: model = models[model_name] current_model_name = model_name # 设置设备 model.to(device) return f"✓ 模型 {model_name} 已加载至 {device}" with gr.Blocks(theme=gr.themes.Soft()) as demo: gr.Markdown("# FunASR 语音识别 WebUI") gr.Markdown("基于 FunASR 的中文语音识别系统\n\nwebUI二次开发 by 科哥 | 微信:312088415") with gr.Row(): with gr.Column(scale=1): model_choice = gr.Radio( ["Paraformer-Large", "SenseVoice-Small"], label="模型选择", value="SenseVoice-Small" ) device_choice = gr.Radio( ["cuda", "cpu"], label="设备选择", value="cuda" if os.getenv("CUDA_VISIBLE_DEVICES", "") != "" else "cpu" ) punc_checkbox = gr.Checkbox(True, label="启用标点恢复 (PUNC)") vad_checkbox = gr.Checkbox(True, label="启用语音活动检测 (VAD)") timestamp_checkbox = gr.Checkbox(False, label="输出时间戳") status_text = gr.Textbox(value="✗ 模型未加载", label="模型状态") with gr.Row(): load_btn = gr.Button("加载模型") refresh_btn = gr.Button("刷新") with gr.Column(scale=3): gr.Markdown("## ASR 语音识别") audio_input = gr.Audio(type="filepath", label="上传音频") mic_input = gr.Microphone(type="filepath", label="麦克风录音") lang_dropdown = gr.Dropdown( choices=["auto", "zh", "en", "yue", "ja", "ko"], value="auto", label="识别语言" ) batch_slider = gr.Slider(60, 600, value=300, step=60, label="批量大小(秒)") start_btn = gr.Button("开始识别") output_text = gr.Textbox(label="文本结果") output_json = gr.JSON(label="详细信息") output_srt = gr.Textbox(label="时间戳") with gr.Row(): txt_btn = gr.Button("下载文本") json_btn = gr.Button("下载 JSON") srt_btn = gr.Button("下载 SRT") # 绑定事件 load_btn.click(load_model, [model_choice, device_choice], status_text) def on_transcribe(audio): result = transcribe(audio, language=lang_dropdown.value) return result, {"text": result}, format_srt(result) # 简化示例 start_btn.click(on_transcribe, audio_input, [output_text, output_json, output_srt]) demo.launch(server_name="0.0.0.0", server_port=7860)

启动服务:

python app.py

访问http://localhost:7860即可进入 WebUI 界面。


4. 功能实现与优化策略

4.1 实时录音支持

利用 Gradio 的Microphone组件实现浏览器内录音,底层调用 Web Audio API 获取 PCM 数据并保存为 WAV 文件,再传递给 ASR 模型处理。

注意:需确保 HTTPS 或本地 HTTP 允许麦克风权限。

4.2 结果导出功能实现

所有输出文件统一保存至带时间戳的子目录中:

def save_outputs(text, json_data, audio_path=None): timestamp = datetime.now().strftime("%Y%m%d%H%M%S") out_dir = f"outputs/outputs_{timestamp}" os.makedirs(out_dir, exist_ok=True) # 保存文本 with open(f"{out_dir}/text_001.txt", "w", encoding="utf-8") as f: f.write(text) # 保存 JSON import json as j with open(f"{out_dir}/result_001.json", "w", encoding="utf-8") as f: j.dump(json_data, f, ensure_ascii=False, indent=2) # 生成 SRT(简化版) srt_content = generate_srt_from_result(json_data) with open(f"{out_dir}/subtitle_001.srt", "w", encoding="utf-8") as f: f.write(srt_content) return out_dir

4.3 性能优化建议

  1. 长音频分段处理:设置合理的batch_size_s(推荐 300s),避免显存溢出。
  2. GPU 显存不足应对:降低批处理大小或改用 CPU 模式。
  3. 缓存机制:首次加载模型较慢,后续请求可复用已加载实例。
  4. 并发控制:生产环境中应限制最大并发数,防止资源争抢。

5. 常见问题排查与解决方案

5.1 模型加载失败

现象:提示Model not foundFileNotFoundError

解决方法

  • 检查模型路径是否正确,特别是modelscope克隆路径。
  • 确保网络通畅,必要时手动下载模型权重。
  • 使用绝对路径指定模型位置。

5.2 识别结果乱码或异常

原因分析

  • 音频编码不兼容(如非 16kHz)
  • 语言设置错误
  • N-gram LM 未正确加载

修复措施

  • 使用soxpydub转换采样率为 16kHz:
    sox input.mp3 -r 16000 output.wav
  • 明确指定lang="zh"提升中文识别稳定性。

5.3 浏览器无法录音

检查项

  • 是否允许站点使用麦克风(Chrome 地址栏左侧图标)
  • 是否运行在 HTTPS 或 localhost
  • 麦克风硬件是否正常工作

6. 总结

本文系统讲解了基于speech_ngram_lm_zh-cn对 FunASR 进行二次开发的全过程,涵盖环境搭建、模型加载、WebUI 构建、功能实现与性能优化等多个关键环节。通过引入外部 N-gram 语言模型,显著提升了中文语音识别的语义准确性;结合 Gradio 实现的可视化界面,使得非专业用户也能轻松完成语音转写任务。

该项目不仅具备良好的实用性,也为进一步扩展提供了清晰的技术框架。未来可在此基础上增加:

  • 多说话人分离(Diarization)
  • 实时流式识别
  • 自定义热词注入
  • RESTful API 接口封装

掌握此类系统的部署能力,对于构建企业级语音应用具有重要意义。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询