使用 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;
var data = RedisExpand.Redis.HMGet<string>(RedisExpandKey.Task(item.Id),
"Progress", "LastEnum", "StartTime", "ErrorMessage");
item.Progress = double.Parse(data[0]);
item.Progress = float.Parse(data[0]);
item.LastEnum = data[1].ToEnum<RedisChannelEnum>() ?? default;
item.StartTimeDic = System.Text.Json.JsonSerializer.Deserialize<Dictionary<RedisChannelEnum, DateTime>>(data[2]) ?? null;
item.ErrorMessage = data[3];

View File

@ -10,6 +10,7 @@ using VideoAnalysisCore.Model.Dto;
using VideoAnalysisCore.AICore.ChatGPT.Dto;
using AntDesign;
using System.Threading.Tasks;
using FFmpeg.NET.Services;
namespace Learn.VideoAnalysis.Controllers
{
@ -41,19 +42,36 @@ namespace Learn.VideoAnalysis.Controllers
/// </summary>
/// <param name="taskId"></param>
/// <param name="tagId">×Ô¶¨Òåid</param>
/// <param name="needSubtitle">ÊÇ·ñ¸½¼Ó×ÖÄ»</param>
/// <returns></returns>
[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()
.WhereIF(taskId!=0, s => s.Id == taskId)
.WhereIF(string.IsNullOrEmpty(tagId), s => s.TagId == tagId)
.WhereIF(!string.IsNullOrEmpty(tagId), s => s.TagId == tagId)
.FirstAsync();
if(task is null)
if (task is null)
return BadRequest();
var taskData = task.ChatAnalysis;
if (task.LastEnum != RedisChannelEnum.EndTask)
return BadRequest(new { Enum = task.LastEnum ,Task = task.ChatAnalysis});
return Ok(new { Enum = task.LastEnum, Task = task.ChatAnalysis });
return BadRequest(new
{
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>
@ -63,7 +81,7 @@ namespace Learn.VideoAnalysis.Controllers
/// <param name="msg"></param>
/// <returns></returns>
[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
, msg);

View File

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

View File

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

View File

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

View File

@ -89,7 +89,7 @@ namespace VideoAnalysisCore.AICore.SherpaOnnx
int windowSize = VADModelConfig.SileroVad.WindowSize;
int sampleRate = VADModelConfig.SampleRate;
int numIter = numSamples / windowSize;
var totalSecond = numSamples / (double)sampleRate;
var totalSecond = numSamples / (float)sampleRate;
var res = new List<SenseVoiceRes>(500);
for (int i = 0; i != numIter; ++i)
{
@ -114,10 +114,10 @@ namespace VideoAnalysisCore.AICore.SherpaOnnx
res.Add(new()
{
Text = stream.Result.Text,
Start= startTime,
End = startTime + duration
Start= (float)Math.Round(startTime, 2, MidpointRounding.AwayFromZero),
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);
}
@ -141,8 +141,8 @@ namespace VideoAnalysisCore.AICore.SherpaOnnx
res.Add(new()
{
Text = stream.Result.Text,
Start = startTime,
End = startTime + duration
Start = (float)Math.Round(startTime, 2, MidpointRounding.AwayFromZero),
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="threshold"></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");
var config = new OfflineSpeakerDiarizationConfig();
@ -36,7 +36,7 @@ namespace VideoAnalysisCore.AICore.SherpaOnnx
if (!useGPU)
config.Embedding.Provider = "cuda";
//说话人判定阈值
config.Clustering.Threshold = (float)threshold;
config.Clustering.Threshold = threshold;
SD = new OfflineSpeakerDiarization(config);
}
/// <summary>
@ -62,7 +62,7 @@ namespace VideoAnalysisCore.AICore.SherpaOnnx
i++;
if(i%20 !=0)
return 1;
var progress = (double)numProcessedChunks / numTotalChunks * 100;
var progress = (float)numProcessedChunks / numTotalChunks * 100;
RedisExpand.SetTaskProgress(task, progress);
return 1;
}, nint.Zero);
@ -109,8 +109,8 @@ namespace VideoAnalysisCore.AICore.SherpaOnnx
/// <param name="sds"></param>
public OfflineSpeakerRes(OfflineSpeakerDiarizationSegment sds)
{
Start = sds.Start;
End =sds.End;
Start = (float)Math.Round(sds.Start, 2, MidpointRounding.AwayFromZero);
End = (float)Math.Round(sds.End, 2, MidpointRounding.AwayFromZero);
SpeakerIndex = sds.Speaker;
}
}

View File

@ -107,9 +107,9 @@ namespace VideoAnalysisCore.Common
/// 获取任务进度
/// </summary>
/// <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>
/// 设置任务进度
@ -151,7 +151,7 @@ namespace VideoAnalysisCore.Common
{
var tId = long.Parse(task);
var gptRes = (await RedisExpand.Redis
.HMGetAsync<CallGPTRes>(RedisExpandKey.Task(task), "ChatAnalysis")).FirstOrDefault();
.HMGetAsync<TaskRes>(RedisExpandKey.Task(task), "ChatAnalysis")).FirstOrDefault();
if (gptRes is null)
throw new Exception("未能读取到GPT处理结果");

View File

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

View File

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

View File

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