Learn.VideoAnalysis/VideoAnalysisCore/Controllers/ApiController.cs

332 lines
12 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using VideoAnalysisCore.Common;
using Microsoft.AspNetCore.Mvc;
using System.Reflection;
using MapsterMapper;
using Mapster;
using VideoAnalysisCore.AICore.SherpaOnnx;
using UserCenter.Model.Enum;
using VideoAnalysisCore.AICore.GPT.ChatGPT;
using VideoAnalysisCore.AICore.GPT;
using System.Text.Json;
using VideoAnalysisCore.Model.Enum;
using Yitter.IdGenerator;
using VideoAnalysisCore.Model;
using Microsoft.AspNetCore.Http;
using VideoAnalysisCore.Model.Dto;
using VideoAnalysisCore.Controllers.Dto;
using VideoAnalysisCore.Common.Expand;
using Microsoft.Extensions.DependencyInjection;
using System.Threading.Tasks;
using VideoAnalysisCore.Model.À¾¨ÖÇ¿â;
namespace VideoAnalysisCore.Controllers
{
[ApiController]
[Route("[controller]/[action]")]
public class ApiController : ControllerBase
{
private readonly IMapper mp;
private readonly Repository<VideoTask> videoTaskDB;
private readonly RedisManager redisManager;
private readonly Repository<VideoKonwPoint> videoKonwDB;
private readonly Repository<CourseInfo> courseInfoDB;
public readonly SenseVoice senseVoice;
public ApiController(Repository<VideoTask> videoTaskDB,
IMapper mp, Repository<VideoKonwPoint> videoKonwDB, Repository<CourseInfo> courseInfoDB, RedisManager redisManager, SenseVoice senseVoice)
{
this.videoTaskDB = videoTaskDB;
this.mp = mp;
this.videoKonwDB = videoKonwDB;
this.courseInfoDB = courseInfoDB;
this.redisManager = redisManager;
this.senseVoice = senseVoice;
}
private string GetClientIpAddress()
{
// ¼ì²é X-Forwarded-For ÇëÇóÍ·
if (HttpContext.Request.Headers.ContainsKey("X-Forwarded-For")
&& !string.IsNullOrEmpty(HttpContext.Request.Headers["X-Forwarded-For"]))
return HttpContext.Request.Headers["X-Forwarded-For"].ToString();
if (HttpContext.Connection.RemoteIpAddress != null)
return HttpContext.Connection.RemoteIpAddress.ToString();
throw new Exception(´ÄÜ»ñÈ¡µ½¿Í»§¶ËipµØÖ·");
}
#if DEBUG
/// <summary>
/// ³õʼ»¯Ö÷¿â±í
/// </summary>
/// <param name="url">ÎļþÁ÷</param>
/// <returns></returns>
[HttpGet(Name = "InitDbTable")]
public IActionResult InitDbTable()
{
var b = AppCommon.Config.DB.UpdateTable;
AppCommon.Config.DB.UpdateTable= true;
SqlSugarExpand.InitDbTable();
AppCommon.Config.DB.UpdateTable = b;
return Ok();
}
#endif
/// <summary>
/// ³õʼ»¯Ö÷¿â±í
/// </summary>
/// <param name="task">ÊÇ·ñÖ´ÐÐÈÎÎñ</param>
/// <returns></returns>
[HttpGet(Name = "StartTask")]
public IActionResult StartTask(bool task)
{
if(task)
redisManager.RestartTask();
else
redisManager.StopTaskAsync();
return Ok();
}
/// <summary>
/// ÓïÒôʶ±ð
/// </summary>
/// <param name="url">ÎļþÁ÷</param>
/// <returns></returns>
[HttpGet(Name = "AudioRecognitionUrl")]
public async Task<IActionResult> AudioRecognitionUrl(string url)
{
try
{
using HttpClient client = new HttpClient();
// ·¢ËÍGETÇëÇó»ñÈ¡ÍøÂçÎļþÁ÷
using var networkStream = await client.GetStreamAsync(url);
var res = await senseVoice.RunTask(networkStream);
return Ok(res);
}
catch (Exception ex)
{
return BadRequest(ex.Message);
}
}
/// <summary>
/// ÓïÒôʶ±ð
/// </summary>
/// <param name="file">ÎļþÁ÷</param>
/// <returns></returns>
[HttpPost(Name = "AudioRecognition")]
public async Task<IActionResult> AudioRecognition(IFormFile file)
{
using var s = file.OpenReadStream();
var res = await senseVoice.RunTask(s);
return Ok(res);
}
/// <summary>
/// »ñÈ¡FTS_Data str
/// </summary>
/// <param name="path">·¾¶</param>
/// <returns></returns>
[HttpGet(Name = "fts_data")]
public async Task<IActionResult> FTS_Data(string path = "itn_subject_sx.fst")
{
var hotwords = JsonSerializer
.Deserialize<HotwordMode[]>(System.IO.File.ReadAllText(Path.Combine(AppCommon.AIModelFile, "Hotwords.json")));
var res = new List<string>(100);
foreach (var element in hotwords.OrderByDescending(s => s.key.Count()))
foreach (var e in element.v)
res.Add($"""("{e}", "{element.key}")""");
var pyFile = System.IO.File.ReadAllText(Path.Combine(AppCommon.AIModelFile, "sherpa-onnx-fst.py"));
var resStr = pyFile
.Replace("(fts_data)", "[" + string.Join(',', res) + "]")
.Replace("(path)", path);
return Ok(resStr);
}
/// <summary>
/// ÖØÐ¿ªÊ¼Ö´ÐÐGPT·ÖÎö<para>taskId/tagId¶þѡһ</para>
/// </summary>
/// <param name="taskId"></param>
/// <param name="tagId">×Ô¶¨Òåid</param>
/// <param name="subject">Çл»ÈÎÎñËùÊôѧ¿Æ nullºöÂÔ</param>
/// <returns></returns>
[HttpGet(Name = "ReStart")]
public async Task<IActionResult> ReStart(long taskId, string? tagId, SubjectEnum? subject)
{
var task = await videoTaskDB.AsQueryable()
.WhereIF(taskId != 0, s => s.Id == taskId)
.WhereIF(!string.IsNullOrEmpty(tagId), s => s.TagId == tagId)
.FirstAsync();
if (task is null)
return BadRequest("δÄÜÕÒµ½¶ÔÓ¦ÈÎÎñ");
if (subject is not null)
{
task.Subject = subject;
await videoTaskDB.UpdateAsync(task);
}
//todoÖØÐ¿ªÊ¼Ö´ÐÐGPT·ÖÎö
return Ok();
}
/// <summary>
/// ÊÓÆµ´¦Àí
/// </summary>
/// <param name="req">ÇëÇóÌå</param>
/// <returns></returns>
[HttpPost(Name = "VideoAnalysis")]
public async Task<IActionResult> VideoAnalysis(VideoAnalysisReq req)
{
if (!ModelState.IsValid) return BadRequest(ModelState);
if (await videoTaskDB.IsAnyAsync(s => s.TagId == req.TagId))
return BadRequest("ÖØ¸´Ìí¼Ó");
// ×Ô¶¯Ó³ÉäÊôÐÔµ½¹þÏ£
var task = new VideoTask()
{
Id = YitIdHelper.NextId(),
ComeFrom = GetClientIpAddress(),
MediaUrl = req.MediaUrl,
ApiToken = req.ApiToken,
CourseId = req.CourseId,
Subject = req.Subject,
Tag = req.Tag,
TagId = req.TagId,
PPTVideoCode = req.PPTVideoCode,
PPTVideoUrl = req.PPTVideoUrl,
VideoType=req.VideoType
};
//Èë¿â
var hashEntries = task.GetType()
.GetProperties(BindingFlags.Public | BindingFlags.Instance)
.ToDictionary(s => s.Name, s => s.GetValue(task));
await videoTaskDB.InsertAsync(task);
redisManager.Redis.HMSet(RedisExpandKey.Task(task.Id), hashEntries);
redisManager.Redis.LPush(RedisExpandKey.ChannelKey, task.Id);
return Ok(task.Id);
}
///// <summary>
///// »ñÈ¡ÊÓÆµÖªÊ¶µãƬ¶Î<para>taskId/tagId¶þѡһ</para>
///// </summary>
///// <param name="taskId"></param>
///// <param name="tagId">×Ô¶¨Òåid</param>
///// <returns></returns>
//[HttpGet(Name = "TaskKnowInfo")]
//public async Task<IActionResult> TaskKnowInfo(long taskId, string? tagId)
//{
// if (taskId == 0 && string.IsNullOrEmpty(tagId))
// return BadRequest();
// var task = await videoTaskDB.AsQueryable()
// .WhereIF(taskId != 0, s => s.Id == taskId)
// .WhereIF(!string.IsNullOrEmpty(tagId), s => s.TagId == tagId)
// .FirstAsync();
// if (task is null)
// return BadRequest("ÎÞЧÈÎÎñ");
// var konwArr = await videoKonwDB.AsQueryable()
// .Where(s => s.VideoTaskId == task.Id)
// .ToArrayAsync();
// if (konwArr is null || konwArr.Length == 0)
// return BadRequest("ÎÞЧÈÎÎñ");
// return Ok(new TaskKnowRes()
// {
// TagId = task.TagId,
// Status = task.LastEnum,
// VideoTaskId = task.Id,
// KnowBlockArr = konwArr
// .GroupBy(s => s.StartTime)
// .Select(s => new TaskKnowBlock()
// {
// Id = s.First().Id,
// Content = s.First().Content,
// StartTime = s.First().StartTime,
// EndTime = s.First().EndTime,
// Theme = s.First().Theme,
// Know = s.Select(x => new TaskKnowInfo()
// {
// Id = x.Id,
// KnowPoint = x.KnowPoint,
// KnowPointId = x.KnowPointId
// }).ToArray()
// }).ToArray()
// });
//}
///// <summary>
///// »ñÈ¡ÊÓÆµÐÅÏ¢<para>taskId/tagId¶þѡһ</para>
///// </summary>
///// <param name="taskId"></param>
///// <param name="tagId">×Ô¶¨Òåid</param>
///// <returns></returns>
//[HttpGet(Name = "TaskInfo")]
//public async Task<IActionResult> TaskInfo(long taskId, string? tagId)
//{
// if (taskId == 0 && string.IsNullOrEmpty(tagId))
// return BadRequest();
// var task = await videoTaskDB.AsQueryable()
// .WhereIF(taskId != 0, s => s.Id == taskId)
// .WhereIF(!string.IsNullOrEmpty(tagId), s => s.TagId == tagId)
// .FirstAsync();
// if (task is null)
// return BadRequest();
// var taskData = task.ChatAnalysis.Adapt<TaskInfoRes>();
// if (taskData is null)
// return BadRequest();
// taskData.Status = task.LastEnum;
// if (task.LastEnum != RedisChannelEnum.EndTask)
// return BadRequest(taskData);
// if (taskData != null && taskData.TimeBase != null)
// taskData.TimeBase = MergeTimeBases(taskData.TimeBase);
// return Ok(taskData);
//}
//[NonAction]
//private static List<TimeBase> MergeTimeBases(IEnumerable<TimeBase> timeBases)
//{
// if (timeBases == null || timeBases.Count() == 0)
// {
// return new List<TimeBase>();
// }
// var mergedList = new List<TimeBase>();
// // ³õʼ»¯ºÏ²¢¶Î
// var current = timeBases.First();
// current.Content = string.Empty;
// foreach (var next in timeBases)
// {
// // Èç¹ûÀàÐÍÏàͬ£¬ÔòÀ©Õ¹Ê±¼ä¶Î
// if (current.TimeBaseType == next.TimeBaseType)
// current.End = Math.Max(current.End, next.End);
// else
// {
// // ÀàÐͲ»Í¬£¬½«µ±Ç°Ê±¼ä¶Î¼ÓÈë½á¹ûÁÐ±í£¬²¢¿ªÊ¼ÐÂʱ¼ä¶Î
// mergedList.Add(current);
// current = next;
// current.Content = string.Empty;
// }
// }
// // Ìí¼Ó×îºóµÄʱ¼ä¶Î
// mergedList.Add(current);
// return mergedList;
//}
}
}