技能
增强功能 官方

本地 Whisper

将语音转录切换为设备端的 whisper.cpp。无需 API 密钥、无网络请求、无逐条消息费用。

功能特性

  • 完全在设备端通过 whisper.cpp 运行,数据不会离开你的机器
  • 无需 API 密钥,无逐条消息费用
  • 在 Apple Silicon 上,base 模型处理约 30 秒音频仅需不到 1 秒
  • 支持多种模型尺寸,可在精度和速度之间灵活取舍
  • 自动检测语言,支持任何语言的语音消息

前置条件

  • 已安装并运行 NanoClaw
  • 已应用语音转录技能(WhatsApp 通道)
  • 推荐 macOS 配合 Apple Silicon(M1 及以上)
  • 已安装 Homebrew

安装

/use-local-whisper

工作原理

/use-local-whisper 技能将 OpenAI Whisper API 替换为本地的 whisper.cpp 二进制文件来进行语音消息转录。语音消息不再发送到 OpenAI 的服务器,而是完全在你的机器上处理。智能体仍然以相同的 [Voice: <transcript>] 格式接收消息——这一变更对智能体和你来说都是透明的。

该技能通过 Homebrew 安装两个依赖:whisper-cpp(提供 whisper-cli 二进制文件)和 ffmpeg(用于音频格式转换)。然后下载一个 GGML 模型文件,并修改 src/transcription.ts 以调用本地二进制文件而非 OpenAI API。

模型尺寸

技能默认使用 base 模型,在速度和精度之间取得良好平衡。如果你需要更高的转录质量,可以选择更大的模型:

模型大小速度(M1,30 秒音频)适用场景
Base148 MB< 1 秒大多数场景
Small466 MB约 2 秒口音较重的语音,精度更高
Medium1.5 GB约 5 秒最佳精度,多语言支持

模型文件存放在 data/models/ 中,可以随时通过下载不同的模型并更新 WHISPER_MODEL 环境变量来切换。

费用对比

使用 OpenAI Whisper API 时,转录费用大约为每分钟音频 $0.006。轻度使用时这几乎可以忽略,但如果你每天处理大量语音消息,费用会累积。使用本地 Whisper 后,除了一次性的模型下载外没有任何费用。代价是由你的机器来承担计算工作,而非 OpenAI 的服务器。

配置

可以在 .env 中设置两个可选的环境变量:

  • WHISPER_BIN — whisper-cli 二进制文件的路径。默认为 whisper-cli(通过 PATH 查找)。
  • WHISPER_MODEL — GGML 模型文件的路径。默认为 data/models/ggml-base.bin

故障排查

开发环境可以转录但服务模式不行。 launchd 服务运行时使用的 PATH 受限,可能不包含 /opt/homebrew/bin/。技能在设置时会检查并修复此问题,但如果你重新安装了 Homebrew 或移动了二进制文件,请检查 ~/Library/LaunchAgents/com.nanoclaw.plist 中的 PATH。

语言检测错误。 whisper.cpp 从音频中自动检测语言。要强制使用特定语言,请在 .env 中设置 WHISPER_LANG,并修改 src/transcription.ts 以向二进制文件传递 -l $WHISPER_LANG 参数。

转录速度慢。 base 模型在 M1 及以上设备上处理 30 秒音频应在 1 秒以内完成。如果速度更慢,请检查 CPU 使用率——可能有其他进程在争夺资源。升级到更小的模型并不会有帮助;降级反而会。

使用建议

  • 此技能目前仅支持 WhatsApp。其他通道需要先实现各自的音频下载逻辑,本地 Whisper 才能为其服务。
  • 你可以随时切换回 OpenAI API,方法是恢复 src/transcription.ts 的改动或重新应用语音转录技能。
  • 非常短的语音消息(不到 1 秒)有时会产生空白或不准确的转录结果。这是 Whisper 模型本身的局限性,并非本地版本特有的问题。