构建一个语音转文字的WebApi服务

2023-12-10 14:10:10 浏览数 (1)

简介

由于业务需要,我们需要提供一个语音输入功能,以便更方便用户的使用,所以我们需要提供语音转文本的功能,下面我们将讲解使用Whisper将语音转换文本,并且封装成WebApi提供web服务给前端调用。

创建项目

  1. 第一步打开Vscode,选择一个目录作为工作空间,然后打开控制台,输入以下指令创建一个WebApi的项目:
代码语言:javascript复制
dotnet new webapi -n Whisper --no-openapi=true
  1. 添加依赖包的引用:
    1. Whisper.netWhisper.cpp的.NET封装
    2. Whisper.net.Runtime.Clblast则是使用GPU的包,当然也可以不使用GPU
代码语言:javascript复制
<PackageReference Include="Whisper.net" Version="1.5.0" />
<PackageReference Include="Whisper.net.Runtime.Clblast" Version="1.5.0" />
  1. 下载一个模型:https://huggingface.co/ggerganov/whisper.cpp/tree/main ,找到ggml-base-q5_1.bin下载,请注意的是带en的是只识别英文的。其他的是全语言。
  2. 下载一个语音示例文件 https://github.com/sandrohanea/whisper.net/blob/main/examples/TestData/kennedy.wav
代码语言:javascript复制

    <ItemGroup>
      <None Update="ggml-base-q5_1.bin">
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      </None>
      <None Update="kennedy.wav">
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      </None>
    </ItemGroup>

实现基本使用案例

将俩个文件复制到部署目录

创建WhisperService.cs并且读取音频文件然后返回识别结果

代码语言:javascript复制
public class WhisperService
{
    /// <summary>
    /// 音频转文字
    /// </summary>
    /// <param name="processor">注入的对象</param>
    /// <returns></returns>
    public static async Task<string> SpeechRecognitionAsync(WhisperProcessor processor)
    {
        var sw = Stopwatch.StartNew();
        var wavFileName = "kennedy.wav";
        await using var fileStream = File.OpenRead(wavFileName);

        var str = string.Empty;
        await foreach (var result in processor.ProcessAsync(fileStream))
        {
            Console.WriteLine($"{result.Start}->{result.End}: {result.Text}");
            str  = result.Text;
        }
        sw.Stop();
        Console.WriteLine($"翻译耗时:{sw.ElapsedMilliseconds}ms 翻译结果:{str} 文件大小:{fileStream.Length}");
        return str;
    }

}

修改Program.cs

代码语言:javascript复制
var builder = WebApplication.CreateBuilder(args);

builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

// 注册单例的WhisperFactory,并且使用ggml-base-q5_1.bin模型
builder.Services.AddSingleton<WhisperFactory>((services) => WhisperFactory.FromPath("ggml-base-q5_1.bin"));
builder.Services.AddSingleton((services)=>
{
    // 从构建的服务中获取WhisperFactory
    var whisperFactory = services.GetRequiredService<WhisperFactory>();
    return whisperFactory.CreateBuilder()
        .WithLanguage("auto") // 自动识别语言
        .Build();
});

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

// 使用MiniApis构建一个简单的API,使用WhisperService.SpeechRecognitionAsync方法
app.MapGet("/whisper/speech-recognition", WhisperService.SpeechRecognitionAsync)
    .WithName("whisper")
    .WithOpenApi()
    .WithDescription("识别语音文件");

await app.RunAsync();

服务构建完成,下面运行体验效果:

在控制台输入:

代码语言:javascript复制
cd .Whisper
dotent run
  • 显卡:1050Ti
  • 耗时:3385ms
  • 显卡:4080
  • 耗时:800ms

总结:

在本次会议中,讨论了构建一个语音转文字的WebApi服务的流程和步骤。主要内容包括创建项目、添加依赖包的引用、下载模型和语音示例文件、实现基本使用案例以及服务构建完成后的运行体验。

行动项目:

  • 下载并添加依赖包Whisper.netWhisper.net.Runtime.Clblast
  • 下载模型ggml-base-q5_1.bin和语音示例文件kennedy.wav,并将其复制到部署目录。
  • 创建WhisperService.cs,实现音频转文字的功能。
  • 修改Program.cs,注册WhisperFactory并构建API,使用WhisperService.SpeechRecognitionAsync方法。
  • 运行服务,测试效果。

0 人点赞