|
|
|
@ -3,18 +3,23 @@ import 'dart:io'; |
|
|
|
import 'dart:typed_data'; |
|
|
|
|
|
|
|
import 'package:flutter/material.dart'; |
|
|
|
import 'package:flutter_easyloading/flutter_easyloading.dart'; |
|
|
|
import 'package:get/get.dart'; |
|
|
|
import 'package:path_provider/path_provider.dart'; |
|
|
|
import 'package:permission_handler/permission_handler.dart'; |
|
|
|
|
|
|
|
import '../../../core/utils/logger.dart'; |
|
|
|
import '../../../data/services/ai_service.dart'; |
|
|
|
import '../../../data/services/asr_service.dart'; |
|
|
|
import '../../../data/services/db/sqflite_api.dart'; |
|
|
|
import '../../../data/services/speech_impl/xunfei_asr_service.dart'; |
|
|
|
import '../../../data/services/volcano_ai_service.dart'; |
|
|
|
import 'meeting_controller.dart'; |
|
|
|
|
|
|
|
class MeetingRecordController extends GetxController |
|
|
|
with GetSingleTickerProviderStateMixin { |
|
|
|
late AiService _aiService; |
|
|
|
|
|
|
|
final MeetingController meetingController = Get.find<MeetingController>(); |
|
|
|
|
|
|
|
late AnimationController lottieController; |
|
|
|
@ -28,6 +33,10 @@ class MeetingRecordController extends GetxController |
|
|
|
String title = ''; |
|
|
|
int creationTime = 0; |
|
|
|
|
|
|
|
RxString address = '深圳市高新技术产业园区W2-A座'.obs; |
|
|
|
String _longitude = ''; |
|
|
|
String _latitude = ''; |
|
|
|
|
|
|
|
RxString intermediateContent = ''.obs; |
|
|
|
RxString finalContent = ''.obs; |
|
|
|
|
|
|
|
@ -75,7 +84,7 @@ class MeetingRecordController extends GetxController |
|
|
|
} |
|
|
|
|
|
|
|
// 暂停 |
|
|
|
void _pause() async { |
|
|
|
Future<void> _pause() async { |
|
|
|
await _stopRecorder(); |
|
|
|
lottieController.stop(); |
|
|
|
isRecording.value = false; |
|
|
|
@ -150,7 +159,9 @@ class MeetingRecordController extends GetxController |
|
|
|
// 完成 |
|
|
|
void complete() async { |
|
|
|
if (await Permission.storage.request().isGranted) { |
|
|
|
_save(); |
|
|
|
EasyLoading.show(); |
|
|
|
await _pause(); |
|
|
|
_aiSummary(); |
|
|
|
} else { |
|
|
|
Get.snackbar( |
|
|
|
'error'.tr, // 错误 |
|
|
|
@ -162,7 +173,19 @@ class MeetingRecordController extends GetxController |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void _save() async { |
|
|
|
void _aiSummary() async { |
|
|
|
_aiService = Get.find<VolcanoAIService>(); |
|
|
|
String aiSummary = await _aiService.sendMessage( |
|
|
|
systemPrompt: '', |
|
|
|
messages: [ |
|
|
|
{'role': 'user', 'content': finalContent.value}, |
|
|
|
{'role': 'user', 'content': '帮我总结一下这次会议'}, |
|
|
|
], |
|
|
|
); |
|
|
|
_save(aiSummary); |
|
|
|
} |
|
|
|
|
|
|
|
void _save(String aiSummary) async { |
|
|
|
String firstContent = finalContent.value.length >= 30 |
|
|
|
? finalContent.value.substring(0, 30) |
|
|
|
: finalContent.value; |
|
|
|
@ -176,26 +199,32 @@ class MeetingRecordController extends GetxController |
|
|
|
Uint8List wavData = Uint8List.fromList([...wavHeader, ...audio]); |
|
|
|
String audiopPath = |
|
|
|
await _saveAudioToFile(wavData, 'meeting_$creationTime.wav'); |
|
|
|
if (audiopPath.isEmpty) return; |
|
|
|
Map<String, Object?> data = { |
|
|
|
'title': title, |
|
|
|
'firstContent': firstContent.replaceAll("\n", ""), |
|
|
|
'seconds': seconds.value, |
|
|
|
'creationTime': creationTime, |
|
|
|
'audio': audiopPath, |
|
|
|
'content': finalContent.value, |
|
|
|
}; |
|
|
|
final result = await SqfliteApi.insertMeeting(data); |
|
|
|
if (result != null) { |
|
|
|
meetingController.dataList.insert(0, { |
|
|
|
'id': result, |
|
|
|
if (audiopPath.isNotEmpty) { |
|
|
|
Map<String, Object?> data = { |
|
|
|
'title': title, |
|
|
|
'content': firstContent, |
|
|
|
'firstContent': firstContent.replaceAll("\n", ""), |
|
|
|
'seconds': seconds.value, |
|
|
|
'creationtime': creationTime, |
|
|
|
}); |
|
|
|
Get.back(); |
|
|
|
'creationTime': creationTime, |
|
|
|
'audio': audiopPath, |
|
|
|
'content': finalContent.value, |
|
|
|
'aisummary': aiSummary, |
|
|
|
'address': address.value, |
|
|
|
'longitude': _longitude, |
|
|
|
'latitude': _latitude, |
|
|
|
}; |
|
|
|
final result = await SqfliteApi.insertMeeting(data); |
|
|
|
if (result != null) { |
|
|
|
meetingController.dataList.insert(0, { |
|
|
|
'id': result, |
|
|
|
'title': title, |
|
|
|
'content': firstContent, |
|
|
|
'seconds': seconds.value, |
|
|
|
'creationtime': creationTime, |
|
|
|
}); |
|
|
|
Get.back(); |
|
|
|
} |
|
|
|
} |
|
|
|
EasyLoading.dismiss(); |
|
|
|
} |
|
|
|
|
|
|
|
Future<String> _saveAudioToFile(Uint8List audioData, String fileName) async { |
|
|
|
|