我为本地助手构建了一个小型端侧语音前端:输入任意唤醒词,仅保留你的声音再送入 STT(5 个模型,7.5 MB,Apache-2.0,早期预览)
摘要
Alkove 是一个开源(Apache-2.0)的端侧语音前端,由五个微型模型(总计 7.5 MB)组成——可输入任意文本的唤醒词系统、基于声纹的说话人过滤,以及个人化 VAD——运行在自研的 Rust 推理引擎上,提供 npm、pip、Android、LiveKit 和 Pipecat 包,旨在 STT 之前减少本地语音助手的误唤醒和串音问题。
GitHub: https://github.com/alkove-ai/alkove (Apache-2.0,代码与权重)
Hi r/LocalLLaMA,
先简单介绍一下我自己:我的日常工作是构建生产环境中的 LLM 系统,包括一个带 RAG 的工具调用助手,以及两条以音频为主的流水线。第一条把公司的最新内容制作成多语言双主播电台节目:按来源生成摘要,由 LLM 验证器对照源材料检查结构化脚本并配合代码校验,每个回合调用一次 TTS,同时用 Whisper 将每个回合回转写以捕捉截断或虚构的语音,最后通过代码和 ffmpeg 进行混音处理(逐回合电平调整、模拟主播之间的重叠、响度归一化、按词时间戳对齐的字幕)。
第二条是一个浏览器中的实时语音代理:客户端 VAD 与降噪、STT 回退链、一个小型决策模型判断每个片段的回合结束、插话和"停止",以及逐句朗读的 TTS。在这个代理中,大部分麻烦并不在 LLM,而是在它之前:用户周围其他人说话会进入转写结果并触发误插话,而降噪器也帮不上忙,因为其他人说话也是语音。
于是我开始着手这个音频层——运行在语音转文字和 LLM 之前的那一层——现在以早期预览的形式分享出来。它叫 Alkove:五个小型模型,运行在设备端,设计上协同工作。
- Lex(1.8 MB)把你输入的文字转换为其可能的发音,所以唤醒词就是一段文本:无需训练,无需录音环节。
- Spot(2.8 MB)监听这些发音,支持 7 种语言。
- Timbre(0.74 MB)生成声纹。录制三遍唤醒词即可获得初始声纹,并在你说话时持续学习。
- Focus(1.1 MB)在 STT 之前保留你的声音(最接近的一路,或与你声纹匹配的一路),并去除噪声、音乐和其他人的声音。
- Cue(1.1 MB)每 30 ms 检测一次语音。
在 Focus 之后启用你的声纹,你的语音回合只会以你的声音开始和结束,旁边的人说话不会开启新的回合。声纹是可选的,同一份声纹同时服务三者:唤醒词忽略其他人,Focus 只保留你,Cue 变成个人化的 VAD。
一些技术细节,因为这个 sub 喜欢看这些:
- 它运行在自己用 Rust 编写的小型推理引擎上,而非 onnxruntime。核心部分编译为 WebAssembly 供浏览器使用,为 Python 和 Android 编译为原生版本,在 ARM、x86 和 wasm 上位上给出相同输出。
- 浏览器中,模型运行在由 AudioWorklet 供数据的 worker 里,无需 COOP/COEP 头。引擎大小为 134 KB(brotli 压缩)。
- 手机单线程原生速度:Focus 每秒音频处理耗时 38.6 ms,Spot 7.5 ms,Cue 1.7 ms。
- 提供的包:npm(浏览器和 Node)、pip(Linux、macOS、Windows,唯一依赖是 numpy)、Android(Kotlin),以及 LiveKit Agents 和 Pipecat 的插件。代码与权重均为 Apache-2.0。
一些数据,测试协议在仓库的 bench 文件夹中:
- 在使用头戴麦克风录制的 AMI 会议中,其他人的话语进入转写结果的次数从约每分钟 17 次降至 0.5 次(开启 Focus 和声纹后)。
- Spot 在输入的单个单词上,英语召回率为 67%(误报率为每小时一次),法语 90%,葡萄牙语 85%。所以对于一个固定的英语词,专门在该词上训练的模型很可能表现更好。
目前还不够好的地方(这是一个 0.x 预览版,API 仍可能变化):
- 它是为近麦克风和单人场景设计的:手机、耳机、笔记本。放在房间中央桌面的会议麦克风上,它会把其他参与者的声音也一起去除。
- 当两个人完全同时说话时,Focus 只能部分分离他们,而两个相同音域的声音(两个男性,或两个女性)分离难度大得多。这是我接下来主要要解决的问题。
- 音频以 16 kHz 处理,即最高支持 8 kHz 的语音。
非常期待收到反馈,尤其是正在运行本地语音助手的朋友:它在哪里会失效、你最希望先支持哪种集成方式、以及这套 API 是否合理。
相似文章
构建了一个JARVIS风格的助手:具备唤醒词、视觉模式、本地语音克隆和LLM生成的系统命令
一位开发者构建了一个名为CYBER的JARVIS风格个人助手,具备唤醒词激活、通过XTTS v2的本地语音克隆、视觉模式以及LLM生成的系统命令,全部在本地运行,无需云端依赖。
我在Android上将完整的离线语音代理压缩到1.2 GB
一位开发者演示了在Android上使用小型本地模型(Silero VAD、Parakeet-EOU STT、FunctionGemma 270M、Pocket TTS)实现的完整离线语音到操作代理,运行内存约1.2 GB,不依赖云端。
基于 Qwen3.5 4B 的本地语音助手,支持技能与工具调用,无需独立 GPU,本地 STT + TTS
一个基于 Qwen3.5 4B 的本地语音助手项目,支持技能与工具调用,无需独立 GPU,集成 Voxtral 本地语音识别与 Pocket TTS 语音合成。
我为 Ollama 构建了一个本地实时语音栈:Parakeet STT → Qwen 2.5 7B → Qwen3-TTS
作者使用 Parakeet STT、Qwen 2.5 7B 和 Qwen3-TTS 构建了一个本地实时语音栈,并与 Ollama 集成。
正如承诺,这是我的100%本地语音到语音助手的GitHub链接
Athena 是一款完全离线、隐私优先的语音助手,完全运行在本地硬件上,结合了多种AI模型用于语音识别、语言理解和情感感知语音合成,具备长期记忆和可中断性。