使用 float 替换double

优化 taskinfo api允许不导出字幕
This commit is contained in:
小肥羊 2024-11-15 11:48:09 +08:00
parent 2ae7477034
commit a8dba48589
13 changed files with 68 additions and 39 deletions

View File

@ -90,7 +90,7 @@ namespace Learn.VideoAnalysis.Components.Pages
return; return;
var data = RedisExpand.Redis.HMGet<string>(RedisExpandKey.Task(item.Id), var data = RedisExpand.Redis.HMGet<string>(RedisExpandKey.Task(item.Id),
"Progress", "LastEnum", "StartTime", "ErrorMessage"); "Progress", "LastEnum", "StartTime", "ErrorMessage");
item.Progress = double.Parse(data[0]); item.Progress = float.Parse(data[0]);
item.LastEnum = data[1].ToEnum<RedisChannelEnum>() ?? default; item.LastEnum = data[1].ToEnum<RedisChannelEnum>() ?? default;
item.StartTimeDic = System.Text.Json.JsonSerializer.Deserialize<Dictionary<RedisChannelEnum, DateTime>>(data[2]) ?? null; item.StartTimeDic = System.Text.Json.JsonSerializer.Deserialize<Dictionary<RedisChannelEnum, DateTime>>(data[2]) ?? null;
item.ErrorMessage = data[3]; item.ErrorMessage = data[3];

View File

@ -10,6 +10,7 @@ using VideoAnalysisCore.Model.Dto;
using VideoAnalysisCore.AICore.ChatGPT.Dto; using VideoAnalysisCore.AICore.ChatGPT.Dto;
using AntDesign; using AntDesign;
using System.Threading.Tasks; using System.Threading.Tasks;
using FFmpeg.NET.Services;
namespace Learn.VideoAnalysis.Controllers namespace Learn.VideoAnalysis.Controllers
{ {
@ -41,19 +42,36 @@ namespace Learn.VideoAnalysis.Controllers
/// </summary> /// </summary>
/// <param name="taskId"></param> /// <param name="taskId"></param>
/// <param name="tagId">×Ô¶¨Òåid</param> /// <param name="tagId">×Ô¶¨Òåid</param>
/// <param name="needSubtitle">ÊÇ·ñ¸½¼Ó×ÖÄ»</param>
/// <returns></returns> /// <returns></returns>
[HttpGet(Name = "TaskInfo")] [HttpGet(Name = "TaskInfo")]
public async Task<IActionResult> TaskInfo(long taskId,string? tagId) public async Task<IActionResult> TaskInfo(long taskId,string? tagId,bool needSubtitle=false)
{ {
var task = await videoTaskDB.AsQueryable() var task = await videoTaskDB.AsQueryable()
.WhereIF(taskId!=0, s => s.Id == taskId) .WhereIF(taskId!=0, s => s.Id == taskId)
.WhereIF(string.IsNullOrEmpty(tagId), s => s.TagId == tagId) .WhereIF(!string.IsNullOrEmpty(tagId), s => s.TagId == tagId)
.FirstAsync(); .FirstAsync();
if(task is null) if (task is null)
return BadRequest(); return BadRequest();
var taskData = task.ChatAnalysis;
if (task.LastEnum != RedisChannelEnum.EndTask) if (task.LastEnum != RedisChannelEnum.EndTask)
return BadRequest(new { Enum = task.LastEnum ,Task = task.ChatAnalysis}); return BadRequest(new
return Ok(new { Enum = task.LastEnum, Task = task.ChatAnalysis }); {
Enum = task.LastEnum ,
Task = taskData
});
if (!needSubtitle && taskData != null && taskData.TimeBase != null)
{
foreach (var item in taskData.TimeBase)
{
item.Content = null;
}
}
return Ok(new
{
Enum = task.LastEnum,
Task = taskData
});
} }
/// <summary> /// <summary>
@ -63,7 +81,7 @@ namespace Learn.VideoAnalysis.Controllers
/// <param name="msg"></param> /// <param name="msg"></param>
/// <returns></returns> /// <returns></returns>
[HttpPost(Name = "TestInsertChannel")] [HttpPost(Name = "TestInsertChannel")]
public IActionResult TestInsertChannel(int @enum=1, string msg= "test_0001") public IActionResult TestInsertChannel(int @enum=1, string msg= "1")
{ {
RedisExpand.InsertChannel(@enum.ToEnum<RedisChannelEnum>().Value RedisExpand.InsertChannel(@enum.ToEnum<RedisChannelEnum>().Value
, msg); , msg);

View File

@ -14,7 +14,7 @@
"dotnetRunMessages": true, "dotnetRunMessages": true,
"launchBrowser": true, "launchBrowser": true,
"launchUrl": "", "launchUrl": "",
"applicationUrl": "http://localhost:5238", "applicationUrl": "http://*:5238",
"environmentVariables": { "environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development" "ASPNETCORE_ENVIRONMENT": "Development"
} }

View File

@ -15,6 +15,6 @@ namespace VideoAnalysisCore.AICore.ChatGPT
/// </summary> /// </summary>
/// <param name="task">任务id</param> /// <param name="task">任务id</param>
/// <returns></returns> /// <returns></returns>
public Task<CallGPTRes> CallGPT(string task); public Task<TaskRes> CallGPT(string task);
} }
} }

View File

@ -9,12 +9,15 @@ using VideoAnalysisCore.Model.Dto;
namespace VideoAnalysisCore.AICore.ChatGPT.Dto namespace VideoAnalysisCore.AICore.ChatGPT.Dto
{ {
public class CallGPTRes /// <summary>
/// 任务结果
/// </summary>
public class TaskRes
{ {
public CallGPTRes() public TaskRes()
{ {
} }
public CallGPTRes(TotalCaptionsDto captions) public TaskRes(TotalCaptionsDto captions)
{ {
this.TeacherSpeaking = captions.TeacherSpeaking; this.TeacherSpeaking = captions.TeacherSpeaking;
this.TimeBase = captions.TimeBase; this.TimeBase = captions.TimeBase;
@ -55,5 +58,13 @@ namespace VideoAnalysisCore.AICore.ChatGPT.Dto
/// AI综合评估 /// AI综合评估
/// </summary> /// </summary>
public AssessmentDto Assessment { get; set; } = default!; public AssessmentDto Assessment { get; set; } = default!;
/// <summary>
/// AI综合评估得分
/// <para>满分100</para>
/// </summary>
public float AssessmentScore =>
(float)(Assessment?.Bad?.Select(x => x.Score)
.Concat(Assessment?.Merit?.Select(s => s.Score) ?? [])
.Average() ?? 0) * 100;
} }
} }

View File

@ -47,7 +47,7 @@ namespace VideoAnalysisCore.AICore.ChatGPT.KIMI
/// </summary> /// </summary>
/// <param name="task">任务id</param> /// <param name="task">任务id</param>
/// <returns></returns> /// <returns></returns>
public async Task<CallGPTRes> CallGPT(string task) public async Task<TaskRes> CallGPT(string task)
{ {
var captions = ExpandFunction.GetSpeakerCaptions(task); var captions = ExpandFunction.GetSpeakerCaptions(task);
var criteriaArr = await criteriaDB.GetListAsync(); var criteriaArr = await criteriaDB.GetListAsync();
@ -87,7 +87,7 @@ namespace VideoAnalysisCore.AICore.ChatGPT.KIMI
var chatRep = new ChatReq var chatRep = new ChatReq
{ {
max_tokens = reqTokenCount * 2, max_tokens = reqTokenCount * 2,
temperature = 0.3, temperature = 0.3f,
frequency_penalty = 0, frequency_penalty = 0,
presence_penalty = 0, presence_penalty = 0,
model = modelId, model = modelId,
@ -108,7 +108,7 @@ namespace VideoAnalysisCore.AICore.ChatGPT.KIMI
throw new Exception("KIMIGPT返回message无效结果"); throw new Exception("KIMIGPT返回message无效结果");
var questionRes = JsonConvert.DeserializeObject<QuestionRes[]>(chatResContent); var questionRes = JsonConvert.DeserializeObject<QuestionRes[]>(chatResContent);
var gptRes = new CallGPTRes(captions); var gptRes = new TaskRes(captions);
if (questionRes is null) if (questionRes is null)
throw new Exception("KIMIGPT返回无效结果"); throw new Exception("KIMIGPT返回无效结果");
//处理 ai问答提问 //处理 ai问答提问

View File

@ -41,7 +41,7 @@
/// 使用什么采样温度,介于 0 和 1 之间。较高的值(如 0.7)将使输出更加随机,而较低的值(如 0.2)将使其更加集中和确定性 /// 使用什么采样温度,介于 0 和 1 之间。较高的值(如 0.7)将使输出更加随机,而较低的值(如 0.2)将使其更加集中和确定性
/// <para>默认为 0如果设置值域须为 [0, 1] 我们推荐 0.3,以达到较合适的效果</para> /// <para>默认为 0如果设置值域须为 [0, 1] 我们推荐 0.3,以达到较合适的效果</para>
/// </summary> /// </summary>
public double temperature { get; set; } public float temperature { get; set; }
/// <summary> /// <summary>
/// 聊天完成时生成的最大 token 数。如果到生成了最大 token 数个结果仍然没有结束finish reason 会是 "length", 否则会是 "stop" /// 聊天完成时生成的最大 token 数。如果到生成了最大 token 数个结果仍然没有结束finish reason 会是 "length", 否则会是 "stop"

View File

@ -89,7 +89,7 @@ namespace VideoAnalysisCore.AICore.SherpaOnnx
int windowSize = VADModelConfig.SileroVad.WindowSize; int windowSize = VADModelConfig.SileroVad.WindowSize;
int sampleRate = VADModelConfig.SampleRate; int sampleRate = VADModelConfig.SampleRate;
int numIter = numSamples / windowSize; int numIter = numSamples / windowSize;
var totalSecond = numSamples / (double)sampleRate; var totalSecond = numSamples / (float)sampleRate;
var res = new List<SenseVoiceRes>(500); var res = new List<SenseVoiceRes>(500);
for (int i = 0; i != numIter; ++i) for (int i = 0; i != numIter; ++i)
{ {
@ -114,10 +114,10 @@ namespace VideoAnalysisCore.AICore.SherpaOnnx
res.Add(new() res.Add(new()
{ {
Text = stream.Result.Text, Text = stream.Result.Text,
Start= startTime, Start= (float)Math.Round(startTime, 2, MidpointRounding.AwayFromZero),
End = startTime + duration End = (float)Math.Round(startTime + duration, 2, MidpointRounding.AwayFromZero),
}); });
var progress = (double)(startTime + duration) / (totalSecond) * 100; var progress = (float)(startTime + duration) / (totalSecond) * 100;
RedisExpand.SetTaskProgress(task, progress); RedisExpand.SetTaskProgress(task, progress);
} }
@ -141,8 +141,8 @@ namespace VideoAnalysisCore.AICore.SherpaOnnx
res.Add(new() res.Add(new()
{ {
Text = stream.Result.Text, Text = stream.Result.Text,
Start = startTime, Start = (float)Math.Round(startTime, 2, MidpointRounding.AwayFromZero),
End = startTime + duration End = (float)Math.Round(startTime + duration, 2, MidpointRounding.AwayFromZero),
}); });
} }

View File

@ -21,7 +21,7 @@ namespace VideoAnalysisCore.AICore.SherpaOnnx
/// <param name="speakerNumber"></param> /// <param name="speakerNumber"></param>
/// <param name="threshold"></param> /// <param name="threshold"></param>
/// <param name="useGPU"></param> /// <param name="useGPU"></param>
public static void Init(int speakerNumber = 2, double threshold = 0.6,bool useGPU = false) public static void Init(int speakerNumber = 2, float threshold = 0.6f,bool useGPU = false)
{ {
Console.WriteLine("初始化 Speaker"); Console.WriteLine("初始化 Speaker");
var config = new OfflineSpeakerDiarizationConfig(); var config = new OfflineSpeakerDiarizationConfig();
@ -36,7 +36,7 @@ namespace VideoAnalysisCore.AICore.SherpaOnnx
if (!useGPU) if (!useGPU)
config.Embedding.Provider = "cuda"; config.Embedding.Provider = "cuda";
//说话人判定阈值 //说话人判定阈值
config.Clustering.Threshold = (float)threshold; config.Clustering.Threshold = threshold;
SD = new OfflineSpeakerDiarization(config); SD = new OfflineSpeakerDiarization(config);
} }
/// <summary> /// <summary>
@ -62,7 +62,7 @@ namespace VideoAnalysisCore.AICore.SherpaOnnx
i++; i++;
if(i%20 !=0) if(i%20 !=0)
return 1; return 1;
var progress = (double)numProcessedChunks / numTotalChunks * 100; var progress = (float)numProcessedChunks / numTotalChunks * 100;
RedisExpand.SetTaskProgress(task, progress); RedisExpand.SetTaskProgress(task, progress);
return 1; return 1;
}, nint.Zero); }, nint.Zero);
@ -109,8 +109,8 @@ namespace VideoAnalysisCore.AICore.SherpaOnnx
/// <param name="sds"></param> /// <param name="sds"></param>
public OfflineSpeakerRes(OfflineSpeakerDiarizationSegment sds) public OfflineSpeakerRes(OfflineSpeakerDiarizationSegment sds)
{ {
Start = sds.Start; Start = (float)Math.Round(sds.Start, 2, MidpointRounding.AwayFromZero);
End =sds.End; End = (float)Math.Round(sds.End, 2, MidpointRounding.AwayFromZero);
SpeakerIndex = sds.Speaker; SpeakerIndex = sds.Speaker;
} }
} }

View File

@ -107,9 +107,9 @@ namespace VideoAnalysisCore.Common
/// 获取任务进度 /// 获取任务进度
/// </summary> /// </summary>
/// <param name="taskId"></param> /// <param name="taskId"></param>
public static double SetTaskProgress(object taskId) public static float GetTaskProgress(object taskId)
{ {
return Redis.HMGet<double>(RedisExpandKey.Task(taskId), "Progress")[0]; return Redis.HMGet<float>(RedisExpandKey.Task(taskId), "Progress")[0];
} }
/// <summary> /// <summary>
/// 设置任务进度 /// 设置任务进度
@ -151,7 +151,7 @@ namespace VideoAnalysisCore.Common
{ {
var tId = long.Parse(task); var tId = long.Parse(task);
var gptRes = (await RedisExpand.Redis var gptRes = (await RedisExpand.Redis
.HMGetAsync<CallGPTRes>(RedisExpandKey.Task(task), "ChatAnalysis")).FirstOrDefault(); .HMGetAsync<TaskRes>(RedisExpandKey.Task(task), "ChatAnalysis")).FirstOrDefault();
if (gptRes is null) if (gptRes is null)
throw new Exception("未能读取到GPT处理结果"); throw new Exception("未能读取到GPT处理结果");

View File

@ -21,8 +21,8 @@ namespace VideoAnalysisCore.Model.Dto
var arr = str.Split(":"); var arr = str.Split(":");
if (arr !=null && arr.Length >= 3) if (arr !=null && arr.Length >= 3)
{ {
Start = double.Parse(arr[1]); Start = float.Parse(arr[1]);
End = double.Parse(arr[2]); End = float.Parse(arr[2]);
} }
} }
public TimeBase() public TimeBase()
@ -32,18 +32,18 @@ namespace VideoAnalysisCore.Model.Dto
/// <summary> /// <summary>
/// 开始时间 /// 开始时间
/// </summary> /// </summary>
public double Start { get; set; } public float Start { get; set; }
/// <summary> /// <summary>
/// 结束时间 /// 结束时间
/// </summary> /// </summary>
public double End { get; set; } public float End { get; set; }
/// <summary> /// <summary>
/// 内容 /// 内容
/// </summary> /// </summary>
public string Content { get; set; } public string? Content { get; set; }
/// <summary> /// <summary>
/// 时间段 类型 /// 时间段 类型
/// <para><see cref="VideoAnalysisCore.AICore.ChatGPT.Dto.CallGPTRes.TimeOverview"/> 时为 null</para> /// <para><see cref="VideoAnalysisCore.AICore.ChatGPT.Dto.TaskRes.TimeOverview"/> 时为 null</para>
/// </summary> /// </summary>
public TimeBaseTypeEnum? TimeBaseType { get; set; } public TimeBaseTypeEnum? TimeBaseType { get; set; }

View File

@ -38,7 +38,7 @@ namespace VideoAnalysisCore.Model.Dto
/// 执行进度 /// 执行进度
/// </summary> /// </summary>
[DisplayName("进度")] [DisplayName("进度")]
public double Progress { get; set; } public float Progress { get; set; }
/// <summary> /// <summary>
/// 错误信息 /// 错误信息
/// </summary> /// </summary>

View File

@ -89,9 +89,9 @@ namespace VideoAnalysisCore.Model
/// Chat模型分析缓存 /// Chat模型分析缓存
/// </summary> /// </summary>
[SugarColumn(IsIgnore = true)] [SugarColumn(IsIgnore = true)]
public CallGPTRes? ChatAnalysis public TaskRes? ChatAnalysis
{ {
get => JsonSerializer.Deserialize<CallGPTRes>(_ChatAnalysis ?? "{}"); get => JsonSerializer.Deserialize<TaskRes>(_ChatAnalysis ?? "{}");
set => _ChatAnalysis = JsonSerializer.Serialize(value); set => _ChatAnalysis = JsonSerializer.Serialize(value);
} }
/// <summary> /// <summary>