RTX 4060 实战:在 WSL2 中利用 GPU 加速 Whisper 提取字幕
记录在 Windows + WSL2 环境下使用 RTX 4060 和 faster-whisper 搭建 GPU 字幕提取流程,并系统排查常见报错。
随着 OpenAI 开源的 Whisper 模型不断进化,使用本地显卡进行高性能语音识别已成为可能。本文将记录如何在 Windows 子系统(WSL2)环境下,利用 NVIDIA RTX 4060 显卡和 faster-whisper 库,从零开始搭建环境并解决常见的“玄学”报错。
1. 环境准备(宿主机与 WSL2)
在 WSL2 中调用 GPU,核心在于“宿主机驱动,子系统库”的原则。
Windows 宿主机
安装最新 NVIDIA 驱动(Game Ready 或 Studio 均可)。
注意:不需要在 WSL2 内重复安装 Windows 显卡驱动。
WSL2 内部
先安装 FFmpeg:
1
2
sudo apt update
sudo apt install -y ffmpeg
建议使用 Python 3.10+,并为项目创建独立虚拟环境,避免依赖污染。
2. 核心依赖安装(避坑指南)
RTX 40 系列显卡需要 CUDA 12+ 支持。实际安装中,包冲突往往比“缺包”更难排查,安装顺序非常关键。
错误示范
同时安装 onnxruntime 和 onnxruntime-gpu。
这很容易导致冲突,出现类似报错:
1
AttributeError: module 'onnxruntime' has no attribute 'SessionOptions'
正确操作
1
2
3
4
5
6
7
8
9
10
11
12
13
# 1) 创建并激活虚拟环境
python3 -m venv .venv
source .venv/bin/activate
# 2) 安装支持 CUDA 12.1 的 PyTorch
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
# 3) 彻底清理并安装 GPU 版 ONNX Runtime
pip uninstall -y onnxruntime onnxruntime-gpu
pip install onnxruntime-gpu
# 4) 安装 faster-whisper
pip install faster-whisper
3. 常见问题排查(Case Study)
问题 A:GPU Device Discovery Failed
现象:终端出现如下警告(示意):
1
2
[W:onnxruntime:Default, device_discovery.cc:211] GPU device discovery failed:
Failed to open file: "/sys/class/drm/card0/device/vendor"
解析:这是 WSL2 环境中的常见警告。onnxruntime 会尝试按原生 Linux 路径读取硬件信息,而 WSL2 的虚拟化路径可能不完全一致。
处理建议:只要程序能继续运行且 GPU 利用率正常,可先忽略该警告,它通常不代表 GPU 完全不可用。
问题 B:AttributeError: module 'onnxruntime' has no attribute 'SessionOptions'
现象:程序运行到 model.transcribe(...) 附近崩溃。
解析:典型环境污染。多版本 onnxruntime(CPU/GPU)共存导致模块结构冲突。
解决方法:按上文“核心依赖安装”重新清理,只保留单一、明确版本的 onnxruntime-gpu。
4. 优化后的提取脚本(Python)
针对 RTX 4060(8GB VRAM),建议优先使用 large-v3 + float16,兼顾速度与准确率。
同时,按照你的需求,下面脚本增加了 --model_dir 参数,用于指定已预下载模型目录。如果该参数存在,会优先从本地目录加载,避免重复联网下载。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import argparse
import os
from faster_whisper import WhisperModel
def build_model_source(model_name: str, model_dir: str | None) -> str:
"""返回 WhisperModel 的模型来源:
- 未指定 model_dir:直接使用模型名(自动下载/缓存)
- 指定 model_dir:拼接本地目录并校验存在性
"""
if not model_dir:
return model_name
local_path = os.path.join(model_dir, model_name)
if not os.path.isdir(local_path):
raise FileNotFoundError(
f"未找到本地模型目录:{local_path}。"
"请先按文末‘手动预下载模型’步骤下载完成。"
)
return local_path
def main():
parser = argparse.ArgumentParser(description="Whisper GPU 字幕提取工具")
parser.add_argument("audio", help="音频/视频文件路径")
parser.add_argument("--model", default="large-v3", help="模型等级 (small, medium, large-v3)")
parser.add_argument("--model_dir", default=None, help="本地预下载模型根目录(可选)")
parser.add_argument("--device", default="cuda", choices=["cpu", "cuda"])
parser.add_argument("--compute_type", default="float16", help="计算精度 (int8, float16)")
args = parser.parse_args()
model_source = build_model_source(args.model, args.model_dir)
# 初始化模型。RTX 4060 建议开启 float16 提升精度与速度
print(f"正在加载模型 {args.model}(来源:{model_source})...")
model = WhisperModel(model_source, device=args.device, compute_type=args.compute_type)
# 开始转录(开启 VAD 过滤无声片段)
segments, info = model.transcribe(
args.audio,
vad_filter=True,
beam_size=5,
)
print(f"检测到语言:{info.language},概率:{info.language_probability:.2f}")
# 保存结果
output_file = "subtitle.txt"
with open(output_file, "w", encoding="utf-8") as f:
for segment in segments:
line = f"[{segment.start:.2f}s -> {segment.end:.2f}s] {segment.text}"
print(line)
f.write(line + "\n")
print(f"\n任务完成!字幕已保存至:{output_file}")
if __name__ == "__main__":
main()
如何手动预下载模型
你有两种常用方式。
方式 1:让 faster-whisper 首次运行自动下载(最省事)
先执行一次:
1
python transcribe.py demo.mp3 --model large-v3
首次运行会自动下载模型并缓存到默认目录(通常在 ~/.cache/huggingface/ 或相关缓存路径)。
随后可以把模型目录拷贝到固定路径,例如:
1
2
3
mkdir -p ~/whisper-models
cp -r ~/.cache/huggingface/hub/models--Systran--faster-whisper-large-v3 \
~/whisper-models/large-v3
之后运行时指定:
1
python transcribe.py demo.mp3 --model large-v3 --model_dir ~/whisper-models
方式 2:使用 huggingface-cli 预拉取(更可控)
1
2
3
4
5
pip install -U "huggingface_hub[cli]"
mkdir -p ~/whisper-models/large-v3
huggingface-cli download Systran/faster-whisper-large-v3 \
--local-dir ~/whisper-models/large-v3 \
--local-dir-use-symlinks False
下载完成后,同样通过 --model_dir 指向模型根目录:
1
python transcribe.py demo.mp3 --model large-v3 --model_dir ~/whisper-models
提示:离线环境建议先在可联网机器下载完模型,再整体拷贝到目标机器,路径结构保持一致即可。
5. 性能监控
在转录任务执行期间,新开一个 WSL 窗口输入:
1
watch -n 1 nvidia-smi
如果使用 large-v3,通常可观察到:
python进程占用约 4~6GB 显存(随音频长度和批次策略波动);Volatile GPU-Util有明显变化。
这基本可以证明 RTX 4060 已在参与推理计算。
总结
在 WSL2 中玩转 AI 模型,最关键的是环境纯净度。
- 遇到
AttributeError,优先怀疑依赖冲突; - 遇到
device_discovery类警告,不要立刻恐慌,先看任务是否可继续以及 GPU 利用率是否正常; - 对于大模型场景,养成“预下载模型 + 显式路径加载”的习惯,能显著提升稳定性与可复现性。
希望这篇实战记录,能帮你少踩一点坑,把更多时间用在真正有价值的语音内容处理上。