1. 为什么你的Mac M芯片转录还不够快?
如果你正在用Mac处理音频转录,尤其是那些动辄一两个小时的会议录音、播客或者课程视频,那你肯定对漫长的等待时间深有体会。我之前也是,用着M2 Max的MacBook Pro,跑个Whisper转录,看着进度条慢悠悠地走,CPU风扇呼呼转,心里就在想:这性能不是号称很强吗?怎么干这点活就这么费劲?
问题就出在这里。默认情况下,很多转录工具,包括Whisper的原始Python版本,主要依赖CPU进行计算。虽然Apple Silicon的CPU性能确实不错,但它真正的“大杀器”——GPU和神经网络引擎(Neural Engine)——却常常在后台“睡大觉”。这就好比你有了一辆跑车,却只用一档在市区里慢慢开,完全没发挥出它的实力。
Whisper.cpp的出现,加上CoreML的深度优化,就是为了解决这个痛点。简单来说,Whisper.cpp是Whisper模型的C++移植版,它本身就对CPU做了大量优化,跑起来就比原版Python快不少。但真正的“魔法加速”,来自于通过CoreML将模型的计算任务“卸载”到Mac M芯片的专用硬件上。实测下来,开启CoreML加速后,转录速度提升2-3倍是家常便饭,对于长音频文件,以前需要半小时的活,现在可能十分钟就搞定了。这不仅仅是快,功耗和发热也明显降低,你的MacBook终于可以安静又凉爽地完成繁重任务了。
所以,这篇文章就是为你准备的,如果你受够了龟速转录,想彻底榨干手中Mac M芯片的每一分性能,那么跟着我一步步来,从环境搭建、模型转换到实战优化,让你体验什么叫“极速转录”。
2. 战前准备:搭建你的极速转录环境
工欲善其事,必先利其器。在开始“飙车”之前,我们需要把跑道和赛车准备好。整个过程其实不复杂,但有几个关键步骤必须做对。
2.1 基础工具:Xcode与Homebrew
首先,确保你的macOS系统是较新的版本(建议macOS 13 Ventura或更高),这对CoreML的支持更好。然后,我们需要两个基石工具:
-
Xcode命令行工具:这是编译C++代码和链接系统库的基础。打开终端,运行以下命令安装或检查:
xcode-select --install如果已经安装,它会提示你;如果没安装,会弹出安装窗口。安装完成后,可以用
xcode-select -p来验证路径。 -
Homebrew:macOS上强大的包管理器,能让我们轻松安装后续的各种依赖。如果你还没安装,一行命令搞定:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"安装好后,我们用它来安装两个关键工具:
cmake(用于构建项目)和ffmpeg(用于处理音频格式转换)。brew install cmake ffmpegffmpeg特别重要,因为Whisper.cpp对输入音频格式有要求,我们经常需要用它把MP3、M4A等常见格式转换成标准的16kHz、单声道、16位PCM的WAV文件。
2.2 获取核心武器:Whisper.cpp与模型
环境就绪,现在来获取我们的核心——Whisper.cpp项目本身。
打开终端,找一个你喜欢的目录,克隆项目仓库:
git clone https://github.com/ggerganov/whisper.cpp.git
cd whisper.cpp
接下来是模型。Whisper提供了从tiny到large多个尺寸的模型,越大精度通常越高,但速度越慢,占用内存也越多。对于Mac用户,我个人的经验是,medium模型在精度和速度上取得了很好的平衡,适合大多数场景。large模型虽然更准,但转录速度会慢不少,除非你对准确率有极致要求。
你可以使用项目自带的脚本下载模型,比如下载medium模型:
sh ./models/download-ggml-model.sh medium
但是,由于模型文件托管在Hugging Face上,国内下载有时会很慢甚至失败。别担心,我们有备选方案:手动下载。
直接打开浏览器,访问这个地址:https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-medium.bin,浏览器就会开始下载这个大约1.5GB的模型文件。下载完成后,把它放到 whisper.cpp/models/ 目录下即可。其他模型同理,只需替换URL中的模型名称,比如 ggml-large-v3.bin。
3. 解锁硬件加速:CoreML模型转换实战
这是整个流程中最关键的一步,也是发挥M芯片性能的核心。我们需要将下载好的Whisper模型,转换成Apple设备能高效执行的CoreML格式。这个过程听起来高大上,但实际操作起来,项目已经为我们准备好了自动化脚本。
3.1 配置Python转换环境
转换脚本是用Python写的,所以我们需要一个独立的Python环境来避免污染系统环境,也便于管理依赖。我强烈推荐使用conda来创建虚拟环境。
首先,如果你还没安装Miniforge(一个针对Apple Silicon优化的conda发行版),可以用Homebrew安装:
brew install miniforge
然后,创建并激活一个专用于Whisper的Python 3.10环境(3.10版本兼容性最好):
conda create -n whisper_coreml python=3.10 -y
conda activate whisper_coreml
激活环境后,你的命令行提示符前面应该会出现 (whisper_coreml) 字样。
接下来,安装转换所需的Python包。这里需要注意顺序和版本,我踩过坑,直接照搬我的命令最稳:
pip install torch==2.5.0 --extra-index-url https://download.pytorch.org/whl/cpu
pip install openai-whisper coremltools
pip install --no-deps ane-transformers
这里解释一下:torch我们安装CPU版本即可,因为转换过程主要在CPU上进行;openai-whisper是原始的Whisper库,我们需要用它来加载PyTorch模型;coremltools是苹果官方的模型转换工具;ane-transformers是一个专门优化Transformer模型在Apple Neural Engine上运行的库,--no-deps是为了避免它安装可能冲突的依赖。
3.2 执行CoreML模型转换
环境准备好后,转换就非常简单了。确保你当前在 whisper.cpp 项目的根目录下,并且 whisper_coreml 虚拟环境已激活。
运行转换脚本,指定你要转换的模型。例如,转换我们刚才下载的 medium 模型:
./models/generate-coreml-model.sh medium
这个脚本会自动工作,它会调用 convert-whisper-to-coreml.py 等内部脚本,将原始的ggml模型转换为CoreML格式。你会在终端看到一系列转换日志。整个过程可能需要几分钟,取决于你的Mac性能。
成功的关键标志:转换完成后,你会在 whisper.cpp/models/ 目录下发现一个新生成的文件夹,名字类似于 coreml-encoder-medium.mlpackage。这个就是转换成功的CoreML模型包,是我们后续加速的“燃料”。
常见问题与手动方案:有时候运行脚本可能会报错,例如提示 coremlc: error: Model does not exist。这通常是因为脚本内部尝试下载一个中间模型文件失败了。别慌,我们可以手动补救。以 large-v3-turbo 模型为例,你可以手动下载其CoreML编码器部分:
curl -L -o models/coreml-encoder-large-v3-turbo.mlpackage https://huggingface.co/ggerganov/whisper.cpp/resolve/main/coreml-encoder-large-v3-turbo.mlpackage
对于其他模型,你可以在项目的GitHub仓库或Hugging Face页面找到对应的CoreML模型文件链接。手动下载后放入 models/ 目录,效果是一样的。
4. 编译与运行:点燃M芯片的引擎
模型转换好了,接下来我们需要编译一个能够识别并使用这个CoreML模型的Whisper.cpp可执行文件。
4.1 启用CoreML支持的编译
Whisper.cpp默认编译是不启用CoreML的,我们需要在编译时通过一个标志来开启它。这里提供两种编译方式,任选其一即可,我通常用CMake,感觉更灵活。
方法一:使用Makefile编译
make clean
WHISPER_COREML=1 make -j
make clean 是清理之前的编译结果,确保重新编译。WHISPER_COREML=1 这个环境变量就是告诉编译器:“嘿,把CoreML支持给我加进去!” -j 参数表示使用所有可用的CPU核心并行编译,速度更快。
方法二:使用CMake编译(推荐)
mkdir build && cd build
cmake -DWHISPER_COREML=1 ..
make -j
这种方式更现代,先在 build 目录下配置CMake,明确指定 -DWHISPER_COREML=1 选项,然后进行编译。编译成功后,可执行文件 whisper-cli 会生成在 build/bin/ 目录下。
编译过程如果没有报错,最后几行通常会显示链接成功的信息。这时,你可以运行 ./build/bin/whisper-cli(如果在build目录内)或 ./bin/whisper-cli(如果使用Makefile且在项目根目录)来测试是否成功。
4.2 进行你的第一次极速转录
激动人心的时刻到了!让我们用编译好的程序,配合CoreML模型,来转录一段音频试试。
首先,准备你的音频文件。假设你有一个 meeting.mp3 文件,先用 ffmpeg 转换成Whisper.cpp需要的格式:
ffmpeg -i meeting.mp3 -ar 16000 -ac 1 -c:a pcm_s16le meeting.wav
参数解释:-ar 16000 设置采样率为16kHz,-ac 1 设置为单声道,-c:a pcm_s16le 指定编码为16位有符号PCM格式,这是Whisper模型期望的输入格式。
然后,运行转录命令。假设我们使用 medium 模型,并启用了CoreML:
./build/bin/whisper-cli -m models/ggml-medium.bin -f meeting.wav -l zh -t 8
参数解释:
-m models/ggml-medium.bin: 指定使用的模型文件。-f meeting.wav: 指定输入的音频文件。-l zh: 指定音频语言为中文(en对应英文)。指定语言能提升识别准确率。-t 8: 指定使用的CPU线程数,可以设置为你的CPU核心数(比如M2 Pro是10核或12核),充分利用CPU资源。
当你按下回车,仔细观察终端输出的信息。如果一切配置正确,你应该能在开头几行看到类似这样的关键信息:
whisper_init_state: loading Core ML model from 'models/coreml-encoder-medium.mlpackage'
whisper_init_state: Core ML model loaded
system_info: ... | COREML = 1 |
看到 COREML = 1,恭喜你!这表示CoreML加速已经成功启用。此时,你可以打开“活动监视器”,在“GPU历史记录”或“能耗”标签页里,能看到GPU/神经网络引擎开始活跃工作,而CPU占用率相对平和。转录速度会比纯CPU模式快上一大截。
5. 高级优化与实战技巧
基础流程跑通了,但追求极致效率的我们,怎么能止步于此?下面这些技巧是我在实际使用中总结出来的,能帮你进一步提升体验。
5.1 模型选择的艺术:速度、精度与内存的权衡
模型不是越大越好,你需要根据任务来选:
tiny/base:速度最快,内存占用最小(几百MB),适合实时转录或对精度要求不高的场景,比如转录清晰的环境音、识别关键词。small/medium:我最推荐的折中选择。medium模型在绝大多数情况下(会议、播客、清晰人声)的准确率已经非常高,速度也比large快很多。它是兼顾质量和效率的“甜点”。large/large-v3:精度最高,能处理复杂的口音、专业术语和嘈杂环境。但速度慢,内存占用接近4GB。适合做最终的字幕生成、法律或医学等专业领域的录音转录。
一个实用的建议:先用 medium 模型跑一遍,如果发现某些片段识别不准,再单独用 large 模型去转录那些有问题的片段,这样效率最高。
5.2 参数调优:挖掘最后一滴性能
Whisper.cpp的命令行参数很多,合理调整能显著影响速度和结果。
- 线程数 (
-t): 如前所述,设置为你的性能核心数(例如M2 Pro是6-8个)。可以通过sysctl -n hw.ncpu查看逻辑核心数,通常设置为这个数字。 - 进程数 (
-p): 这个参数控制并行解码器的数量。对于超长音频,适当增加(如-p 2)可能提升速度,但也会增加内存开销。对于M系列芯片,通常-t调优的收益更明显。 - 语言指定 (
-l): 务必指定。即使模型支持多语言,明确告诉它语言能大幅减少候选词搜索空间,提升速度和准确率。 - 指令集优化: 编译时,Whisper.cpp会自动检测并使用M芯片的NEON和AMX指令集。确保你的编译输出中有
NEON = 1和BLAS = 1(使用了Accelerate框架),这表示底层计算已经过优化。
5.3 批处理与自动化:解放双手
如果你经常需要处理大量音频文件,手动一个个操作太累了。写一个简单的Shell脚本吧:
#!/bin/bash
# batch_transcribe.sh
INPUT_DIR="./audio_input"
OUTPUT_DIR="./text_output"
MODEL_PATH="./models/ggml-medium.bin"
LANGUAGE="zh"
mkdir -p "$OUTPUT_DIR"
for audio_file in "$INPUT_DIR"/*.{mp3,m4a,wav}; do
if [ -f "$audio_file" ]; then
filename=$(basename "$audio_file" .mp3)
filename=$(basename "$filename" .m4a)
filename=$(basename "$filename" .wav)
echo "处理: $audio_file"
# 转换为WAV格式
wav_file="$INPUT_DIR/${filename}.wav"
ffmpeg -i "$audio_file" -ar 16000 -ac 1 -c:a pcm_s16le "$wav_file" 2>/dev/null
# 执行转录,输出SRT字幕和TXT纯文本
./build/bin/whisper-cli -m "$MODEL_PATH" -f "$wav_file" -l "$LANGUAGE" -osrt -otxt -of "$OUTPUT_DIR/$filename"
# 删除临时WAV文件(可选)
rm "$wav_file"
echo "完成: $filename"
fi
done
echo "批量转录完成!"
这个脚本会自动遍历指定文件夹下的音频文件,转换格式后调用Whisper.cpp转录,并生成带时间轴的字幕文件(.srt)和纯文本文件(.txt)。你可以把它设为可执行 (chmod +x batch_transcribe.sh),然后随时调用。
5.4 性能监控与问题排查
有时候可能会遇到速度提升不明显的情况。别急,按以下步骤排查:
- 确认CoreML已启用:运行程序时,终端最开始的系统信息里必须有
COREML = 1。 - 检查模型路径:确保
-m参数指定的.bin模型文件存在,并且对应的.mlpackageCoreML模型也在models/目录下。 - 查看活动监视器:转录时打开“活动监视器”,看是CPU满载还是GPU/神经网络引擎在忙。理想状态是GPU/ANE活跃,CPU占用中等。
- 首次运行延迟:第一次加载某个CoreML模型时,系统会进行编译和优化,可能会比较慢。第二次及以后就会飞快了。
- 内存压力:使用
large模型时,注意系统的内存压力。如果内存不足,系统会使用Swap,导致速度急剧下降。关闭一些不必要的应用,确保有足够可用内存。
经过以上优化,你的Mac M芯片应该已经化身为一个高效的本地转录工作站。无论是处理日常会议记录,还是为视频批量生成字幕,速度和体验都会有质的飞跃。这种完全离线、隐私无忧、又能充分利用硬件潜力的感觉,正是技术带给我们的实在乐趣。
344



被折叠的 条评论
为什么被折叠?



