Browse Source

修改按住说话防抖

newdev_shunjiawei
tanlongsheng 1 year ago
parent
commit
0ee1333f73
  1. 60
      lib/modules/chat/controllers/chat_controller.dart
  2. 2
      lib/modules/chat/views/chat_view.dart

60
lib/modules/chat/controllers/chat_controller.dart

@ -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);
} }

2
lib/modules/chat/views/chat_view.dart

@ -438,7 +438,7 @@ class ChatView extends GetView<ChatController> {
filled: false, filled: false,
border: InputBorder.none, border: InputBorder.none,
focusedBorder: InputBorder.none, focusedBorder: InputBorder.none,
contentPadding: EdgeInsets.only(left: 10.w), contentPadding: EdgeInsets.only(left: 6.w),
), ),
onSubmitted: (value) { onSubmitted: (value) {
if (value.trim().isNotEmpty) { if (value.trim().isNotEmpty) {

Loading…
Cancel
Save