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; namespace VideoAnalysisCore.Controllers { [ApiController] [Route("[controller]/[action]")] public class ApiController : ControllerBase { private readonly IMapper mp; private readonly Repository videoTaskDB; private readonly Repository videoKonwDB; private readonly IBserGPT chatGPT; public ApiController(Repository videoTaskDB, IMapper mp, IBserGPT chatGPT, Repository videoKonwDB) { this.videoTaskDB = videoTaskDB; this.mp = mp; this.chatGPT = chatGPT; this.videoKonwDB = videoKonwDB; } 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地址"); } /// /// 语音识别 /// /// 文件流 /// [HttpGet(Name = "AudioRecognitionUrl")] public async Task 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); } } /// /// 语音识别 /// /// 文件流 /// [HttpPost(Name = "AudioRecognition")] public async Task AudioRecognition(IFormFile file) { using var s = file.OpenReadStream(); var res = await SenseVoice.RunTask(s); return Ok(res); } /// /// 获取FTS_Data str /// /// 路径 /// [HttpGet(Name = "fts_data")] public async Task FTS_Data(string path = "itn_subject_sx.fst") { var hotwords = JsonSerializer .Deserialize(System.IO.File.ReadAllText(Path.Combine(AppCommon.AIModelFile, "Hotwords.json"))); var res = new List(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); } /// /// 重新开始执行GPT分析taskId/tagId二选一 /// /// /// 自定义id /// 切换任务所属学科 null忽略 /// [HttpGet(Name = "ReStart")] public async Task 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); } //重新开始执行GPT分析 RedisExpand.InsertChannel(RedisChannelEnum.ChatModelAnalysis , task.Id); return Ok(); } /// /// 插入队列 /// /// /// /// [HttpPost(Name = "TestInsertChannel")] public IActionResult TestInsertChannel(int @enum = 1, string msg = "1") { RedisExpand.InsertChannel(@enum.ToEnum().Value , msg); return Ok(); } /// /// 视频处理 /// /// 请求体 /// [HttpPost(Name = "VideoAnalysis")] public async Task 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, Type = req.Type, Subject = req.Subject, Tag = req.Tag, TagId = req.TagId, MediaName = req.Name, PPTVideoCode = req.PPTVideoCode, }; //入库 var hashEntries = task.GetType() .GetProperties(BindingFlags.Public | BindingFlags.Instance) .ToDictionary(s => s.Name, s => s.GetValue(task)); await videoTaskDB.InsertAsync(task); RedisExpand.Redis.HMSet(RedisExpandKey.Task(task.Id), hashEntries); RedisExpand.Redis.LPush(RedisExpandKey.ChannelKey, task.Id); return Ok(task.Id); } ///// ///// 获取视频知识点片段taskId/tagId二选一 ///// ///// ///// 自定义id ///// //[HttpGet(Name = "TaskKnowInfo")] //public async Task 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() // }); //} ///// ///// 获取视频信息taskId/tagId二选一 ///// ///// ///// 自定义id ///// //[HttpGet(Name = "TaskInfo")] //public async Task 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(); // 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 MergeTimeBases(IEnumerable timeBases) //{ // if (timeBases == null || timeBases.Count() == 0) // { // return new List(); // } // var mergedList = new List(); // // 初始化合并段 // 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; //} } }