fluxions-ai/vui

GitHub: fluxions-ai/vui

Vui 是一个端到端实时流式语音助手,将 ASR、本地 LLM 与自研 300M TTS 串联,实现低延迟、可打断、可克隆语音的本地对话体验并兼容 OpenAI Realtime API。

Stars: 700 | Forks: 72

fluxions.ai

Vui — 流式对话语音助手

发音为 "vooey"(与 Louie 押韵) · 由 fluxions.ai 出品

Try it live Hugging Face Discord

🎙️ 访问 fluxions.ai/talk 在线体验

📖 **[发布公告博客](https://fluxions.ai/blog/vui-launch)** — 设计说明、演示以及后续规划。 Vui 是一个实时语音助手:对着麦克风说话,模型会进行转录,运行本地 LLM,并流式传回 TTS 回复——所有这些都由单个 Python 服务器完成。它基于 **Vui Nano** 构建,这是一个基于 Qwen3 TTS 的 300M 参数语音 transformer。它在包含呼吸声、笑声、犹豫停顿和多人对话的对话式语音数据上进行了训练。 ## 功能 - **Vui Nano (300M)** — 基于 Qwen3-TTS-12Hz 编解码器的 Llama 风格解码器 + RQ-Transformer 头 - **实时语音交互** — WebRTC + WebSocket 流水线 (ASR → LLM → TTS),配备浏览器 UI、基于 VAD 的轮次切换、在你说话时进行推测性 LLM 预填充、带有背压机制的句子级 TTS 分块 - **打断机制 (Barge-in)** — 在回复中途开始说话,模型会取消当前操作并倾听 - **流式 TTS** — 在 4090 上达到约 9 倍实时速度,bf16 推理,CUDA graphs - **兼容 OpenAI Realtime API** — 可直接将 `ws://…/v1/realtime` 提供给基于 OpenAI 规范编写的客户端使用 ([`docs/realtime-api.md`](docs/realtime-api.md)) - **一次性语音笔记 REST endpoint** — `POST /v1/voice-note` 通过单次 HTTP 调用运行整个 ASR → LLM → TTS 流水线(输入音频,输出 JSON) - **独立 TTS 演示** — `demo.py`,用于单独运行该模型的 Gradio 演练场 - **语音克隆** — 上传音频样本即可克隆任何说话人的声音;内置 4 个微调预设(`maeve`、`abraham`、`rhian`、`harry`) - **SQ / WPS 条件控制** — 在六个语音质量通道和每秒字数上进行生成偏置 - **模型热插拔** — 可直接在 UI 中实时选择 Ollama LLM 和 ASR 后端 - **可插拔 ASR** — faster-whisper (GPU) 或 Moonshine (CPU 流式,ONNX) - **可插拔 LLM 后端** — Ollama, vLLM,或任何兼容 OpenAI 的 endpoint - **记忆功能** — 助手会在跨会话中记住关于你的信息(持久化到 `~/.vui/memories.json`) - **思维流 (Thoughts stream)** — 并行的 LLM 在无需唤醒词语法的情况下,将语音意图路由至约 15 个工具(记忆操作、任务控制、计时器、网络搜索、委派);支持为你自己的本地工具进行插拔扩展 - **内置网络搜索** — 通过 Serper、Brave 或 Tavily 进行单次查询的事实查找(“伦敦天气”、“X 的价格”、“谁赢了比赛”)——一次 API 往返,无需 agent 循环;对于多步研究则回落到 `delegate` - **可选的 Claude 任务服务器** — sidecar agent,通过你现有的 Claude Code MCP 处理缓慢/代理型工作(Gmail、日历、Drive、Slack、多步网络研究);启动时自动发现 - **非 Anthropic 任务后端** — 通过兼容 Anthropic 的 `/v1/messages` 信封,将任务服务器指向 Ollama, z.ai, DeepSeek, vLLM, LM Studio, LiteLLM - **Apple Silicon 支持** — MLX 后端 (WIP) - **移动端就绪** — 提供了详尽的 cloudflared 和 Tailscale 路径,用于通过 HTTPS 在手机上访问麦克风 - **Docker compose** — 一个文件即可启动整个技术栈(流式服务器 + 可选的内置 Ollama + 可选的 Claude 任务服务器) - **OpenClaw 集成** — 将 OpenClaw 的 `openai` realtime provider 指向 Vui,即可获得完全本地的语音前端 ## 安装(单行命令) ``` curl -fsSL https://install.fluxions.ai | bash ``` 克隆到 `~/vui`,自动检测使用 Docker 还是原生安装,安装依赖项 (uv, Ollama, ffmpeg, Claude Code CLI),拉取模型,并在 上启动技术栈。相关参数 (`--docker`, `--native`, `--no-claude`, `--upgrade`, `--model `, `--dry-run`) 会直接传递给 `install.sh` —— 从克隆的目录中运行 `./install.sh --help` 查看完整列表。 ## 快速开始(使用 docker-compose,推荐) Vui 流式服务器通过一个 compose 文件运行。推荐的设置是**在宿主机上运行 Ollama**(大多数用户已经有了)外加 Vui 容器——该容器使用宿主机网络并与你本地的 Ollama 在 `localhost:11434` 进行通信。专为 **Linux + NVIDIA GPU** 设计。 ### 前置条件 1. **Docker** 及 Compose 插件 (Docker Desktop 4.x 或 `docker-ce` ≥ 24)。 2. **NVIDIA Container Toolkit**,以便容器可以使用 GPU: # Debian / Ubuntu — 见 https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/ sudo apt install -y nvidia-container-toolkit sudo nvidia-ctk runtime configure --runtime=docker sudo systemctl restart docker 验证:`docker run --rm --gpus all nvidia/cuda:13.0.0-base-ubuntu22.04 nvidia-smi` 3. **[Ollama](https://ollama.com) 安装在宿主机上**(或者使用内置的容器化版本 —— 见下文)。 ### 启动核心技术栈 ``` ollama pull qwen3.5:4b # on the host docker compose up -d ``` 打开 ,允许麦克风访问,开始对话。Vui checkpoint 和 Qwen codec 会在首次运行时自动从 [Hugging Face](https://huggingface.co/fluxions/vui) 下载,并持久化存储在命名卷中。 #### 没有宿主机 Ollama?使用内置版本 如果你也想在容器中运行 Ollama: ``` docker compose --profile ollama up -d docker compose exec ollama ollama pull qwen3.5:4b ``` 内置服务受 `ollama` profile 控制,因此默认关闭;Vui 容器会与运行在 `localhost:11434` 上的任意实例进行通信。 ### 可选:Claude 任务服务器 compose 文件附带了一个 `claude-task` profile —— 这是一个运行在 `:8642` 上的 sidecar Claude 容器,用于处理委派的代理型工作(读取 Gmail / 日历,进行网络研究)。关于它的具体功能、如何启动(通过 compose 或原生方式)以及如何使用非 Anthropic 模型作为后端,请参阅下方的 [Claude 任务服务器](#claude-task-server-optional)。 ### 常用 compose 命令 ``` docker compose ps # service status docker compose logs -f vui-stream # follow streaming server logs docker compose restart vui-stream # restart after a code change docker compose down # stop everything docker compose down -v # ...and wipe HF cache + Ollama models ``` ## 原生安装(可选) 如果你不想使用 Docker。这两个服务都作为普通的 Python 进程运行;任务服务器是可选的——如果没有它,`vui-stream` 也能正常工作,只是 UI 中的“任务服务器”状态标签会保持灰色。 ### Vui 流式服务器 **系统依赖:ffmpeg。** `torchcodec` 在运行时会动态链接 ffmpeg 共享库,如果没有它们将无法导入。Docker 用户自带此依赖;原生安装的用户需要在宿主机上准备它: ``` sudo apt install ffmpeg # Debian / Ubuntu brew install ffmpeg # macOS ``` 接着: ``` uv sync # base + flash-attn pre-built wheel on Linux uv sync --extra mlx # add for Apple Silicon ``` 安装 [Ollama](https://ollama.com),启动它,拉取一个模型,然后运行流式服务器(默认端口为 `:8080`): ``` ollama serve & # or your distro's systemd unit ollama pull qwen3.5:4b python -m vui.serving.stream # http://localhost:8080 ``` 通过环境变量指向不同的 LLM 后端——这两个变量必须在运行 `python -m vui.serving.stream` 的同一 shell 中设置(它们会进入不同的代码路径:chat/streaming 与 model-list/pull 辅助程序): ``` export VUI_OLLAMA_URL="http://gpu-box.lan:11434" # chat/streaming path export OLLAMA_URL="http://gpu-box.lan:11434" # model-list / pull / MLX detect export VUI_OLLAMA_MODEL="qwen3:8b" # initial model (UI can switch live) ``` vLLM 和其他兼容 OpenAI 的后端也受支持 (`VUI_LLM_BACKEND=vllm` + `VUI_VLLM_URL=…`);请参阅 [`docs/configuration.md`](docs/configuration.md#custom-model-server)。 **Apple Silicon —— MLX 自动设置(解码速度提升约 1.9 倍,推荐):** 在首次运行时,服务器会通过 `ollama create --experimental --quantize int4` 自动创建 `qwen3.5-4b-mlx`(在同一个 4B 模型上,解码速度约为 37 tok/s,而 GGUF Q4 约为 19 tok/s)。如果 MLX 设置失败,会自动回退到 `qwen3.5:4b` GGUF。必须使用 `--experimental` 参数——如果没有它,Ollama 会转换为 GGUF,从而失去速度优势。 ### 单独的 TTS 演示 ``` python demo.py # Gradio UI — upload your own voice prompt python demo.py --render --prompt prompts/abraham.wav # CLI render with a preset voice ``` `prompts/` 中的预设语音(从 [HF 仓库](https://huggingface.co/fluxions/vui) 下载): | 语音 | 描述 | |---|---| | `maeve` | 推荐默认 - 爱尔兰女性口音 — 声音优美,但非英国地区的听众可能会觉得有些难懂 | | `abraham` | 英国口音,谈吐优雅,充满活力和个性 — 认真负责,擅长处理情感上困难的话题 | | `rhian` | 更传统的英国口音,说话风格略带犹豫 | | `harry` | 英国男性口音,发音含糊 | 更多语音角色即将推出!你有想听到的声音或角色吗?欢迎提 issue 或在 [Discord](https://discord.fluxions.ai) 上告诉我们。 #### 条件控制 (SQ / WPS) 演示界面的 *Advanced* 面板公开了两个用于影响生成结果的条件向量。每个向量都通过一个学习到的投影层(`model.py` 中的 `sq_proj` / `wps_proj`)进行处理,并添加到文本 embedding 中,因此模型经过训练,会将这些数值与可听的特性关联起来。将任意分数设为 `0` 即可禁用该通道——在训练期间,每个通道都会被随机遮蔽,因此部分条件控制是可行的。 - **SQ — 语音质量**(每项 `0–5`,六个独立通道)。映射到训练数据所依据的评分指标: - **DNS Signal** — DNSMOS 信号清晰度 - **DNS Background** — DNSMOS 背景静音度 (5 = 无底噪环境) - **NISQA Noise** — 感知噪声水平 (5 = 无噪声) - **NISQA Disc.** — 断续 / 故障伪影 (5 = 流畅) - **NISQA Color.** — 频谱着色 (5 = 中性音色) - **NISQA Loudness** — 音量水平 - **WPS — 每秒字数**(`0–6`,典型的对话语速范围约为 2–4)。语速目标。当 prompt 导致模型说话过快或过慢时非常有用;保持为 `0` 可让其遵循 prompt 的自然节奏(根据 prompt 的字数和帧长度估算,见 `engine.py:771-773`)。 默认值为 `sq = (0, 0, 0, 0, 0, 5)` 且 `wps = 0` —— 仅 **loudness**(音量)受条件控制(固定为 5),其余五个通道被禁用。这在实际应用中能产生最一致的输出。要倾向于更干净的音频(以牺牲一些生动性为代价),请将前五个通道的值提升至接近 5;要模拟电话 / lo-fi / 嘈杂环境的录音,请将它们设置为 **较低的非零值 (~1–2)** —— 设置为 `0` 并不会使输出变成 lo-fi 效果,它只会关闭该通道(`sq_proj` 是一个无偏置的线性层,因此输入 0 -> 贡献为 0)。 ## Claude 任务服务器(可选) 这是一个用于处理委派的、代理型工作的 sidecar 进程 —— 即主语音循环不应阻塞等待的、缓慢的需使用工具的任务(读取 Gmail / 日历 / Drive / Slack,进行网络研究)。它使用 Anthropic 的 `/v1/messages` 规范,并利用你在宿主机上接入 Claude Code 的所有 MCP,因此添加新集成只需执行claude mcp add …`。当它在后台处理时,一个并行的“思维”LLM 调用会通过填充语(“好的,让我查一下……”)保持对话活跃,处理结果会被 POST 回来并进行语音播报。 启动方式:`docker compose --profile claude up -d claude-task` (Docker) 或 `uv sync --extra claude && python -m vui.serving.claude_server` (原生)。身份验证:Claude Code 订阅(首选 —— 使用 `~/.claude/.credentials.json`)或 `ANTHROPIC_API_KEY`。可通过 `ANTHROPIC_BASE_URL` 对接 Ollama, z.ai, DeepSeek, vLLM, LM Studio, LiteLLM。 完整的设置、身份验证选项、MCP 示例、模型选择、非 Anthropic 后端,以及完全基于本地 Ollama 的实战示例:[`docs/claude-task-server.md`](docs/claude-task-server.md)。 ## 通过手机对话 移动端浏览器需要 HTTPS 才能访问麦克风,且 Vui 的 WebRTC 媒体会通过点对点连接发送到服务器的局域网 IP —— 因此正确的路径取决于你的手机所在位置: | 手机在哪里? | 最简单的路径 | |---|---| | **与服务器连接同一个 Wi-Fi** | `cloudflared tunnel --url http://localhost:8080` —— 一条命令搞定,HTTPS,无需账户 | | **蜂窝网络 / 外出时** | [Tailscale](https://tailscale.com) —— host-candidate WebRTC 在 tailnet 上可直接使用 | | **自定义客户端,任何位置** | 基于 `/v1/realtime` 构建 —— 全 WebSocket 通信,可穿透任何 HTTPS 代理 | 完整的设置、命名隧道选项及注意事项:[`docs/mobile.md`](docs/mobile.md)。 ## 架构 ``` mic ──► WebRTC ─► VAD ─► faster-whisper ─► Ollama LLM ─► Vui TTS ─► WebRTC ─► speaker │ └─► thoughts stream (parallel tool router) ├─ memories └─ delegated tasks (optional) ``` 三个操作系统进程通过 `torch.multiprocessing.Queue` 连接: | 进程 | GPU | 职责 | |---|---|---| | Main (`server.py`) | 否 | aiohttp, WebRTC/WS, Ollama LLM 流式传输, 对话状态 | | TTS worker | 是 | Vui + RQ-Transformer + Qwen codec, CUDA graphs, 流式传输 | | ASR worker | 是/CPU | faster-whisper 或 Moonshine + Silero VAD | ## 配置 UI 控制、支持的 LLM/ASR 模型,以及如何指向自定义(远程 vLLM / Ollama / 兼容 OpenAI)服务器,请参阅 [`docs/configuration.md`](docs/configuration.md)。 ### ASR: Whisper 或 Moonshine 内置了两种 ASR 系列,可在 UI 下拉菜单中实时切换。默认为 **`fwhisper.distil-small.en`** (faster-whisper, GPU) 以支持英语;切换到 **[Moonshine](https://github.com/moonshine-ai/moonshine)** (ONNX, CPU) 可将 ASR 从 GPU 卸载。完整的后端矩阵和调节参数:[`docs/configuration.md`](docs/configuration.md#asr-models)。 ## Realtime API + 语音笔记 endpoint Vui 在 `ws://localhost:8080/v1/realtime` 暴露了一个**兼容 OpenAI Realtime 的 WebSocket** —— 相同的事件名称(`session.update`、`input_audio_buffer.append`、`response.create`、`response.audio.delta` 等),相同的 PCM16 @ 24 kHz 音频格式。基于 OpenAI 规范编写的客户端基本上可以直接运行。 此外还有一个同步的 **`POST /v1/voice-note`**,它通过单次 HTTP 调用运行整个 ASR → LLM → TTS 流水线(输入音频,输出包含 base64 编码 WAV 的 JSON)—— 适用于按下即说机器人、iOS 快捷指令或 Home Assistant 自动化。 事件层面、支持/不支持的事件、最小化的 Python 客户端、OpenClaw 集成方案以及完整的语音笔记请求/响应结构,请参阅 [`docs/realtime-api.md`](docs/realtime-api.md)。 ## 灵魂 (Soul) 其他项目称之为“系统提示词”的东西,Vui 称之为**灵魂 (soul)** —— 这是一种定义语音风格(短句、填充词、无 markdown、数字发音化)、对话规则(确认范围、将列表分三部分表达、禁止捏造)以及感知工具的填充行为的角色提示词。它位于 `src/vui/serving/stream/prompts.py` (`SOUL`) 中,可在 UI 的 **Soul** 文本框内进行实时编辑 —— 保存到 `prompts/.soul` 并重新作为 LLM 的预填充内容。Realtime API 客户端也可以通过标准的 `instructions` 字段进行设置。 为什么要换个名字?因为“系统提示词”虽然准确但毫无乐趣。灵魂是你控制助手行为的最大杠杆——替换它,你就替换了它的个性,而且不需要任何微调。这个名称借用自 [OpenClaw](https://github.com/openclaw/openclaw),在那里同样的概念也被称为 *soul*。关于它内置了什么以及如何编辑的完整解析:[`docs/soul.md`](docs/soul.md)。 ## 语音控制 你不需要唤醒词语法 —— **思维流 (thoughts stream)** (`src/vui/serving/stream/thoughts.py`) 是一个并行的 LLM,它会监视每一轮对话并根据意图从约 15 个工具中选择一个。对话回复是并行进行的,因此记忆操作和任务控制感觉几乎是瞬时的;委派任务时会取消正在进行的回复并移交给 `claude-task`。想要添加你自己的本地工具(例如计时器、智能家居开关),而不是通过 `claude-task` 路由?请参阅 [`docs/thoughts-tools.md`](docs/thoughts-tools.md)。 | 意图 | 试着说…… | 会发生什么 | |---|---|---| | **保存记忆** | "记住我对坚果过敏", "我女儿的名字叫 Lily" | `add_memory` — 仅保存持久性事实(姓名、职业、家人、偏好);像 "我今天很累" 这种短暂的信息会被忽略。如果涵盖了相同主题,则会更新现有的记忆。 | | **忘记记忆** | "忘了我有只狗", "你可以把关于我以前工作的事情删掉" | `remove_memory` — 根据内容进行模糊匹配。 | | **清除所有记忆** | "清除所有记忆", "抹去你对我的一切了解" | `clear_memories`. | | **在网上查找内容** | "在网上搜索 X", "东京的天气怎么样", "英镑/美元的价格", "谁赢了比赛" | `web_search` — 通过 Serper / Brave / Tavily(取决于设置了哪个 API 密钥)进行单次查询获取。一次往返,无需 `claude-task`。在 UI 中以任务行的形式展示查询内容 + 结果片段,方便你在语音回复后重新阅读。设置 `SERPER_API_KEY`、`BRAVE_API_KEY` 或 `TAVILY_API_KEY`;使用 `VUI_SEARCH_PROVIDER=serper\|brave\|tavily` 显式选择提供商。 | | **委派任务** | "检查一下我的未读邮件", "我明天日历上有什么?", "对 X 做一些研究并总结" | `delegate` — 发送给 `claude-task`,播放填充语 ("好的,让我查一下……"),完成后播报结果。 | | **列出任务** | "正在运行的任务有哪些?", "显示我的任务" | `list_tasks` — 将它们读出来。 | | **检查单个任务** | "那个完成了吗?", "再告诉我一遍你查到了什么" | `check_task` — 重新播报缓存的结果,不重新运行。 | | **取消任务** | "取消那个", "停止邮件搜索", "算了吧" | `cancel_task` — 将该条目保留可见状态,标记为 `cancelled`。 | | **删除任务** | "删除那个", "把搜索任务去掉" | `delete_task` — 如果正在运行则先取消,然后从列表中移除。 | | **清除所有任务** | "清除所有任务", "清空我的任务" | `clear_tasks`. | | **设置计时器** | "设一个五分钟的计时器", "30 秒后提醒我", "设个九分钟的煮意面计时器" | `set_timer` — 倒计时会作为带有 × 取消功能的 UI 任务行显示;触发时会播报语音通知。单位换算 (分 -> 秒) 在路由器中完成。 | | **改变语速** | "说快点", "稍微慢一点", "恢复正常语速", "每秒说三个字" | `set_speech_rate` — 将 `wps_score` 微调上下半个步长,重置为自然语速,或者固定一个绝对的每秒字数值。UI 中的滑块会随之移动。 | | **重置对话** | "我们重新开始吧", "清空对话" | `clear_context` — 丢弃历史记录,保留记忆。 | 记忆在启动时从 `~/.vui/memories.json` 加载,并在每次添加/删除时重写,因此重启后依然存在。任务仅存在于流式服务器的内存中——它们不会被持久化,因此重启 `vui-stream` 会让你得到一个空的任务列表。触发短语是基于意图而非字面匹配的——“记一下……”和“记住……”的效果是一样的,并且系统对 ASR 错误有一定的容忍度(比如把 "email" 识别成 "male")。 ### 它是如何选择工具的 思维流是在每一轮对话中进行的第二次并行 LLM 调用——使用相同的 Ollama 模型,但提示词不同,它从不发声,并在 `temperature=0.0` 下被强制输出恰好一次工具调用。它的系统提示词是由一段前言 + 动态生成的可用工具 (AVAILABLE TOOLS) 列表 + 当前记忆 (CURRENT MEMORIES) + 每个工具的规则 (`RULE`) 块动态构建的;第二条系统消息列出了带有结果摘录的当前任务 (CURRENT TASKS),以便后续问题(“第二个是什么?”)能映射到 `no_action` 而不是重新委派。 添加你自己的工具只需在 `src/vui/serving/stream/tools/` 中添加一个文件,然后执行 `POST /tools/reload`。完整的提示词结构解析、KV 预热详情以及工具编写契约:[`docs/thoughts-tools.md`](docs/thoughts-tools.md)。 ## Vui Nano 这是一个基于 Qwen3-TTS 语音 codec 的 300M 参数自回归语言模型 —— 它是 Vui 模型家族中的第一个。该 codec 和说话人编码器复用了阿里巴巴的 [`Qwen3-TTS-12Hz-0.6B-Base`](https://huggingface.co/Qwen/Qwen3-TTS-12Hz-0.6B-Base); - **300M 参数**,Llama 风格解码器 + RQ-Transformer 头 —— 768 维度,22 层,8 个注意力头 - **Codec**: [Qwen3-TTS-Tokenizer-12Hz](https://huggingface.co/Qwen/Qwen3-TTS-Tokenizer-12Hz) — 16 个 codebook,包含 2048 个条目,频率为 12.5 Hz,24 kHz 音频(解码后),在 `src/vui/qwen_codec.py` 中使用纯 PyTorch 重新实现 - **说话人编码器**: 来自 `Qwen3-TTS-12Hz-0.6B-Base` 的 ECAPA-TDNN(8.9M 参数,1024 维)—— 在训练时用于嵌入参考说话人的特征 - **输出**: 16 kHz 音频,bf16 推理,在 4090 上实现约 9 倍实时流式传输 ### 语音与声音克隆 **该模型可以克隆任意声音** —— 在演示 UI 中上传一段样本(或者将 `.wav` 文件放入 `prompts/` 文件夹),它就会模仿该说话人的声音。**克隆的声音听起来不会像 `prompts/` 中附带的四个经过微调的声音(`maeve`、`abraham`、`rhian`、`harry`)那么好** —— 因为发布的 checkpoint 已经针对这四个声音进行了微调,所以它们是模型能生成的最高质量的输出。任意声音克隆是有效的,但预计自然度会降低,偏移会更多,并且会产生一些偏向于微调声音韵律的倾向。 为获得最佳效果:语音提示词的文本必须与音频逐字匹配,力求提供 **30 秒或更长** 的纯净源音频(上下文窗口为 6 分钟),并记住“垃圾进,垃圾出”的原则。关于语音提示词的完整指南、支持的标签 ([breath], [laugh], [sigh] …)、标点符号规则以及数字/日期/单位的音标拼写:[`docs/prompting.md`](docs/prompting.md)。 如果你处于合法的应用场景(如有声读物、无障碍辅助、游戏角色、征得同意的表演者配音、内部工具),需要一个针对特定声音调优的 checkpoint,请通过 [fluxions.ai](https://fluxions.ai) **与我们联系** —— 我们可以为你训练、授权或托管一个。 ``` from vui.engine import Engine, GenConfig engine = Engine() # loads "vui-nano" from HuggingFace by default with engine.new_row() as row: codes, audio = row.render( "So [breath] the thing about this is, it's not what you'd expect, right?", GenConfig(temperature=0.7), ) ``` **提示:尝试关闭重复惩罚。** `GenConfig` 默认设置 `rep_penalty=1.1` 以长时间的静音/填充词循环,但这可能会使韵思变得平淡,并扭曲自然的重复。将其设置为 `0`(任何 `<= 1.0` 的值都会禁用惩罚路径,见 `inference.py:539`)通常能产生听起来更自然的输出 —— 如果生成的语音听起来很生硬或过度纠正,值得一试。 对于长语音提示词(>15 秒),你需要适当的多段分块 —— `vui.prompt_utils.build_prompt_segments` 会进行 ASR + 强制对齐 + 目标约 10 秒的句子边界分割,以便模型在整个参考音频中保持其说话人条件。涵盖分块提示词、流式传输、连续批处理、仅 codes 解码以及 MLX 路径的完整 Python 指南:[`docs/python-api.md`](docs/python-api.md)。 ## 硬件 流式服务器和 `demo.py` 均可在以下任一环境中运行: - **NVIDIA GPU + Linux** — 完整技术栈 (TTS + ASR + Ollama LLM,已在 4090 / H100 上测试) 需约 **12 GB VRAM**,如果切换到 `moonshine.*` (CPU) ASR 后端,则可降至 **~8 GB**。需要 CUDA 12.x,并已安装 flash-attn。 - **Apple Silicon Mac** — M1/M2/M3/M4,MLX 后端(自动检测,无需 flash-attn)。 完整的细分说明 —— 包括各组件测量的 VRAM 占用、各后端的 ASR 延迟/VRAM、KV-cache 计算以及调整参数 —— 请见 [`docs/memory-budget.md`](docs/memory-budget.md)。 **提示:在较小的 GPU 上,可降低 `n_codebooks` 以获得更快的 TTS 速度。** RQ-Transformer 头默认为每个音频帧解码 16 个 RVQ codebook 级别。将 UI 中的 **Codebooks** 滑块(或 `DEFAULT_SETTINGS` 中的 `n_codebooks`,server.py:232)降低至 **~10**,会显著加快解码速度并降低 VRAM 占用,代价是牺牲一些稳定性 —— 偶尔会出现伪影,对生硬的提示词更敏感。低于 8 时质量会急剧下降。`0` 表示“全部使用 16 个”。 ## 负责任的使用 Vui 生成的语音听起来可以像真人一样逼真。使用此模型——无论是直接使用、通过流式服务器,还是通过 Realtime API——即表示你同意以下条款: 我们**明确禁止**: - **欺诈** — 生成语音以欺骗他人获取经济利益,或获取你原本无权获得的东西(诈骗电话、绕过语音身份验证等)。 - **虚假信息或欺骗** — 假新闻、欺诈性通话、旨在误导的深度伪造、冒充真实人物真实录音的合成媒体。 - **骚扰、诽谤或滥用** — 生成针对、威胁或伤害他人的语音,包括未经同意的色情内容。 - **非法活动** — 在运行模型或分发其输出的司法管辖区内属于违法的任何行为。 你要对自己生成的内容负责。发布的 checkpoint 针对精选的语音集进行了微调,部分原因是为了增加这些滥用行为的难度,但这不能代替你自己的判断。如果你在 Vui 之上构建产品,请内建同意流程、内容来源追踪(例如 [C2PA](https://c2pa.org/))以及滥用举报机制。 我们对滥用行为**不承担责任**,并强烈谴责这项技术的不道德应用。 ## 遥测 Vui 每次渲染音频时都会发送一个匿名事件,以便我们了解人们使用了哪些预设语音,以及该模型在自然环境中大致生成了多少语音。**发送的内容包含**:`{app: "vui", event_type: "render", voice, seconds}` —— payload 中不包含其他任何内容。**事件中不包含**:转录文本、音频、提示词文本、用户标识符、安装 ID。克隆的语音被标记为字面字符串 `"clone"`,因此源文件名绝不会泄露 (`telemetry.py:59`)。payload 中不包含源 IP,但作为 HTTPS 请求的一部分,接收端点必然能看到它——我们不会记录或持久化它。即发即忘——失败或无法访问的端点不会减慢语音循环,并且一次最多只能有 32 个事件在传输中 (`telemetry.py:11`)。 通过环境变量禁用: ``` export VUI_TELEMETRY=0 python -m vui.serving.stream ``` 对于 Docker,请在 `docker-compose.yml` 的 `vui-stream` 服务环境中添加 `VUI_TELEMETRY=0`。 ## 致谢 - [Qwen3-TTS-Tokenizer](https://huggingface.co/Qwen/Qwen3-TTS-Tokenizer-12Hz) — Alibaba - [Whisper](https://github.com/openai/whisper) — OpenAI - [faster-whisper](https://github.com/SYSTRAN/faster-whisper) - [Moonshine](https://github.com/moonshine-ai/moonshine) — Moonshine AI (CPU 流式 ASR 选项) - [Silero VAD](https://github.com/snakers4/silero-vad) - [aiortc](https://github.com/aiortc/aiortc) - [Ollama](https://ollama.com) — 本地 LLM runtime(助手的默认后端 + 任务服务器可选的兼容 Anthropic 的 endpoint) ## 许可证 Apache 2.0 —— 适用于本仓库中的代码。发布的模型权重受其自身条款约束(见 Hugging Face 上的模型卡片)。Qwen3-TTS-Tokenizer-12Hz 编解码器和 `Qwen3-TTS-12Hz-0.6B-Base` 说话人编码器版权归 Alibaba 所有,并根据其各自 Hugging Face 仓库中的条款进行许可。 ## 引用 ``` @software{vui_2026, author = {Coultas Blum, Harry}, title = {Vui: Streaming Conversational Text-to-Speech}, url = {https://github.com/fluxions-ai/vui}, version = {1.0.0}, year = {2026} } ```
标签:AI风险缓解, DLL 劫持, Vectored Exception Handling, WebRTC, 凭据扫描, 大语言模型, 本地部署, 版权保护, 语音助手, 语音合成, 语音识别, 逆向工具