unmute
Unmute 是一个让纯文本大语言模型(LLM)具备“听”和“说”能力的开源系统。它通过集成 Kyutai 研发的语音识别(STT)与语音合成(TTS)模型,将用户的语音实时转为文字输入给模型,再将模型生成的文字回复即时转化为语音播放,从而构建出流畅的语音对话体验。
这一工具主要解决了传统文本模型无法直接处理音频交互的痛点,让用户无需打字即可与自然语言模型进行低延迟的实时口头交流。其技术亮点在于对语音处理链路进行了专门的低延迟优化,并采用灵活的架构设计:后端通过 WebSocket 实时流转音频数据,且兼容任意文本大模型。用户既可以直接使用官方服务,也能通过 OpenRouter 接入云端模型,或在本地部署如 Gemma 3 等开源模型。
Unmute 特别适合开发者、AI 研究人员以及希望构建语音交互应用的技术爱好者。对于想要探索多模态交互原型或搭建私有化语音助手的团队来说,它提供了基于 Docker Compose 的便捷部署方案,只需单张支持 CUDA 的显卡即可在 Linux 环境下快速启动。虽然普通用户也可通过网页版直接体验,但其核心价值更在于为技术社区提供了一套可定制、可扩展的语音交互基础设施。
使用场景
一位视障开发者正在深夜调试复杂的 Python 代码,急需通过自然对话快速定位报错原因并获取修复建议。
没有 unmute 时
- 交互断层严重:必须依赖屏幕阅读器逐字朗读网页内容,再手动打字输入问题,思维频繁被打断,效率极低。
- 上下文丢失快:在“听报错 - 切窗口 - 打字提问 - 等回复”的繁琐流程中,难以保持对代码逻辑的连贯思考。
- 多模态支持缺失:无法直接口述代码片段或错误日志,只能依靠并不精准的语音转文字输入法,反复修正消耗大量精力。
- 响应延迟感知强:传统文本交互的等待感被放大,缺乏实时对话的流畅性,导致调试过程枯燥且充满挫败感。
使用 unmute 后
- 全双工语音闭环:unmute 将 Gemma 3 等文本模型包裹在低延迟的语音系统中,开发者可直接口述问题,系统即时语音播报解决方案,实现“所说即所得”。
- 思维流不断档:省去了打字和切换界面的步骤,开发者能像与同事结对编程一样,边看代码边口头讨论,保持高度的逻辑专注。
- 原生口语理解:依托优化的语音识别模型,unmute 能精准转录包含专业术语的口述代码,自动处理停顿与修正,无需人工干预。
- 实时流式反馈:借助流式传输技术,unmute 在模型生成回答的同时即可开始朗读,大幅缩短等待时间,让调试节奏更加紧凑自然。
unmute 的核心价值在于打破了文本大模型的“哑巴”限制,让开发者仅凭声音就能获得沉浸式、零摩擦的智能编程辅助体验。
运行环境要求
- Linux
- Windows (仅限 WSL)
- 必需 NVIDIA GPU (支持 CUDA),架构必须为 x86_64 (不支持 aarch64/Mac)
- 单卡运行默认模型需至少 16GB 显存
- 若分离部署服务,LLM 需 6.1GB,STT 需 2.5GB,TTS 需 5.3GB 显存
未说明

快速开始
解除静音
快来 Unmute.sh 体验吧!
Unmute 是一个系统,它通过将文本型大语言模型(LLM)与 Kyutai 的语音合成(TTS)和语音识别(STT)模型相结合,使 LLM 具备“听”和“说”的能力。语音识别会将用户的语音转录为文本,LLM 生成回复文本,然后语音合成就会将这些文本朗读出来。语音识别和语音合成都针对低延迟进行了优化,该系统可以与任何你喜欢的文本型 LLM 配合使用。
如果你想单独使用 Kyutai 的 STT 或 TTS,可以查看 kyutai-labs/delayed-streams-modeling。关于这些模型的预印本可以在 这里 获取。
从高层次来看,其工作流程如下:
graph LR
UB[用户浏览器]
UB --> B(后端)
UB --> F(前端)
B --> STT(语音识别)
B --> LLM(LLM)
B --> TTS(语音合成)
- 用户打开由 前端 提供服务的 Unmute 网站。
- 点击“连接”后,用户会建立一个 WebSocket 连接至 后端,实时传输音频及其他元数据。
- 后端通过 WebSocket 连接到 语音识别 服务器,将用户的音频发送过去,并实时接收转录结果。
- 当语音识别检测到用户停止说话并准备生成回复时,后端会连接到 LLM 服务器以获取响应。我们使用 OpenRouter 来部署 LLM,但你也可以使用 VLLM 自行托管。
- 在生成回复的过程中,后端会将回复内容传递给 语音合成 服务器进行朗读,并将合成后的语音流返回给用户。
设置
[!NOTE]
如果遇到问题,请随时提交 Issue,我们会尽力帮助你解决问题。
要求:
- 硬件:支持 CUDA 的 GPU,显存至少 16 GB。架构必须是 x86_64,暂不支持 aarch64。
- 操作系统:Linux,或带有 WSL 的 Windows(安装说明)。不支持在原生 Windows 上运行(参见 #84),也不支持在 Mac 上运行(参见 #74)。
我们提供了多种方式来部署你自己的 unmute.sh:
| 名称 | GPU 数量 | 机器数量 | 难度 | 文档是否完善 | Kyutai 支持 |
|---|---|---|---|---|---|
| Docker Compose | 1+ | 1 | 非常简单 | ✅ | ✅ |
| 无 Docker | 1–3 | 1–5 | 容易 | ✅ | ✅ |
| Docker Swarm | 1–~100 | 1–~100 | 中等难度 | ✅ | ❌ |
由于 Unmute 是一个复杂的系统,包含多个需要同时运行的服务,我们建议使用 Docker Compose 来运行 Unmute。它允许你通过一条命令启动或停止所有服务。由于这些服务都是 Docker 容器,你可以获得一个可重复的环境,而无需担心依赖关系。
虽然我们也支持使用 Docker Compose 和无 Docker 的部署方式,但 Docker Swarm 部署仅用于展示我们如何部署和扩展 unmute.sh。它的配置文件与 Compose 类似,但由于多节点应用的调试较为困难,我们无法提供 Swarm 部署的调试支持。
Hugging Face Hub 上的 LLM 访问权限
你可以使用任何你想要的 LLM。在生产环境中,我们使用通过 OpenRouter 提供服务的 GPT OSS 120B。而在默认的本地设置中(Docker Compose/无 Docker),Unmute 使用 Gemma 3 1B 作为 LLM。
该模型可免费使用,但你需要先接受相关条款:
- 创建一个 Hugging Face 账号。
- 接受 Mistral Small 3.2 24B 模型页面上的使用条款。
- 创建访问令牌。 你可以使用细粒度令牌,只需授予“读取你可访问的所有公开 gated repo 内容”的权限即可。 请勿在公开部署时使用具有写入权限的令牌。 如果服务器遭到入侵,攻击者将获得对你在 Hugging Face 上所有模型、数据集等的写入权限。
- 将令牌添加到你的
~/.bashrc或等效文件中,格式为export HUGGING_FACE_HUB_TOKEN=hf_...你的令牌..."。
启动 Unmute
请确保已安装 Docker Compose。此外,还需要安装 NVIDIA Container Toolkit,以便 Docker 能够访问你的 GPU。要验证 NVIDIA Container Toolkit 是否正确安装,请运行以下命令:
sudo docker run --rm --runtime=nvidia --gpus all ubuntu nvidia-smi
如果你使用的是 google/gemma-3-1b-it,这是 docker-compose.yml 中的默认配置,那么 16 GB 的显存就足够了。如果遇到内存不足的问题,可以打开 docker-compose.yml,查找带有 NOTE: 标记的注释,看看哪些地方可能需要调整。
在配备 GPU 的机器上,运行以下命令:
# 确保已设置包含令牌的环境变量:
echo $HUGGING_FACE_HUB_TOKEN # 应该输出 hf_...一些内容...
docker compose up --build
使用多 GPU
在 Unmute.sh 上,我们将语音识别、语音合成以及 VLLM 服务器分别部署在不同的 GPU 上,这样可以显著降低延迟,相比单 GPU 配置效果更好。例如,当所有服务都在一台 L40S GPU 上运行时,TTS 延迟约为 750 毫秒;而在 Unmute.sh 上,这一延迟降至约 450 毫秒。
如果你有至少三块 GPU,可以在 stt、tts 和 llm 服务的配置中添加以下片段,以确保它们分别运行在不同的 GPU 上:
stt: # `tts` 和 `llm` 同理
# ...其他配置
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
不使用 Docker 运行
或者,你也可以选择不通过 Docker,而是手动启动各个服务来运行 Unmute。 由于需要处理多种依赖关系,这种方式的设置可能会更加复杂。
以下说明仅适用于 Linux 和 WSL 环境。
软件要求
uv:使用curl -LsSf https://astral.sh/uv/install.sh | sh安装cargo:使用curl https://sh.rustup.rs -sSf | sh安装pnpm:使用curl -fsSL https://get.pnpm.io/install.sh | sh -安装cuda 12.1:可通过 conda 或直接从 Nvidia 官网安装。Rust 进程(tts 和 stt)需要此工具。
硬件要求
在不同的 tmux 会话或终端中依次启动每个服务:
./dockerless/start_frontend.sh
./dockerless/start_backend.sh
./dockerless/start_llm.sh # 需要 6.1GB 显存
./dockerless/start_stt.sh # 需要 2.5GB 显存
./dockerless/start_tts.sh # 需要 5.3GB 显存
之后,网站应可在 http://localhost:3000 访问。
连接到运行 Unmute 的远程服务器
如果你在一台通过 SSH 访问的机器上运行 Unmute——假设这台机器名为 unmute-box——并且希望从本地计算机访问它,
你需要设置 端口转发。
[!注意] 如果你使用的是 HTTP 而不是 HTTPS,即使可以直接访问
http://unmute-box:3000,仍然需要进行端口转发。 这是因为出于安全考虑,浏览器通常不允许在非本地的 HTTP 连接上使用麦克风。 HTTPS 的相关说明请见下文。
对于 Docker Compose:默认情况下,我们的 Docker Compose 设置运行在端口 80 上。 要将远程服务器的 80 端口转发到本地的 3333 端口,请使用:
ssh -N -L 3333:localhost:80 unmute-box
如果一切正常,该命令不会输出任何内容,只会持续运行。然后在浏览器中打开 localhost:3333。
对于 Dockerless:你需要分别转发后端(8000 端口)和前端(3000 端口):
ssh -N -L 8000:localhost:8000 -L 3000:localhost:3000 unmute-box
flowchart LR
subgraph Local_Machine [本地机器]
direction TB
browser[浏览器]
browser -. "用户在浏览器中打开 localhost:3000" .-> local_frontend[localhost:3000]
browser -. "前端向 localhost:8000 发起 API 请求" .-> local_backend[localhost:8000]
end
subgraph Remote_Server [远程服务器]
direction TB
remote_backend[后端:8000]
remote_frontend[前端:3000]
end
local_backend -- "SSH 隧道: 8000" --> remote_backend
local_frontend -- "SSH 隧道: 3000" --> remote_frontend
HTTPS 支持
为简化起见,我们在 Docker Compose 和 Dockerless 的设置中未包含 HTTPS 支持。 如果你想让部署通过 HTTPS 工作,可以考虑使用 Docker Swarm (参见 SWARM.md),或者询问你喜欢的 LLM 如何使 Docker Compose 或 Dockerless 设置支持 HTTPS。
使用 Docker Swarm 的生产部署
如果你想知道我们是如何部署和扩展 unmute.sh 的,请查看我们的文档中关于 Docker Swarm 部署的部分。
修改 Unmute
以下是一些关于如何对 Unmute 进行特定修改的高层次指导。
字幕与开发模式
按下 “S” 键可为用户和聊天机器人同时开启字幕。
此外,还有一个开发模式可以帮助调试,但默认是禁用的。打开 useKeyboardShortcuts.ts 文件,将 ALLOW_DEV_MODE 改为 true。
然后按下 “D” 键即可查看调试界面。你可以通过修改 unmute_handler.py 中的 self.debug_dict 来添加更多调试信息。
更改角色/声音
角色的声音和提示语定义在 voices.yaml 文件中。
配置文件的格式应该比较直观。某些系统提示语包含动态生成的内容。
例如,“知识竞赛”中的 5 道题目是从一个固定列表中随机提前选出的。
类似这样的系统提示语定义在 unmute/llm/system_prompt.py 文件中。
请注意,该文件仅在后端启动时加载并被缓存,因此如果你更改了 voices.yaml 中的内容,
就需要重新启动后端。
你可以在我们的 语音仓库 中查看可用的语音。
要使用其中一种语音,只需将 voices.yaml 中的 path_on_server 字段更改为所需语音的相对路径,
例如 voice-donations/Haku.wav。
从 2025 年 6 月至 2026 年 2 月,我们还开展了 Unmute 语音捐赠项目, 志愿者们提供了自己的声音,用于 Kyutai TTS 1.6B(Unmute 使用)及其他开源 TTS 模型。 这些语音同样可以在 语音仓库 中找到。
使用外部 LLM 服务器
Unmute 后端可以与任何兼容 OpenAI 的 LLM 服务器一起使用。默认情况下,docker-compose.yml 配置 VLLM,以实现完全自包含的本地部署。
你可以修改此文件,切换到其他外部 LLM,比如 OpenAI 服务器、本地 Ollama 部署等。
以 Ollama 为例,将 unmute-backend 镜像的环境变量部分中的
backend:
image: unmute-backend:latest
[..]
environment:
[..]
- KYUTAI_LLM_URL=http://llm:8000
替换为:
backend:
image: unmute-backend:latest
[..]
environment:
[..]
- KYUTAI_LLM_URL=http://host.docker.internal:11434
- KYUTAI_LLM_MODEL=gemma3
- KYUTAI_LLM_API_KEY=ollama
extra_hosts:
- "host.docker.internal:host-gateway"
这样就指向了你的本地服务器。或者,如果你想使用兼容 OpenAI 的服务器,比如 OpenRouter,可以这样配置:
backend:
image: unmute-backend:latest
[..]
environment:
[..]
- KYUTAI_LLM_URL=https://openrouter.ai/api
- KYUTAI_LLM_MODEL=google/gemma-3-12b-it # 或其他型号
- KYUTAI_LLM_API_KEY=sk-.. # 你的 OpenRouter 密钥
随后可以移除 vllm 相关的部分,因为不再需要:
llm:
image: vllm/vllm-openai:v0.11.0
[..]
切换前端
后端和前端通过 WebSocket 按照基于 OpenAI 实时 API(简称 ORA)的协议进行通信。在可能的情况下,我们尽量与 ORA 格式保持一致,但也有一些额外的消息需要添加,而另一些消息则简化了参数。我们会明确指出与 ORA 格式的差异,请参阅 unmute/openai_realtime_api_events.py。
有关 WebSocket 通信协议、消息类型以及音频处理流程的详细信息,请参阅 浏览器与后端通信文档。
理想情况下,编写一个能够同时与 Unmute 后端或 OpenAI 实时 API 通信的单一前端应该很简单,但目前我们尚未完全兼容。欢迎贡献代码!
前端是一个 Next.js 应用,定义在 frontend/ 目录中。如果您想将其与其他前端实现进行比较,我们还提供了一个 Python 客户端,位于 unmute/loadtest/loadtest_client.py,该脚本用于基准测试 Unmute 的延迟和吞吐量。
工具调用
这是一个常见的需求,因此我们非常欢迎有人为 Unmute 添加对工具调用的支持!
将工具调用集成到 Unmute 中最简单的方式,是让这一功能对 Unmute 本身完全透明——只需将其作为 LLM 服务器的一部分即可。关于如何实现这一点,请参阅 此评论。您需要使用 FastAPI 编写一个简单的服务器来封装 vLLM,并接入工具调用的响应。
开发 Unmute
安装 pre-commit 钩子
首先安装 pre-commit 工具本身——建议您使用 pip install pre-commit 将其全局安装,而不是在虚拟环境或 uv 中安装,因为您需要始终能够访问 pre-commit 可执行文件。然后运行以下命令:
pre-commit install --hook-type pre-commit
我们推荐使用 uv 来管理 Python 依赖。以下命令假设您正在使用 uv。
运行后端(开发模式,自动重载)
uv run fastapi dev unmute/main_websocket.py
运行后端(生产模式)
uv run fastapi run unmute/main_websocket.py
运行负载测试
loadtest_client.py 是一个脚本,它会连接到 Unmute 并模拟与之的对话,以测量延迟和吞吐量。
uv run unmute/loadtest/loadtest_client.py --server-url ws://localhost:8000 --n-workers 16
常见问题
相似工具推荐
everything-claude-code
everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上
LLMs-from-scratch
LLMs-from-scratch 是一个基于 PyTorch 的开源教育项目,旨在引导用户从零开始一步步构建一个类似 ChatGPT 的大型语言模型(LLM)。它不仅是同名技术著作的官方代码库,更提供了一套完整的实践方案,涵盖模型开发、预训练及微调的全过程。 该项目主要解决了大模型领域“黑盒化”的学习痛点。许多开发者虽能调用现成模型,却难以深入理解其内部架构与训练机制。通过亲手编写每一行核心代码,用户能够透彻掌握 Transformer 架构、注意力机制等关键原理,从而真正理解大模型是如何“思考”的。此外,项目还包含了加载大型预训练权重进行微调的代码,帮助用户将理论知识延伸至实际应用。 LLMs-from-scratch 特别适合希望深入底层原理的 AI 开发者、研究人员以及计算机专业的学生。对于不满足于仅使用 API,而是渴望探究模型构建细节的技术人员而言,这是极佳的学习资源。其独特的技术亮点在于“循序渐进”的教学设计:将复杂的系统工程拆解为清晰的步骤,配合详细的图表与示例,让构建一个虽小但功能完备的大模型变得触手可及。无论你是想夯实理论基础,还是为未来研发更大规模的模型做准备
spec-kit
Spec Kit 是一款专为提升软件开发效率而设计的开源工具包,旨在帮助团队快速落地“规格驱动开发”(Spec-Driven Development)模式。传统开发中,需求文档往往与代码实现脱节,导致沟通成本高且结果不可控;而 Spec Kit 通过将规格说明书转化为可执行的指令,让 AI 直接依据明确的业务场景生成高质量代码,从而减少从零开始的随意编码,确保产出结果的可预测性。 该工具特别适合希望利用 AI 辅助编程的开发者、技术负责人及初创团队。无论是启动全新项目还是在现有工程中引入规范化流程,用户只需通过简单的命令行操作,即可初始化项目并集成主流的 AI 编程助手。其核心技术亮点在于“规格即代码”的理念,支持社区扩展与预设模板,允许用户根据特定技术栈定制开发流程。此外,Spec Kit 强调官方维护的安全性,提供稳定的版本管理,帮助开发者在享受 AI 红利的同时,依然牢牢掌握架构设计的主动权,真正实现从“凭感觉写代码”到“按规格建系统”的转变。
NextChat
NextChat 是一款轻量且极速的 AI 助手,旨在为用户提供流畅、跨平台的大模型交互体验。它完美解决了用户在多设备间切换时难以保持对话连续性,以及面对众多 AI 模型不知如何统一管理的痛点。无论是日常办公、学习辅助还是创意激发,NextChat 都能让用户随时随地通过网页、iOS、Android、Windows、MacOS 或 Linux 端无缝接入智能服务。 这款工具非常适合普通用户、学生、职场人士以及需要私有化部署的企业团队使用。对于开发者而言,它也提供了便捷的自托管方案,支持一键部署到 Vercel 或 Zeabur 等平台。 NextChat 的核心亮点在于其广泛的模型兼容性,原生支持 Claude、DeepSeek、GPT-4 及 Gemini Pro 等主流大模型,让用户在一个界面即可自由切换不同 AI 能力。此外,它还率先支持 MCP(Model Context Protocol)协议,增强了上下文处理能力。针对企业用户,NextChat 提供专业版解决方案,具备品牌定制、细粒度权限控制、内部知识库整合及安全审计等功能,满足公司对数据隐私和个性化管理的高标准要求。
ML-For-Beginners
ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程,旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周,包含 26 节精炼课程和 52 道配套测验,内容涵盖从基础概念到实际应用的完整流程,有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。 无论是希望转型的开发者、需要补充算法背景的研究人员,还是对人工智能充满好奇的普通爱好者,都能从中受益。课程不仅提供了清晰的理论讲解,还强调动手实践,让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持,通过自动化机制提供了包括简体中文在内的 50 多种语言版本,极大地降低了全球不同背景用户的学习门槛。此外,项目采用开源协作模式,社区活跃且内容持续更新,确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路,ML-For-Beginners 将是理想的起点。
funNLP
funNLP 是一个专为中文自然语言处理(NLP)打造的超级资源库,被誉为"NLP 民工的乐园”。它并非单一的软件工具,而是一个汇集了海量开源项目、数据集、预训练模型和实用代码的综合性平台。 面对中文 NLP 领域资源分散、入门门槛高以及特定场景数据匮乏的痛点,funNLP 提供了“一站式”解决方案。这里不仅涵盖了分词、命名实体识别、情感分析、文本摘要等基础任务的标准工具,还独特地收录了丰富的垂直领域资源,如法律、医疗、金融行业的专用词库与数据集,甚至包含古诗词生成、歌词创作等趣味应用。其核心亮点在于极高的全面性与实用性,从基础的字典词典到前沿的 BERT、GPT-2 模型代码,再到高质量的标注数据和竞赛方案,应有尽有。 无论是刚刚踏入 NLP 领域的学生、需要快速验证想法的算法工程师,还是从事人工智能研究的学者,都能在这里找到急需的“武器弹药”。对于开发者而言,它能大幅减少寻找数据和复现模型的时间;对于研究者,它提供了丰富的基准测试资源和前沿技术参考。funNLP 以开放共享的精神,极大地降低了中文自然语言处理的开发与研究成本,是中文 AI 社区不可或缺的宝藏仓库。