From 0ee1333f733effe72cf19206df355cdccbabb020 Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Thu, 24 Apr 2025 21:00:12 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=8C=89=E4=BD=8F=E8=AF=B4?= =?UTF-8?q?=E8=AF=9D=E9=98=B2=E6=8A=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chat/controllers/chat_controller.dart | 60 +++++++++++-------- lib/modules/chat/views/chat_view.dart | 2 +- 2 files changed, 37 insertions(+), 25 deletions(-) diff --git a/lib/modules/chat/controllers/chat_controller.dart b/lib/modules/chat/controllers/chat_controller.dart index 7776de777..5de5f28a7 100644 --- a/lib/modules/chat/controllers/chat_controller.dart +++ b/lib/modules/chat/controllers/chat_controller.dart @@ -98,7 +98,9 @@ class ChatController extends GetxController { String finalResult = ''; // 按住说话防抖 + bool isDebounce = false; Timer? _talkDebounceTimer; + Timer? _talkStartDebounceTimer; @override Future onInit() async { @@ -295,6 +297,7 @@ class ChatController extends GetxController { _autoStopTimer?.cancel(); _scrollDebounceTimer?.cancel(); // 清理防抖计时器 _talkDebounceTimer?.cancel(); + _talkStartDebounceTimer?.cancel(); _amapFlutter.dispose(); _locationStream?.cancel(); @@ -591,38 +594,46 @@ class ChatController extends GetxController { // 按下开始说话 void talkLongPress() async { + _talkStartDebounceTimer?.cancel(); _talkDebounceTimer?.cancel(); - if (isHoldSpeak.value) return; + isHoldSpeak.value = true; + Haptics.vibrate(HapticsType.success); - _voiceInteractionService.pauseVoiceInteraction(); - // 中断当前响应 - _interruptCurrentResponse("发送新消息,中断当前响应"); - try { - final recognitionStream = await _asrService.startContinuousRecognition(); - - await Future.delayed(const Duration(milliseconds: 150)); + _talkStartDebounceTimer = + Timer(const Duration(milliseconds: 260), () async { + if (isDebounce) return; - isHoldSpeak.value = true; - recognizedText.value = ''; - finalResult = ''; - Haptics.vibrate(HapticsType.success); + _voiceInteractionService.pauseVoiceInteraction(); + // 中断当前响应 + _interruptCurrentResponse("发送新消息,中断当前响应"); + try { + final recognitionStream = + await _asrService.startContinuousRecognition(); + await Future.delayed(const Duration(milliseconds: 260)); + isDebounce = true; + recognizedText.value = ''; + finalResult = ''; - // 监听识别事件 - _recognitionSubscription = recognitionStream.listen( - _handleRecognitionEvent, - onError: _handleRecognitionError, - ); - } catch (e) { - Logger.error('启动语音识别失败', e); - isHoldSpeak.value = false; - } + // 监听识别事件 + _recognitionSubscription = recognitionStream.listen( + _handleRecognitionEvent, + onError: _handleRecognitionError, + ); + } catch (e) { + Logger.error('启动语音识别失败', e); + isHoldSpeak.value = false; + } + }); } // 松开停止说话 void talkLongPressUp() async { + _talkStartDebounceTimer?.cancel(); _talkDebounceTimer?.cancel(); - _talkDebounceTimer = Timer(const Duration(milliseconds: 200), () async { - if (!isHoldSpeak.value) return; + isHoldSpeak.value = false; + + _talkDebounceTimer = Timer(const Duration(milliseconds: 300), () async { + if (!isDebounce) return; try { await _asrService.stopContinuousRecognition(); _recognitionSubscription?.cancel(); @@ -641,7 +652,8 @@ class ChatController extends GetxController { recognizedText.value = ''; finalResult = ''; - isHoldSpeak.value = false; + + isDebounce = false; } catch (e) { Logger.error('停止语音识别失败', e); } diff --git a/lib/modules/chat/views/chat_view.dart b/lib/modules/chat/views/chat_view.dart index abc28324d..46193f830 100644 --- a/lib/modules/chat/views/chat_view.dart +++ b/lib/modules/chat/views/chat_view.dart @@ -438,7 +438,7 @@ class ChatView extends GetView { filled: false, border: InputBorder.none, focusedBorder: InputBorder.none, - contentPadding: EdgeInsets.only(left: 10.w), + contentPadding: EdgeInsets.only(left: 6.w), ), onSubmitted: (value) { if (value.trim().isNotEmpty) {