using VideoAnalysisCore.Common; using System; using System.Linq; using Whisper.net; using Whisper.net.Ggml; using Whisper.net.Wave; namespace VideoAnalysisCore.AICore.Whisper { public static class WhisperHandle { /// /// 获取语音字幕 /// /// /// public static async Task RunTask(string task) { var filePath = Path.Combine(task.LocalPath(), task + ".wav"); if (string.IsNullOrEmpty(filePath) || !File.Exists(filePath)) throw new Exception("task 音频路径未找到"); var opt = new WhisperOption(filePath) { ModelName = AppCommon.Config.Whisper.ModelName }; var modPath = Path.Combine(AppCommon.AIModelFile, opt.ModelName); // 从给定的模型名称路径创建一个 WhisperFactory 实例 using var factory = WhisperFactory.FromPath(modPath); var builder = factory.CreateBuilder() //自定义提示词 .WithPrompt("以下是普通话的句子") //设置语言 .WithLanguage(opt.Language); // 如果值为 "translate",则在构建器中启用翻译功能 //if (opt.Command == "translate") //{ // builder.WithTranslate(); //} using var processor = builder.Build(); // 打开一个文件流来读取由 opt.FileName 指定的音频文件 using var fileStream = File.OpenRead(filePath); var res = new List(200); // 使用处理器异步处理音频文件。对于处理器返回的每个段(segment),它将段的开始时间、结束时间和文本打印到控制台。 await foreach (var segment in processor.ProcessAsync(fileStream, CancellationToken.None)) { res.Add(new WhisperResDto(segment)); } RedisExpand.Redis.HMSet(RedisExpandKey.Task(task), "Captions", res); RedisExpand.InsertChannel(Enum.RedisChannelEnum.ParsingSpeaker, task); } /// /// 检测语言的方法 /// /// static void LanguageIdentification(WhisperOption opt) { var modPath = Path.Combine(AppCommon.AIModelFile, opt.ModelName); // 使用 File.ReadAllBytes 方法将模型文件读取到内存中。 var bufferedModel = File.ReadAllBytes(modPath); // 多个任务可以使用同一个工厂来创建处理器 using var factory = WhisperFactory.FromBuffer(bufferedModel); // 使用工厂创建一个新的构建器,并设置其语言 var builder = factory.CreateBuilder() .WithLanguage(opt.Language); using var processor = builder.Build(); // 打开一个文件流来读取由 opt.FileName 指定的音频文件 using var fileStream = File.OpenRead(opt.FilePath); // 使用 WaveParser 类来解析音频文件 var wave = new WaveParser(fileStream); // 使用 WaveParser 的 GetAvgSamples 方法获取音频文件的平均样本 var samples = wave.GetAvgSamples(); // 使用处理器的 DetectLanguage 方法检测音频样本中的语言 var language = processor.DetectLanguage(samples, speedUp: true); Console.WriteLine("Language is " + language); } } /// /// 音频处理选项 /// public class WhisperOption { /// /// 传入目标文件路径 /// /// public WhisperOption(string file) { FilePath = file; } /// /// 指令类型 /// public string Command { get; set; } = "transcribe"; /// /// 音频文件,默认要存放bin目录下 /// public string FilePath { get; set; } /// /// 语言,默认自动选择 /// public string Language { get; set; } = "chinese"; /// /// 模型文件名称 /// public string ModelName { get; set; } = "ggml-base.bin"; /// /// 模型文件路径 /// public string ModPath => Path.Combine(AppCommon.AIModelFile, ModelName); /// /// 模型类型 /// //public GgmlType ModelType { get; set; } = GgmlType.Base; } }