Skip to content

zsc/Fun-ASR

 
 

Repository files navigation

Fun-ASR(本机麦克风 + desk 局域网 GPU Server 模式)

这个仓库提供了 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 直连)。


1. 整体工作原理(数据流)

核心思路是把“最吃算力/显存”的部分放到 GPU 机(desk)上常驻运行,从而复用同一个模型实例:

  1. laptop(本机)

    • 通过麦克风实时采集音频(pyaudio
    • 用 silero-vad 做语音活动检测(VAD)并把音频按 chunk 组合成“partial / final”片段
    • 通过 HTTP 把片段发送到 desk 的 GPU Server 做 ASR
    • 把 ASR 的 partial/final 结果实时显示在网页 demo
    • (可选)当产生 final 句子时,把该句子作为 user 消息发送到 desk 的 Chat 接口,得到 assistant 回复并展示
  2. desk(GPU 机)

    • 常驻一个 FastAPI + Uvicorn Server:启动时一次性加载 FunASR 模型到 cuda:0
    • 每次请求只做推理,复用同一个模型/显存(避免重复加载带来的延迟)
    • (可选)同一进程里加载一个文本 LLM,用于把“最终转写文本”做对话回复

你会看到“ASR/Chat 都是 desk 上一个常驻实例”,本机多次启动/停止 demo,都复用同一个 desk server(只要它还在跑)。


2. 目录与关键脚本

  • 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 写了更详细版本,这里可当速查)

3. 环境准备

3.1 desk(GPU 机,conda env: py312

需要能在 py312 环境中 import:

  • torch / transformers / funasr
  • fastapi / uvicorn / pydantic

如果 desk 上缺模型或依赖,启动 server 时会报错;用 python tools/desk_asr.py logs 把日志给我即可。

3.2 laptop(本机)

Web demo 需要:

  • Python 依赖(见 requirements.txt
  • 麦克风采集依赖:pyaudio
    • macOS 通常需要先装 portaudio(例如 brew install portaudio),再 pip install pyaudio

4. 部署:把工程放到 desk:~/d/Fun-ASR

你已选择不做自动同步,所以这里是“手动同步/放置”的原则:

  • desk 上应存在 ~/d/Fun-ASR,且代码版本与 laptop 本地一致
  • 你可以用任意方式放过去(git clone / rsync / scp)。例如(可选):
rsync -av --delete ./ desk:~/d/Fun-ASR/

5. 启动 desk GPU Server(两种方式)

方式 A:在 desk 上手动启动(建议第一次先用这个确认依赖/模型)

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

方式 B:在 laptop 上一键起停(复用同一个 desk server 实例)

控制脚本会在 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> up

关于 ssh alias(desk)和 HTTP 地址

HTTP 不认识 ~/.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


6. 本机跑麦克风 Demo(ASR + 可选 Chat 走 desk)

先确保 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 消息),适合“边说边出字 + 句末对话回复”的交互。


7. desk Server API(简要)

7.1 健康检查

GET /health

返回 server 的 pid / device / model 等信息。

7.2 ASR

POST /v1/asr/transcribe

  • 两种输入方式(二选一):
    • audio_b64:base64 编码的原始 PCM(demo 使用 s16le + 16k
    • input:desk 机器可访问的路径/URL(适合把音频放在 desk 上或引用 URL)

7.3 Chat(可选)

POST /v1/chat/completions

请求体:

  • messages: [{role, content}, ...]

返回:

  • assistant: 模型回复文本

8. 安全提示(重要)

你选择了让 desk server 监听 0.0.0.0,这意味着:

  • 局域网内任何能访问到 desk 的机器都能请求这个 ASR/Chat 服务

建议至少做一项:

  • 在 desk 上用防火墙/安全组限制来源 IP
  • 或把 server 改为只监听 127.0.0.1,通过 ssh 端口转发使用(更安全)

9. Troubleshooting

  • 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

About

Fun-ASR is an end-to-end speech recognition large model launched by Tongyi Lab.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages

  • Python 98.9%
  • Shell 1.1%