parent
2ae7477034
commit
a8dba48589
|
|
@ -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];
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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问答提问
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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处理结果");
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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; }
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue