1. 背景

whisper是OpenAI官方发布的一款开源语音识别大模型,使用python实现。可以将语音信息转化为文本信息。其实也叫做ASR”自动语音识别”(Automatic Speech Recognition)。本文主要做的工作如下:

  • 搭建whisper服务,和dify进行语音转写配合
  • 针对MacOS进行优化编写
    本文主要是用whisper.cpp,两者的区别是因为whipser官方默认功能比较重,whisper.cpp是社区将该模型移植到了C/C++版本,针对CPU和性能做了大量优化,区别如下:
对比项目 whisper.cpp whisper(官方实现)
语言与依赖 - 纯 C/C++ 实现 - 几乎不依赖第三方深度学习库,安装轻量 - Python + PyTorch(或其他深度学习框架) - 依赖完整的深度学习环境(GPU 驱动、Python 环境等)
运行平台/环境 - 可在 Linux、macOS、Windows、移动端等多平台编译运行 - 针对 CPU 优化,依赖 SIMD 指令集 - 一般在有 GPU(NVIDIA CUDA)的服务器/工作站或本地带 GPU 的环境中运行 - 也可在 CPU 上跑,但速度相对较慢
性能特点 - 专门针对 CPU 进行优化(AVX/AVX2/NEON 等) - 在较低端硬件上也有不错的推理速度 - 在 GPU 上推理速度快 - 在 CPU 上速度相对更慢,除非硬件配置较高或者模型规模小
使用方式 - 提供命令行工具和 C/C++ API - 无需安装 Python,即可离线编译使用 - 通过 Python 脚本或 CLI 使用 - 需要安装 PyTorch、依赖 Python 生态
模型兼容性 - 支持官方的 Whisper 模型权重(需转换为 ggml 格式) - 部分模型可进行量化(如 int8、int4) - 直接使用官方发布的 .pt 或 .bin 模型权重
部署场景 - 适用于资源受限或不便部署 Python/PyTorch 的场景 - 可跨平台、嵌入式、本地离线语音转录等 - 适用于有 GPU 环境的服务器或工作站,处理大批量音频数据 - 与 Python 生态(如深度学习工具、pipeline 等)配合度更高
社区与生态 - 由社区维护,活跃度较高 - 不断出现新的优化分支、量化方案等 - 由 OpenAI 发布,社区广泛使用 - 生态成熟,有众多第三方封装库、扩展
适用人群 - C++/系统开发者或需要轻量级部署的用户 - 不想依赖 Python 环境、希望本地 CPU 直接推理 - Python/深度学习开发者 - 需要与 PyTorch 兼容或直接在研究、生产环境中使用可扩展的深度学习框架
github的官方网址:
1
https://github.com/ggerganov/whisper.cpp

2. 安装

2.1 基础环境搭建

首先进行github文件下载并进入文件夹:

1
2
git clone https://github.com/ggerganov/whisper.cpp.git
cd whisper.cpp

根据需要下载whisper的模型:

1
sh ./models/download-ggml-model.sh base

其注意,不同的模型,需要的内存和大小不同,占用的存储和内存如下,一般来说使用small和base基本上也足够了。

Model Disk Mem
tiny 75 MiB ~273 MB
base 142 MiB ~388 MB
small 466 MiB ~852 MB
medium 1.5 GiB ~2.1 GB
large 2.9 GiB ~3.9 GB
注意,本下载需要从huggingface.co下载,如果无法下载,可以从官网下载
从官网下载,官网地址:https://ggml.ggerganov.com/
1
2
cd models
wget https://ggml.ggerganov.com/ggml-model-whisper-base.bin

下载下来的文件进行MD5校验,可以看到和huggingface上的md5一致。

1
2
3
 shasum -a 1 ggml-model-whisper-base.bin

>>465707469ff3a37a2b9b8d8f89f2f99de7299dac ggml-model-whisper-base.bin

2.2 MacOS环境优化

针对苹果的M系列芯片,whisper.cpp进行了单独的优化,可以比单纯CPU速度更快。在安装之前保证:

  • xcode正确安装,如果没有安装,在appstore上安装,并使用xcode-select --install进行工具安装
  • 使用python3.10
  • MacOS的版本大于14.0
    开始进行虚拟环境搭建:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 安装homebrew
    /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
    # 安装miniconda
    brew install --cask miniconda

    # 创建虚拟环境
    conda create -n py310-whisper python=3.10 -y
    # 激活虚拟环境
    conda activate py310-whisper
    如果报错CondaError: Run 'conda init' before 'conda activate',是因为.bashrc中没有初始化,执行:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # 执行看是否有激活环境
    cat ~/.zshrc | grep conda
    cat ~/.bash_profile | grep conda

    # 如果出现如下内容,则说明有添加,需要重新执行一下,如果没有,需要手动添加到bash_profile下,然后再激活虚拟环境
    # >>> conda initialize >>> __conda_setup="$('/opt/homebrew/Caskroom/miniforge/base/bin/conda' 'shell.zsh' 'hook' 2> /dev/null)" eval "$__conda_setup" unset __conda_setup # <<< conda initialize <<<
    # 如果有,需要执行一下
    source ~/.bash_profile

    # 如果没有,手动添加执行
    echo 'eval "$(/opt/homebrew/Caskroom/miniforge/base/bin/conda shell.zsh hook)"' >> ~/.zshrc
    source ~/.zshrc
    激活虚拟环境后进行环境安装:
    1
    2
    3
    pip install ane_transformers
    pip install openai-whisper
    pip install coremltools
    开始针对Core ML进行模型优化,比如刚刚下载的是base,那么执行:
    1
    ./models/generate-coreml-model.sh base
    执行后会生成models/ggml-base-encoder.mlmodelc文件夹,然后开始进行针对mac优化的编译:
    1
    2
    3
    # using CMake,其中DWHISPER_COREML=1表示对macos的优化
    cmake -B build -DWHISPER_COREML=1
    cmake --build build -j --config Release
    编译完毕后,可以运行sample:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $ ./build/bin/whisper-cli -m models/ggml-base.bin -f samples/jfk.wav

    ...

    whisper_init_state: loading Core ML model from 'models/ggml-base-encoder.mlmodelc'
    whisper_init_state: first run on a device may take a while ...
    whisper_init_state: Core ML model loaded

    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 | COREML = 1 |

    ...
    如果运行成功则表示运行成功了。
    其中以目前whisper-cli仅支持16-bit wav格式的音频文件,如果不是此类文件比如是mp3文件,则需要使用ffmpeg进行转化。比如:
    1
    ffmpeg -i test.mp3 -ar 16000 -ac 1 -c:a pcm_s16le output.wav