Handy 0.9.7 快捷键行为升级:Auto(Hold or Toggle)模式完整解析
发布时间:2026/9/30 11:04:52来源:尧图网络
桌面应用语音音频AI 应用本地部署【免费下载链接】HandyA free, open source, and extensible speech-to-text application that works completely offline.项目地址https://gitcode.com/GitHub_Trending/handy11/Handy点击查看免费下载Handy 0.9.7 为转录快捷键引入全新的Auto模式让同一个快捷键既能按住说话push-to-talk又能轻点开关toggle且该模式成为新安装的默认值。本文基于 0.9.7 发布说明 与仓库源码详解三种快捷键行为模式的定义、Auto 模式的底层判定原理按住时长阈值与录音状态机、升级迁移规则以及如何通过General → Shortcut Behavior切换模式。三种快捷键行为模式Handy 0.9.7 之前快捷键只有两种互斥的工作方式按住录音push-to-talk或轻点切换toggle。0.9.7 在二者之上新增了Auto组合模式用户可以在General → Shortcut Behavior通用设置 → 快捷键行为中随时切换模式触发方式说明Auto按住录制、松开停止或轻点一次开始、再轻点一次停止同一快捷键自动区分长按与轻点行为由按住时长决定新安装的默认值Hold按住录制、松开停止即旧的 push-to-talk 行为只在按住快捷键期间录制Toggle轻点一次开始录制、轻点一次再停止经典的开关式切换录音会一直持续到下一次轻点对应到源码中三种模式就是设置项shortcut_activation的三个枚举值。在 settings.rs 中定义如下/// How the transcribe shortcuts key events drive a recording. #[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq, Type, Default)] #[serde(rename_all snake_case)] pub enum ShortcutActivation { /// Press to start, press again to stop. Toggle, /// Hold to record, release to stop. PushToTalk, /// Hold to record and release to stop, or tap to keep recording until the /// next press. Which one it was is decided by how long the key was held /// (hold_threshold_ms). #[default] HoldOrToggle, }#[serde(rename_all snake_case)]意味着三者在配置文件中序列化为字符串toggle、push_to_talk、hold_or_toggleUI 下拉框与存储层使用同一套取值。模式枚举还带#[default]属性标注在HoldOrToggle上与Auto 是新安装默认值的发布说明一致。Auto 模式同一快捷键智能区分按住与轻点Auto源码中的HoldOrToggle的判别核心是一个按住时长阈值按住超过阈值视为按住push-to-talk 语义松开即停止录音按住不足阈值视为轻点toggle 语义录音被锁定、持续到下一次按下快捷键。这个阈值就是设置项hold_threshold_ms其默认值为300 毫秒定义在 settings.rsfn default_hold_threshold_ms() - u64 { 300 }也就是说Auto 模式下按快捷键后按住 ≥ 300ms 后松开→ 停止录音并开始转录等价于 Hold 模式按住 300ms 就松开→ 判定为轻点录音持续进行直到下一次再按下快捷键才停止等价于 Toggle 模式。事件路由与状态机从按键事件到录音状态切换的调用链在 shortcut/handler.rs 中所有快捷键事件Tauri 实现与 handy-keys 实现共用此逻辑统一进入handle_shortcut_event其中 transcribe 类绑定被路由给TranscriptionCoordinator并携带当前配置的模式与阈值coordinator.send_input( binding_id, hotkey_string, is_pressed, settings.shortcut_activation, std::time::Duration::from_millis(settings.hold_threshold_ms), );真正的按住 vs 轻点判定发生在 transcription_coordinator.rs 的CoordinatorState状态机中关键节点是finish_holdL437-L459let held self.hold.as_ref() .map(|h| released_at.saturating_duration_since(h.pressed_at)) .unwrap_or(Duration::MAX); if held threshold { return Some(self.begin_processing(binding_id, hotkey_string)); } if let Some(hold) mut self.hold { debug!(Tap ({held:?}) for {binding_id}: recording locked on until the next press); hold.locked true; } None松开按键时用实际按住时长held与阈值比较held threshold走正常结束路径begin_processing停止录音、进入转录否则把当前会话标记为locked true录音不结束等待下一次按下。锁定会话与下一次按下locked标记贯穿整个状态机is_locked()L245-L248判断当前会话是否比按键存活得更久即录音在按键松开后仍继续锁定时释放事件被忽略、由下一次按下结束会话。这对应了文档中tap once to start and tap again to stop的行为。此外effective_hold_thresholdL146-L150只在HoldOrToggle模式下启用真实阈值而PushToTalk与Toggle模式的阈值恒为 0——因为它们根本不需要按住/轻点判别也侧面印证了 Auto 是三者中唯一依赖hold_threshold_ms的模式。实用细节防抖、重复按键与忙碌期处理状态机还内置了几个对用户体验至关重要的细节按键防抖L286-L299对快速重复的按下事件系统键重复或双击做DEBOUNCE去重避免一次物理按键产生两次按下外部触发如踏板、CLI 信号则被豁免保证切换对账的确定性。释放宽限RELEASE_GRACE按住模式的释放事件先挂起在pending_release中L273-L281用于吸收 X11 自动重复产生的抖动。忙碌期记忆当转录管线正忙Stage::Processing时新的按下不会被丢弃而是记入pending_press待管线排空后自动补开一次录音on_processing_finishedL475-L489轻点此时会被标记为锁定启动长按则被对冲为无操作L408-L432。如何配置与切换在应用内进入General通用→ Shortcut Behavior快捷键行为从下拉框选择 Auto / Hold / Toggle 即可无需重启。该设置项的 UI 组件是 ShortcutActivation.tsx读取shortcut_activation并写入同一设置键const selected (getSetting(shortcut_activation) || hold_or_toggle) as ShortcutActivation; // ... onSelect{(value) updateSetting(shortcut_activation, value as ShortcutActivation)}注意组件默认回退值是hold_or_toggle与后端默认枚举保持一致。该组件在 GeneralSettings.tsx 中紧跟在Transcribe 快捷键输入框之后展示三者并列、描述以 tooltip 呈现。界面文案来自 i18n 资源文件英文版位于 en/translation.jsonshortcutActivation: { title: Shortcut Behavior, description: Choose how the transcribe shortcut starts and stops recording., options: { holdOrToggle: Auto, pushToTalk: Hold, toggle: Toggle }, descriptions: { hold_or_toggle: Hold to record or tap to toggle, push_to_talk: Records while you hold the shortcut, toggle: Tap the shortcut to start recording, tap again to stop } }项目已为 30 多种语言提供translation.json位于 src/i18n/locales每个语言目录中都包含shortcutActivation词条因此该设置界面对多语言用户同样可用。升级迁移老用户行为不变新安装默认 Auto这是 0.9.7 变更中一个容易被忽略但极其重要的细节现有用户升级后会自动保留升级前的快捷键行为只有全新安装才会默认 Auto。发布说明中Existing users will keep their current shortcut behavior after updating在源码中有明确实现——settings.rs 的一次性迁移逻辑// One-time shortcut activation migration (only while the new key is // absent): the retired push_to_talk bool maps onto the two legacy modes so // upgrading users keep exactly the behavior they had. Only fresh installs // get the hold-or-toggle default. if settings_value.get(shortcut_activation).is_none() { if let Some(push_to_talk) settings_value.get(push_to_talk).and_then(|v| v.as_bool()) { settings.shortcut_activation if push_to_talk { ShortcutActivation::PushToTalk } else { ShortcutActivation::Toggle }; updated true; } }迁移规则非常明确老版本设置中push_to_talk true按住说话→ 迁移为PushToTalkHold老版本设置中push_to_talk false开关模式→ 迁移为Toggle只有配置中不存在旧键即全新安装时才走HoldOrToggle默认值。迁移相关的边界情况都有对应单元测试覆盖settings.rs 测试区shortcut_activation_migration_maps_push_to_talk_true、shortcut_activation_migration_maps_push_to_talk_false、shortcut_activation_migration_respects_explicit_new_key显式写入过新键则不再覆盖以及shortcut_activation_defaults_to_hold_or_toggle_without_legacy_key无旧键时默认 Auto。因此升级到 0.9.7 的用户不会感到习惯被改变想体验 Auto 模式只需手动到General → Shortcut Behavior切换一次即可。测试验证Auto 模式的状态机行为Auto 模式按住/轻点的每一种关键行为都由 transcription_coordinator.rs 中的测试用例在合成时钟上逐项钉死测试统一使用HOLD_THRESHOLD 300ms与真实模式驱动同一状态机hold_or_toggle_long_hold_stops_on_release按住超过阈值后松开 → 停止录音hold_or_toggle_tap_locks_recording_until_next_press轻点不足阈值→ 录音锁定直到下一次按下hold_or_toggle_locked_session_ignores_release锁定会话忽略释放事件hold_or_toggle_press_while_held_is_ignored按住期间再次按下被忽略hold_or_toggle_autorepeat_burst_is_one_long_hold系统键重复的一连串事件被合并为一次长按hold_or_toggle_remembered_press_measures_hold_from_real_key_down忙碌期记住的按下以真实按下时刻计算按住时长hold_or_toggle_tap_during_processing_queues_locked_start与hold_or_toggle_completed_hold_during_processing_nets_noop忙碌期的轻点排队补开、长按则净无操作。这些测试与Toggle 模式忽略释放、从开始即锁定classify_busy_input中对(Toggle, false, _) BusyAction::IgnoreL104-L118共同说明三种模式在最底层由同一个状态机驱动区别仅在于释放事件如何处理、录音是否锁定——这正是 Auto 模式能与两种传统模式无缝共存的架构基础。小结Handy 0.9.7 的 Shortcut Behavior 升级本质上是把按住说话和轻点开关两种交互统一到一个 Auto 模式下由 300ms 的按住时长阈值自动判别并借助锁定会话、按键防抖、释放宽限与忙碌期记忆等机制保证在各种真实按键场景下的稳定表现。升级用户的行为由一次性迁移逻辑完整保留新用户则默认享受 Auto 的灵活性。需要强调的是hold_threshold_ms阈值同样暴露在调试设置HoldThreshold.tsx中说明 Auto 模式的判别阈值是可以按个人习惯微调的这为喜欢更长/更短的按住判定的用户保留了进一步定制的空间。赞分享桌面应用语音音频AI 应用本地部署【免费下载链接】HandyA free, open source, and extensible speech-to-text application that works completely offline.项目地址https://gitcode.com/GitHub_Trending/handy11/Handy点击查看免费下载相关推荐为什么选择QRibbonQt Ribbon菜单栏实现方案对比与选型指南为什么选择QRibbonQt Ribbon菜单栏实现方案对比与选型指南 QRibbon是一款基于Qt框架实现的Ribbon风格菜单栏组件它通过定制QTabWUI组件桌面应用Handsontable 键盘快捷键完全指南默认快捷键、编辑器行为与底层实现Handsontable 键盘快捷键完全指南默认快捷键、编辑器行为与底层实现 Handsontable 是一款具有电子表格外观与交互的 JavaScript前端UI组件Vibe Kanban快捷键大全提升操作效率的完整快捷键列表Vibe Kanban快捷键大全提升操作效率的完整快捷键列表 Vibe Kanban是一款专为管理AI编程助手设计的看板工具通过掌握其快捷键您可以显著提升后端前端AI 应用桌面应用研发协作上一篇深入探索相机潜能PMCA-RE逆向工程工具全解析下一篇res-downloader视频资源下载与AES-CBC解密技术深度解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网