Whisper 是由 OpenAI 于 2022 年发布的开源语音识别模型。它是一个基于 Transformer 架构的端到端模型,具有以下核心特点:多任务模型、多语言支持、多种格式、强鲁棒性和无需微调开箱即用。
whisper虽然开箱即用,但是首次使用的时候需要下载模型,下载的时候可以选择不同大小的模型tiny、base、small、medium、large,他们的准确率与模型的大小成正比(越大准确率越高),速度与模型大小成反比(越大速度越慢)。
whisper生态系统:以OpenAI的Whisper模型为核心,由社区驱动的工具、框架、应用和服务组成的完整技术栈,如下图

| 生态工具 | 场景 | 理由 |
| openai/whisper | 研究和实验 | 功能完整,调试方便 |
| faster-whisper | 生产环境部署 | 平衡性能与功能 |
| whisper.cpp或faster-whisper | 实时转写/直播 | 延迟低,资源占用少 |
| whisperX | 需要说话人分离 | 集成diarization |
| whisper-jax或faster-whisper | 云端大批量处理 | 吞吐量高 |
| whisper.cpp | 移动端/嵌入式 | 内存小,无GPU依赖 |
whisperX |
需要词级时间戳 | 词对齐准确 |
|---|
针对whisper衍生出的工具包在调用transcribe()函数的时候会返回不同的结构内容。
1、官方实现------openai-whisper/whisper.cpp的返回结构
openai-whisper包返回的是以下格式:其中text是所有的文本,segments表示每一段的信息(包括文本、开始/结束时间、偏移量),words表示每个词/字的信息。
python
result = {
"text": "完整文本,所有分段合并", # 最常用的结果
"segments": [ # 最重要的部分,包含详细分段信息
{
"id": 0, # 分段序号
"seek": 0, # 在音频中的搜索位置(秒)
"start": 0.0, # 开始时间(秒)
"end": 4.0, # 结束时间(秒)
"text": "你好,", # 该段落的文本
# 🔬 解码质量指标(判断准确性)
"avg_logprob": -0.2, # 平均对数概率:-1(差)~ 0(完美)
"no_speech_prob": 0.02, # 无语音概率:0(是语音)~1(不是语音)
"compression_ratio": 1.2, # 压缩比:>2.4可能有问题
"temperature": 0.0, # 解码温度
# 🔢 技术细节
"tokens": [50364, 1234, ...], # 该段的token序列
# 🆕 large-v3新增(需要word_timestamps=True)
"words": [ # 词级时间戳
{
"word": "你", # 单个词/字
"start": 0.0, # 词开始时间
"end": 0.2, # 词结束时间
"probability": 0.95 # 词置信度
}
]
}
],
"language": "zh" # 检测到的语言(ISO 639-1代码)
}
whisper.cpp返回 json 格式,以下是返回示例:transcription表示转录文本
python
{
"transcription": [
{
"timestamps": {
"from": "00:00:00,000", # SRT格式时间戳
"to": "00:00:04,000"
},
"offsets": {
"from": 0, # 字符偏移量(在全文中的位置)
"to": 3
},
"text": "你好,",
"tokens": [50364, 1234, ...]
}
],
"text": "完整文本", # 可选,根据参数
"language": "zh",
"response_time": 2.3
}
2、推理优化------faster-whisper的返回结构
faster-whisper中使用transcribe()函数一般返回两个对象:生成器和信息对象,如下
python
# 返回两个对象:生成器和信息对象
segments, info = model.transcribe("audio.mp3")
# 📊 info对象(TranscriptionInfo)
print(info.__dict__)
# {
# 'language': 'zh', # 检测语言
# 'language_probability': 0.98, # 语言检测置信度
# 'duration': 30.5, # 音频时长
# 'all_language_probs': { # 所有语言概率
# 'zh': 0.98, 'en': 0.01, ...
# },
# 'transcription_time': 2.3, # 转录耗时(秒)
# 'initial_prompt': None # 初始提示词
# }
# 🔄 segments生成器(迭代获取Segment对象)
for segment in segments:
print(segment.__dict__)
# {
# 'start': 0.0, # 开始时间
# 'end': 4.0, # 结束时间
# 'text': '你好,', # 文本
#
# # 可选(word_timestamps=True时)
# 'words': [
# Word(start=0.0, end=0.2, word='你', probability=0.95),
# Word(start=0.2, end=0.4, word='好', probability=0.92)
# ]
# }
3、功能增强------whisperX的返回结构
python
result = {
# 🎯 语音活动检测结果
"segments": [ # 类似官方格式
{
"start": 0.0,
"end": 4.0,
"text": "你好,",
# 🎤 词级对齐(比官方更准)
"words": [
{
"word": "你",
"start": 0.0,
"end": 0.2,
"score": 0.95, # 对齐分数
"speaker": None # 可扩展说话人分离
}
]
}
],
# 📝 另一种词片段格式
"word_segments": [
{
"word": "你",
"start": 0.0,
"end": 0.2,
"score": 0.95
}
],
# 🗣️ 说话人分离结果(需要额外模型)
"speaker_segments": [
{
"start": 0.0,
"end": 10.0,
"speaker": "SPEAKER_00",
"text": "第一段话..."
}
],
"language": "zh"
}
| 工具包 | 返回类型 | 主要字段 | 额外特性 | 语言检测 |
|---|---|---|---|---|
| openai-whisper | dict | text, segments, language |
官方实现,功能完整 | 返回语言代码 |
| faster-whisper | tuple + Generator | (segments_generator, info) |
速度快,内存小 | 包含概率值 |
| whisper.cpp | JSON/文本 | 各种自定义格式 | 可嵌入式部署 | 需要参数指定 |
| whisper-jax | dict | text, chunks |
GPU利用率高 | HF格式 |
| whisperX | dict | segments, word_segments |
词级对齐,说话人分离 | 同官方 |