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


    构建一个语音转文字的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>PreserveNewestCopyToOutputDirectory>
          None>
          <None Update="kennedy.wav">
            <CopyToOutputDirectory>PreserveNewestCopyToOutputDirectory>
          None>
        ItemGroup>
    

    实现基本使用案例

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

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

    public class WhisperService
    {
        /// 
        /// 音频转文字
        /// 
        /// 注入的对象
        /// 
        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((services) => WhisperFactory.FromPath("ggml-base-q5_1.bin"));
    builder.Services.AddSingleton((services)=>
    {
        // 从构建的服务中获取WhisperFactory
        var whisperFactory = services.GetRequiredService();
        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

  • 相关阅读:
    vue打包的基层原理
    数据结构之数组
    [WUSTCTF2020]颜值成绩查询-1
    【笔记】原型和原型链(持续完善)
    GetKeyState获取键盘状态(原神水龙王转转转)
    “合”而不同,持“智”以恒,幂律智能2022产品升级发布会全程回顾!
    深度学习 opencv python 实现中国交通标志识别 计算机竞赛
    Linux 系统目录结构
    工业控制系统安全标准
    Additional Features for Scripting
  • 原文地址:https://www.cnblogs.com/hejiale010426/p/17881978.html