唤醒流程更新,修复重复唤醒的问题

This commit is contained in:
2025-09-29 14:11:33 +08:00
parent 5be50b4dbb
commit ba73d6d780
5 changed files with 36 additions and 25 deletions

View File

@@ -89,7 +89,7 @@ class AIChatAssistantManager {
Future<void> startVoskWakeword() async {
FlutterVoskWakeword.instance.initialize(
wakeWords: ['你好众众', '你好', '众众'], // 唤醒词列表
wakeWords: ['你好众众', '你好', '众众', '测试', '哈喽', '唤醒'], // 唤醒词列表
);
debugPrint('Starting Vosk Wakeword detection...');
@@ -99,12 +99,10 @@ class AIChatAssistantManager {
debugPrint('Vosk Wakeword detected: ${event.text}');
_wakeWordDetected = true;
// 通知所有监听者
// _wakeWordController.add(null);
// 可选:一段时间后自动重置状态
Future.delayed(const Duration(seconds: 2), () {
_wakeWordDetected = false;
});
_wakeWordController.add(null);
// 监听到之后就停止,这个时候已经弹出了对话框
// 对话框消失就可以继续监听 recognitionStream 的订阅不会断开
FlutterVoskWakeword.instance.stop();
});
}

View File

@@ -2,6 +2,7 @@ import 'dart:async';
import 'dart:ui';
import 'package:ai_chat_assistant/manager.dart';
import 'package:flutter/material.dart';
import 'package:flutter_vosk_wakeword/flutter_vosk_wakeword.dart';
import 'package:provider/provider.dart';
import '../pages/full_screen.dart';
import '../services/message_service.dart';
@@ -44,6 +45,7 @@ class _ChatPopupState extends State<ChatPopup> with SingleTickerProviderStateMix
// 订阅唤醒词事件
_wakeWordSubscription = AIChatAssistantManager.instance.onWakeWordDetected.listen((_) async {
await FlutterVoskWakeword.instance.stop();
// 在这里处理唤醒事件,例如显示聊天窗口
debugPrint("唤醒词被检测到执行UI操作");
final messageService = MessageService.instance;
@@ -59,8 +61,9 @@ class _ChatPopupState extends State<ChatPopup> with SingleTickerProviderStateMix
super.dispose();
}
void _insertOverlay() {
Future<void> _insertOverlay() async {
if (_isShowingPopup) return;
await FlutterVoskWakeword.instance.stop(); // 停止唤醒词监听,避免误触发
setState(() {
_isShowingPopup = true;
});
@@ -69,6 +72,7 @@ class _ChatPopupState extends State<ChatPopup> with SingleTickerProviderStateMix
void _removeOverlay() {
if (!_isShowingPopup) return;
FlutterVoskWakeword.instance.start(); // 重新开始监听唤醒词
_partScreenAnimationController.reverse().then((_) {
if (mounted) {
setState(() {