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;
}
}