起因是语音输入转出来没有标点符号,顺手想优化一下本地的 Gemma 4 做后处理——结果 LM Studio 的 MLX 运行时在半路升级失败炸掉了。一路修回来,再把流程迁到 Groq 云端。这是今天折腾下来的完整记录,所有命令、错误信息、参数都保留原样。
症状汇总
- LM Studio 加载 Gemma 4 26B-A4B 报错
ValueError: Gemma 4 support is not ready yet - 切换 MLX runtime 又报
libpython3.11.dylib missing,模型直接Exit code: null - voquill 语音输入转写出的文本没有标点,一大串下来不可读
- 切到 Groq 后又遇到
413 TPM exceeded、CORS preflight 失败、/models404 一堆问题
修 LM Studio MLX 运行时
原因
venvstacks 分层 Python 环境(cpython 基座层 + app 层)在 1.5 → 1.6 升级过程中断了。残留 .tmp-178668363015875/ 目录,libpython3.11.dylib 没到正确位置;postinstall.py 也没跑,pyvenv.cfg 和 sitecustomize.py 缺失。
修复
-
把临时目录移正:
mv ~/.lmstudio/extensions/backends/vendor/_amphibian/.tmp-178668363015875 \ ~/.lmstudio/extensions/backends/vendor/_amphibian/cpython3.11-mac-arm64@10 -
lms runtime get卡 0% 死活不动,绕过 CLI 直接从 CDN 抓 MLX 1.6.0 的 tarball 手动解压到app-mlx-generate-mac14-arm64@22/。 -
对两层分别跑
postinstall.py生成pyvenv.cfg+sitecustomize.py。 -
改
~/.lmstudio/.internal/backend-preferences-v1.json,把 active MLX 版本从1.5.0改成1.6.0。
验证:Gemma 4 26B-A4B 能正常加载,推理正常。
给语音输入加中文标点(本地方案)
voquill 的 Tone 其实就是一段 system prompt。写了个 preset 导到 LM Studio,关键参数:
| 参数 | 值 | 原因 |
|---|---|---|
temperature | 0 | 只加标点不创作,完全确定性 |
top_p | 0.9 | 兜底约束,temperature=0 时其实几乎不触发 |
repeat_penalty | 1.05 | 防止模型复读输入 |
maxPredictedTokens | 1024 | 长语音也能一次输出完 |
stopStrings | ["\n\n\n", "输入:", "输出:"] | 防止模型把 few-shot 示例继续写下去 |
contextOverflowPolicy | truncateMiddle | 长通话保留首尾上下文 |
System prompt 核心逻辑:只加标点(中文全角、英文半角),不改字词顺序,不总结,不回答,去掉"那个""就是说""嗯""呃"这类口头禅,纯文本输出不用 Markdown。附 3 个 few-shot 示例覆盖陈述、疑问、列举三种常见句式。
voquill Tone 系统的坑
踩了两个:
坑 1:新建 Tone 不生效
每次开启语音输入默认选 Polished。读了源码 apps/desktop/src/utils/tone.utils.ts 才发现:
const POLISHED_TONE_ID = "default"
selectedToneId 和 activeToneIds 是两套状态。activeToneIds 控制哪些 Tone 出现在快捷切换列表里,selectedToneId 才是当前生效的那个。UI 上两个概念混在一起,不在 active 列表的 Tone 会被 fallback 回 Polished。
坑 2:不要改 upstream 源码
voquill 是开源的 fork,prompt 在代码里,但不要直接改——后面同步上游会冲突。正确做法是在 UI 里新建一个自己的 Tone,把完整 prompt 粘进去,设为 active + selected。
切到 Groq
动机
本地 Gemma 4 Q4 吃内存,转写几十分钟通话时发热严重;而且想试一下能不能逼近 Typeless 的识别质量。Groq 免费额度对个人使用完全够。
配置
voquill 里加一个 OpenAI Compatible provider(不是 Ollama,协议不一样):
- Base URL:
https://api.groq.com/openai - Include /v1 path: ON(Groq 的完整路径是
/openai/v1/...) - Transcription model:
whisper-large-v3-turbo - Post-processing model:
meta-llama/llama-4-scout-17b-16e-instruct
为什么不用 gpt-oss-120b
第一次选的是 gpt-oss-120b,跑几句就 413 TPM exceeded。对照 Groq 免费档额度:
| 模型 | TPM | TPD |
|---|---|---|
| gpt-oss-120b | 8,000 | 200,000 |
| llama-4-scout-17b | 30,000 | 1,000,000 |
TPM 8K 一次语音输入就能打满。换 scout 之后再没碰过上限。
CORS 踩坑
Tauri webview 跨域请求 LM Studio 时 OPTIONS preflight 失败。改 ~/.lmstudio/.internal/http-server-config.json:
{
"cors": true
}
Groq 官方 API 本身有 CORS,不用配。
最终 pipeline 表现
实测日志:
- ASR(Groq Whisper large-v3-turbo):388–648ms
- Post-processing(Groq Llama 4 Scout 17B):242–525ms
- Warnings:0
一句话从说完到带标点输出,稳定在 1 秒内。
Takeaway
本地跑 MLX 适合模型选型和离线场景;一旦追求稳定、低内存、低延迟,云端推理 + OpenAI 兼容协议是更省心的路。voquill 这类开源语音工具的 Tone/Prompt 系统做任何改动都优先走 UI 层,别动 upstream 代码。Groq 免费档选模型时 TPM 比 token 总量更容易卡——选 30K+ 的中等模型比选"最强"的更实用。
