構建一個語音轉文字的WebApi服務

tokengo發表於2023-12-07

構建一個語音轉文字的WebApi服務

簡介

由於業務需要,我們需要提供一個語音輸入功能,以便更方便使用者的使用,所以我們需要提供語音轉文字的功能,下面我們將講解使用Whisper將語音轉換文字,並且封裝成WebApi提供web服務給前端呼叫。

建立專案

  1. 第一步開啟Vscode,選擇一個目錄作為工作空間,然後開啟控制檯,輸入以下指令建立一個WebApi的專案:
dotnet new webapi -n Whisper --no-openapi=true
  1. 新增依賴包的引用:
    1. Whisper.netWhisper.cpp的.NET封裝
    2. Whisper.net.Runtime.Clblast則是使用GPU的包,當然也可以不使用GPU
<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


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

實現基本使用案例

將倆個檔案複製到部署目錄

建立WhisperService.cs並且讀取音訊檔案然後返回識別結果

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

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();

服務構建完成,下面執行體驗效果:

在控制檯輸入:

cd .\Whisper\
dotent run
  • 顯示卡:1050Ti

  • 耗時:2275ms

  • 顯示卡:4080

  • 耗時:800ms

總結:

在本次會議中,討論了構建一個語音轉文字的WebApi服務的流程和步驟。主要內容包括建立專案、新增依賴包的引用、下載模型和語音示例檔案、實現基本使用案例以及服務構建完成後的執行體驗。
行動專案:
1. 下載並新增依賴包Whisper.netWhisper.net.Runtime.Clblast
2. 下載模型ggml-base-q5_1.bin和語音示例檔案kennedy.wav,並將其複製到部署目錄。
3. 建立WhisperService.cs,實現音訊轉文字的功能。
4. 修改Program.cs,註冊WhisperFactory並構建API,使用WhisperService.SpeechRecognitionAsync方法。
5. 執行服務,測試效果。

分享

技術交流群:737776595

相關文章