332 lines
12 KiB
C#
332 lines
12 KiB
C#
|
||
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;
|
||
//}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
}
|
||
}
|