Whisper 语音识别模型

💡 核心定位

Whisper 既是一种技术(基于大规模弱监督训练的鲁棒语音识别技术),也是一个具体的模型家族(OpenAI 开源的 ASR 模型全家桶)。


一、Whisper 是什么?

1.1 双重身份

作为技术: - 基于大规模弱监督学习的语音识别方法 - 从互联网自动收集多语言语音数据进行训练 - 无需人工标注,实现零样本跨语言迁移

作为模型: - OpenAI 开源的 ASR 模型全家桶 - 5 种不同大小的预训练模型 - 可直接下载使用,支持本地推理

1.2 基本信息

项目 详情
开发者 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

1.3 核心功能


二、Whisper 的技术创新

2.1 传统 ASR 的痛点

数据瓶颈:

传统 ASR 需要:
  ↓
大量语音 + 文字配对数据(标注)
  ↓
人工标注成本高昂
  ↓
数据规模受限(通常 < 1 万小时)
  ↓
泛化能力差

流程复杂:

音频预处理 → 特征提取 → 声学模型 → 语言模型 → 解码器
  ↓
每个模块独立优化,非全局最优

2.2 Whisper 的突破:弱监督学习

数据收集策略:

互联网音频(播客、视频、音乐)
  ↓
自动获取多语言字幕(弱标注)
  ↓
68 万小时多语言语音数据
  ↓
覆盖 99 种语言

关键创新: - ✅ 弱监督:不强制语音和文字严格对齐 - ✅ 多任务学习:识别、翻译、语音活动检测 - ✅ 端到端:语音直接到文字,无需中间模块 - ✅ 大规模:68 万小时数据(传统方法的 10-100 倍)

2.3 模型架构

基于 Transformer 的 Encoder-Decoder:

输入:音频梅尔频谱(80 维)
  ↓
Audio Encoder(Transformer)
  ↓
  提取语音特征
  ↓
Text Decoder(Transformer)
  ↓
  自回归生成文字
  ↓
输出:文本序列(带时间戳)

技术细节:

组件 说明
输入 30 秒音频片段(16kHz 采样)
编码器 多层 Transformer,提取语音特征
解码器 自回归生成,支持多语言
特殊 Token <startoftranscript>、<translate> 等

三、Whisper 模型家族

3.1 五种规格对比

模型 参数量 文件大小 速度 精度 内存 适用场景
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 模型(平衡速度和精度)

3.2 参数量 vs 文件大小的关系

计算公式:

模型文件大小 = 参数量 × 精度字节数 + 元数据

以 base 模型为例:

精度类型 每参数占用 base 模型计算 实际大小
FP32(单精度) 4 字节 74M × 4 = 296 MB -
FP16(半精度) 2 字节 74M × 2 = 148 MB -
实际文件 压缩后 - ~142 MB

为什么实际文件 < 计算值? - ✅ 模型文件经过压缩优化 - ✅ 去除了冗余信息 - ✅ 使用了高效的存储格式

通俗类比:

对比项 说明 类比
参数量(74M) 模型有 7400 万个参数 📊 表格有 7400 万行数据
文件大小(142 MB) 保存模型的实际磁盘空间 💾 保存这个表格的文件大小

3.3 如何选择模型?

按场景选择:

场景 推荐模型 原因
日常使用 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


四、安装与部署

4.1 环境要求

项目 最低要求 推荐配置
Python 3.8+ 3.10+
内存 2GB 8GB+
磁盘 5GB 20GB+
GPU 可选 NVIDIA GPU (CUDA 11.8+)

4.2 安装步骤

基础安装:

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 模式

4.7 模型下载与缓存

首次运行自动下载:

运行 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

4.8 低内存服务器部署方案(Swap解决)

📌 部署实录

以下是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

解决方案:添加Swap

步骤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使用

# 实时查看内存和Swap变化
watch -n 1 free -h

# 查看Swap详细信息
swapon --show

# 输出:
NAME      TYPE SIZE USED PRIO
/swapfile file   2G  24M   -2

注意事项

  1. Swap不是银弹:
  2. Swap使用磁盘,速度比内存慢10-100倍
  3. 适合偶尔使用,不适合频繁大量交换

  4. 监控Swap使用量:

  5. 如果Swap持续使用>500MB,说明内存严重不足
  6. 建议升级到4GB内存

  7. 磁盘空间:

  8. 2GB Swap需要磁盘空间
  9. 确保磁盘有足够剩余空间

  10. 性能影响:

  11. 首次加载:影响较小(一次性)
  12. 识别推理:影响中等(使用部分Swap)
  13. 如果服务器有其他服务,可能互相竞争内存

4.9 为什么 Ping 模块不需要 ffmpeg?

对比说明:

对比项 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!

4.9 "离线"的真正含义

三阶段说明:

阶段 1:安装运行环境(需要网络)
  ↓
下载 PyTorch + CUDA 等依赖(约 2.5 GB)
  ↓
阶段 2:首次运行(需要网络)
  ↓
下载语音识别模型 base.pt(142 MB)← 只需这一次!
  ↓
阶段 3:之后永久离线 ✅
  ↓
再也不需要网络连接

对比云端 API:

对比项 Whisper ChatGPT API 阿里云 ASR
首次使用 下载模型(142 MB) 注册账号 获取 API Key
后续使用 完全离线 ✅ 每次都需要网络 ❌ 每次都需要网络 ❌
数据处理 本地计算 上传到云端 上传到云端
隐私保护 数据不离机 ✅ 数据发送到服务器 数据发送到服务器
网络依赖 仅首次需要 永久依赖 永久依赖

类比理解: - 📱 第一次:需要从应用商店下载 APP - 💾 下载后:可以离线使用 - 🔄 不需要每次都下载


五、使用实战

5.1 命令行使用

# 基础用法
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

5.2 Python 代码使用

基础转写:

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
)

5.3 输出格式

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"
}

六、实际测试案例

6.1 测试环境

项目 详情
系统 Ubuntu Noble (24.04)
容器 Docker (bypnotes/dab1311013d6)
Python 3.12
Whisper 版本 20250625
测试视频 鹿西大黄鱼_02_抗风浪大网箱.mp4(5 分钟)

6.2 测试 1:base 模型

运行结果:

项目 详情
模型下载时间 18 秒(139 MB)
音频转写时间 18 秒
识别片段数 149 个
技术要点数 5 个
总耗时 约 1 分钟
运行模式 CPU(FP32)

识别问题: - ❌ "网箱" → "网乡"(专业术语识别错误) - ❌ 繁体字较多 - ⚠️ 技术要点提取不完整

6.3 测试 2:medium 模型

运行结果:

项目 详情
模型下载时间 8 分 35 秒(1.42 GB)
音频转写时间 2 分 21 秒
识别片段数 83 个
技术要点数 17 个
总耗时 约 12 分钟
运行模式 CPU(FP32)

关键改进: - ✅ "网箱"识别正确(base 模型错误为"网乡") - ✅ 技术要点从 5 个增加到 17 个(提升 3.4 倍) - ✅ 人名"石福明"识别准确 - ✅ 数字识别更精确(1000多万元、48个桩等) - ✅ 繁体字明显减少 - ⚠️ 处理时间增加(1 分钟 → 12 分钟)

6.4 模型对比总结

对比项 base 模型 medium 模型 提升
模型大小 142 MB 1.5 GB 10 倍
下载时间 18 秒 8 分 35 秒 慢 28 倍
转写时间 18 秒 2 分 21 秒 慢 8 倍
识别片段 149 个 83 个 更准确分段
技术要点 5 个 17 个 3.4 倍 ✅
专业术语 错误(网乡) 正确(网箱) 准确 ✅
繁体字 较多 较少 改善 ✅

结论: - 对于专业术语多的视频,强烈推荐 medium 模型 - 虽然时间长,但准确率大幅提升 - 模型只需下载一次,后续使用无需重复下载


七、性能优化

7.1 加速方法

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 加速
)

7.2 常见问题

Q1:FP16 警告是什么意思?

UserWarning: FP16 is not supported on CPU; using FP32 instead

解答: - CPU 不支持 FP16,Whisper 自动切换为 FP32 - ✅ 完全正常,不影响功能 - ⚠️ 只是速度比 GPU 模式慢

Q2:识别不准怎么办?

Q3:运行速度太慢?

Q4:内存不足?


八、中文繁简转换

8.1 问题说明

现象:Whisper 识别的中文可能包含繁体字

原因: - 视频中的方言口音(闽南语、粤语等) - 专有名词的繁体形式 - Whisper 的默认行为:混合简繁体

8.2 解决方案

方案 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 = {
    '魚': '鱼', '鳴': '鸣', '麼': '么', '為': '为',
    '個': '个', '們': '们', '這': '这', '時': '时',
    '會': '会', '說': '说', '國': '国', '電': '电',
    '腦': '脑', '網': '网', '頁': '页',
}

九、Whisper 的局限性

9.1 准确率问题

场景 准确率 说明
标准普通话 ~95% 表现良好
专业术语 ~85% 需要人工校对
方言口音 ~80% 闽南语、粤语等较差
背景噪音 ~85% 抗噪能力中等
多人重叠 ~70% 说话人分离能力弱

9.2 与商业 ASR 对比

对比项 Whisper 阿里云 ASR 讯飞语音
准确率 ~95% ~98% ~99% ✅
中文支持 良好 优秀 最强 ✅
方言识别 一般 支持部分 支持多方言 ✅
专业术语 一般 行业优化 ✅ 行业优化 ✅
费用 免费 ✅ ¥0.02/分钟 商用授权
网络要求 不需要 ✅ 必须联网 必须联网
隐私保护 数据不离机 ✅ 上传云端 上传云端

9.3 适用场景

推荐使用: - ✅ 个人隐私要求高(数据不能外传) - ✅ 预算有限(免费方案) - ✅ 离线环境(无网络) - ✅ 需要无限制并发 - ✅ 视频字幕生成 - ✅ 语音笔记转写

不推荐: - ❌ 医疗、法律等高精度场景 - ❌ 方言、口音重的语音 - ❌ 实时性要求极高 - ❌ 专业术语密集场景


十、总结

10.1 核心优势

优势 说明
完全免费 开源协议 MIT,零成本使用
离线运行 模型下载后不需要网络
隐私保护 数据不离机,不会上传云端
多语言支持 99 种语言,包括中文
无并发限制 不像云端 API 有调用次数限制
社区活跃 GitHub 持续优化,插件丰富

10.2 技术贡献

Whisper 的最大贡献不是准确率最高,而是: - ✅ 证明了弱监督学习的可行性 - ✅ 降低了 ASR 的数据门槛 - ✅ 推动了开源语音识别发展 - ✅ 让个人开发者也能使用高质量 ASR

10.3 未来展望

发展方向: - 🚀 更大的训练数据(百万小时级) - 🚀 多模态融合(语音 + 视觉 + 文本) - 🚀 个性化声音适配 - 🚀 实时流式识别优化 - 🚀 方言和小语种增强


十一、在线测试

11.1 Whisper Tiny 实时测试

👉 进入 Whisper Tiny 测试页面

测试功能: - 🎤 浏览器直接录音 - ⚡ 本地 Whisper tiny 模型识别 - 📊 实时显示识别结果和耗时 - 🔒 完全离线,数据不离机

适用场景: - 快速验证 Whisper tiny 的识别效果 - 测试不同音频质量下的识别准确率 - 对比云端 ASR 方案(如阿里云 paraformer-v1)

11.2 参考资料


📝 创建时间:2026-05-12
🔄 来源:从 Whisper 技术文档重构
🏷️ 标签:Whisper、OpenAI、语音识别、ASR、端到端、弱监督学习
📊 状态:技术专题文档

0:00 0:00

相关笔记