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