diff --git a/lib/data/services/speech_impl/azure_asr_service.dart b/lib/data/services/speech_impl/azure_asr_service.dart index eb003736a..12e43489c 100644 --- a/lib/data/services/speech_impl/azure_asr_service.dart +++ b/lib/data/services/speech_impl/azure_asr_service.dart @@ -139,6 +139,13 @@ class AzureAsrService extends GetxService implements AsrService { } } + @override + void onClose() async { + // 页面或服务被删除时,确保释放底层资源 + await dispose(); + super.onClose(); + } + @override Future recognizeOnce() async { if (!_isInitialized) { diff --git a/lib/data/services/speech_impl/azure_ast_service.dart b/lib/data/services/speech_impl/azure_ast_service.dart index 5b5dc35da..97cb98335 100644 --- a/lib/data/services/speech_impl/azure_ast_service.dart +++ b/lib/data/services/speech_impl/azure_ast_service.dart @@ -54,6 +54,13 @@ class AzureAstService extends GetxService implements AstService { _loadConfig(); } + @override + void onClose() async { + // 页面或服务被删除时,确保释放底层资源 + await dispose(); + super.onClose(); + } + /// 设置事件通道 void _setupEventChannel() { _eventSubscription?.cancel(); @@ -244,12 +251,19 @@ class AzureAstService extends GetxService implements AstService { @override Future dispose() async { try { - final bool result = await _channel.invokeMethod('dispose'); - - return; + // 取消事件订阅,关闭事件流,重置状态(补充释放,避免监听残留) + await _eventSubscription?.cancel(); + _eventSubscription = null; + await _eventStreamController?.close(); + _eventStreamController = null; + + // 通知原生端释放资源,并重置初始化标记 + await _channel.invokeMethod('dispose'); + _isInitialized = false; + Logger.info('Azure AST 资源已释放'); } catch (e) { - Logger.error('停止录音: ${e.toString()}'); - rethrow; + Logger.error('Azure AST 资源释放失败: ${e.toString()}'); + _isInitialized = false; } } diff --git a/lib/modules/translation/controllers/translation_controller.dart b/lib/modules/translation/controllers/translation_controller.dart index 8c63c903d..dcb70b5ba 100644 --- a/lib/modules/translation/controllers/translation_controller.dart +++ b/lib/modules/translation/controllers/translation_controller.dart @@ -234,7 +234,7 @@ class TranslationController extends GetxController with WidgetsBindingObserver { Future changeTranslationMode(String mode) async { currentMode.value = mode; currentModeTitle.value = _getModeTitle(mode); - stopAll(); + //stopAll(); // 检查悬浮窗支持情况 if (isFloatingWindowEnabled.value && !_isFloatingWindowSupportedMode()) { @@ -592,7 +592,7 @@ class TranslationController extends GetxController with WidgetsBindingObserver { sourceLanguageCode.value, targetLanguageCode.value ]; - Logger.info('2初始化ASR服务,支持语言: $asrSupportedLanguages'); + //Logger.info('2初始化ASR服务,支持语言: $asrSupportedLanguages'); //await _asrService.initialize(supportedLanguages: asrSupportedLanguages); @@ -640,7 +640,7 @@ class TranslationController extends GetxController with WidgetsBindingObserver { sourceLanguageCode.value, targetLanguageCode.value ]; - + Logger.info('1初始化AST服务,支持语言: $callModeLanguages'); //ast=asr+translate await _astService.initialize(supportedLanguages: callModeLanguages); Logger.info('通话模式语音翻译服务初始化完成'); } catch (e) { @@ -656,8 +656,9 @@ class TranslationController extends GetxController with WidgetsBindingObserver { _voiceInteractionSubscription?.cancel(); _translationDebounceTimer?.cancel(); restoreOtherServices(); - _asrService.dispose(); - _astService.dispose(); + // 移除对服务的 dispose,避免频繁销毁/重建造成卡顿 + // _asrService.dispose(); + // _astService.dispose(); // 释放管理器资源 _timerManager.dispose();