Browse Source

fix(speech): 修复语音服务资源释放问题

确保语音服务在关闭时正确释放底层资源
移除翻译控制器中不必要的服务销毁调用以避免性能问题
newdev_shunjiawei
lxm 11 months ago
parent
commit
39760e4c35
  1. 7
      lib/data/services/speech_impl/azure_asr_service.dart
  2. 24
      lib/data/services/speech_impl/azure_ast_service.dart
  3. 11
      lib/modules/translation/controllers/translation_controller.dart

7
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<RecognitionEvent> recognizeOnce() async {
if (!_isInitialized) {

24
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<void> 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;
}
}

11
lib/modules/translation/controllers/translation_controller.dart

@ -234,7 +234,7 @@ class TranslationController extends GetxController with WidgetsBindingObserver {
Future<void> 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();

Loading…
Cancel
Save