using FreeRedis; using Microsoft.Extensions.DependencyInjection; using System; using System.Threading.Channels; using System.Threading.Tasks; using System.Xml.Linq; using VideoAnalysisCore.AICore.ChatGPT; using VideoAnalysisCore.AICore.FFMPGE; //using VideoAnalysisCore.AICore.FFMPGE; using VideoAnalysisCore.AICore.SherpaOnnx; using VideoAnalysisCore.AICore.Whisper; using VideoAnalysisCore.Enum; namespace VideoAnalysisCore.Common { /// /// redis key /// public static class RedisExpandKey { /// /// 基础key /// public const string BaseKey = "VideoAnalysis:"; /// /// 基础Channel key /// public const string ChannelKey = BaseKey + "Channel:"; /// /// 下载文件 /// public const string DownloadFile = ChannelKey + "DownloadFile"; /// /// 分离音频 /// public const string SeparateAudio = ChannelKey + "SeparateAudio"; /// /// 解析字幕 /// public const string ParsingCaptions = ChannelKey + "ParsingCaptions"; /// /// 解析说话人 /// public const string ParsingSpeaker = ChannelKey + "ParsingSpeaker"; /// /// Chat模型分析 /// public const string ChatModelAnalysis = ChannelKey + "ChatModelAnalysis"; /// /// 任务数组 /// public const string TaskArr = BaseKey + "TaskArr"; /// /// 获取枚举RedisKey /// /// /// public static string EnumKey(RedisChannelEnum e) { return ChannelKey + e.ToString(); } /// /// 任务对象地址 /// public static string Task(object taskId) => BaseKey + "Task:" + taskId; } /// /// redis拓展 /// public class RedisExpand { /// /// redis 连接 /// public static RedisClient Redis = new RedisClient(AppCommon.Config.Redis.ConnectionString); /// /// 初始化redis /// 需要在初始化配置文件时候调用 /// public static void Init() { Redis.Serialize = obj => System.Text.Json.JsonSerializer.Serialize(obj); Redis.Deserialize = (json, type) => System.Text.Json.JsonSerializer.Deserialize(json, type); InitChannel(); } /// /// 将任务 插入 队列 /// /// 枚举 /// 任务id public static void InsertChannel(RedisChannelEnum @enum, object taskId) { var startTime = Redis.HMGet>(RedisExpandKey.Task(taskId), "StartTime").FirstOrDefault(); if (startTime is null) startTime = new Dictionary(); if (!startTime.ContainsKey(@enum)) startTime.Add(@enum, DateTime.Now); else startTime[@enum] = DateTime.Now; Redis.HMSet(RedisExpandKey.Task(taskId), "StartTime", startTime); if (Redis is null) throw new Exception("redis未初始化"); Redis.LPush(RedisExpandKey.EnumKey(@enum), taskId); } /// /// 初始化 队列 任务 /// public static void InitChannel() { if (Redis is null) throw new Exception("redis未初始化"); Redis.SubscribeList(RedisExpandKey.EnumKey(RedisChannelEnum.DownloadFile), (msg) => { TouchChannel(RedisChannelEnum.DownloadFile, msg, DownloadFile.RunTask); }); Redis.SubscribeList(RedisExpandKey.EnumKey(RedisChannelEnum.SeparateAudio), (msg) => { TouchChannel(RedisChannelEnum.SeparateAudio, msg, FFMPGEHandle.Audio2WAV16KAsync); }); Redis.SubscribeList(RedisExpandKey.EnumKey(RedisChannelEnum.ParsingCaptions), (msg) => { TouchChannel(RedisChannelEnum.ParsingCaptions, msg, WhisperHandle.RunTask); }); Redis.SubscribeList(RedisExpandKey.EnumKey(RedisChannelEnum.ParsingSpeaker), (msg) => { TouchChannel(RedisChannelEnum.ParsingSpeaker, msg, Speaker.Run); }); Redis.SubscribeList(RedisExpandKey.EnumKey(RedisChannelEnum.ChatModelAnalysis), (msg) => { TouchChannel(RedisChannelEnum.ChatModelAnalysis, msg, (task) => { using var scope = AppCommon.Services?.CreateScope(); if (scope is null || scope.ServiceProvider.GetService() is null) throw new Exception("IBserGPT 未注入"); else return scope.ServiceProvider.GetService()?.CallGPT(task)??Task.CompletedTask; }); }); Redis.SubscribeList(RedisExpandKey.EnumKey(RedisChannelEnum.CallBackSystem), (msg) => { TouchChannel(RedisChannelEnum.ParsingSpeaker, msg); }); } /// /// /// /// /// /// public static async void TouchChannel(RedisChannelEnum key, string msg, Func action = null) { if (msg is null) return; Console.WriteLine(DateTime.Now.ToString("HH:mm:ss") + "-> " + key + " " + msg); if (action is not null) { Redis.HMSet(RedisExpandKey.Task(msg), "LastEnum", key); await action(msg); } else { Console.WriteLine(key + " 任务函数 未实现"); } } } }