whisper.cpp

OpenAI Whisper 模型的 C/C++ 移植
授权协议 MIT
开发语言 C/C++ C/C++ C/C++ C/C++ C/C++
所属分类 神经网络/人工智能、 机器学习/深度学习
软件类型 开源软件
地区 不详
投 递 者 祁和通
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

whisper.cpp 是 OpenAI 的 Whisper 自动语音识别 (ASR) 模型的  C/C++ 移植

特性

  • 没有依赖项的普通 C/C++ 实现
  • Apple silicon 一等公民 - 通过 Arm Neon 和 Accelerate 框架优化
  • AVX 内在函数支持 x86 架构
  • VSX 内在函数支持 POWER 架构
  • 混合 F16 / F32 精度
  • 内存使用率低(Flash Attention)
  • 运行时零内存分配
  • 在 CPU 上运行
  • C 风格的 API

支持的平台:

  •  Mac OS (Intel and Arm)
  •  iOS
  •  Android
  •  Linux / FreeBSD
  •  WebAssembly
  •  Windows (MSVC and MinGW]
  •  Raspberry Pi

模型的整个实现包含在2个源文件中:

这种轻量级的模型实现允许容易地将 OpenAI 的 Whisper 模型集成到不同的平台和应用程序中。

实现细节

  • 核心张量运算在 C 中实现 (ggml.h / ggml.c)
  • 转换器模型和高级 C 风格的 API 是用 C++ 实现的  (whisper.h / whisper.cpp)
  • main.cpp 中演示了示例用法
  • stream.cpp 中演示了麦克风的实时音频转录示例
  •  examples 文件夹中提供了各种其他示例

张量运算符针对 Apple 芯片的 CPU 进行了大量优化。根据计算大小,使用 Arm Neon SIMD instrisics 或 CBLAS Accelerate 框架例程。后者对于更大的尺寸特别有效,因为 Accelerate 框架利用现代 Apple 产品中提供的专用 AMX 协处理器。

Quick start 快速开始

首先,下载一个转换为 ggml 格式的 Whisper 模型。例如:

bash ./models/download-ggml-model.sh base.en

构建主要示例并转录一个音频文件,如下所示:

# build the main example
make

# transcribe an audio file
./main -f samples/jfk.wav

要快速演示,只需运行 make base.en 

$ make base.en

cc  -I.              -O3 -std=c11   -pthread -DGGML_USE_ACCELERATE   -c ggml.c -o ggml.o
c++ -I. -I./examples -O3 -std=c++11 -pthread -c whisper.cpp -o whisper.o
c++ -I. -I./examples -O3 -std=c++11 -pthread examples/main/main.cpp whisper.o ggml.o -o main  -framework Accelerate
./main -h

usage: ./main [options] file0.wav file1.wav ...

options:
  -h,        --help              [default] show this help message and exit
  -t N,      --threads N         [4      ] number of threads to use during computation
  -p N,      --processors N      [1      ] number of processors to use during computation
  -ot N,     --offset-t N        [0      ] time offset in milliseconds
  -on N,     --offset-n N        [0      ] segment index offset
  -d  N,     --duration N        [0      ] duration of audio to process in milliseconds
  -mc N,     --max-context N     [-1     ] maximum number of text context tokens to store
  -ml N,     --max-len N         [0      ] maximum segment length in characters
  -bo N,     --best-of N         [5      ] number of best candidates to keep
  -bs N,     --beam-size N       [-1     ] beam size for beam search
  -wt N,     --word-thold N      [0.01   ] word timestamp probability threshold
  -et N,     --entropy-thold N   [2.40   ] entropy threshold for decoder fail
  -lpt N,    --logprob-thold N   [-1.00  ] log probability threshold for decoder fail
  -su,       --speed-up          [false  ] speed up audio by x2 (reduced accuracy)
  -tr,       --translate         [false  ] translate from source language to english
  -di,       --diarize           [false  ] stereo audio diarization
  -nf,       --no-fallback       [false  ] do not use temperature fallback while decoding
  -otxt,     --output-txt        [false  ] output result in a text file
  -ovtt,     --output-vtt        [false  ] output result in a vtt file
  -osrt,     --output-srt        [false  ] output result in a srt file
  -owts,     --output-words      [false  ] output script for generating karaoke video
  -ocsv,     --output-csv        [false  ] output result in a CSV file
  -of FNAME, --output-file FNAME [       ] output file path (without file extension)
  -ps,       --print-special     [false  ] print special tokens
  -pc,       --print-colors      [false  ] print colors
  -pp,       --print-progress    [false  ] print progress
  -nt,       --no-timestamps     [true   ] do not print timestamps
  -l LANG,   --language LANG     [en     ] spoken language ('auto' for auto-detect)
             --prompt PROMPT     [       ] initial prompt
  -m FNAME,  --model FNAME       [models/ggml-base.en.bin] model path
  -f FNAME,  --file FNAME        [       ] input WAV file path


bash ./models/download-ggml-model.sh base.en
Downloading ggml model base.en ...
ggml-base.en.bin               100%[========================>] 141.11M  6.34MB/s    in 24s
Done! Model 'base.en' saved in 'models/ggml-base.en.bin'
You can now use it like this:

  $ ./main -m models/ggml-base.en.bin -f samples/jfk.wav


===============================================
Running base.en on all samples in ./samples ...
===============================================

----------------------------------------------
[+] Running base.en on samples/jfk.wav ... (run 'ffplay samples/jfk.wav' to listen)
----------------------------------------------

whisper_init_from_file: loading model from 'models/ggml-base.en.bin'
whisper_model_load: loading model
whisper_model_load: n_vocab       = 51864
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: kv self size  =    5.25 MB
whisper_model_load: kv cross size =   17.58 MB
whisper_model_load: adding 1607 extra tokens
whisper_model_load: model ctx     =  140.60 MB
whisper_model_load: model size    =  140.54 MB

system_info: n_threads = 4 / 10 | AVX = 0 | AVX2 = 0 | AVX512 = 0 | FMA = 0 | NEON = 1 | ARM_FMA = 1 | F16C = 0 | FP16_VA = 1 | WASM_SIMD = 0 | BLAS = 1 | SSE3 = 0 | VSX = 0 |

main: processing 'samples/jfk.wav' (176000 samples, 11.0 sec), 4 threads, 1 processors, lang = en, task = transcribe, timestamps = 1 ...


[00:00:00.000 --> 00:00:11.000]   And so my fellow Americans, ask not what your country can do for you, ask what you can do for your country.


whisper_print_timings:     fallbacks =   0 p /   0 h
whisper_print_timings:     load time =   113.81 ms
whisper_print_timings:      mel time =    15.40 ms
whisper_print_timings:   sample time =    11.58 ms /    27 runs (    0.43 ms per run)
whisper_print_timings:   encode time =   266.60 ms /     1 runs (  266.60 ms per run)
whisper_print_timings:   decode time =    66.11 ms /    27 runs (    2.45 ms per run)
whisper_print_timings:    total time =   476.31 ms

 该命令下载转换为自定义 ggml 格式的 base.en 模型,并对文件夹 samples 中的所有 .wav 样本运行推理。

有关详细的使用说明,请运行: ./main -h

请注意,主要示例当前仅使用 16 位 WAV 文件运行,因此请确保在运行该工具之前转换您的输入。例如,您可以像这样使用 ffmpeg 

ffmpeg -i input.mp3 -ar 16000 -ac 1 -c:a pcm_s16le output.wav

内存使用状况

Model Disk Mem SHA
tiny 75 MB ~125 MB bd577a113a864445d4c299885e0cb97d4ba92b5f
base 142 MB ~210 MB 465707469ff3a37a2b9b8d8f89f2f99de7299dac
small 466 MB ~600 MB 55356645c2b361a969dfd0ef2c5a50d530afd8d5
medium 1.5 GB ~1.7 GB fd9727b6e1217c2f614f9b698455c4ffd82463b4
large 2.9 GB ~3.3 GB 0f4c8e34f21cf1a914c59d8b3ce882345ad349d6

 

  • 业界良心OpenAI开源的Whisper模型是开源语音转文字领域的执牛耳者,白璧微瑕之处在于无法通过苹果M芯片优化转录效率,Whisper.cpp 则是 Whisper 模型的 C/C++ 移植版本,它具有无依赖项、内存使用量低等特点,重要的是增加了 Core ML 支持,完美适配苹果M系列芯片。 Whisper.cpp的张量运算符针对苹果M芯片的 CPU 进行了大量优化,根据计算大小,使用 Ar

  • 要在 Java 中调用 Whisper,首先需要安装 Whisper 并将其配置为运行在本地。然后,可以使用 Java 的 IPC (Inter-Process Communication) 库,如 Apache Thrift 或 gRPC 来与 Whisper 进行通信。 具体实现可能会有所不同,但通常需要以下步骤: 定义与 Whisper 通信所需的数据结构(如请求和响应)。 使用选定的 IP

  • 以太坊系列之二十 以太坊中的基础应用whisper 以太坊系列之二十 以太坊中的基础应用whisper 1 whisper介绍 2 whisper rpc模块 3 whisper中的消息 4 消息的加密 5 过滤器 以太坊作为一个区块链生态系统,为区块链dapp应用提供了丰富的环境,whisper就是其中一个基础性设施.它相当于是以太坊中的bitmessage,希望以后dapp中可以用上whisp

  • 报错全称 main.cpp在IDEA控制台输出乱码中文 代码 main.cp 疑似产生的原因 encoding问题 弯路、坑 将IDEA所有设计encoding的地方设置成UTF-8 分析 在IDEA新建main.cpp,编写内容包含中文,用记事本打开main.cpp,点击右键->另存为提示存储编码为UTF-8,那么是否main.cpp是UTF-8编码呢,结果不是 解决方案 仍然乱码,在IDEA检

 相关资料
  • 本文向大家介绍解析C语言与C++的编译模型,包括了解析C语言与C++的编译模型的使用技巧和注意事项,需要的朋友参考一下 首先简要介绍一下C的编译模型: 限于当时的硬件条件,C编译器不能够在内存里一次性地装载所有程序代码,而需要将代码分为多个源文件,并且分别编译。并且由于内存限制,编译器本身也不能太大,因此需要分为多个可执行文件,进行分阶段的编译。在早期一共包括7个可执行文件:cc(调用其它可执行文

  • 本文向大家介绍C++之WSAAsyncSelect模型实例,包括了C++之WSAAsyncSelect模型实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C++中WSAAsyncSelect模型的用法。分享给大家供大家参考。具体实现方法如下: TCPServer.cpp源文件如下: TCPServer.h头文件如下: TCPClient.cpp源文件如下: TCPClient.h头文件

  • 本文向大家介绍C++中I/O模型之select模型实例,包括了C++中I/O模型之select模型实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C++中I/O模型的select模型用法。分享给大家供大家参考。具体实现方法如下: 效果如下图所示: 希望本文所述对大家的C++程序设计有所帮助。

  • 译者:talengu PyTorch的主要接口为Python。虽然Python有动态编程和易于迭代的优势,但在很多情况下,正是Python的这些属性会带来不利。我们经常遇到的生产环境,要满足低延迟和严格部署要求。对于生产场景而言,C 通常是首选语言,也能很方便的将其绑定到另一种语言,如Java,Rust或Go。本教程将介绍从将PyTorch训练的模型序列化表示,到C语言_加载_和_执行_的过程。

  • 我喜欢线程安全的,它允许我使用和方法“阻止”直到新项目可用,例如阻止最大值1秒: 什么是的C++/boost模拟?

  • 主要内容:泛型的特性,泛型方法,泛型委托在 C# 中,泛型(Generic)是一种规范,它允许我们使用占位符来定义类和方法,编译器会在编译时将这些占位符替换为指定的类型,利用泛型的这一特性我们可以定义通用类(泛型类)或方法(泛型方法)。 定义通用类需要使用尖括号 ,这里的尖括号用于将类或方法声明为泛型。下面通过一个简单的示例来帮助您理解这个概念: 允许结果如下: 小牛知识库 1234567 C 泛型的特性 可以将泛型看作是一种增强程序功

  • 更新时间:2018-12-29 10:14:27 简介 使用阿里云IoT提供了C SDK移植适配自己的嵌入式硬件的详细介绍,请参考《移植指南》。 需要三个步骤完成移植: 在Ubuntu上编译主机版本 交叉编译到嵌入式硬件平台 开发未适配平台的HAL层 Hacklab已经提供了移植到arm-linux平台需要的工作环境和工具,可以直接在Hacklab中完成交叉编译需要的工作,编译好的库文件和需要的头

  • 模板是泛型编程的基础,它涉及以独立于任何特定类型的方式编写代码。 模板是用于创建泛型类或函数的蓝图或公式。 像迭代器和算法这样的库容器是通用编程的示例,并且是使用模板概念开发的。 每个容器都有一个定义,例如vector ,但我们可以定义许多不同类型的向量,例如vector 《int》或vector 《string》 。 您可以使用模板来定义函数和类,让我们看看它们是如何工作的 - 功能模板 此处显