
一份帮你省下几小时排错时间的实战笔记,从路径、模型到 FFmpeg、弹窗卡死,逐个击破。
导语
想给电脑装个本地离线语音转文字工具,结果比想象中折腾:录音莫名存成 WAV、拖个 MP4 进去"毫无反应"、翻译弹窗要么空白要么一闪而过、CapsLock 还卡在录音状态……如果你也在部署 CapsWriter-Offline 时被各种报错和环境问题劝退,这份避坑指南就是为你写的。我们不重复官方教程,只讲真踩过的坑和对应的解决办法。
① 工具一句话介绍
CapsWriter-Offline 是一个本地离线的语音转文字工具。长按 CapsLock(或鼠标侧键)即可听写,也能把 MP4/MP3/M4A 等音视频文件拖进去自动转录出文本与字幕,全部在本地完成,数据不出本机,适合注重隐私、又想要高效率听写的场景。
② 部署前准备 / 环境要求
- 安装路径:建议固定到
C:CapsWriter-Offline。不要放到路径特别长、权限复杂、或被同步盘(如 OneDrive)锁定的位置——Windows 下语音监听、托盘、模型加载和日志写入都更怕路径权限问题。 - 程序本体:下载或解压
HaujetZhao/CapsWriter-Offline的 Windows 发行包,核心入口应包含start_server.exe、start_client.exe、config_server.py、config_client.py,以及core、internal、LLM、models等目录。 - 模型文件:需按
config_server.py中的路径放置,例如: modelsSenseVoice-SmallSensevoice-Small-ONNXSenseVoice-Encoder.fp16.onnxmodelsQwen3-ASRQwen3-ASR-1.7Bqwen3_asr_llm.ggufmodelsQwen3-ForcedAlignerQwen3-ForcedAligner-0.6Bqwen3_aligner_llm.q5_k.gguf- FFmpeg:部署到
C:CapsWriter-Offlineffmpegbin,用于把录音压成 MP3、读取音视频音频流、用ffprobe.exe取时长与进度。 - 系统麦克风:Windows 设置里确认麦克风已插入可用、隐私设置允许桌面应用访问麦克风、默认输入设备是实际麦克风。
③ 常见坑点与对应解决办法(忠实保留报错/命令/路径)
坑1:模型文件检查失败 现象:启动报模型文件检查失败。 原因:模型目录名、文件名必须和 config_server.py 完全一致,少一个层级或文件名大小写不对都会失败。 解决:严格按配置里的层级与大小写放置,例如 SenseVoice-Encoder.fp16.onnx、qwen3_asr_llm.gguf 等。
坑2:FFmpeg 检测不到 现象:录音保存成 WAV,或拖 MP4 转录失败。 排查:
<code class="language-powershell">Get-Command ffmpeg Get-Command ffprobe</code>
解决:只把 FFmpeg 放目录里还不够,运行进程必须在 PATH 中找到它。在启动脚本中追加本地 ffmpegbin:
<code class="language-powershell">$env:Path = "C:CapsWriter-Offlineffmpegbin;" + $env:Path</code>
坑3:拖 MP4 看起来没反应 原因:文件转录是后台运行,不是即时弹窗;长视频尤其 Qwen3-ASR + ForcedAligner 会比较慢(实测 291 秒视频约 125 秒,RTF≈0.43,即 1 分钟音频约 26 秒处理)。 解决:看日志判断是否在跑,logsclient_latest.log、logsserver_latest.log 中出现 开始转录文件 即表示正在处理,耐心等即可。需要更快可先启动 SenseVoice 再拖文件。
坑4:LLM 文件名乱码 现象:角色无法触发、划词翻译没反应。 解决:把 LLM 目录下乱码文件名恢复为 大助理.py、小助理.py、翻译.py;复制/解压/压缩时确认中文文件名未变成乱码(Windows 中文文件名须用 UTF-8 正确保存)。
坑5:翻译弹窗空白 现象:API 实际返回了内容,但弹窗蓝色区域为空白。 原因:Markdown/HTMLLabel 渲染路径与模型输出格式兼容性不好。 解决:给角色增加 toast_markdown = False 关闭 Markdown 渲染(toast_editable = False 亦可一并设置),避免渲染路径导致空白。
坑6:翻译弹窗一闪而过 现象:翻译成功但还没看清就消失。 解决:设 toast_duration = 0 表示固定弹窗、不自动关闭;关闭方式:弹窗上按 Esc 或点右键。
坑7:CapsLock 卡在录音状态 现象:按一次后程序"没反应",日志停在 [caps_lock] 触发:开始录音,后面没有 释放:完成录音。 原因:Windows/监听器漏掉了 CapsLock 松开事件,客户端一直以为在录音。 解决:增加最大录音时长兜底 max_record_seconds = 60,超过 60 秒仍未收到松开事件会自动结束录音,防止卡死。
坑8:打 zip 时中文文件名损坏 现象:Windows 自带 tar.exe -a -cf xxx.zip 可能按 CP437 处理 zip 文件名,遇到中文文件名会报:
<code>Can't translate Pathname ... to CP437</code>
解决:用 Python zipfile 打包(Zip64 + UTF-8 文件名)更稳。
坑9:API Key 别写进包 真实 Key 只放用户环境变量,不写入 LLM*.py、models*.py、文档笔记、便携包。推荐:
<code class="language-powershell">[Environment]::SetEnvironmentVariable('SILICONFLOW_API_KEY', '你的 API Key', 'User')</code>
config_server.py 中 api_key = '' 即从环境变量读取。打包前扫描:
<code class="language-powershell">rg "sk-" C:CapsWriter-OfflinedistCapsWriter-Offline-CPU-Portable -n</code>
(sk-xxx 是占位符,真实 Key 要清掉。)
④ 验证是否跑通的方法
启动后,日志中应看到:
<code>找到音频设备: 麦克风 (...) 音频流已启动 键盘监听器已启动 鼠标监听器已启动 WebSocket 建立成功</code>
拖音视频文件转录时,日志出现:
<code>已显示文件转录模式启动提示 待处理文件: [...] 正在处理文件: ... 开始转录文件: ... 音频数据发送完成 转录完成: ...</code>
输出一般保存在原视频旁边:同名 .txt、.json、.srt(视配置 file_save_srt/file_save_txt/file_save_json)。查看 GPU 是否用于 GGUF:日志出现 offloaded 29/29 layers to GPU、Vulkan0 model buffer 表示走 GPU;若看到 CPU KV buffer / CPU compute buffer 则说明对应部分在 CPU 上。
排错常用命令:
<code class="language-powershell">Get-Process start_client,start_server -ErrorAction SilentlyContinue Get-Content C:CapsWriter-Offlinelogsclient_latest.log -Encoding UTF8 -Tail 120 Get-Content C:CapsWriter-Offlinelogsserver_latest.log -Encoding UTF8 -Tail 120</code>
⑤ 结语 + 互动
本地部署 CapsWriter-Offline 的坑大多集中在路径权限、模型目录命名、FFmpeg 的 PATH、以及几个弹窗/监听器边界情况上,按上面逐条核对基本都能跑通。日常建议:听写用 启动-SenseVoice.cmd(快),长文件/字幕用 启动-Qwen3-ASR.cmd(准),翻译选中文字后说"翻译一下",看完按 Esc 关弹窗。
你在部署本地语音工具时踩过最离谱的坑是什么?或者哪条排错方法对你最有用的?欢迎在评论区聊聊,我们一起把这份避坑清单补全 👇

