Whisper.cpp 编译使用

whisper.cpp 是牛人 ggerganov 对 openai 的 whisper 语音识别模型用 C++ 重新实现的项目,开源在 github 上,具有轻量、性能高,实用性强等特点。这篇文章主要记录在 windows 平台,如何使用该模型在本地端进行语音识别。

下载

whisper.cpp 的开源地址在 ggerganov/whisper.cpp: Port of OpenAI’s Whisper model in C/C++ (github.com),首先将项目下载在本地。

git clone https://github.com/ggerganov/whisper.cpp

whisper.cpp 项目里提供了几个现成的模型。建议下载 small 以上的模型,不然识别效果完全无法使用。

我们可以使用下面命令下载指定模型,下载好之后,它们存储在 models 文件夹下。

.\models\download-ggml-model.cmd small

编译

在项目根目录执行 make 即可编译,得到 main.exe 可执行文件,然后用 main 文件就可以转录本地语音文件了。

> make

转录本地语言

samples 语言文件

  • 先我们用项目里自带的一段语音,来体验一下识别效果。其中

    • -m 指定模型
    • -f 指定语音文件
> PS C:\Users\aiyolo\whisper.cpp> ./main.exe -m C:\Users\aiyolo\whisper.cpp\models\ggml-base.bin -f C:\Users\aiyolo\whisper.cpp\samples\jfk.wav
whisper_init_from_file_no_state: loading model from 'C:\Users\aiyolo\whisper.cpp\models\ggml-base.bin'
whisper_model_load: loading model
whisper_model_load: n_vocab       = 51865
whisper_model_load: n_audio_ctx   = 1500
whisper_model_load: n_audio_state = 512
whisper_model_load: n_audio_head  = 8
whisper_model_load: n_audio_layer = 6
whisper_model_load: n_text_ctx    = 448
whisper_model_load: n_text_state  = 512
whisper_model_load: n_text_head   = 8
whisper_model_load: n_text_layer  = 6
whisper_model_load: n_mels        = 80
whisper_model_load: f16           = 1
whisper_model_load: type          = 2
whisper_model_load: mem required  =  215.00 MB (+    6.00 MB per decoder)
whisper_model_load: adding 1608 extra tokens
whisper_model_load: model ctx     =  140.60 MB
whisper_model_load: model size    =  140.54 MB
whisper_init_state: kv self size  =    5.25 MB
whisper_init_state: kv cross size =   17.58 MBsystem_info: n_threads = 4 / 16 | AVX = 1 | AVX2 = 1 | AVX512 = 0 | FMA = 1 | NEON = 0 | ARM_FMA = 0 | F16C = 1 | FP16_VA = 0 | WASM_SIMD = 0 | BLAS = 0 | SSE3 = 1 | VSX = 0 |main: processing 'C:\Users\aiyolo\whisper.cpp\samples\jfk.wav' (176000 samples, 11.0 sec), 4 threads, 1 processors, lang = en, task = transcribe, timestamps = 1 ...[00:00:00.000 --> 00:00:07.600]   And so my fellow Americans ask not what your country can do for you,
[00:00:07.600 --> 00:00:10.600]   ask what you can do for your country.whisper_print_timings:     load time =   108.72 ms
whisper_print_timings:     fallbacks =   0 p /   0 h
whisper_print_timings:      mel time =    88.37 ms
whisper_print_timings:   sample time =   104.12 ms /    28 runs (    3.72 ms per run)
whisper_print_timings:   encode time =   824.49 ms /     1 runs (  824.49 ms per run)
whisper_print_timings:   decode time =   138.39 ms /    28 runs (    4.94 ms per run)
whisper_print_timings:    total time =  1302.72 ms

可以看到识别效果很好。

识别中文

用系统的录音机录制了 OpenAI 的 Whisper 模型是一个很伟大的发明

由于 whisper.cpp 目前只支持 16 khzwav 文件格式的语言文件,需要先使用 ffmpeg 将语音文件转成所需的格式。

windows 平台可以使用 choco 命令来安装 FFmpeg

> choco install ffmpeg

然后,将其转成需要的格式。

> ffmpeg -i '.\录音 (2).wav' -ar 16000 -ac 1 -c:a pcm_s16le output.wav

接着使用 whisper 进行识别。

./main.exe -l auto -m C:\Users\aiyolo\whisper.cpp\models\ggml-small.bin -f "C:\Users\aiyolo\Documents\录音\output.wav" -osrt

上面面命令中:

  • -l 选项指定的语种,设置成 auto 会自动检测。
  • -osrt 将输出 srt 文件格式的文本。

打开文件看看最终的效果。

相比之下 base 模型的输出结果不尽人意,而 small 模型基本能达到日常的用途。

实时转录

再来试一下,实时语音转录功能。实时语音转录需要得到 stream 文件。使用 make stream 命令编译, 发现需要依赖 sdl 库。

> make stream
In file included from examples/common-sdl.cpp:1:
examples/common-sdl.h:3:10: fatal error: SDL.h: No such file or directory3 | #include <SDL.h>

由于我使用 mingw 编译的,我可以直接使用下面命令安装 sdl 依赖库。

$ pacman -S mingw-w64-x86_64-SDL2

依赖库安装成功后,编译也顺利完成,得到 stream.exe 文件。但是在 windows 执行下面命令,还不能达到实时转录的效果。

./stream -m ./models/ggml-base.en.bin -t 8 --step 500 --length 5000

Whisper.cpp 编译使用相关推荐

  1. 把cpp编译为so_基于VSCode和CMake进行C/C++开发第三讲GCC编译器

    3.0 本讲目录 本系列视频,B站首发,up主: xiaobing1016 前言: GCC 编译器支持编译 Go.Objective-C,Objective-C ++,Fortran,Ada,D 和 ...

  2. [旭日x3] 动手实践之bpu_rezie以及简化cpp编译流程

    1.前言 在x3开发者手册里面的利用bpu进行resize的操作,便在板端上进行了测试,对比了一下bpu-resize与opencv-resize的时间差异,而且还能在裁剪的同时对裁剪的区域进行缩放. ...

  3. c++将.cpp编译为.so文件

    1.首先看文件形式 其中cpp1是直接调用.cpp和生成.so的文件夹. cpp2是测试生成的.so可以使用的文件夹. 2.先直接编译.cpp检查代码没问题 a.cpp内容: #include < ...

  4. cpp 编译dll_GCC编译基础

    资料准备: ❝ 为了方便演示和讲解,在这里提前准备好几个简单的文件:test.cpp test.h main.cpp 文件内容如下: ❞ main.cpp #include "test.h& ...

  5. ubuntu18.04环境下配置opencv c++环境(make实现cpp编译)

    安装环境:ubuntu18.04 opencv包:opencv-3.4.15 1.确保你的ubuntu可以联网 大多数如果初始不是ubuntu等linux系统,有可能本来支持windows,但是换了l ...

  6. stdafx.cpp编译引起的C2859、C1083、LNK2001错误

    今天在VC2005中修改一个工程的文件结构,将"stdafx.cpp"文件挪动了位置,编译时出现C2859错误,具体信息如下: error C2859: e:/projects/a ...

  7. matlab将cpp编译为dll,Matlab函数编译成dll供Cpp调用的方法图解教程

    曾经实现过将matlab函数编译成dll供Cpp调用,这篇文章的目的是对新增的面向对象的的扩展mwArray进行讲解,matlab很容易和C/C++联合起来使用. 以前做过matlab7与c++的混合 ...

  8. .cpp 编译成.a或是 .so

    1.将.c 文件编译成.o文件 gcc -c test1.c test2.c test3.c 2.然后用ar命令生成.a文件,ar crv test.a test1.o test2.o test3.o ...

  9. C/CPP 编译原理 硬件相关

    1.static修饰局部变量和全局变量会有什么效果 解题思路 静态全局变量:具有全局作用域,它与全局变量的区别在于如果程序包含多个文件的话,它作用于定义它的文件里,不能作用到其它文件里,即被 stat ...

最新文章

  1. 来聊一聊Cookie(小甜饼),及其涉及到的web安全吧
  2. python报错TabError: inconsistent use of tabs and spaces in indentation解决方案
  3. mysql end log pos_MySql binlog日志详解
  4. java并发synchronized 锁的膨胀过程(锁的升级过程)深入剖析(1)
  5. php dingo和jwt,dingo配合laravel、JWT使用
  6. html界面左侧没有顶格,求解,html页面顶部有空白??
  7. activiti操作流程的几个demo
  8. 谁将拥有移动互联网的下一个机会?…
  9. matlab2c使用c++实现matlab函数系列教程-rank函数
  10. typora html代码无效,Typora优化-适合不懂CSS代码的小白
  11. iStack详解(二)——堆叠连接方式堆叠拓扑变动处理
  12. mysql io线程 原理_mysql 原理 ~ 线程与IO
  13. 利用IAR软件,将KEIL项目工程直接转换IAR项目工程
  14. 解决在局域网内QQ传文件慢的问题(转)
  15. 【计算机网络】数据链路层(超多图详析)
  16. python wmi 显卡型号_确定通过WMI运行的GPU
  17. 多进程中之文件描述符继承的消除
  18. k8s 偏向运维技术 ,后端程序员为什么要学习k8s?
  19. 江苏小学计算机面试题目,2019下半年江苏省小学信息技术教师资格证面试试题(精选)(三)...
  20. 英集芯IP5566带TYPE-C口3A充放快充移动电源5w无线充二合一方案SOC

热门文章

  1. SSM搭建二手市场交易平台(一):开发流程与环境搭建
  2. 用友财务软件--T3
  3. 基于AT89C52单片机的温度检测报警设计
  4. VMware 克隆虚拟机
  5. 玉林首创广西全区不动产登记与房产交易一体化信息平台
  6. 四种发生器的使用方法——FlexSim
  7. 项目交易平台上发布的项目
  8. 中国式危机公关9加1策略(第四章 情感公关策略)
  9. miniPCIe标准
  10. 小程序图片作为背景图无法铺满的问题