3 changed files with 310 additions and 28 deletions
@ -0,0 +1,113 @@ |
|||||
|
const int asrStatusProcessing = 0; // 处理中 |
||||
|
const int asrStatusFailed = 1; // 处理失败 |
||||
|
const int asrStatusCompleted = 2; // 已完成 |
||||
|
|
||||
|
// 会议音频文件转文字单次数据 |
||||
|
class MeetingAsrRecord { |
||||
|
String id; // 本次ASR唯一标识 |
||||
|
int meetingId; // 会议记录ID |
||||
|
String taskId; // 云端任务ID |
||||
|
int audioSeconds; // 音频总时长(秒) |
||||
|
int fileSizeBytes; // 音频文件大小(字节) |
||||
|
String language; // ASR语言 |
||||
|
int submitTimestamp; // 提交时间戳(毫秒) |
||||
|
|
||||
|
int status; // 状态: 0-处理中, 1-处理失败, 2-已完成 |
||||
|
int transcriptBytes; // 转写后的字节数(utf8) |
||||
|
int completeTimestamp; // 完成时间戳(毫秒) |
||||
|
|
||||
|
MeetingAsrRecord({ |
||||
|
required this.id, |
||||
|
required this.meetingId, |
||||
|
required this.taskId, |
||||
|
required this.audioSeconds, |
||||
|
required this.fileSizeBytes, |
||||
|
required this.language, |
||||
|
required this.submitTimestamp, |
||||
|
required this.status, |
||||
|
required this.transcriptBytes, |
||||
|
required this.completeTimestamp, |
||||
|
}); |
||||
|
|
||||
|
Map<String, dynamic> toJson() => { |
||||
|
'id': id, |
||||
|
'meetingId': meetingId, |
||||
|
'taskId': taskId, |
||||
|
'audioSeconds': audioSeconds, |
||||
|
'fileSizeBytes': fileSizeBytes, |
||||
|
'language': language, |
||||
|
'submitTimestamp': submitTimestamp, |
||||
|
'status': status, |
||||
|
'transcriptBytes': transcriptBytes, |
||||
|
'completeTimestamp': completeTimestamp, |
||||
|
}; |
||||
|
|
||||
|
factory MeetingAsrRecord.fromJson(Map<String, dynamic> json) { |
||||
|
return MeetingAsrRecord( |
||||
|
id: json['id'] ?? '', |
||||
|
meetingId: json['meetingId'] ?? 0, |
||||
|
taskId: json['taskId'] ?? '', |
||||
|
audioSeconds: json['audioSeconds'] ?? 0, |
||||
|
fileSizeBytes: json['fileSizeBytes'] ?? 0, |
||||
|
language: json['language'] ?? '', |
||||
|
submitTimestamp: json['submitTimestamp'] ?? 0, |
||||
|
status: json['status'] ?? 0, |
||||
|
transcriptBytes: json['transcriptBytes'] ?? 0, |
||||
|
completeTimestamp: json['completeTimestamp'] ?? 0, |
||||
|
); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 会议音频文件转文字单日统计 |
||||
|
class MeetingAsrDailyStats { |
||||
|
String date; // 日期字符串: YYYY-MM-DD |
||||
|
String userId; // 用户ID |
||||
|
List<MeetingAsrRecord> items; // 当天所有单次ASR |
||||
|
|
||||
|
MeetingAsrDailyStats({ |
||||
|
required this.date, |
||||
|
required this.userId, |
||||
|
required this.items, |
||||
|
}); |
||||
|
|
||||
|
// 计算型聚合,不冗余存储 |
||||
|
int get asrCalls => items.length; |
||||
|
int get audioSecondsTotal => items.fold(0, (s, r) => s + r.audioSeconds); |
||||
|
int get audioBytesTotal => items.fold(0, (s, r) => s + r.fileSizeBytes); |
||||
|
int get transcriptBytesTotal => |
||||
|
items.fold(0, (s, r) => s + r.transcriptBytes); |
||||
|
|
||||
|
Map<String, dynamic> toJson() => { |
||||
|
'date': date, |
||||
|
'userId': userId, |
||||
|
'items': items.map((e) => e.toJson()).toList(), |
||||
|
}; |
||||
|
|
||||
|
factory MeetingAsrDailyStats.fromJson(Map<String, dynamic> json) { |
||||
|
final list = (json['items'] as List? ?? []) |
||||
|
.map((e) => MeetingAsrRecord.fromJson(Map<String, dynamic>.from(e))) |
||||
|
.toList(); |
||||
|
return MeetingAsrDailyStats( |
||||
|
date: json['date'] ?? '', |
||||
|
userId: json['userId'] ?? 'anonymous', |
||||
|
items: list, |
||||
|
); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 会议音频文件转文字历史统计 |
||||
|
class MeetingAsrHistoryStats { |
||||
|
String userId; // 用户ID |
||||
|
int allAsrCalls; // 所有ASR调用次数 |
||||
|
int allAudioSeconds; // 所有音频总时长(秒) |
||||
|
int allAudioFileBytes; // 所有音频文件大小(字节) |
||||
|
int allTranscriptBytes; // 所有转写后的字节数(utf8) |
||||
|
|
||||
|
MeetingAsrHistoryStats({ |
||||
|
required this.userId, |
||||
|
required this.allAsrCalls, |
||||
|
required this.allAudioSeconds, |
||||
|
required this.allAudioFileBytes, |
||||
|
required this.allTranscriptBytes, |
||||
|
}); |
||||
|
} |
||||
Loading…
Reference in new issue