Browse Source

修改按住说话防抖

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

32
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,21 +594,25 @@ 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);
_talkStartDebounceTimer =
Timer(const Duration(milliseconds: 260), () async {
if (isDebounce) return;
_voiceInteractionService.pauseVoiceInteraction(); _voiceInteractionService.pauseVoiceInteraction();
// 中断当前响应 // 中断当前响应
_interruptCurrentResponse("发送新消息,中断当前响应"); _interruptCurrentResponse("发送新消息,中断当前响应");
try { try {
final recognitionStream = await _asrService.startContinuousRecognition(); final recognitionStream =
await _asrService.startContinuousRecognition();
await Future.delayed(const Duration(milliseconds: 150)); await Future.delayed(const Duration(milliseconds: 260));
isDebounce = true;
isHoldSpeak.value = true;
recognizedText.value = ''; recognizedText.value = '';
finalResult = ''; finalResult = '';
Haptics.vibrate(HapticsType.success);
// 监听识别事件 // 监听识别事件
_recognitionSubscription = recognitionStream.listen( _recognitionSubscription = recognitionStream.listen(
@ -616,13 +623,17 @@ class ChatController extends GetxController {
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