From 072a571a8961f29debb18dfc3c40bcd7b3996a93 Mon Sep 17 00:00:00 2001 From: impressionyang Date: Thu, 11 Jun 2026 14:19:52 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E9=95=BF=E6=8C=89=203s=20=E7=AB=8B?= =?UTF-8?q?=E5=8D=B3=E5=A4=8D=E4=BD=8D=20CapsLock=EF=BC=8C=E4=B8=8D?= =?UTF-8?q?=E7=AD=89=E6=9D=BE=E5=BC=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CapsLock 语音输入流程调整为: 按下 CapsLock → 预录音 → 长按 3s → 立即复位 CapsLock → 正式录音 → 松开 → 停止录音 → 识别 → 注入文本 短按(< 3s)保持原有行为:模拟 CapsLock 切换大小写 Co-Authored-By: Claude Opus 4.7 --- src/core/voice_input_service.cpp | 6 +++--- src/core/voice_input_service.h | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/core/voice_input_service.cpp b/src/core/voice_input_service.cpp index 66ce174..787efc6 100644 --- a/src/core/voice_input_service.cpp +++ b/src/core/voice_input_service.cpp @@ -45,6 +45,8 @@ VoiceInputService::VoiceInputService(ConfigManager* configManager, // 长按超时仍未松开 → 确认为长按录音 if (!longPressDetected_) { longPressDetected_ = true; + // 立即复位 CapsLock,不等用户松开 + simulateCapsLock(); emit statusChanged("正在录音..."); } }); @@ -150,9 +152,7 @@ void VoiceInputService::onHotkeyDeactivated() { simulateCapsLock(); emit statusChanged("短按:切换 CapsLock"); } else { - // 长按 → 先恢复 CapsLock 状态,再开始识别 - // 这样识别结果注入时 CapsLock 已恢复原始状态 - simulateCapsLock(); + // 长按 → CapsLock 已在长按阈值时复位,松开后直接开始识别 stopRecordingAndTranscribe(); } diff --git a/src/core/voice_input_service.h b/src/core/voice_input_service.h index 096d1dd..bd278fd 100644 --- a/src/core/voice_input_service.h +++ b/src/core/voice_input_service.h @@ -19,10 +19,10 @@ class ConfigManager; * * 协调全局快捷键、音频采集、STT 推理和文本注入。 * 状态机: - * 1. 空闲 → 按下快捷键 → 开始录音 - * 2. 长按超过 1 秒 → 开始正式录音(清除之前的静音段) - * 3. 松开快捷键 → 停止录音 → 推理 → 注入文本 - * 4. 短按(< 1 秒)→ 注入 CapsLock 按键(切换大小写) + * 1. 按下 CapsLock → 开始预录音 + * 2. 长按超过阈值(默认 3s)→ 立即复位 CapsLock,正式录音 + * 3. 松开 CapsLock → 停止录音 → 推理 → 注入文本 + * 4. 短按(< 阈值)→ 注入 CapsLock 按键(切换大小写) */ class VoiceInputService : public QObject { Q_OBJECT @@ -44,7 +44,7 @@ public: /** @brief 是否正在录音 */ bool isRecording() const { return recording_; } - /** @brief 长按阈值(毫秒),默认 1000ms */ + /** @brief 长按阈值(毫秒),默认 3000ms */ void setLongPressThreshold(int ms) { longPressThreshold_ = ms; } int longPressThreshold() const { return longPressThreshold_; }