import 'package:get/get.dart'; import 'asr_service.dart'; import 'tts_service.dart'; import 'speech_impl/azure_asr_service.dart'; import 'speech_impl/azure_tts_service.dart'; import '../../core/utils/logger.dart'; /// 语音服务类型 enum SpeechServiceType { /// Azure 语音服务 azure, /// 科大讯飞语音服务 iflytek, /// Google 语音服务 google, /// 阿里巴巴语音服务(旧版 qwen3-livetranslate-flash-realtime,无声音复刻) alibaba, /// 阿里巴巴语音服务 3.5(qwen3.5-livetranslate-flash-realtime,带实时声音复刻) /// /// 与 [alibaba] 是**同一套 WebSocket 协议、同一个原生 helper**,只差 /// `model` 参数和 `enable_voice_clone` 两个开关,所以下发给原生的 /// provider 字符串仍然是 `alibaba`(见 AzureAstService.initialize), /// 原生不需要为它多一个分支。 alibaba35, /// 火山引擎(豆包)语音服务 volcano, /// Flutter 本地语音服务 flutter, } /// 语音服务工厂类 /// /// 用于根据配置信息获取不同的TTS和ASR实现 class SpeechFactory extends GetxService { static SpeechFactory get to => Get.find(); /// 当前使用的语音服务类型 SpeechServiceType _currentServiceType = SpeechServiceType.azure; /// 获取当前使用的语音服务类型 SpeechServiceType get currentServiceType => _currentServiceType; /// 设置语音服务类型 void setServiceType(SpeechServiceType type) { if (_currentServiceType != type) { _currentServiceType = type; Logger.info('语音服务类型已切换为: ${type.toString().split('.').last}'); // 重新注册服务 _registerServices(); } } /// 注册语音服务 void _registerServices() { // 注销现有服务 if (Get.isRegistered()) { Get.delete(force: true); } if (Get.isRegistered()) { Get.delete(force: true); } Get.lazyPut(() => AzureAsrService()); Get.lazyPut(() => AzureTtsService()); } /// 初始化语音服务 Future initialize({SpeechServiceType? initialType}) async { try { // 注册服务 _registerServices(); // // 初始化服务 // final asrService = Get.find(); // final ttsService = Get.find(); // await asrService.initialize(); // await ttsService.initialize(); Logger.info( '语音服务初始化完成,当前类型: ${_currentServiceType.toString().split('.').last}'); } catch (e) { Logger.error('语音服务初始化失败: ${e.toString()}'); rethrow; } } /// 获取ASR服务 AsrService getAsrService() { if (!Get.isRegistered()) { _registerServices(); } return Get.find(); } /// 获取TTS服务 TtsService getTtsService() { if (!Get.isRegistered()) { _registerServices(); } return Get.find(); } }