Browse Source

Merge branch 'new_dev' of https://github.com/deepcloud2048/deep_voice into new_dev

newdev_shunjiawei
liwei1dao 12 months ago
parent
commit
bc6ef8cb0a
  1. 202
      lib/data/services/db/database_helper.dart
  2. 41
      lib/data/services/db/sqflite_api.dart
  3. 43
      lib/data/services/meeting/meeting_task_service.dart
  4. 12
      lib/data/services/meeting/meeting_upload_service.dart
  5. 9
      lib/data/services/network/api.dart
  6. 9
      lib/modules/login/controllers/login_controller.dart
  7. 9
      lib/modules/meeting/controllers/meeting_details_controller.dart
  8. 11
      lib/modules/meeting/views/bottomSheet/generate_bottom_sheet.dart

202
lib/data/services/db/database_helper.dart

@ -104,6 +104,7 @@ class DatabaseHelper {
icon TEXT,
tag TEXT,
desc TEXT,
outline TEXT,
prompt TEXT
)
''');
@ -112,207 +113,6 @@ class DatabaseHelper {
'synctime': 0,
'privatecloud': 0,
});
// 商务会议助手插入默认模版
batch.insert('meetingcategorytemplate', {
'id': 1,
'name': '通用',
});
batch.insert('meetingcategorytemplate', {
'id': 2,
'name': '会议',
});
batch.insert('meetingcategorytemplate', {
'id': 3,
'name': '演讲',
});
batch.insert('meetingcategorytemplate', {
'id': 4,
'name': '自定义',
});
batch.insert('meetingtemplate', {
'categoryid': 1,
'name': '会议纪要',
'icon': 'auto_stories',
'tag': '主题, 代办事项',
'desc': '旨在概述和回顾项目内容,重点捕捉所提话题的精髓和关键点',
'prompt': '提示词',
});
batch.insert('meetingtemplate', {
'categoryid': 1,
'name': 'Autopilot',
'icon': 'auto_graph',
'tag': '自适应结构, 全场景适配',
'desc': '旨在概述和回顾项目内容,重点捕捉所提话题的精髓和关键点',
'prompt': '提示词',
});
batch.insert('meetingtemplate', {
'categoryid': 1,
'name': '推理Autopilot',
'icon': 'add_to_drive_outlined',
'tag': '推理模型, 自动结构化',
'desc': '旨在概述和回顾项目内容,重点捕捉所提话题的精髓和关键点',
'prompt': '提示词',
});
batch.insert('meetingtemplate', {
'categoryid': 1,
'name': '通话',
'icon': 'perm_phone_msg',
'tag': '主题, 代办事项',
'desc': '旨在概述和回顾项目内容,重点捕捉所提话题的精髓和关键点',
'prompt': '提示词',
});
batch.insert('meetingtemplate', {
'categoryid': 1,
'name': '项目计划',
'icon': 'assignment',
'tag': '目标, 里程碑',
'desc': '用于规划项目阶段和关键节点,跟踪项目执行进度',
'prompt': '请按时间顺序整理项目阶段'
});
batch.insert('meetingtemplate', {
'categoryid': 1,
'name': '头脑风暴',
'icon': 'lightbulb',
'tag': '创意, 发散思维',
'desc': '记录创意发散过程,结构化整理核心创意点',
'prompt': '请将讨论内容按创新性排序'
});
batch.insert('meetingtemplate', {
'categoryid': 1,
'name': '日常记录',
'icon': 'note',
'tag': '日志, 每日总结',
'desc': '自动化生成结构化日报,自动提取工作亮点与待办事项',
'prompt': '请按优先级排列今日工作事项'
});
batch.insert('meetingtemplate', {
'categoryid': 2,
'name': '咨询',
'icon': 'auto_stories',
'tag': '主题, 代办事项',
'desc': '旨在概述和回顾项目内容,重点捕捉所提话题的精髓和关键点',
'prompt': '提示词',
});
batch.insert('meetingtemplate', {
'categoryid': 2,
'name': '讨论',
'icon': 'auto_graph',
'tag': '自适应结构, 全场景适配',
'desc': '旨在概述和回顾项目内容,重点捕捉所提话题的精髓和关键点',
'prompt': '提示词',
});
batch.insert('meetingtemplate', {
'categoryid': 2,
'name': '汇报',
'icon': 'add_to_drive_outlined',
'tag': '推理模型, 自动结构化',
'desc': '旨在概述和回顾项目内容,重点捕捉所提话题的精髓和关键点',
'prompt': '提示词',
});
batch.insert('meetingtemplate', {
'categoryid': 2,
'name': '任务分配',
'icon': 'perm_phone_msg',
'tag': '主题, 代办事项',
'desc': '旨在概述和回顾项目内容,重点捕捉所提话题的精髓和关键点',
'prompt': '提示词',
});
batch.insert('meetingtemplate', {
'categoryid': 2,
'name': '评审会议',
'icon': 'rate_review',
'tag': '质量评估, 改进建议',
'desc': '用于评估项目阶段成果,生成改进建议和风险评估',
'prompt': '请按优先级列出需要改进的环节'
});
batch.insert('meetingtemplate', {
'categoryid': 2,
'name': '周例会',
'icon': 'event_repeat',
'tag': '进度汇报, 计划制定',
'desc': '自动生成每周工作进展摘要,识别延期风险',
'prompt': '请按部门分类整理工作进度'
});
batch.insert('meetingtemplate', {
'categoryid': 2,
'name': '客户洽谈',
'icon': 'handshake',
'tag': '需求沟通, 合同条款',
'desc': '记录客户核心诉求和合作关键条款',
'prompt': '请按优先级排列客户需求'
});
batch.insert('meetingtemplate', {
'categoryid': 2,
'name': '项目复盘',
'icon': 'restart_alt',
'tag': '经验总结, 问题分析',
'desc': '自动生成项目得失分析报告',
'prompt': '请按影响程度排序待改进项'
});
batch.insert('meetingtemplate', {
'categoryid': 3,
'name': '课堂笔记',
'icon': 'auto_stories',
'tag': '主题, 代办事项',
'desc': '旨在概述和回顾项目内容,重点捕捉所提话题的精髓和关键点',
'prompt': '提示词',
});
batch.insert('meetingtemplate', {
'categoryid': 3,
'name': '讲座',
'icon': 'auto_graph',
'tag': '自适应结构, 全场景适配',
'desc': '旨在概述和回顾项目内容,重点捕捉所提话题的精髓和关键点',
'prompt': '提示词',
});
batch.insert('meetingtemplate', {
'categoryid': 3,
'name': '培训',
'icon': 'add_to_drive_outlined',
'tag': '推理模型, 自动结构化',
'desc': '旨在概述和回顾项目内容,重点捕捉所提话题的精髓和关键点',
'prompt': '提示词',
});
batch.insert('meetingtemplate', {
'categoryid': 3,
'name': 'Sermon',
'icon': 'perm_phone_msg',
'tag': '主题, 代办事项',
'desc': '旨在概述和回顾项目内容,重点捕捉所提话题的精髓和关键点',
'prompt': '提示词',
});
batch.insert('meetingtemplate', {
'categoryid': 3,
'name': '产品发布会',
'icon': 'rocket_launch',
'tag': '功能展示, 市场定位',
'desc': '结构化整理产品核心卖点和市场差异化特征',
'prompt': '请按用户场景分类产品功能'
});
batch.insert('meetingtemplate', {
'categoryid': 3,
'name': '技术分享',
'icon': 'code',
'tag': '知识传递, 最佳实践',
'desc': '自动提取技术要点和可复用代码片段',
'prompt': '请按技术难度分级整理内容'
});
batch.insert('meetingtemplate', {
'categoryid': 3,
'name': '投资者路演',
'icon': 'bar_chart',
'tag': '财务数据, 商业模式',
'desc': '自动提取核心财务指标和增长预期',
'prompt': '请按投资关注度整理内容'
});
batch.insert('meetingtemplate', {
'categoryid': 3,
'name': '学术报告',
'icon': 'school',
'tag': '研究成果, 数据分析',
'desc': '结构化整理实验数据和学术论点',
'prompt': '请按研究重要性排序结论'
});
await batch.commit();
}
}

41
lib/data/services/db/sqflite_api.dart

@ -210,6 +210,47 @@ class SqfliteApi {
await db.insert('meetingai', meeting);
}
// 初始化模版
static Future initMeetingTemplate(List data) async {
final db = await DatabaseHelper().database;
await db.transaction((txn) async {
// 清空旧数据
await txn.delete('meetingtemplate');
await txn.delete('meetingcategorytemplate');
List categoryList = [];
for (var i = 0; i < data.length; i++) {
Map item = data[i];
int index = categoryList.indexOf(item['ttype']);
int categoryId = categoryList.length;
if (index == -1) {
categoryList.add(item['ttype']);
categoryId++;
await txn.insert('meetingcategorytemplate', {
'id': categoryId,
'name': item['ttype'],
});
}
await txn.insert('meetingtemplate', {
'categoryid': categoryId,
'name': item['title'],
'icon': item['icon'],
'tag': item['tags'],
'desc': item['description'],
'outline': item['outline'],
'prompt': item['template'],
});
}
if (!categoryList.contains('自定义')) {
await txn.insert('meetingcategorytemplate', {
'id': categoryList.length + 1,
'name': '自定义',
});
}
});
}
// 获取商务会议助手所有分类模版列表
static Future getMeetingCategoryTemplateList() async {
final db = await DatabaseHelper().database;

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

@ -6,7 +6,6 @@ import 'package:http/http.dart' as http;
import '../../../core/utils/logger.dart';
import '../../../core/utils/synchrodata.dart';
import '../../models/appconfig.dart';
import '../db/sqflite_api.dart';
import '../deapsound_ai_service.dart';
import 'meeting_upload_service.dart';
@ -21,7 +20,6 @@ class MeetingTaskService extends GetxService {
bool _isTask = false;
String _systemPrompt = '';
String _userId = '';
final String _appid = '2316081933';
@ -50,7 +48,6 @@ class MeetingTaskService extends GetxService {
void _getAgent() async {
Map userInfo = _storage.read("user_info");
_userId = userInfo['user']['uid'];
_systemPrompt = AppConfig.agentsystemPrompt("meet_assistant") ?? '';
}
void _getTaskList() {
@ -59,7 +56,8 @@ class MeetingTaskService extends GetxService {
_executeTask();
}
Future<void> addTask(int id, String audiourl, String taskid) async {
Future<void> addTask(int id, String audiourl, String taskid, String language,
String prompt, String outline) async {
if (audiourl.isEmpty) {
Map uploadData = _uploadService.uploadList.firstWhere(
(element) => element['id'] == id,
@ -68,24 +66,31 @@ class MeetingTaskService extends GetxService {
if (uploadData.isNotEmpty) {
if (uploadData['audiourl'].isEmpty) {
uploadData['isTask'] = true;
uploadData['language'] = language;
uploadData['prompt'] = prompt;
uploadData['outline'] = outline;
} else {
await addTaskList(id, uploadData['audiourl'], taskid);
await addTaskList(
id, uploadData['audiourl'], taskid, language, prompt, outline);
}
}
} else {
await addTaskList(id, audiourl, taskid);
await addTaskList(id, audiourl, taskid, language, prompt, outline);
}
}
Future<void> addTaskList(int id, String audiourl, String taskId) async {
Future<void> addTaskList(int id, String audiourl, String taskId,
String language, String prompt, String outline) async {
if (taskId.isEmpty) {
taskId = await _submitTask(audiourl);
taskId = await _submitTask(audiourl, language);
}
await SqfliteApi.editMeeting(id, {'tasktype': 1, 'taskid': taskId});
_taskList.add({
'id': id,
'taskid': taskId,
'tasktype': 1,
'prompt': prompt,
'outline': outline,
});
taskFinishList.add({
'id': id,
@ -126,7 +131,7 @@ class MeetingTaskService extends GetxService {
}
}
Future<String> _submitTask(String audiourl) async {
Future<String> _submitTask(String audiourl, String language) async {
String format = _getFileType(audiourl);
final requestBody = jsonEncode({
@ -143,6 +148,7 @@ class MeetingTaskService extends GetxService {
"url": audiourl,
},
"additions": {
"language": language,
"with_speaker_info": "True",
}
});
@ -206,7 +212,12 @@ class MeetingTaskService extends GetxService {
var code = respDic['resp']['code'] as int;
if (code == 1000) {
await _addTextList(item['id'], respDic['resp']['utterances']);
await _addTextList(
item['id'],
respDic['resp']['utterances'],
item['prompt'],
item['outline'],
);
return;
} else if (code < 2000) {
Logger.debug("FileRecognize failed");
@ -217,7 +228,8 @@ class MeetingTaskService extends GetxService {
}
}
Future<void> _addTextList(int id, List utterances) async {
Future<void> _addTextList(
int id, List utterances, String prompt, String outline) async {
String text = '';
String personnel = '';
List<Map<String, Object?>> list = [];
@ -267,10 +279,10 @@ class MeetingTaskService extends GetxService {
_storage.write("meeting_task_list", _taskList);
_storage.write("meeting_task_finish_list", taskFinishList);
}
aiServiceMessage(id, text);
aiServiceMessage(id, text, prompt, outline);
}
void aiServiceMessage(int id, String text) {
void aiServiceMessage(int id, String text, String prompt, String outline) {
int awaitQuantity = 0;
String summaryText = '';
String overviewText = '';
@ -278,8 +290,7 @@ class MeetingTaskService extends GetxService {
messages: [
{
'role': 'system',
'content':
'您将扮演一名会议总结专家,拥有超强的信息归纳与细分能力。不仅能高效处理各类通用场景会议,精准提炼会议核心内容,为后续思维导图生成奠定坚实基础。若涉及人员,人员名称保留[]。并根据内容只输出对应语言。',
'content': prompt,
},
{'role': 'user', 'content': text},
],
@ -294,7 +305,7 @@ class MeetingTaskService extends GetxService {
messages: [
{
'role': 'system',
'content': '您将扮演一名会议事件归纳专家,能准确抓住会议中事件的关键点,并每个事件只需一句话精简总结。',
'content': outline,
},
{'role': 'user', 'content': text},
],

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

@ -41,6 +41,9 @@ class MeetingUploadService extends GetxService {
'rootdir': rootDir,
'audiourl': '',
'isTask': false,
'language': '',
'prompt': '',
'outline': '',
});
_storage.write("meeting_upload_list", uploadList);
if (isUpload) {
@ -70,7 +73,14 @@ class MeetingUploadService extends GetxService {
{'audiourl': audiourl},
);
if (element['isTask']) {
await _taskService.addTaskList(element['id'], audiourl, '');
await _taskService.addTaskList(
element['id'],
audiourl,
'',
element['language'],
element['prompt'],
element['outline'],
);
}
element['audiourl'] = audiourl;
uploadProgress.value = 0.0;

9
lib/data/services/network/api.dart

@ -180,4 +180,13 @@ class Api {
params: params,
);
}
//获取模版数据
static getEchomeetTemplates([params]) {
return DioManager().request(
NWMethod.post,
'/api/home/echomeet_gettemplates',
params: params,
);
}
}

9
lib/modules/login/controllers/login_controller.dart

@ -8,6 +8,7 @@ import 'package:logger/web.dart';
import 'package:get_storage/get_storage.dart';
import 'package:device_info_plus/device_info_plus.dart';
import 'dart:convert';
import '../../../data/services/db/sqflite_api.dart';
import 'facebookLogin.dart';
import 'googleLogin.dart';
import 'weixinLogin.dart';
@ -869,6 +870,7 @@ class LoginController extends GetxController {
// 获取app的配置信息
await getAppConfig();
await _initMeetingTemplate();
Get.offAllNamed(Routes.pairing);
} else {
throw Exception('接口返回错误: ${response['msg']}');
@ -991,4 +993,11 @@ class LoginController extends GetxController {
return false;
}
}
Future _initMeetingTemplate() async {
var response = await Api.getEchomeetTemplates();
if (response != null) {
await SqfliteApi.initMeetingTemplate(response['templates']);
}
}
}

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

@ -245,18 +245,19 @@ class MeetingDetailsController extends GetxController
}
}
void summaryCreate() async {
void summaryCreate(String language, String prompt, String outline) async {
EasyLoading.show();
_everType = 2;
String audiourl = meetingData.value.audiourl;
String taskId = meetingDetails.value.taskid;
await _meetingTaskService.addTask(id, audiourl, taskId);
await _meetingTaskService.addTask(
id, audiourl, taskId, language, prompt, outline);
meetingDetails.value.tasktype = 1;
meetingDetails.refresh();
EasyLoading.dismiss();
}
void refreshSummary() async {
void refreshSummary(String prompt, String outline) async {
String text = '';
for (var element in textList) {
if (element['speaker'].isNotEmpty) {
@ -267,6 +268,6 @@ class MeetingDetailsController extends GetxController
_everType = 3;
await SqfliteApi.editMeeting(id, {'tasktype': 2});
_meetingTaskService.tasktype.value = 2;
_meetingTaskService.aiServiceMessage(id, text);
_meetingTaskService.aiServiceMessage(id, text, prompt, outline);
}
}

11
lib/modules/meeting/views/bottomSheet/generate_bottom_sheet.dart

@ -283,9 +283,16 @@ class _GenerateBottomSheetState extends State<GenerateBottomSheet> {
_storage.write("meeting_template_list", _templateList);
Get.back();
if (widget.isSummarizeAgain) {
_controller.refreshSummary();
_controller.refreshSummary(
_templateData['prompt'],
_templateData['outline'],
);
} else {
_controller.summaryCreate();
_controller.summaryCreate(
_language,
_templateData['prompt'],
_templateData['outline'],
);
}
},
child: Container(

Loading…
Cancel
Save