💡 核心定位
Whisper 既是一种技术(基于大规模弱监督训练的鲁棒语音识别技术),也是一个具体的模型家族(OpenAI 开源的 ASR 模型全家桶)。
- 🧠 技术创新:68 万小时弱监督训练,支持 99 种语言
- 📦 模型家族:5 种规格(tiny/base/small/medium/large)
- 🔒 离线运行:模型下载后完全本地计算
- 💰 完全免费:MIT 开源协议,无使用限制
作为技术: - 基于大规模弱监督学习的语音识别方法 - 从互联网自动收集多语言语音数据进行训练 - 无需人工标注,实现零样本跨语言迁移
作为模型: - OpenAI 开源的 ASR 模型全家桶 - 5 种不同大小的预训练模型 - 可直接下载使用,支持本地推理
| 项目 | 详情 |
|---|---|
| 开发者 | OpenAI |
| 发布时间 | 2022 年 9 月 |
| 开源协议 | MIT |
| GitHub | https://github.com/openai/whisper |
| 技术论文 | https://arxiv.org/abs/2212.04356 |
| Model Card | https://github.com/openai/whisper/blob/main/model-card.md |
数据瓶颈:
传统 ASR 需要:
↓
大量语音 + 文字配对数据(标注)
↓
人工标注成本高昂
↓
数据规模受限(通常 < 1 万小时)
↓
泛化能力差
流程复杂:
音频预处理 → 特征提取 → 声学模型 → 语言模型 → 解码器
↓
每个模块独立优化,非全局最优
数据收集策略:
互联网音频(播客、视频、音乐)
↓
自动获取多语言字幕(弱标注)
↓
68 万小时多语言语音数据
↓
覆盖 99 种语言
关键创新: - ✅ 弱监督:不强制语音和文字严格对齐 - ✅ 多任务学习:识别、翻译、语音活动检测 - ✅ 端到端:语音直接到文字,无需中间模块 - ✅ 大规模:68 万小时数据(传统方法的 10-100 倍)
基于 Transformer 的 Encoder-Decoder:
输入:音频梅尔频谱(80 维)
↓
Audio Encoder(Transformer)
↓
提取语音特征
↓
Text Decoder(Transformer)
↓
自回归生成文字
↓
输出:文本序列(带时间戳)
技术细节:
| 组件 | 说明 |
|---|---|
| 输入 | 30 秒音频片段(16kHz 采样) |
| 编码器 | 多层 Transformer,提取语音特征 |
| 解码器 | 自回归生成,支持多语言 |
| 特殊 Token | <startoftranscript>、<translate> 等 |
| 模型 | 参数量 | 文件大小 | 速度 | 精度 | 内存 | 适用场景 |
|---|---|---|---|---|---|---|
| tiny | 39M | ~75 MB | ⚡⚡⚡⚡⚡ | ⭐⭐ | 1GB | 快速测试 |
| base | 74M | ~142 MB | ⚡⚡⚡⚡ | ⭐⭐⭐ | 1GB | 日常使用 ✅ |
| small | 244M | ~466 MB | ⚡⚡⚡ | ⭐⭐⭐⭐ | 2GB | 较高精度 |
| medium | 769M | ~1.5 GB | ⚡⚡ | ⭐⭐⭐⭐⭐ | 5GB | 高精度 |
| large | 1550M | ~2.9 GB | ⚡ | ⭐⭐⭐⭐⭐ | 10GB | 最高精度 |
官方推荐:base 模型(平衡速度和精度)
计算公式:
模型文件大小 = 参数量 × 精度字节数 + 元数据
以 base 模型为例:
| 精度类型 | 每参数占用 | base 模型计算 | 实际大小 |
|---|---|---|---|
| FP32(单精度) | 4 字节 | 74M × 4 = 296 MB | - |
| FP16(半精度) | 2 字节 | 74M × 2 = 148 MB | - |
| 实际文件 | 压缩后 | - | ~142 MB |
为什么实际文件 < 计算值? - ✅ 模型文件经过压缩优化 - ✅ 去除了冗余信息 - ✅ 使用了高效的存储格式
通俗类比:
| 对比项 | 说明 | 类比 |
|---|---|---|
| 参数量(74M) | 模型有 7400 万个参数 | 📊 表格有 7400 万行数据 |
| 文件大小(142 MB) | 保存模型的实际磁盘空间 | 💾 保存这个表格的文件大小 |
按场景选择:
| 场景 | 推荐模型 | 原因 |
|---|---|---|
| 日常使用 | base | 速度快,精度够用 ✅ |
| 专业术语多 | small 或 medium | 识别更准确 |
| 语音质量差 | medium 或 large | 抗噪能力强 |
| 多语言混合 | large | 支持语言最多 |
| 服务器部署 | base 或 tiny | 资源占用小 |
按硬件选择:
| 硬件配置 | 推荐模型 | 处理速度(5分钟视频) |
|---|---|---|
| CPU 4核 8GB | base | ~8 分钟 |
| CPU 8核 16GB | small | ~15 分钟 |
| GPU (8GB) | medium | ~3 分钟 |
| GPU (16GB+) | large | ~5 分钟 |
测试建议:
1. 先用 base 模型测试效果
2. 如果识别不准,升级到 small
3. 专业场景使用 medium
4. 追求最高精度使用 large
| 项目 | 最低要求 | 推荐配置 |
|---|---|---|
| Python | 3.8+ | 3.10+ |
| 内存 | 2GB | 8GB+ |
| 磁盘 | 5GB | 20GB+ |
| GPU | 可选 | NVIDIA GPU (CUDA 11.8+) |
基础安装:
pip install openai-whisper
验证安装:
python -c "import whisper; print(whisper.__version__)"
⚠️ 重要:ffmpeg 依赖
Whisper 的 load_audio() 函数(whisper/audio.py 第58行)底层通过 subprocess 调用系统 ffmpeg 命令来解码音频文件,因此必须安装 ffmpeg。
# whisper/audio.py 源码
import subprocess
def load_audio(file: str, sr: int = 16000):
"""
加载音频文件并转换为 16kHz 单声道
使用 ffmpeg 解码音频
"""
cmd = [
"ffmpeg",
"-i", file,
"-vn",
"-acodec", "pcm_s16le",
"-ar", "16000",
"-ac", "1",
"-f", "s16le",
"-"
]
out = subprocess.run(cmd, capture_output=True, check=True).stdout
# ...
支持的音频格式(通过 ffmpeg 解码): - ✅ WAV、MP3、FLAC - ✅ WebM、OGG、M4A - ✅ MP4、AVI(视频文件中的音频) - ✅ 几乎所有 ffmpeg 支持的格式
安装 ffmpeg:
根据不同系统选择安装方式:
方案A:Ubuntu/Debian
apt update
apt install -y ffmpeg
方案B:CentOS/RHEL(有EPEL源)
yum install -y epel-release
yum install -y ffmpeg
方案C:conda 环境
conda install -c conda-forge ffmpeg
方案D:静态编译版(推荐阿里云/低内存服务器)
适用于: - 阿里云 EPEL 源没有 ffmpeg 包 - conda install 因内存不足被 Killed - 需要快速安装,不依赖包管理器
# 1. 下载静态编译版
wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz
# 2. 解压
tar -xf ffmpeg-release-amd64-static.tar.xz
# 3. 复制到系统路径
cd ffmpeg-*/
sudo cp ffmpeg /usr/local/bin/
sudo cp ffprobe /usr/local/bin/
# 4. 验证安装
ffmpeg -version
# 5. 清理临时文件
cd ~
rm -rf /tmp/ffmpeg-*
验证 ffmpeg 是否可用:
# 检查 ffmpeg 命令
ffmpeg -version
# 测试 Whisper 能否正常加载音频
python -c "
import whisper
model = whisper.load_model('tiny')
result = model.transcribe('test.wav', language='zh')
print('✅ Whisper + ffmpeg 工作正常')
"
安装依赖说明:
| 包名 | 大小 | 作用 |
|---|---|---|
| torch | 530 MB | 深度学习框架(核心引擎) |
| nvidia-cudnn | 366 MB | GPU 神经网络加速库 |
| nvidia-cublas | 423 MB | GPU 矩阵运算库 |
| triton | 188 MB | GPU 编译器 |
| 其他 nvidia-* 库 | ~1 GB | CUDA 工具包组件 |
重要说明: - 这些是运行环境,不是语音模型 - 即使没有 GPU,也会安装 CUDA 库(PyTorch 默认行为) - Whisper 会自动降级为 CPU 模式
首次运行自动下载:
运行 whisper.load_model("base")
↓
检测到模型不存在
↓
自动从 OpenAI 服务器下载
↓
缓存到 ~/.cache/whisper/base.pt
↓
之后无需重复下载 ✅
模型缓存位置:
~/.cache/whisper/
├── tiny.pt # 75 MB
├── base.pt # 142 MB
├── small.pt # 466 MB
├── medium.pt # 1.5 GB
└── large.pt # 2.9 GB
查看已下载模型:
ls -lh ~/.cache/whisper/
手动删除模型(释放空间):
# 删除 large 模型(2.9 GB)
rm ~/.cache/whisper/large.pt
# 删除所有模型
rm ~/.cache/whisper/*.pt
📌 部署实录
以下是2026-05-18在阿里云ECS上的真实部署记录,解决了内存不足问题。
服务器配置(阿里云ECS):
# CPU信息
Architecture: x86_64
CPU(s): 2
Model name: Intel(R) Xeon(R) Platinum
CPU MHz: 2500.002
# 内存信息
total used free shared buff/cache available
Mem: 1.8Gi 858Mi 610Mi 15Mi 567Mi 1.0Gi
Swap: 0B 0B 0B
# 磁盘信息
/dev/vda3 40G 17G 21G 46% /
核心问题: - 总内存:1.8GB - 可用内存:约1GB - Whisper tiny运行时需要:~1.2GB - 结论:内存不足,需要Swap补充
访问测试页面时报错:
网络错误或服务器异常:Load failed
日志显示:
❌ Whisper 识别失败: [Errno 2] No such file or directory: 'ffmpeg'
原因分析: 1. 首次加载模型时,内存不够 → 进程被OOM Kill 2. ffmpeg解码时,额外占用内存 → 内存溢出 3. Gunicorn worker超时 → 因为加载太慢或被Kill
步骤1:创建2GB Swap文件
# 创建Swap文件
fallocate -l 2G /swapfile
# 设置权限(仅root可读写)
chmod 600 /swapfile
# 格式化为Swap
mkswap /swapfile
# 启用Swap
swapon /swapfile
步骤2:验证Swap生效
# 查看内存和Swap
free -h
# 输出:
total used free shared buff/cache available
Mem: 1.8Gi 992Mi 776Mi 17Mi 262Mi 879Mi
Swap: 2.0Gi 0B 2.0Gi
步骤3:永久生效(重启后自动加载)
# 添加到fstab
echo '/swapfile none swap sw 0 0' | tee -a /etc/fstab
步骤4:重启服务并测试
# 重启Gunicorn
cd /home/bypWeb/BYPsNotes
./restart.sh
# 等待服务启动
sleep 10
# 查看内存使用情况
free -h
# 输出(首次加载模型后):
total used free shared buff/cache available
Mem: 1.8Gi 1.4Gi 93Mi 14Mi 506Mi 439Mi
Swap: 2.0Gi 24Mi 2.0Gi
内存使用变化:
| 阶段 | 内存使用 | Swap使用 | 可用内存 |
|---|---|---|---|
| 启动前 | 989MB | 0MB | 881MB |
| 加载模型后 | 1.4GB | 24MB | 439MB |
| 识别音频时 | 1.5GB | 100-200MB | 300-400MB |
性能表现:
| 场景 | 耗时 | 说明 |
|---|---|---|
| 首次识别 | ~6-7秒 | 包含模型加载3秒 |
| 后续识别 | ~2-3秒 | 模型已缓存 |
| 5秒音频识别 | ~2秒 | CPU推理 |
结论: - ✅ Swap方案可行,Whisper tiny能正常运行 - ⚠️ 速度比有足够内存的服务器慢一些(使用磁盘交换) - ✅ 对于低配服务器(2GB内存),这是零成本的最佳方案
# 实时查看内存和Swap变化
watch -n 1 free -h
# 查看Swap详细信息
swapon --show
# 输出:
NAME TYPE SIZE USED PRIO
/swapfile file 2G 24M -2
适合偶尔使用,不适合频繁大量交换
监控Swap使用量:
建议升级到4GB内存
磁盘空间:
确保磁盘有足够剩余空间
性能影响:
对比说明:
| 对比项 | Whisper(本地ASR) | Ping(阿里云ASR) |
|---|---|---|
| 识别服务 | Whisper本地模型 | 阿里云 paraformer-v1 |
| 音频处理 | 本地 model.transcribe() |
提交HTTP URL到云端 |
| 谁来解码 | Whisper调用ffmpeg本地解码 | 阿里云服务端解码 |
| 需要ffmpeg | ✅ 必须安装 | ❌ 不需要(云端处理) |
Ping模块的voice_handler.py:
# 即使没有pydub/ffmpeg,也会直接传WebM数据
wav_data = _convert_webm_to_wav(audio_data)
# ↓ 如果转换失败,返回原始WebM数据
# ↓ 最终保存到static/audio目录
# ↓ 生成HTTP URL:https://byp.com.cn/static/audio/xxx.wav
# ↓ 阿里云ASR服务端解码WebM,不需要本地ffmpeg
Whisper测试模块:
# Whisper库内部调用ffmpeg解码音频
result = model.transcribe(temp_audio_path, language='zh')
# ↓ 内部调用 whisper/audio.py 的 load_audio()
# ↓ subprocess.run(["ffmpeg", "-i", file, ...])
# ↓ 必须在服务器安装ffmpeg!
三阶段说明:
阶段 1:安装运行环境(需要网络)
↓
下载 PyTorch + CUDA 等依赖(约 2.5 GB)
↓
阶段 2:首次运行(需要网络)
↓
下载语音识别模型 base.pt(142 MB)← 只需这一次!
↓
阶段 3:之后永久离线 ✅
↓
再也不需要网络连接
对比云端 API:
| 对比项 | Whisper | ChatGPT API | 阿里云 ASR |
|---|---|---|---|
| 首次使用 | 下载模型(142 MB) | 注册账号 | 获取 API Key |
| 后续使用 | 完全离线 ✅ | 每次都需要网络 ❌ | 每次都需要网络 ❌ |
| 数据处理 | 本地计算 | 上传到云端 | 上传到云端 |
| 隐私保护 | 数据不离机 ✅ | 数据发送到服务器 | 数据发送到服务器 |
| 网络依赖 | 仅首次需要 | 永久依赖 | 永久依赖 |
类比理解: - 📱 第一次:需要从应用商店下载 APP - 💾 下载后:可以离线使用 - 🔄 不需要每次都下载
# 基础用法
whisper audio.mp3 --language zh --model base
# 输出 SRT 字幕格式
whisper audio.mp3 --language zh --output_format srt
# 指定输出目录
whisper audio.mp3 --language zh --output_dir ./output
# 使用 medium 模型(高精度)
whisper audio.mp3 --language zh --model medium
基础转写:
import whisper
# 加载模型
model = whisper.load_model("base")
# 转写音频
result = model.transcribe(
"audio.mp3",
language="zh",
task="transcribe"
)
# 输出结果
print(result["text"]) # 完整文本
print(result["segments"]) # 带时间戳的片段
高级用法:
result = model.transcribe(
"audio.mp3",
language="zh",
task="transcribe",
verbose=True, # 显示详细信息
temperature=0.0, # 降低随机性
beam_size=5, # Beam Search 大小
best_of=5, # 采样次数
fp16=False # CPU 模式使用 FP32
)
SRT 字幕格式:
1
00:02:15,000 --> 00:02:30,000
网箱要放在水深五到八米的位置,水流不能太急
2
00:05:40,000 --> 00:05:55,000
苗种投放密度大概八千到一万尾每亩
JSON 格式:
{
"text": "网箱要放在水深五到八米的位置...",
"segments": [
{
"id": 0,
"start": 135.0,
"end": 150.0,
"text": "网箱要放在水深五到八米的位置",
"tokens": [50365, 6728, 25335, ...],
"temperature": 0.0,
"avg_logprob": -0.287,
"compression_ratio": 1.45,
"no_speech_prob": 0.012
}
],
"language": "zh"
}
| 项目 | 详情 |
|---|---|
| 系统 | Ubuntu Noble (24.04) |
| 容器 | Docker (bypnotes/dab1311013d6) |
| Python | 3.12 |
| Whisper 版本 | 20250625 |
| 测试视频 | 鹿西大黄鱼_02_抗风浪大网箱.mp4(5 分钟) |
运行结果:
| 项目 | 详情 |
|---|---|
| 模型下载时间 | 18 秒(139 MB) |
| 音频转写时间 | 18 秒 |
| 识别片段数 | 149 个 |
| 技术要点数 | 5 个 |
| 总耗时 | 约 1 分钟 |
| 运行模式 | CPU(FP32) |
识别问题: - ❌ "网箱" → "网乡"(专业术语识别错误) - ❌ 繁体字较多 - ⚠️ 技术要点提取不完整
运行结果:
| 项目 | 详情 |
|---|---|
| 模型下载时间 | 8 分 35 秒(1.42 GB) |
| 音频转写时间 | 2 分 21 秒 |
| 识别片段数 | 83 个 |
| 技术要点数 | 17 个 |
| 总耗时 | 约 12 分钟 |
| 运行模式 | CPU(FP32) |
关键改进: - ✅ "网箱"识别正确(base 模型错误为"网乡") - ✅ 技术要点从 5 个增加到 17 个(提升 3.4 倍) - ✅ 人名"石福明"识别准确 - ✅ 数字识别更精确(1000多万元、48个桩等) - ✅ 繁体字明显减少 - ⚠️ 处理时间增加(1 分钟 → 12 分钟)
| 对比项 | base 模型 | medium 模型 | 提升 |
|---|---|---|---|
| 模型大小 | 142 MB | 1.5 GB | 10 倍 |
| 下载时间 | 18 秒 | 8 分 35 秒 | 慢 28 倍 |
| 转写时间 | 18 秒 | 2 分 21 秒 | 慢 8 倍 |
| 识别片段 | 149 个 | 83 个 | 更准确分段 |
| 技术要点 | 5 个 | 17 个 | 3.4 倍 ✅ |
| 专业术语 | 错误(网乡) | 正确(网箱) | 准确 ✅ |
| 繁体字 | 较多 | 较少 | 改善 ✅ |
结论: - 对于专业术语多的视频,强烈推荐 medium 模型 - 虽然时间长,但准确率大幅提升 - 模型只需下载一次,后续使用无需重复下载
1. 使用 GPU(速度提升 5-10 倍)
import torch
import whisper
# 检查 GPU 可用性
print(f"GPU 可用: {torch.cuda.is_available()}")
# 加载模型(自动使用 GPU)
model = whisper.load_model("base")
print(f"模型设备: {model.device}") # 输出: cuda 或 cpu
2. 使用更小的模型
model = whisper.load_model("tiny") # 最快
3. 半精度推理(GPU 模式)
result = model.transcribe(
"audio.mp3",
fp16=True # GPU 模式使用 FP16 加速
)
Q1:FP16 警告是什么意思?
UserWarning: FP16 is not supported on CPU; using FP32 instead
解答: - CPU 不支持 FP16,Whisper 自动切换为 FP32 - ✅ 完全正常,不影响功能 - ⚠️ 只是速度比 GPU 模式慢
Q2:识别不准怎么办?
Q3:运行速度太慢?
base 或 tiny 模型Q4:内存不足?
--fp16 半精度(GPU 模式)现象:Whisper 识别的中文可能包含繁体字
原因: - 视频中的方言口音(闽南语、粤语等) - 专有名词的繁体形式 - Whisper 的默认行为:混合简繁体
方案 A:安装专业简繁转换库(推荐)
pip install opencc-python-reimplemented
代码实现:
import opencc
def to_simplified_chinese(text):
"""将繁体中文转换为简体中文"""
cc = opencc.OpenCC('t2s') # Traditional to Simplified
return cc.convert(text)
# 在生成 SRT 时自动转换
text = to_simplified_chinese(segment["text"].strip())
转换效果:
转换前:魚鳴聊天得知
转换后:鱼鸣聊天得知
方案 B:使用内置简单转换
traditional_to_simplified = {
'魚': '鱼', '鳴': '鸣', '麼': '么', '為': '为',
'個': '个', '們': '们', '這': '这', '時': '时',
'會': '会', '說': '说', '國': '国', '電': '电',
'腦': '脑', '網': '网', '頁': '页',
}
| 场景 | 准确率 | 说明 |
|---|---|---|
| 标准普通话 | ~95% | 表现良好 |
| 专业术语 | ~85% | 需要人工校对 |
| 方言口音 | ~80% | 闽南语、粤语等较差 |
| 背景噪音 | ~85% | 抗噪能力中等 |
| 多人重叠 | ~70% | 说话人分离能力弱 |
| 对比项 | Whisper | 阿里云 ASR | 讯飞语音 |
|---|---|---|---|
| 准确率 | ~95% | ~98% | ~99% ✅ |
| 中文支持 | 良好 | 优秀 | 最强 ✅ |
| 方言识别 | 一般 | 支持部分 | 支持多方言 ✅ |
| 专业术语 | 一般 | 行业优化 ✅ | 行业优化 ✅ |
| 费用 | 免费 ✅ | ¥0.02/分钟 | 商用授权 |
| 网络要求 | 不需要 ✅ | 必须联网 | 必须联网 |
| 隐私保护 | 数据不离机 ✅ | 上传云端 | 上传云端 |
推荐使用: - ✅ 个人隐私要求高(数据不能外传) - ✅ 预算有限(免费方案) - ✅ 离线环境(无网络) - ✅ 需要无限制并发 - ✅ 视频字幕生成 - ✅ 语音笔记转写
不推荐: - ❌ 医疗、法律等高精度场景 - ❌ 方言、口音重的语音 - ❌ 实时性要求极高 - ❌ 专业术语密集场景
| 优势 | 说明 |
|---|---|
| 完全免费 | 开源协议 MIT,零成本使用 |
| 离线运行 | 模型下载后不需要网络 |
| 隐私保护 | 数据不离机,不会上传云端 |
| 多语言支持 | 99 种语言,包括中文 |
| 无并发限制 | 不像云端 API 有调用次数限制 |
| 社区活跃 | GitHub 持续优化,插件丰富 |
Whisper 的最大贡献不是准确率最高,而是: - ✅ 证明了弱监督学习的可行性 - ✅ 降低了 ASR 的数据门槛 - ✅ 推动了开源语音识别发展 - ✅ 让个人开发者也能使用高质量 ASR
发展方向: - 🚀 更大的训练数据(百万小时级) - 🚀 多模态融合(语音 + 视觉 + 文本) - 🚀 个性化声音适配 - 🚀 实时流式识别优化 - 🚀 方言和小语种增强
测试功能: - 🎤 浏览器直接录音 - ⚡ 本地 Whisper tiny 模型识别 - 📊 实时显示识别结果和耗时 - 🔒 完全离线,数据不离机
适用场景: - 快速验证 Whisper tiny 的识别效果 - 测试不同音频质量下的识别准确率 - 对比云端 ASR 方案(如阿里云 paraformer-v1)
📝 创建时间:2026-05-12
🔄 来源:从 Whisper 技术文档重构
🏷️ 标签:Whisper、OpenAI、语音识别、ASR、端到端、弱监督学习
📊 状态:技术专题文档