|
|
@ -98,7 +98,9 @@ class ChatController extends GetxController { |
|
|
String finalResult = ''; |
|
|
String finalResult = ''; |
|
|
|
|
|
|
|
|
// 按住说话防抖 |
|
|
// 按住说话防抖 |
|
|
|
|
|
bool isDebounce = false; |
|
|
Timer? _talkDebounceTimer; |
|
|
Timer? _talkDebounceTimer; |
|
|
|
|
|
Timer? _talkStartDebounceTimer; |
|
|
|
|
|
|
|
|
@override |
|
|
@override |
|
|
Future<void> onInit() async { |
|
|
Future<void> onInit() async { |
|
|
@ -295,6 +297,7 @@ class ChatController extends GetxController { |
|
|
_autoStopTimer?.cancel(); |
|
|
_autoStopTimer?.cancel(); |
|
|
_scrollDebounceTimer?.cancel(); // 清理防抖计时器 |
|
|
_scrollDebounceTimer?.cancel(); // 清理防抖计时器 |
|
|
_talkDebounceTimer?.cancel(); |
|
|
_talkDebounceTimer?.cancel(); |
|
|
|
|
|
_talkStartDebounceTimer?.cancel(); |
|
|
|
|
|
|
|
|
_amapFlutter.dispose(); |
|
|
_amapFlutter.dispose(); |
|
|
_locationStream?.cancel(); |
|
|
_locationStream?.cancel(); |
|
|
@ -591,38 +594,46 @@ class ChatController extends GetxController { |
|
|
|
|
|
|
|
|
// 按下开始说话 |
|
|
// 按下开始说话 |
|
|
void talkLongPress() async { |
|
|
void talkLongPress() async { |
|
|
|
|
|
_talkStartDebounceTimer?.cancel(); |
|
|
_talkDebounceTimer?.cancel(); |
|
|
_talkDebounceTimer?.cancel(); |
|
|
if (isHoldSpeak.value) return; |
|
|
isHoldSpeak.value = true; |
|
|
|
|
|
Haptics.vibrate(HapticsType.success); |
|
|
|
|
|
|
|
|
_voiceInteractionService.pauseVoiceInteraction(); |
|
|
_talkStartDebounceTimer = |
|
|
// 中断当前响应 |
|
|
Timer(const Duration(milliseconds: 260), () async { |
|
|
_interruptCurrentResponse("发送新消息,中断当前响应"); |
|
|
if (isDebounce) return; |
|
|
try { |
|
|
|
|
|
final recognitionStream = await _asrService.startContinuousRecognition(); |
|
|
|
|
|
|
|
|
|
|
|
await Future.delayed(const Duration(milliseconds: 150)); |
|
|
|
|
|
|
|
|
|
|
|
isHoldSpeak.value = true; |
|
|
_voiceInteractionService.pauseVoiceInteraction(); |
|
|
recognizedText.value = ''; |
|
|
// 中断当前响应 |
|
|
finalResult = ''; |
|
|
_interruptCurrentResponse("发送新消息,中断当前响应"); |
|
|
Haptics.vibrate(HapticsType.success); |
|
|
try { |
|
|
|
|
|
final recognitionStream = |
|
|
|
|
|
await _asrService.startContinuousRecognition(); |
|
|
|
|
|
await Future.delayed(const Duration(milliseconds: 260)); |
|
|
|
|
|
isDebounce = true; |
|
|
|
|
|
recognizedText.value = ''; |
|
|
|
|
|
finalResult = ''; |
|
|
|
|
|
|
|
|
// 监听识别事件 |
|
|
// 监听识别事件 |
|
|
_recognitionSubscription = recognitionStream.listen( |
|
|
_recognitionSubscription = recognitionStream.listen( |
|
|
_handleRecognitionEvent, |
|
|
_handleRecognitionEvent, |
|
|
onError: _handleRecognitionError, |
|
|
onError: _handleRecognitionError, |
|
|
); |
|
|
); |
|
|
} catch (e) { |
|
|
} catch (e) { |
|
|
Logger.error('启动语音识别失败', e); |
|
|
Logger.error('启动语音识别失败', e); |
|
|
isHoldSpeak.value = false; |
|
|
isHoldSpeak.value = false; |
|
|
} |
|
|
} |
|
|
|
|
|
}); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// 松开停止说话 |
|
|
// 松开停止说话 |
|
|
void talkLongPressUp() async { |
|
|
void talkLongPressUp() async { |
|
|
|
|
|
_talkStartDebounceTimer?.cancel(); |
|
|
_talkDebounceTimer?.cancel(); |
|
|
_talkDebounceTimer?.cancel(); |
|
|
_talkDebounceTimer = Timer(const Duration(milliseconds: 200), () async { |
|
|
isHoldSpeak.value = false; |
|
|
if (!isHoldSpeak.value) return; |
|
|
|
|
|
|
|
|
_talkDebounceTimer = Timer(const Duration(milliseconds: 300), () async { |
|
|
|
|
|
if (!isDebounce) return; |
|
|
try { |
|
|
try { |
|
|
await _asrService.stopContinuousRecognition(); |
|
|
await _asrService.stopContinuousRecognition(); |
|
|
_recognitionSubscription?.cancel(); |
|
|
_recognitionSubscription?.cancel(); |
|
|
@ -641,7 +652,8 @@ class ChatController extends GetxController { |
|
|
|
|
|
|
|
|
recognizedText.value = ''; |
|
|
recognizedText.value = ''; |
|
|
finalResult = ''; |
|
|
finalResult = ''; |
|
|
isHoldSpeak.value = false; |
|
|
|
|
|
|
|
|
isDebounce = false; |
|
|
} catch (e) { |
|
|
} catch (e) { |
|
|
Logger.error('停止语音识别失败', e); |
|
|
Logger.error('停止语音识别失败', e); |
|
|
} |
|
|
} |
|
|
|