parent
2ae7477034
commit
a8dba48589
|
|
@ -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];
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@
|
|||
"dotnetRunMessages": true,
|
||||
"launchBrowser": true,
|
||||
"launchUrl": "",
|
||||
"applicationUrl": "http://localhost:5238",
|
||||
"applicationUrl": "http://*:5238",
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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问答提问
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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处理结果");
|
||||
|
||||
|
|
|
|||
|
|
@ -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; }
|
||||
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@ namespace VideoAnalysisCore.Model.Dto
|
|||
/// 执行进度
|
||||
/// </summary>
|
||||
[DisplayName("进度")]
|
||||
public double Progress { get; set; }
|
||||
public float Progress { get; set; }
|
||||
/// <summary>
|
||||
/// 错误信息
|
||||
/// </summary>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
Loading…
Reference in New Issue