自建语音助手,从零到能对话,两天就够
先说结论:自建一个能对话的语音助手,门槛比很多人想象的低。S.A.T.U.R.D.A.Y 这个开源项目,把整条链路都打包好了,从「听到你说话」到「开口回你」,中间那堆零件它都帮你拼好了。我在本地跑了一周,把步骤拆给你看,照着一路点下来,两天内能跑通。
先交代背景。这个项目全称 S.A.T.U.R.D.A.Y,定位是 open-source、self-hosted、J.A.R.V.I.S。self-hosted 意思是你自己的电脑或服务器就是它的家,所有东西都在本地跑,不经过任何第三方云服务。J.A.R.V.I.S 就是钢铁侠那个管家,当然这位没有电影里那么聪明,但它能做的已经很实用了:你说话,它识别成文字,文字丢给 AI 理解,再生成语音回你。
对完全没接触过这块的新手,先解释三个词,后面不重复了。语音转文字(缩写 STT),就是把你说的话变成屏幕上的文字。文字转语音(缩写 TTS),反过来,把文字变成声音。WebRTC,一种浏览器里实时传声音、传画面的技术,不用装额外软件,这是整个项目的通信底座。
我这次给了自己两个方案,跑了两遍。方案 A 是直接用 S.A.T.U.R.D.A.Y 全套组装,零件省心,跑起来快。方案 B 是自己拆零件拼,用 whisper.cpp 做 STT、大模型 API 做理解、Coqui TTS 做语音,中间用 WebRTC 串起来。两个方案都跑通后,区别在这张表里:
| 对比项 | 方案A:S.A.T.U.R.D.A.Y 全家桶 | 方案B:自己拼装 |
|---|---|---|
| 部署难度 | 低,clone 下来就能跑 | 高,每个零件都要自己调 |
| 隐私性 | 全本地,数据不出门 | 看你怎么配,可以全本地也能混云 API |
| 需要 GPU 吗 | 建议有,CPU 能跑但很慢 | 同上 |
| 灵活性 | 中,跟着项目设计走 | 高,想换哪个零件换哪个 |
| 适合谁 | 第一次接触、想快速跑通 | 想折腾、对链路有研究兴趣 |
我的建议是直接上方案 A,先跑通,再拆开研究里面每个零件干了什么。别一上来就拼装,你还没见过正常跑起来是什么样,出问题了都不知道是哪个环节的锅。
下面跟着做,假设你用的是 Ubuntu 22.04 或者更新的版本,电脑上得有 Docker。Docker 是啥不重要,你就当成一个帮你打包软件的盒子,项目作者把环境都装好了,你只要按一下就启动。没装的话,先跑 sudo apt install docker.io docker-compose,装完确认 docker --version 能出版本号。
第一步,找个目录把代码拉下来。终端里输入:
git clone https://github.com/GRVYDEV/S.A.T.U.R.D.A.Y
cd S.A.T.U.R.D.A.Y
此时目录下会有一个 docker-compose.yml 文件,后面所有服务都由它启动。
第二步,看一眼 docker-compose.yml,确认端口没有冲突。默认是 8080,如果你本机跑着别的服务占了 8080,把配置里的 8080:8080 改成 8090:8080,左边是外部访问端口,右边是容器内部端口。这个坑我踩过,不检查直接启动,日志报端口占用,看不出原因,愣是浪费了二十分钟。
第三步,启动服务。docker-compose up -d,第一次会拉镜像,看你的网络,大约十分钟到二十分钟。看到 Started 字样就说明起来了。用 docker-compose logs -f 可以看实时日志,如果起不来,基本是镜像拉取失败,换 Docker 镜像源再拉一次就行。
第四步,打开浏览器访问 http://localhost:8080。界面是个很简单的网页,中间一个大按钮,点住不放说话。说完松开,大概一两秒,就听到语音回复了。第一次跑通的时候我愣了一下,它真的回话了,那一刻还是有点爽的。
到这里你已经跑通核心链路了。但还有个大坑:中文识别。whisper.cpp 默认模型对英文效果好,中文会识别得乱七八糟,我测下来一开始它把「今天天气怎么样」听成了完全不沾边的东西。解决方式是在配置里把模型指定为中文模型,或者在 whisper 的启动参数里加 -l zh 强制语言为中文。这个配置藏在 docker-compose.yml 里那个 whisper 服务的 environment 段,加一行 LANGUAGE=zh,重启服务就生效。改完再试,识别准确率明显上来了。
另一个我觉得值得说的坑是延迟。整条链路里最慢的是 TTS 生成语音那步,冷启动的时候要先把模型加载进内存,第一次对话会等个三五秒,后面就快了。不要以为装坏了,这是正常的。想要更快,可以换更小的 TTS 模型,代价是声音质感下降,听起来更像机器人。
我自己跑下来的体验是,这套东西作为个人的语音助手,已经能胜任了。素材里有不少人用它把家里的 Alexa 换掉了,理由都一样:不想要云端的麦克风一直开着。你也知道,本地部署这东西,隐私不是功能,是基于信任的前提条件。
学完这个,下一步可以试什么。把语音助手接到你的智能家居上,比如让它控制灯、开关插座,这涉及给助手加「工具调用」能力。或者反过来,把语音识别这块拆出来单独用,它本身就是个很干净的 STT 工具,可以用在会议录音转文字上。我有朋友就在搞这个,把规划好的会议纪要流程整个接到本地 whisper 上,省掉了每个月给云服务商交的订阅费。
最后留个问题给有动手欲望的人:语音助手识别对错怎么评估?准确率这个词,不同场景下的衡量方式完全不一样,你对着麦克风说「关灯」和对着录音转写「项目周报」,衡量标准是两套东西。你觉得本地部署的语音识别,到底该用什么指标来衡量?
本文编译自 Hacker News,原文:GitHub - GRVYDEV/S.A.T.U.R.D.A.Y: A toolbox for working with WebRTC, Audio and AI · GitHub
版权归原作者所有,本文为基于公开报道的编译与独立分析。
物界前沿