Wisper
本地流式语音识别:麦克风 → 火山 SAUC WebSocket → 文本;通过 Hammerspoon 把识别结果 键入到当前光标处(适合在搜索框、文档里说话输入)。
目录结构
| 路径 | 说明 |
|---|---|
wisper/ |
运行时 Python 包:音频采集、volc 协议、HTTP daemon、backends 能力声明 |
main.py |
推荐日常启动:与 python -m wisper 相同,可用 --mode 选择能力组合 |
demos/ |
实验/对照脚本(整段 Flash、纯采集等),非日常热键路径 |
artifacts/ |
本地产物目录(已 gitignore):logs/、recordings/、debug/ |
hammerspoon/ |
配置模板,复制到 ~/.hammerspoon/ |
config/example.json |
可选配置示例;覆盖请用 config/local.json(不提交) |
环境
- Python 3.x,依赖见
requirements.txt。 - 在项目根配置
.env:VOLC_ASR_APP_KEY、VOLC_ASR_ACCESS_KEY;可选VOLC_ASR_WS_URL、VOLC_ASR_RESOURCE_ID、VOLC_ASR_SEG_DURATION_MS。 - 日志默认写入
artifacts/logs/wisper.log;可用环境变量ASR_DAEMON_LOG_FILE、ASR_DAEMON_LOG_LEVEL覆盖。
统一启动(一个进程监听)
默认 仅流式(与 Hammerspoon 热键一致)。也可用 --mode 或环境变量 WISPER_MODE 打开整段 Flash 或两者并存:
--mode |
行为 |
|---|---|
stream(默认) |
GET /health、/start、/partial、/stop(麦克风流式) |
flash |
仅 POST /recognize(整段 WAV 等,见下) |
both |
上两表的路由 同一端口 都有 |
./.venv/bin/python main.py
./.venv/bin/python main.py --mode both
./.venv/bin/python -m wisper --mode flash --port 8766
WISPER_MODE=both ./.venv/bin/python main.py
兼容旧入口:./.venv/bin/python asr_daemon.py 与 ./.venv/bin/python -m wisper.daemon 等价于默认 stream。
GET /capabilities:返回当前启用的能力列表(如["stream_volc","flash_volc"]),Lua 或其它客户端可用来判断是否调用/recognize。POST /recognize:multipart/form-data字段名file,或 JSON{"path":"recordings/xxx.wav"}(路径须位于artifacts/下)。响应:{"ok":true,"text":"..."}。
扩展本地模型时:在 wisper/backends/spec.py 增加能力位,在 wisper/daemon/server.py 挂载对应路由即可。
服务默认监听 http://127.0.0.1:8765。
Hammerspoon(光标处插入文字)
- 安装 Hammerspoon。
- 将本仓库
hammerspoon/init.lua复制到~/.hammerspoon/init.lua,在 Hammerspoon 中 Reload Config。 - macOS 隐私与安全性 → 辅助功能:允许 Hammerspoon(用于向当前应用注入按键)。
- 确保 daemon 已启动;使用脚本中配置的热键(例如
Option+V开始/停止录音并由客户端轮询/partial注入文字)。
主目标:把识别文字插入当前焦点应用的光标位置;是否在浏览器里按回车搜索由你手动完成,daemon 不包含搜索 URL 等逻辑。
Demos
均需 在仓库根目录 执行,例如:
./.venv/bin/python demos/realtime_audio_capture.py --help
./.venv/bin/python demos/srec_flash_demo.py --file your.wav
./.venv/bin/python demos/flash_capture_demo.py
./.venv/bin/python demos/realtime_asr_stream_demo.py --help
demos/srec_websocket_demo.py 为占位式旧示例,需自行填入密钥后才可用。
根目录兼容入口
为兼容旧脚本,realtime_audio.py 与 asr_errors.py 仍可作为薄封装,从 wisper 包 re-export 符号。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 kipleyarch@gmail.com