HaoLiu's blog

从 LM Studio 到 Groq:一次语音输入法的完整折腾记录

Published on
/
6 mins read

起因是语音输入转出来没有标点符号,顺手想优化一下本地的 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 失败、/models 404 一堆问题

修 LM Studio MLX 运行时

原因

venvstacks 分层 Python 环境(cpython 基座层 + app 层)在 1.5 → 1.6 升级过程中断了。残留 .tmp-178668363015875/ 目录,libpython3.11.dylib 没到正确位置;postinstall.py 也没跑,pyvenv.cfgsitecustomize.py 缺失。

修复

  1. 把临时目录移正:

    mv ~/.lmstudio/extensions/backends/vendor/_amphibian/.tmp-178668363015875 \
       ~/.lmstudio/extensions/backends/vendor/_amphibian/cpython3.11-mac-arm64@10
    
  2. lms runtime get 卡 0% 死活不动,绕过 CLI 直接从 CDN 抓 MLX 1.6.0 的 tarball 手动解压到 app-mlx-generate-mac14-arm64@22/

  3. 对两层分别跑 postinstall.py 生成 pyvenv.cfg + sitecustomize.py

  4. ~/.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,关键参数:

参数原因
temperature0只加标点不创作,完全确定性
top_p0.9兜底约束,temperature=0 时其实几乎不触发
repeat_penalty1.05防止模型复读输入
maxPredictedTokens1024长语音也能一次输出完
stopStrings["\n\n\n", "输入:", "输出:"]防止模型把 few-shot 示例继续写下去
contextOverflowPolicytruncateMiddle长通话保留首尾上下文

System prompt 核心逻辑:只加标点(中文全角、英文半角),不改字词顺序,不总结,不回答,去掉"那个""就是说""嗯""呃"这类口头禅,纯文本输出不用 Markdown。附 3 个 few-shot 示例覆盖陈述、疑问、列举三种常见句式。

voquill Tone 系统的坑

踩了两个:

坑 1:新建 Tone 不生效

每次开启语音输入默认选 Polished。读了源码 apps/desktop/src/utils/tone.utils.ts 才发现:

const POLISHED_TONE_ID = "default"

selectedToneIdactiveToneIds 是两套状态。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 免费档额度:

模型TPMTPD
gpt-oss-120b8,000200,000
llama-4-scout-17b30,0001,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+ 的中等模型比选"最强"的更实用。