You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
112 lines
3.0 KiB
112 lines
3.0 KiB
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<SpeechFactory>();
|
|
|
|
/// 当前使用的语音服务类型
|
|
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<AsrService>()) {
|
|
Get.delete<AsrService>(force: true);
|
|
}
|
|
|
|
if (Get.isRegistered<TtsService>()) {
|
|
Get.delete<TtsService>(force: true);
|
|
}
|
|
|
|
Get.lazyPut<AsrService>(() => AzureAsrService());
|
|
Get.lazyPut<TtsService>(() => AzureTtsService());
|
|
}
|
|
|
|
/// 初始化语音服务
|
|
Future<void> initialize({SpeechServiceType? initialType}) async {
|
|
try {
|
|
// 注册服务
|
|
_registerServices();
|
|
|
|
// // 初始化服务
|
|
// final asrService = Get.find<AsrService>();
|
|
// final ttsService = Get.find<TtsService>();
|
|
|
|
// 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<AsrService>()) {
|
|
_registerServices();
|
|
}
|
|
return Get.find<AsrService>();
|
|
}
|
|
|
|
/// 获取TTS服务
|
|
TtsService getTtsService() {
|
|
if (!Get.isRegistered<TtsService>()) {
|
|
_registerServices();
|
|
}
|
|
return Get.find<TtsService>();
|
|
}
|
|
}
|
|
|