構建一個語音轉文字的WebApi服務
簡介
由於業務需要,我們需要提供一個語音輸入功能,以便更方便使用者的使用,所以我們需要提供語音轉文字的功能,下面我們將講解使用Whisper
將語音轉換文字,並且封裝成WebApi
提供web服務給前端呼叫。
建立專案
- 第一步開啟
Vscode
,選擇一個目錄作為工作空間,然後開啟控制檯,輸入以下指令建立一個WebApi的專案:
dotnet new webapi -n Whisper --no-openapi=true
- 新增依賴包的引用:
Whisper.net
是Whisper.cpp
的.NET封裝Whisper.net.Runtime.Clblast
則是使用GPU的包,當然也可以不使用GPU
<PackageReference Include="Whisper.net" Version="1.5.0" />
<PackageReference Include="Whisper.net.Runtime.Clblast" Version="1.5.0" />
-
下載一個模型:https://huggingface.co/ggerganov/whisper.cpp/tree/main ,找到
ggml-base-q5_1.bin
下載,請注意的是帶en
的是隻識別英文的。其他的是全語言。 -
下載一個語音示例檔案 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.net
和Whisper.net.Runtime.Clblast
。
2. 下載模型ggml-base-q5_1.bin
和語音示例檔案kennedy.wav
,並將其複製到部署目錄。
3. 建立WhisperService.cs
,實現音訊轉文字的功能。
4. 修改Program.cs
,註冊WhisperFactory
並構建API,使用WhisperService.SpeechRecognitionAsync
方法。
5. 執行服務,測試效果。
分享
技術交流群:737776595