You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
115 lines
3.6 KiB
115 lines
3.6 KiB
///会议模块用量统计的模型类
|
|
|
|
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,
|
|
});
|
|
}
|
|
|