Browse Source

feat(会议助手): 添加极速版语音识别服务支持

添加 MeetingTaskService2 作为火山引擎极速版语音识别服务实现
修改相关控制器和服务以支持双版本语音识别服务切换
根据音频时长自动选择标准版或极速版服务
newdev_shunjiawei
lxm 11 months ago
parent
commit
ce5f8b3faa
  1. 3
      lib/core/bindings/initial_binding.dart
  2. 1
      lib/data/services/meeting/meeting_task_service.dart
  3. 1155
      lib/data/services/meeting/meeting_task_service2.dart
  4. 39
      lib/data/services/meeting/meeting_upload_service.dart
  5. 27
      lib/data/services/meeting/summary_task_service.dart
  6. 46
      lib/modules/meeting/controllers/meeting_details_controller.dart
  7. 3
      lib/modules/meeting/controllers/meeting_home_controller.dart

3
lib/core/bindings/initial_binding.dart

@ -11,6 +11,7 @@ import '../../../data/services/ast_service.dart';
import '../../../data/services/speech_impl/azure_ast_service.dart'; import '../../../data/services/speech_impl/azure_ast_service.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import '../../data/services/meeting/meeting_task_service.dart'; import '../../data/services/meeting/meeting_task_service.dart';
import '../../data/services/meeting/meeting_task_service2.dart';
import '../../data/services/meeting/meeting_upload_service.dart'; import '../../data/services/meeting/meeting_upload_service.dart';
import '../../data/services/novice_guide_service.dart'; import '../../data/services/novice_guide_service.dart';
import '../../data/services/speech_factory.dart'; import '../../data/services/speech_factory.dart';
@ -70,6 +71,8 @@ class InitialBinding extends Bindings {
// 会议助手任务服务 // 会议助手任务服务
Get.lazyPut<MeetingTaskService>(() => MeetingTaskService(), fenix: true); Get.lazyPut<MeetingTaskService>(() => MeetingTaskService(), fenix: true);
// 会议助手任务服务(极速识别版)
Get.lazyPut<MeetingTaskService2>(() => MeetingTaskService2(), fenix: true);
// 会议助手总结任务服务 // 会议助手总结任务服务
Get.lazyPut<SummaryTaskService>(() => SummaryTaskService(), fenix: true); Get.lazyPut<SummaryTaskService>(() => SummaryTaskService(), fenix: true);

1
lib/data/services/meeting/meeting_task_service.dart

@ -12,6 +12,7 @@ import '../../../data/models/appconfig.dart';
import 'summary_task_service.dart'; import 'summary_task_service.dart';
///会议任务服务类,负责管理会议音频的转写任务处理流程,包括任务提交、状态轮询、结果处理和AI分析等功能。 ///会议任务服务类,负责管理会议音频的转写任务处理流程,包括任务提交、状态轮询、结果处理和AI分析等功能。
///火山引擎录音文件识别大模型-标准版
class MeetingTaskService extends GetxService { class MeetingTaskService extends GetxService {
final GetStorage _storage = GetStorage(); final GetStorage _storage = GetStorage();

1155
lib/data/services/meeting/meeting_task_service2.dart

File diff suppressed because it is too large

39
lib/data/services/meeting/meeting_upload_service.dart

@ -5,6 +5,7 @@ import '../../../core/utils/logger.dart';
import '../../../core/utils/upload_oss.dart'; import '../../../core/utils/upload_oss.dart';
import '../db/sqflite_api.dart'; import '../db/sqflite_api.dart';
import 'meeting_task_service.dart'; import 'meeting_task_service.dart';
import 'meeting_task_service2.dart';
class MeetingUploadService extends GetxService { class MeetingUploadService extends GetxService {
final _taskService = Get.find<MeetingTaskService>(); final _taskService = Get.find<MeetingTaskService>();
@ -43,6 +44,12 @@ class MeetingUploadService extends GetxService {
String rootDir, { String rootDir, {
bool isUpload = true, bool isUpload = true,
}) async { }) async {
bool flash = false;
try {
final details = await SqfliteApi.getMeetingDetails(id);
final int seconds = (details['seconds'] ?? 0) as int;
flash = seconds > 0 && seconds <= 7200;
} catch (_) {}
uploadList.add({ uploadList.add({
'id': id, 'id': id,
'filepath': filePath, 'filepath': filePath,
@ -53,6 +60,7 @@ class MeetingUploadService extends GetxService {
'language': '', 'language': '',
'prompt': '', 'prompt': '',
'outline': '', 'outline': '',
'useFlashASR': flash,
}); });
_storage.write("meeting_upload_list", uploadList); _storage.write("meeting_upload_list", uploadList);
if (isUpload) { if (isUpload) {
@ -82,15 +90,28 @@ class MeetingUploadService extends GetxService {
{'audiourl': audiourl}, {'audiourl': audiourl},
); );
if (element['isTask']) { if (element['isTask']) {
await _taskService.addTaskList( if (element['useFlashASR'] == true) {
element['id'], final service2 = Get.find<MeetingTaskService2>();
audiourl, await service2.addTaskList(
'', element['id'],
element['isSpeaker'], audiourl,
element['language'], isSpeaker: element['isSpeaker'],
element['prompt'], language: element['language'],
element['outline'], targetLanguage: '',
); prompt: element['prompt'],
outline: element['outline'],
);
} else {
await _taskService.addTaskList(
element['id'],
audiourl,
'',
element['isSpeaker'],
element['language'],
element['prompt'],
element['outline'],
);
}
} }
element['audiourl'] = audiourl; element['audiourl'] = audiourl;
uploadProgress.value = 0.0; uploadProgress.value = 0.0;

27
lib/data/services/meeting/summary_task_service.dart

@ -5,9 +5,11 @@ import '../../../core/utils/logger.dart';
import '../db/sqflite_api.dart'; import '../db/sqflite_api.dart';
import '../deapsound_ai_service.dart'; import '../deapsound_ai_service.dart';
import 'meeting_task_service.dart'; import 'meeting_task_service.dart';
import 'meeting_task_service2.dart';
class SummaryTaskService extends GetxService { class SummaryTaskService extends GetxService {
final _taskService = Get.find<MeetingTaskService>(); final _taskService = Get.find<MeetingTaskService>();
final _taskService2 = Get.find<MeetingTaskService2>();
final GetStorage _storage = GetStorage(); final GetStorage _storage = GetStorage();
@ -137,11 +139,24 @@ class SummaryTaskService extends GetxService {
'summary': summaryText, 'summary': summaryText,
'overview': overviewText, 'overview': overviewText,
}); });
// 更新 V1 Service 状态
if (id == _taskService.meetingId) { if (id == _taskService.meetingId) {
summary = summaryText; summary = summaryText;
overview = overviewText; overview = overviewText;
_taskService.tasktype.value = 3; _taskService.tasktype.value = 3;
} }
// 更新 V2 Service 状态
if (id == _taskService2.meetingId) {
summary = summaryText;
overview = overviewText;
_taskService2.summary = summaryText;
_taskService2.overview = overviewText;
_taskService2.tasktype.value = 3;
}
// 更新 V1 任务完成列表
Map taskFinishData = _taskService.taskFinishList.firstWhere( Map taskFinishData = _taskService.taskFinishList.firstWhere(
(element) => element['id'] == id, (element) => element['id'] == id,
orElse: () => {}, orElse: () => {},
@ -151,6 +166,18 @@ class SummaryTaskService extends GetxService {
_taskService.taskFinishList.refresh(); _taskService.taskFinishList.refresh();
} }
_storage.write("meeting_task_finish_list", _taskService.taskFinishList); _storage.write("meeting_task_finish_list", _taskService.taskFinishList);
// 更新 V2 任务完成列表
Map taskFinishData2 = _taskService2.taskFinishList.firstWhere(
(element) => element['id'] == id,
orElse: () => {},
);
if (taskFinishData2.isNotEmpty) {
taskFinishData2['tasktype'] = 3;
_taskService2.taskFinishList.refresh();
}
_storage.write("meeting_task_finish_list_v2", _taskService2.taskFinishList);
_taskList.removeWhere((element) => element['id'] == id); _taskList.removeWhere((element) => element['id'] == id);
_storage.write("summary_task_list", _taskList); _storage.write("summary_task_list", _taskList);
_isTask = false; _isTask = false;

46
lib/modules/meeting/controllers/meeting_details_controller.dart

@ -14,6 +14,7 @@ import 'package:path_provider/path_provider.dart';
import '../../../core/utils/synchrodata.dart'; import '../../../core/utils/synchrodata.dart';
import '../../../data/services/db/sqflite_api.dart'; import '../../../data/services/db/sqflite_api.dart';
import '../../../data/services/meeting/meeting_task_service.dart'; import '../../../data/services/meeting/meeting_task_service.dart';
import '../../../data/services/meeting/meeting_task_service2.dart';
import '../../../data/services/meeting/meeting_upload_service.dart'; import '../../../data/services/meeting/meeting_upload_service.dart';
import '../../../data/services/meeting/summary_task_service.dart'; import '../../../data/services/meeting/summary_task_service.dart';
import '../model/meeting_details_model.dart'; import '../model/meeting_details_model.dart';
@ -28,9 +29,11 @@ class MeetingDetailsController extends GetxController
late AnimationController lottieController; late AnimationController lottieController;
late final Worker _tasktypeListener; late final Worker _tasktypeListener;
late final Worker _tasktypeListenerV2;
final _meetingUploadService = Get.find<MeetingUploadService>(); final _meetingUploadService = Get.find<MeetingUploadService>();
final _meetingTaskService = Get.find<MeetingTaskService>(); final _meetingTaskService = Get.find<MeetingTaskService>();
final _meetingTaskService2 = Get.find<MeetingTaskService2>();
final _summaryTaskService = Get.find<SummaryTaskService>(); final _summaryTaskService = Get.find<SummaryTaskService>();
final PlayerController playerController = PlayerController(); final PlayerController playerController = PlayerController();
@ -106,11 +109,25 @@ class MeetingDetailsController extends GetxController
} }
meetingDetails.refresh(); meetingDetails.refresh();
}); });
_tasktypeListenerV2 = ever(_meetingTaskService2.tasktype, (value) {
meetingDetails.value.tasktype = value;
if (_everType <= value) {
if (value == 2) {
textList.value = _meetingTaskService2.textList;
} else if (value == 3) {
meetingDetails.value.summary = _meetingTaskService2.summary;
meetingDetails.value.overview = _meetingTaskService2.overview;
summaryNumberModifications.value++;
}
}
meetingDetails.refresh();
});
} }
@override @override
void onClose() { void onClose() {
_tasktypeListener.dispose(); _tasktypeListener.dispose();
_tasktypeListenerV2.dispose();
_currentDurationSubscription?.cancel(); _currentDurationSubscription?.cancel();
_playerStateSubscription?.cancel(); _playerStateSubscription?.cancel();
tabController.dispose(); tabController.dispose();
@ -122,6 +139,7 @@ class MeetingDetailsController extends GetxController
void popInvokedWithResult(didPop, result) async { void popInvokedWithResult(didPop, result) async {
_meetingUploadService.removeUpload(id); _meetingUploadService.removeUpload(id);
_meetingTaskService.removeTask(id); _meetingTaskService.removeTask(id);
_meetingTaskService2.removeTask(id);
_meetingTaskService.meetingId = 0; _meetingTaskService.meetingId = 0;
} }
@ -257,10 +275,30 @@ class MeetingDetailsController extends GetxController
bool isSpeaker, String language, String prompt, String outline) async { bool isSpeaker, String language, String prompt, String outline) async {
EasyLoading.show(); EasyLoading.show();
_everType = 2; _everType = 2;
String audiourl = meetingData.value.audiourl; final String audiourl = meetingData.value.audiourl;
String taskId = meetingDetails.value.taskid; final int seconds = meetingData.value.seconds;
await _meetingTaskService.addTask( if (seconds > 0 && seconds <= 7200) {
id, audiourl, taskId, isSpeaker, language, prompt, outline); await _meetingTaskService2.addTask(
id,
audiourl,
isSpeaker: isSpeaker,
language: language,
targetLanguage: '',
prompt: prompt,
outline: outline,
);
} else {
final String taskId = meetingDetails.value.taskid;
await _meetingTaskService.addTask(
id,
audiourl,
taskId,
isSpeaker,
language,
prompt,
outline,
);
}
meetingDetails.value.tasktype = 1; meetingDetails.value.tasktype = 1;
meetingDetails.refresh(); meetingDetails.refresh();
EasyLoading.dismiss(); EasyLoading.dismiss();

3
lib/modules/meeting/controllers/meeting_home_controller.dart

@ -19,6 +19,7 @@ import '../../../core/utils/permission_util.dart';
import 'package:share_plus/share_plus.dart'; import 'package:share_plus/share_plus.dart';
import '../../../data/services/meeting/meeting_task_service.dart'; import '../../../data/services/meeting/meeting_task_service.dart';
import '../../../data/services/meeting/meeting_task_service2.dart';
import '../../../data/services/meeting/meeting_upload_service.dart'; import '../../../data/services/meeting/meeting_upload_service.dart';
import '../../../data/services/meeting/summary_task_service.dart'; import '../../../data/services/meeting/summary_task_service.dart';
import '../../../routes/app_routes.dart'; import '../../../routes/app_routes.dart';
@ -29,6 +30,7 @@ class MeetingHomeController extends GetxController {
final meetingController = Get.find<MeetingController>(); final meetingController = Get.find<MeetingController>();
final meetingUploadService = Get.find<MeetingUploadService>(); final meetingUploadService = Get.find<MeetingUploadService>();
final meetingTaskService = Get.find<MeetingTaskService>(); final meetingTaskService = Get.find<MeetingTaskService>();
final meetingTaskService2 = Get.find<MeetingTaskService2>();
final summaryTaskService = Get.find<SummaryTaskService>(); final summaryTaskService = Get.find<SummaryTaskService>();
final AudioPlayer _audioPlayer = AudioPlayer(); final AudioPlayer _audioPlayer = AudioPlayer();
@ -585,6 +587,7 @@ class MeetingHomeController extends GetxController {
_deleteFile(filepath); _deleteFile(filepath);
meetingUploadService.removeUpload(id, isDeleteTask: true); meetingUploadService.removeUpload(id, isDeleteTask: true);
meetingTaskService.removeTask(id, isDeleteTask: true); meetingTaskService.removeTask(id, isDeleteTask: true);
meetingTaskService2.removeTask(id, isDeleteTask: true);
} }
// 删除文件 // 删除文件

Loading…
Cancel
Save