这个仓库提供了 Fun-ASR Nano 的推理/微调脚本,并新增了一套“laptop 采集麦克风 + desk(GPU 机)常驻 Server”的工作方式,用于在局域网内获得更低延迟的 ASR +(可选)LLM 对话能力。
约定:
desk是你~/.ssh/config里定义的 alias(ssh desk免登录)。
远端工程目录:desk:~/d/Fun-ASR(你已确认)。
远端运行环境:conda env py312(你已确认)。
远端 Server 监听:0.0.0.0:8123(你已确认,可 LAN 直连)。
核心思路是把“最吃算力/显存”的部分放到 GPU 机(desk)上常驻运行,从而复用同一个模型实例:
-
laptop(本机):
- 通过麦克风实时采集音频(
pyaudio) - 用 silero-vad 做语音活动检测(VAD)并把音频按 chunk 组合成“partial / final”片段
- 通过 HTTP 把片段发送到
desk的 GPU Server 做 ASR - 把 ASR 的 partial/final 结果实时显示在网页 demo
- (可选)当产生 final 句子时,把该句子作为 user 消息发送到
desk的 Chat 接口,得到 assistant 回复并展示
- 通过麦克风实时采集音频(
-
desk(GPU 机):
- 常驻一个 FastAPI + Uvicorn Server:启动时一次性加载 FunASR 模型到
cuda:0 - 每次请求只做推理,复用同一个模型/显存(避免重复加载带来的延迟)
- (可选)同一进程里加载一个文本 LLM,用于把“最终转写文本”做对话回复
- 常驻一个 FastAPI + Uvicorn Server:启动时一次性加载 FunASR 模型到
你会看到“ASR/Chat 都是 desk 上一个常驻实例”,本机多次启动/停止 demo,都复用同一个 desk server(只要它还在跑)。
tools/desk_asr_server.py:跑在 desk 上的 GPU Server(ASR + 可选 Chat)tools/desk_asr.py:跑在 laptop 上的控制器(up/status/logs/down),用于复用 desk 上的同一个 server 实例vad_demo/web_demo.py:本机麦克风 Web Demo(支持--asr-backend desk把 ASR/Chat 交给 desk)docs/desk_gpu.md:更精简的说明(README 写了更详细版本,这里可当速查)
需要能在 py312 环境中 import:
torch/transformers/funasrfastapi/uvicorn/pydantic
如果 desk 上缺模型或依赖,启动 server 时会报错;用 python tools/desk_asr.py logs 把日志给我即可。
Web demo 需要:
- Python 依赖(见
requirements.txt) - 麦克风采集依赖:
pyaudio- macOS 通常需要先装
portaudio(例如brew install portaudio),再pip install pyaudio
- macOS 通常需要先装
你已选择不做自动同步,所以这里是“手动同步/放置”的原则:
- desk 上应存在
~/d/Fun-ASR,且代码版本与 laptop 本地一致 - 你可以用任意方式放过去(git clone / rsync / scp)。例如(可选):
rsync -av --delete ./ desk:~/d/Fun-ASR/cd ~/d/Fun-ASR
conda run -n py312 python tools/desk_asr_server.py --host 0.0.0.0 --port 8123启用“对话”(需要你指定一个可用的文本 LLM):
cd ~/d/Fun-ASR
conda run -n py312 python tools/desk_asr_server.py \
--host 0.0.0.0 --port 8123 \
--chat-model <your_chat_model_id_or_path>探活:
curl http://127.0.0.1:8123/health控制脚本会在 desk 上用 nohup 拉起 server,并用 ~/.fun-asr/desk_asr_server.pid 复用同一个进程:
python tools/desk_asr.py up
python tools/desk_asr.py status
python tools/desk_asr.py logs
python tools/desk_asr.py down启用 chat(会把 --chat-model 透传给 server 启动参数):
python tools/desk_asr.py --chat-model <your_chat_model_id_or_path> upHTTP 不认识 ~/.ssh/config 的 alias。为此:
tools/desk_asr.py会自动执行ssh -G desk解析出真实HostName,用于http://<HostName>:8123/health的检查- 如果你的
HostName不是一个能从 laptop 直连的 LAN 地址,请手动指定:
python tools/desk_asr.py --http-host <desk_lan_ip_or_hostname> status同理,demo 侧也会尝试把 http://desk:8123 解析成 http://<HostName>:8123。
先确保 desk server 已经是 UP(任选一种方式启动即可)。
然后在 laptop 启动 Web Demo:
python vad_demo/web_demo.py --asr-backend desk --desk-url http://desk:8123 --chat浏览器打开:
http://127.0.0.1:8000
常用参数:
--language 中文:指定转写语言(不传则用默认 prompt)--no-itn:关闭 ITN--max-length 50:ASR max_length--system-prompt '...':对话系统提示词--chat-history-turns 8:保留最近 N 轮(user+assistant)的上下文
当前实现:只在 final 句子产生时触发一次 chat(把该句子作为 user 消息),适合“边说边出字 + 句末对话回复”的交互。
GET /health
返回 server 的 pid / device / model 等信息。
POST /v1/asr/transcribe
- 两种输入方式(二选一):
audio_b64:base64 编码的原始 PCM(demo 使用s16le + 16k)input:desk 机器可访问的路径/URL(适合把音频放在 desk 上或引用 URL)
POST /v1/chat/completions
请求体:
messages:[{role, content}, ...]
返回:
assistant: 模型回复文本
你选择了让 desk server 监听 0.0.0.0,这意味着:
- 局域网内任何能访问到 desk 的机器都能请求这个 ASR/Chat 服务
建议至少做一项:
- 在 desk 上用防火墙/安全组限制来源 IP
- 或把 server 改为只监听
127.0.0.1,通过 ssh 端口转发使用(更安全)
desk server did not become healthy in time:- 先
python tools/desk_asr.py logs看是否缺依赖/缺模型/端口冲突
- 先
- desk 缺模型:
- 日志里会包含具体模型名/路径;把日志贴我我给你装
- demo 没有麦克风输入/报
pyaudio not installed:- 安装
portaudio+pyaudio
- 安装
http://desk:8123访问不了:- 用
ssh -G desk看解析出来的HostName - 或改用
--desk-url http://<desk_lan_ip>:8123
- 用