简介
Whisper 是 OpenAI 于 2022 年开源的自动语音识别系统,其核心优势在于强大的鲁棒性。即便面对口音、背景噪音或专业术语等复杂场景,它也能保持较高的识别准确性,在英语语音识别上已接近人类水平。
核心技术与工作原理
Whisper 的强大能力源于其独特的技术设计:
- 端到端的 Transformer 架构:采用编码器 - 解码器结构。输入音频被分割成 30 秒片段并转换为对数梅尔频谱图,由编码器提取特征,解码器预测对应文本。
- 大规模多任务训练:模型在高达 68 万小时的多语言(支持近百种语言)和多任务监督数据上训练。训练时交替执行转录、翻译、语言识别及生成时间戳等任务。
- 统一的多任务格式:通过引入特殊标记,单个模型即可处理所有任务,替代传统流程中的多个阶段。
模型规格与选择
不同规模的模型适用于不同的速度与精度权衡需求:
| 模型名称 | 参数量 | 磁盘空间 | 适用场景 |
|---|---|---|---|
| tiny | 约 39 M | ~75 MB | 快速演示,资源极度敏感 |
| base | 约 74 M | ~140 MB | 平衡速度与基本准确率 |
| small | 约 244 M | ~480 MB | 良好准确率与速度的折中 |
| medium | 约 769 M | ~1.5 GB | 追求较高准确率 |
| large | 约 1550 M | ~3 GB | 最高准确率,支持所有任务 |
主要应用场景
- 会议记录与转录:自动生成会议纪要,将音频转为可编辑文本。
- 视频字幕生成:为视频内容自动生成字幕,提升可访问性。
- 多语言翻译与转录:支持多种语言直接转录或翻译成英文。
- 语音助手与智能客服:作为语音接口核心,提升指令理解准确性。
- 无障碍技术:实时语音转文本服务,便利听障人士沟通。
本地部署实践
在实际部署中,我们通常有两种服务模式:提供 RESTful API 的 FastAPI 后端,以及提供 Web 交互界面的 Gradio 前端。以下是基于 Docker Compose 的完整落地方案。
1. FastAPI 服务实现
如果你需要集成到现有系统中,FastAPI 是首选。它提供了高性能的异步处理能力。
依赖准备
确保 requirements.txt 包含以下核心库:
torch
openai-whisper
fastapi
uvicorn
python-multipart
scipy
librosa
numpy
soundfile
核心代码逻辑
这里的关键在于音频预处理和模型加载优化。我们增加了高通滤波器去除低频噪声,并标准化了音频幅度。同时,使用 beam_size 和 best_of 参数来平衡识别准确率与速度。
from fastapi import FastAPI, File, UploadFile, HTTPException
fastapi.responses JSONResponse
whisper
tempfile
os
numpy np
scipy signal
librosa
uvicorn
soundfile sf
app = FastAPI(
title=,
description=,
version=
)
model =
():
model
model :
model = whisper.load_model()
model
():
:
y, sr = librosa.load(audio_path, sr=)
b, a = signal.butter(, , , fs=sr)
y = signal.filtfilt(b, a, y)
y = y / np.(np.(y))
temp_path = tempfile.mktemp(suffix=)
sf.write(temp_path, y, sr)
temp_path
Exception e:
()
audio_path
():
()
load_whisper_model()
()
():
valid_extensions = {, , , , , , }
file_extension = os.path.splitext(file.filename)[].lower()
file_extension valid_extensions:
HTTPException(status_code=, detail=)
temp_path =
processed_audio =
:
tempfile.NamedTemporaryFile(delete=, suffix=file_extension) temp_file:
content = file.read()
temp_file.write(content)
temp_path = temp_file.name
processed_audio = preprocess_audio(temp_path)
model = load_whisper_model()
result = model.transcribe(
processed_audio,
language=,
task=,
beam_size=,
best_of=,
temperature=,
patience=,
suppress_tokens=[-]
)
JSONResponse(content={
: ,
: result[],
: result.get(, ),
: file.filename
})
Exception e:
HTTPException(status_code=, detail=)
:
temp_path os.path.exists(temp_path):
os.unlink(temp_path)
processed_audio processed_audio != temp_path os.path.exists(processed_audio):
os.unlink(processed_audio)
():
JSONResponse(content={: , : model })
__name__ == :
uvicorn.run(app, host=, port=)


