ToB企服应用市场:ToB评测及商务社交产业平台

标题: Whisper.cpp 0底子搭建音频文件转笔墨(Windows下C++) [打印本页]

作者: 汕尾海湾    时间: 2024-7-15 05:09
标题: Whisper.cpp 0底子搭建音频文件转笔墨(Windows下C++)
介绍

whisper.cpp是一个开源项目,它是对OpenAI的Whisper模型的C/C++移植实现。
OpenAI的Whisper是一个主动语音识别(ASR)体系,颠末大量多语言和多任务的监督数据练习,可以或许举行多语言语音识别、语音翻译和语言识别等任务。而whisper.cpp项目使得这个模型可以或许在差别的平台上以当地方式运行,包括但不限于Windows、Mac OS、Linux、Android和WebAssembly等。
whisper.cpp的优势主要体如今以下几个方面:
无依靠性: whisper.cpp不需要安装任何第三方的库或框架,只需要一个C/C++编译器就可以编译和运行,这减少了对外部库的依靠。
轻量级: whisper.cpp库非常小巧,只有一个源文件,便于集成到任何项目中,无论是大型还是小型,都不会增长过多的负担。
高性能: 通过使用模板元编程和C++17特性,whisper.cpp在运行时几乎无额外开销。它使用了类型安全的方式,保证了事件处理惩罚的服从。
简单易用: 设计简洁明了,API友好,开发者可以快速上手并开始编写事件驱动的代码。
此外,whisper.cpp还提供了音频转笔墨的功能,但需要注意的是,它现在只支持16khz的wav文件格式的音频文件。在使用前,可能需要使用如ffmpeg这样的工具将音频文件转换成所需的格式。
总的来说,whisper.cpp是一个功能强大且机动的语音识别工具,为开发者提供了在多种平台上举行当地语音识别的新选择。然而,由于技能范畴的快速发展,发起在使用前查阅最新的文档和资料,以确保获取最准确和最新的信息。
关于Whisper.cpp是个什么东西我就不外多解释了,这里主要是说搭建环境的,对于Whisper.cpp的说明网上有一大堆,也有点懒得写了。
参考文档:
​https://blog.csdn.net/weixin_52318459/article/details/139546485
下载

whisper.cpp 的地点

whisper.cpp地点
whisper.cpp github官网关于Models介绍部门
或使用Git下令将项目克隆到当地:
  1. git clone https://github.com/ggerganov/whisper.cpp
复制代码
没有装Git的,可以参考以下链接:
Git安装链接
Model的地点

Model的地点
下完whisper.cpp项目之后还要下载Model,我用的是small Model,关于Model的具体描述请找其他文章,写这个Blog的时候我对whisper.cpp也不是很了解,只是刚刚搭建好环境而已,记录一下。
在whisper.cpp 项目的根目录中有个models文件夹,进去使用下令下载small Model,
下面的是CMD下令,在cmd中执行:
  1. download-ggml-model.cmd small
复制代码
另有一个shell下令:
  1. download-ggml-model.sh medium
复制代码
恣意挑一个,参考下图。
注意:假如两个下令都不成功,那就看一下能不能访问Model的地点(上面的链接),假如访问不了,那就需要使用迅雷下载了,往下看。


迅雷下载Model

迅雷Model下载链接
可根据差别的Model填写差别的链接路径:
  1. https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-small.bin
复制代码

注意Model需要放在Whisper.cpp项目中的Models文件夹中。
make
下令天生Main.exe


上面两步成功之后就在Whisper.cpp项目的根路径下使用Git下令天生main.exe
  1. make
复制代码
假如显示make
下令不存在就参考以下链接安装make
下令:

make
下令参考链接
安装好make
下令后就继承执行,假如执行失败显示GCC不存在的话就参考以下链接:

GCC安装参考链接
继承执行make
下令,假如make
下令成功执行没有报错的话,往下看.
在Whisper.cpp项目的根路径下使用Git下令举行音频文件识别,识别成功后的文件在samples文件夹中的jfk.wav.srt文件中。
  1. ./main -osrt -m ./models/ggml-small.bin -f samples/jfk.wav
复制代码
ffmpeg

whisper.cpp现在只支持16khz的wav文件格式的音频文件,以是其他文件可以使用ffmpeg来转换为.wav文件。
假如还没有安装ffmpeg可以参考以下链接:
ffmpeg安装链接
  1. ffmpeg -i ./repeat.mp3 -ar 16000 -ac 1 -c:a pcm_s16le ./repeat.wav
复制代码
  1. ./main -osrt -m ./models/ggml-medium.bin -f samples/repeat.wav -l zh
复制代码
使用 whispe.cpp 的 demo

参考的文章
whisper 中的几个函数:

whisper_lang_id() :语言支持检测——这里要使用小写,如 chinese 而不能用 Chinese.
whisper_context_default_params() :设置默认的上下文参数
whisper_init_from_file_with_params() :初始化上下文
whisper_is_multilingual() :查抄上下文是否支持多国语言
whisper_full(): 语音识别过程的函数
whisper_full_n_segments(): 获取一共产生了多少段笔墨
whisper_full_get_segments_text(): 获取识别到的一段笔墨
whisper_full_n_token() :一段识别中有多少个 tokern
whisper_full_get_token_id() :获取对应 id 的 token
代码部门

代码写在main.cpp中,然后重新回到根目录whisper.cpp中执行make
下令天生新的main.exe,然后执行main.exe测试新写入的代码功能即可

  1. #include "common.h"
  2. #include "whisper.h"
  3. #include "grammar-parser.h"
  4. #include <cmath>
  5. #include <fstream>
  6. #include <cstdio>
  7. #include <regex>
  8. #include <string>
  9. #include <thread>
  10. #include <vector>
  11. #include <cstring>
  12. bool wav_read(std::string fname, std::vector<float>& pcmf32)
  13. {
  14.     std::vector<std::vector<float>> pcmf32s;
  15.     if (!::read_wav(fname, pcmf32, pcmf32s, false)) {
  16.         fprintf(stderr, "error: failed to read WAV file '%s'\n", fname.c_str());
  17.         return false;
  18.     }
  19.     return true;
  20. }
  21. int whisper_init(struct whisper_context * *ctx, whisper_full_params& wparams)
  22. {
  23.     if (whisper_lang_id("chinese") == -1) {
  24.         fprintf(stderr, "error: unknown language '%s'\n", "Chinese");
  25.         exit(0);
  26.     }
  27.     struct whisper_context_params cparams = whisper_context_default_params();
  28.     cparams.use_gpu = false;
  29.    *ctx = whisper_init_from_file_with_params("models/ggml-small.bin", cparams);
  30.     if (*ctx == nullptr) {
  31.         fprintf(stderr, "error: failed to initialize whisper context\n");
  32.         return 3;
  33.     }
  34.     wparams = whisper_full_default_params(WHISPER_SAMPLING_GREEDY);
  35.     wparams.language         = "chinese";
  36.     return 0;
  37. }
  38. int whisper_exit(struct whisper_context ** ctx)
  39. {
  40.     whisper_free(*ctx);
  41.     return 0;
  42. }
  43. int whisper_identify(struct whisper_context **ctx, whisper_full_params& wparams, std::vector<float> pcmf32, std::string& result)
  44. {
  45.     if(whisper_full(*ctx, wparams, pcmf32.data(), pcmf32.size()) != 0){
  46.         return -1;
  47.     }
  48.     const int n_segments = whisper_full_n_segments(*ctx);
  49.     for (int i = 0; i < n_segments; ++i) {
  50.         const char * text = whisper_full_get_segment_text(*ctx, i);
  51.         result += text;
  52.     }
  53.     return 0;
  54. }
  55. int main(int argc, char ** argv) {
  56.     std::vector<float> pcmf32;
  57.     struct whisper_context *ctx = nullptr;
  58.     whisper_full_params wparams;
  59.     std::string text;
  60.     if(!wav_read("output.wav", pcmf32)){
  61.         fprintf(stderr, "wave read failed !\n");
  62.         return -1;
  63.     }
  64.     if(whisper_init(&ctx, wparams)){
  65.         fprintf(stderr, "whisper init error !\n");
  66.         return -1;
  67.     }
  68.     if(whisper_identify(&ctx, wparams, pcmf32, text)){
  69.         fprintf(stderr, "identify error !\n");
  70.         return 0;
  71.     }
  72.     whisper_exit(&ctx);
  73.    fprintf(stdout, "text is : %s\n", text.c_str());
  74.     return 0;
  75. }
复制代码
好了,临时到这了。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4