0. 为什么想给 AI 编程配个手持遥控器?

最近用终端跑 AI 编程(比如 OpenAI Codex、Claude Code、WorkBuddy 或者各种 CLI Agent)越来越多。用了一段时间后,能明显感觉到工作流里最大的变化是:打字量变少了,但对话和确认变多了。

以前写代码大部分时间是在敲键盘,现在很多时候是:

  • 整理一段思路,用自然语言向 Agent 描述需求;
  • 看着它输出代码和 Diff;
  • 敲回车确认执行命令,或者在中途按中断;
  • 在几个不同的终端窗口或工作区之间切来切去,看各个 Agent 跑完了没有。

在这样的节奏下,语音输入确实是一个实打实的效率提升——说话往往比手打一段长 Prompt 快得多。但如果纯靠键盘上的按键去唤醒语音,人还是得一直坐在桌子正前方、手放在键盘上。

前段时间 OpenAI 的硬件原型 Codex Micro 公开后,社区里跟风出现了很多各色各样的「Vibe Coding 实体按键/小硬件」。但实际看下来,很多 DIY 小外设要么做工粗糙、按键松垮,要么属于早期的实验性玩具,稳定性和连接体验参差不齐。

其实完全不需要去买那些溢价外设或折腾 3D 打印。手边一个日常能买到的小米电视蓝牙语音遥控器 2 Pro(型号 RC003),成本大概 50~60 元,本身就是大厂量产、模具成熟、自带蓝牙 BLE 和语音麦克风的成品硬件。

香槟金金属磨砂质感的小米蓝牙语音遥控器 2 Pro

拿它当掌上控制器,核心诉求其实很朴素:

  1. 按住即说(Push-to-Talk):单手按住遥控器上的语音键直接口述 Prompt,松手自动上屏;
  2. 免键鼠盲切:靠在椅子上时,单手用方向键切换终端 Tab 和 Workspace,按中间 OK 键确认放行,按返回键中断。

这套方案不仅适用于我日常在用的 macOS,社区目前也提供了 Windows 的运行路径。下面记录具体的配置方法与排坑细节。


1. 硬件细节:为什么选 RC003?

小米这款遥控器在二手平台或电商平台售价通常在 50 到 60 元左右。选它主要看中几个硬件细节:

RC003 正面上半部微距:下凹式 OK 键、四向刻度触感环与独立的麦克风按键
  • 原生蓝牙 BLE 直连:走标准蓝牙协议,不需要外挂 USB 接收器,电脑自带的蓝牙就能直接配对连接;
  • 远超几十元价位的金属质感: 许多低价小硬件或 DIY 按钮最大的痛点是外壳轻飘、塑料感强,甚至有 3D 打印的明显毛刺。而 RC003 作为小米高端电视的原配遥控器,整机做工非常扎实:
    • 一体成型的金属质感机身:香槟金色表面经过了细腻的磨砂处理,触感温润微凉且不易留指纹,拿在手里有一定的分量感和重心平衡,绝非轻飘飘的薄塑料;
    • 干脆清晰的按键段落感:按键内部并非软塌塌的导电胶手感,触发时有类似微动的清脆确认感(Clicky),行程适中、回弹利落,盲操时按没按下去心里一清二楚;
    • 不突兀的桌搭颜值:极简的黑金撞色设计,平时随手放在键盘掌托、实木桌面或数码桌垫上,看起来就像一件专门打造的掌上数码配件,毫无违和感;
  • 适合盲操的按键布局:
    • 中间 OK 键有明显的下凹弧度,大拇指搭上去就能瞬间定位;
    • 外圈方向环在上下左右四个方向都有凸起的微小刻度,不用眼睛看也能清楚确认按键方位;
    • 顶部的麦克风键独立居中,单手握持时食指托底、拇指自然落在语音键上;
  • 近场人声拾音:电视遥控器内置的麦克风本身针对近距离人声做了拾音调优,环境杂音相对较小,很适合日常口述 Prompt。
横架在传统键盘之上的遥控器

2. 软件配置:打通系统与语音输入

虽然遥控器的方向键蓝牙连接后就能作为普通输入设备使用,但遥控器上的语音键传输的是专用的语音数据包,操作系统默认不会把它识别为常规麦克风。

社区开源的 HD838A/remote-mic-app(SayAll) 解决了两件事:

  1. 在系统里生成一个虚拟音频输入设备(macOS 下为 MiRemoteV 2ch);
  2. 监听遥控器的语音事件,按住语音键时接收音频并实时推流到虚拟麦克风,松手时结束。

配合支持「按住说话(PTT)」的语音输入法(如微信输入法),就能做到按住说话、松手上屏。

2.1 macOS 平台配置流程

  1. 配对遥控器:在 Mac 系统设置的蓝牙列表中,同时长按遥控器的「主页键(房子标)」和「菜单键(三条杠)」,等待指示灯闪烁,在 Mac 上点击配对连接;
  2. 安装 SayAll 与音频驱动:
    • 从 GitHub Releases 下载安装 SayAll.app;
    • 打开后根据提示安装音频驱动插件(位于 /Library/Audio/Plug-Ins/HAL/MiRemoteV2ch.driver);
    • 打开「系统设置 ➔ 声音 ➔ 输入」,此时可以看到已出现输入设备 MiRemoteV 2ch;
  3. 设置微信输入法(WeType):
    • 微信输入法的语音识别率和标点断句很准确,并且支持长按快捷键说话;
    • 在微信输入法设置中开启「按住快捷键说话」,将快捷键设为 Fn(或指定组合键);
    • 声音输入来源选择 MiRemoteV 2ch。

2.2 Windows 平台配置流程

如果你在 Windows 环境下使用(例如用 Windows 跑终端、运行 Codex 或 WorkBuddy):

  1. 同样在 Windows 设置的「蓝牙和其他设备」中长按配对遥控器;
  2. 运行 SayAll 的 Windows 预览版(或社区针对 RC003 的 Windows 适配方案,如 zhaozhuque/MIC-RC003-Windows);
  3. Windows 预览版默认将语音快捷键映射为 Ctrl + Win;
  4. 在 Windows 微信输入法中将语音输入快捷键同样匹配为 Ctrl + Win,麦克风选定遥控器映射出的音频设备即可。

3. 几个关键细节的快速排坑

实际配置过程中有几个容易卡住的体验细节,提前处理可以省不少时间:

技巧 1:SayAll 引导界面如果卡住怎么跳过?(macOS)

全新安装 SayAll 时,部分 macOS 版本在连接遥控器后,新手引导界面可能会一直停在最后一步无法点击完成。

无需重新安装,直接在终端执行一行命令写入完成标记即可:

defaults write com.hd838a.RemoteMic "onboarding.completedVersion" -int 1
defaults write com.hd838a.RemoteMic "onboarding.step" -string "complete"

重启 SayAll 即可直接进入完整的按键映射设置界面。

技巧 2:微信输入法 Mac 版录入不上独立 Fn 键?

在 macOS 上,如果想用单按独立 Fn 键作为语音触发,微信输入法设置界面偶尔无法正常录入。推荐直接在微信输入法「快捷键」中设为一个冷门组合键(如 Control + Option + V),并在 SayAll 中同样映射为该组合键,零门槛且绝无冲突。

若执意使用单键 Fn,微信输入法配置由 MMKV 存储且带 CRC32 校验,通过以下精简脚本重算校验即可生效:

# 微信输入法 MMKV 配置修复 (重算 CRC32 校验)
import os, zlib, struct
path = os.path.expanduser("~/Library/Application Support/WeType/mmkv/wetype.settings")
data = bytearray(open(path, "rb").read())
open(path + ".crc", "wb").write(struct.pack("<I", zlib.crc32(data)))

随后在 SayAll 里将语音模式选为 fn 即可无缝配合。

技巧 3:方向键快速连按无响应?打开「允许连续快速按」

很多用户在 SayAll 里把十字键映射为自定义快捷键后,会发现“按一下能切,但快速连按两下第二下没反应”。

原因:

  1. SayAll 默认对自定义快捷键开启了防连击保护,按键稳定前会过滤连续输入;
  2. 如果你在界面里设置了「双击」,单按时系统会额外等待几十毫秒去判断是否为双击,带来明显延迟。

手感优化设置:

  • 在 SayAll 方向键设置中,清除所有「双击」绑定;
  • 勾选对应按键下方的 「允许连续快速按」(Allow Rapid Repeated Presses)。

这样设置后,按键消除了双击等待窗口,单击零延迟触发,连续快速点按时也能每一次都即时响应。


4. 终端与 Agent 工作流配置:Herdr / Codex / WorkBuddy

遥控器到手后,最重要的价值是在开发工作流里配合终端复用器使用。

这里以我常用的 Herdr(专为多 Agent 协同设计的终端管理器,运行在 Ghostty 或任意终端中)为例,同时兼容 OpenAI Codex、腾讯 WorkBuddy (CodeBuddy) 和 Claude Code 等常见 Agent 工具。

4.1 空间直觉的按键映射

在多 Agent 场景下,界面的排布通常有天然的空间逻辑:

  • 顶部是横向排列的 Tabs(标签页,通常放同一个项目里的不同任务或视图);
  • 左侧是纵向排列的 Workspaces(工作区,比如分别跑着 Codex、WorkBuddy 和一个测试环境)。

我们将遥控器映射为直观的免前缀快捷键:

遥控器按键发送的快捷键对应动作实际用途
方向左 ◀Ctrl + Alt + Left上一个 Tab拇指往左切,回到上一个代码或输出窗口
方向右 ▶Ctrl + Alt + Right下一个 Tab拇指往右切,查看右侧并行的终端输出
方向上 ▲Ctrl + Alt + Up上一个 Workspace向上切换工作区(如切到正在跑 Codex 的项目)
方向下 ▼Ctrl + Alt + Down下一个 Workspace向下切换工作区(如切到 WorkBuddy 的执行区)
中心 OK 键Enter回车确认Agent 提出操作确认时,按一下直接放行
返回键 ⮌Ctrl + C / Esc中断 / 取消发现 Agent 运行偏离预期,按一下中断当前轮次
语音键 🎙Fn (长按 PTT)语音输入按住口述 Prompt,松手文字自动落入命令行

4.2 保持键盘原有习惯:Herdr 的多键位数组

如果你在键盘上依然习惯 tmux 式的 Ctrl+B 然后按 p / n 切标签,在 Herdr 的配置文件(~/.config/herdr/config.toml)中支持用数组同时声明两套按键:

[keys]
previous_tab       = ["prefix+p", "ctrl+alt+left"]   # 左/右键:切 Tab
next_tab           = ["prefix+n", "ctrl+alt+right"]
previous_workspace = ["prefix+up", "ctrl+alt+up"]    # 上/下键:切工作区
next_workspace     = ["prefix+down", "ctrl+alt+down"]

修改后执行 herdr server reload-config 即可热加载生效。这样坐在桌前打字时键盘快捷键照常使用,靠在椅背上手持遥控器时又能单手免前缀直切。

4.3 在 Codex / WorkBuddy 中的实际配合

当你在多个工作区里并行跑不同的 Agent:

  • 在 Codex 中:经常需要对生成的改动做多次确认。大拇指按住语音键:“这部分不要重构,只在原来的函数里加一个空值检查”,松手文字上屏,按一下中心 OK 提交;如果 Codex 询问是否允许执行 bash 脚本,再按一下 OK 放行;
  • 在 WorkBuddy / CodeBuddy 中:多 Agent 分工执行时,左手可以完全离开键盘,右手按住遥控器下达任务:“帮我把刚才的 API 文档生成成 Markdown 格式”,随后用上下键切换到其它工作区去检查编译日志。

5. 日常使用感受

用了这套方案一段时间后,最真实的改变并不是什么工作方式的翻天覆地,而是生理上更舒服了:

  1. 长 Prompt 明显更愿意说了:以前敲三四句话的需求或者边界条件,经常懒得打字就精简成了半截话,导致 Agent 理解不准;现在按住遥控器自然地说完一两百字的完整上下文,识别准确度很高,沟通成本反而降了;
  2. 多终端巡视更顺手:几个 Agent 都在跑任务的时候,手里拿着遥控器按两下方向键巡视一眼状态,比把手移到触控板或鼠标上去切屏轻松很多;
  3. 硬件成本几乎没有心理负担:相比动辄上百美元的专用小硬件,几十块钱的小米遥控器坏了不心疼,模具做工也完全在线。

如果你平时也在重度使用各种 AI 编程工具,手边正好有闲置的小米蓝牙遥控器,或者花几十块淘一个,花上十几分钟配置好,会是一个低成本但体验很扎实的小外设升级。