news 2026/9/12 17:11:37

如何构建FunASR的本地语音识别服务

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何构建FunASR的本地语音识别服务

FunASR 简介

FunASR 是阿里巴巴达摩院开源的高性能语音识别工具包,支持离线识别实时流式识别两种模式。其核心特点包括:

  • 支持多种语音任务:ASR(自动语音识别)、VAD(语音活动检测)、标点恢复、关键词检测等。
  • 提供预训练模型:覆盖中文、英文等多语言,支持不同场景(通用、会议、直播等)。
  • 支持多种部署方式:本地 Python、Docker 容器、ONNX 推理优化等。
  • 开源地址:GitHub - FunASR

一、本地 Python 部署

1. 克隆仓库
git clone https://github.com/modelscope/FunASR.git cd FunASR
2. 创建环境并安装依赖
# 创建 Conda 环境 conda create -n funasr python=3.9 conda activate funasr # 安装 PyTorch(CUDA 11.8 版本,CPU 版本需移除 `-c nvidia`) conda install pytorch==2.3.1 torchvision==0.18.1 torchaudio==2.3.1 pytorch-cuda=11.8 -c pytorch -c nvidia # 安装 FunASR 及相关库 pip install -U funasr pip install -U modelscope huggingface huggingface_hub
3. 模型使用示例
from funasr import AutoModel # 加载 ASR 模型(中文通用) model = AutoModel( model="damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch", model_revision="v2.0.4" ) # 加载标点恢复模型(可选) punc_model = AutoModel( model="damo/punc_ct-transformer_zh-cn-common-vocab272727-pytorch", model_revision="v1.0.4" ) # 语音识别示例(输入为 16kHz 采样率的 WAV 文件) audio_file = "your_audio.wav" result = model(audio_in=audio_file) # 添加标点(可选) if result and punc_model: text = result[0]["text"] result_with_punc = punc_model(text) print("识别结果(带标点):", result_with_punc[0]["text"])

二、Docker 容器部署

1. 拉取 Docker 镜像
# CPU 版本 docker pull registry.cn-hangzhou.aliyuncs.com/funasr_repo/funasr:funasr-runtime-sdk-cpu-0.4.6 # GPU 版本(需 NVIDIA 驱动和 Docker 支持) docker pull registry.cn-hangzhou.aliyuncs.com/funasr_repo/funasr:funasr-runtime-sdk-gpu-0.4.6
2. 创建模型目录并启动容器
# 创建模型存储目录 mkdir -p ./funasr-runtime-resources/models # 启动 CPU 容器(映射端口 10095) docker run -p 10095:10095 -it --privileged=true \ -v $PWD/funasr-runtime-resources/models:/workspace/models \ registry.cn-hangzhou.aliyuncs.com/funasr_repo/funasr:funasr-runtime-sdk-cpu-0.4.6
3. 启动服务(容器内执行)
cd FunASR/runtime # 启动完整服务(包含 VAD、ASR、标点恢复、语言模型等) nohup bash run_server.sh \ --download-model-dir /workspace/models \ --vad-dir damo/speech_fsmn_vad_zh-cn-16k-common-onnx \ --model-dir damo/speech_paraformer-large-vad-punc_asr_nat-zh-cn-16k-common-vocab8404-onnx \ --punc-dir damo/punc_ct-transformer_zh-cn-common-vad_realtime-vocab272727-onnx \ --lm-dir damo/speech_ngram_lm_zh-cn-ai-wesp-fst \ --itn-dir thuduj12/fst_itn_zh \ --hotword /workspace/models/hotwords.txt > log.txt 2>&1 & # 关闭 SSL(添加 --certfile 0 参数) nohup bash run_server.sh ... --certfile 0 > log.txt 2>&1 &

三、基于 FastAPI 的 Web 服务实现

1. 服务端代码(asr_service.py
from fastapi import FastAPI, File, UploadFile, HTTPException from fastapi.responses import JSONResponse import uvicorn import wave import numpy as np from funasr import AutoModel app = FastAPI(title="FunASR 语音识别服务") # 初始化模型 try: model = AutoModel( model="damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch", model_revision="v2.0.4" ) punc_model = AutoModel( model="damo/punc_ct-transformer_zh-cn-common-vocab272727-pytorch", model_revision="v1.0.4" ) except Exception as e: raise HTTPException(status_code=500, detail=f"模型加载失败: {str(e)}") @app.post("/asr") async def recognize_audio(file: UploadFile = File(...)): try: # 保存临时文件 temp_file = "temp_audio.wav" with open(temp_file, "wb") as f: f.write(await file.read()) # 检查音频格式(需 16kHz 采样率) with wave.open(temp_file, "rb") as wf: sample_rate = wf.getframerate() if sample_rate != 16000: return JSONResponse( content={"error": "请上传 16kHz 采样率的 WAV 文件"}, status_code=400 ) # 执行识别 result = model(audio_in=temp_file) # 添加标点(可选) if result and punc_model: text = result[0]["text"] result_with_punc = punc_model(text) result[0]["text_with_punctuation"] = result_with_punc[0]["text"] return {"result": result} except Exception as e: return JSONResponse(content={"error": str(e)}, status_code=500) finally: # 清理临时文件 import os if os.path.exists(temp_file): os.remove(temp_file) if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=8000)
2. 启动服务
python asr_service.py
3. 客户端调用示例
import requests url = "http://localhost:8000/asr" audio_file = "test.wav" # 16kHz WAV 文件 with open(audio_file, "rb") as f: response = requests.post(url, files={"file": f}) if response.status_code == 200: print("识别结果:", response.json()) else: print(f"错误: {response.status_code}, {response.text}")

四、性能优化建议

  1. 模型选择

    • 轻量级模型:damo/speech_paraformer-tiny_asr_nat-zh-cn-16k-common(更快)
    • 通用模型:damo/speech_paraformer-large_asr_nat-zh-cn-16k-common(更准)
  2. 模型量化
    使用 ONNX 或 TensorRT 对模型进行量化,减少内存占用并提升推理速度。

  3. 批处理
    对多个音频文件进行批量处理,提高吞吐量。

  4. 缓存机制
    对相同音频的识别结果进行缓存,避免重复计算。

五、常见问题及解决方案

  1. CUDA 兼容性问题

    • 确保 PyTorch 版本与本地 CUDA 驱动匹配。
    • CPU 环境使用无 CUDA 的 PyTorch 版本。
  2. 模型下载失败

    • 手动下载模型并放置到指定路径。
    • 配置网络代理或使用国内镜像源。
  3. Docker 权限问题

    • 添加--privileged=true参数或调整容器权限。

通过以上步骤,可以构建一个完整的本地语音识别服务,支持实时语音转文字功能。

启动Fay数字人的语音服务方法如下:

安装启动funasr

1、进入Fay/asr/funasr代码目录

2、安装依赖

在终端或cmd中分别执行以下命令

pip install torch pip install modelscope pip install testresources pip install websockets==10.4 pip install torchaudio pip install FunASR

3、终端或cmd启动funasr服务端(保持启动)

python -u ASR_server.py --host "0.0.0.0" --port 10197 --ngpu 1

说明:--ngpu 0——CPU运行

--ngpu 1——GPU运行

启动后,默认端口为10197,系统配置代码中调用方式为:

local_asr_ip =(本地语音服务的电脑IP) local_asr_port = 10197
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/5 23:06:20

什么是PROFINET

文章目录为什么需要PROFINETPROFINET IO系统有哪些组成PROFINET是如何工作的PROFINET采用TCP/IP协议作为基础,并在其应用层上增加了实时机制和通讯协议,因此具有和标准以太网相同的一些特性如全双工、多种拓扑结构等,其速率可达千兆。另外它也…

作者头像 李华
网站建设 2026/9/5 23:06:17

ΔΣ(Delta-Sigma)ADC 的原理---从“为什么要有 ΔΣ ADC → 它到底在干什么 → 每一块电路在物理层干了什么 → 为什么电表/计量芯片都爱用它”这个顺序,完整、工程化地讲清楚

一、先说结论(抓住本质)ΔΣ ADC 低分辨率量化器 过采样 噪声整形 数字滤波它的核心思想不是“一次采得很准”,而是:我一次采得很粗,但我采得非常快,而且把误差“挤”到高频,再用数字滤波丢…

作者头像 李华
网站建设 2026/9/2 23:57:51

密度敏感哈希(DSH)学习算法详解

密度敏感哈希(Density Sensitive Hashing,简称DSH)是一种无监督哈希学习方法,其独特之处在于考虑数据的密度分布,通过自适应选择分割超平面来生成二进制码。这种方法在高密度区域分配更多比特位,从而提升哈希码的区分能力,特别适合非均匀分布的数据集,如图像特征或文本…

作者头像 李华
网站建设 2026/9/11 2:11:55

Spring Boot动态数据源实战,让数据库连接“随用随取”

数据源切换方法 Springboot提供了AbstractRoutingDataSource抽象类,类名意思是数据源路由,让用户可以选择根据需要切换当前数据源 该类提供了一个抽象方法determineCurrentLookupKey(), 切换数据源时springboot会调用这个方法,所以只需要实现该方法,在该方法中返回需要切换…

作者头像 李华
网站建设 2026/9/11 5:44:11

51单片机控制LCD1602显示:超详细版入门指南

51单片机驱动LCD1602实战指南:从点亮第一行文字到构建人机界面你有没有遇到过这样的场景?电路板已经焊好,程序也烧录进去了,但设备“黑屏”一片,毫无反应。没有提示、没有状态、甚至连个“Hello World”都没有——调试…

作者头像 李华
网站建设 2026/9/10 1:33:31

基于STM32的工业touch驱动开发操作指南

手把手教你打造工业级STM32触摸驱动:从硬件到算法的全链路实战你有没有遇到过这样的场景?设备刚上电,操作员在屏幕上点了好几下,界面却迟迟没反应;或者冬天戴着手套一碰就误触发,夏天又完全没感应——这些看…

作者头像 李华