从Whisper迁移到GPT-Transcribe和GPT-Live-Transcribe指南
技术背景
Whisper是OpenAI早期推出的语音识别模型,广泛应用于文件转录和实时语音处理。然而,随着应用场景的复杂化,开发者对转录的准确性、多语言支持、上下文理解以及低延迟流式处理提出了更高要求。GPT-Transcribe和GPT-Live-Transcribe作为新一代模型,针对文件转录和实时流式转录分别优化,引入了结构化关键词、多语言数组、上下文提示和延迟控制等特性,解决了Whisper在领域术语识别、多语言混合和实时性能上的不足。本教程旨在帮助开发者理解新模型的优势,并指导其完成迁移。
核心原理
GPT-Transcribe和GPT-Live-Transcribe基于Transformer架构,利用大规模预训练和微调,实现了高精度的语音识别。核心原理包括:1) 上下文感知:通过prompt提供场景描述,模型能更好地理解音频内容;2) 关键词引导:keywords参数注入字面术语,增强特定词汇的识别;3) 多语言支持:languages数组允许指定多种预期语言,提升混合语言场景的准确性;4) 流式处理:GPT-Transcribe支持流式输出,通过事件驱动实时返回转录增量;5) 低延迟优化:GPT-Live-Transcribe通过delay参数平衡延迟和准确性,适用于实时字幕。数据流上,文件转录通过REST API上传音频,返回JSON或流式事件;实时转录通过WebSocket/WebRTC建立会话,持续传输音频并接收转录事件。
架构分析
系统架构设计上,迁移涉及两个主要路径:文件转录和实时转录。文件转录沿用REST API端点,但模型替换为gpt-transcribe,并支持流式响应。实时转录则通过Realtime API的会话机制,模型可选gpt-live-transcribe(持续流式)或gpt-transcribe(提交轮次)。架构设计的关键决策包括:1) 分离音频输入和转录输出,文件转录可流式输出,实时转录可提交轮次;2) 统一事件处理,使用transcript.text.delta和transcript.text.done等事件;3) 灵活配置,通过session.update设置模型、提示、关键词和语言;4) 兼容性考虑,保留对旧模型和格式的支持。组件关系上,客户端负责音频采集和上传,API服务处理转录,事件流返回结果。
完整实战教程
概述
OpenAI的新转录模型为现有Whisper用户提供了两条聚焦的升级路径。GPT-Transcribe(gpt-transcribe)专为通过上传文件进行准确转录而设计。GPT-Live-Transcribe(gpt-live-transcribe)专为低延迟、持续流式转录而设计。
从高层次来看,API端点相同。文件请求继续使用POST /v1/audio/transcriptions。实时集成继续配置转录会话并处理转录事件。不同之处在于支持的请求字段、输出格式以及上下文/多语言提示。
保持不变的内容
- 文件转录使用现有的音频API转录端点。
- 实时转录使用现有的实时转录会话、WebSocket或WebRTC传输以及转录事件。
- 应用程序仍然提供音频、接收转录文本并处理API或连接错误。
变化的内容
- 对于已完成文件、流式文件转录或已提交的实时回合,使用
gpt-transcribe。 - 对于持续流式、低延迟的实时转录,使用
gpt-live-transcribe。 - 将旧的
language提示替换为新模型的languages数组。 - 使用
prompt提供自由形式的上下文,使用keywords提供音频中预期的字面术语。 - 处理GPT-Transcribe检测到的语言输出,包括空的languages数组。
1. 选择迁移路径
- 录制的会议、通话或上传的音频:在POST /v1/audio/transcriptions上将
whisper-1迁移到gpt-transcribe。 - 实时字幕或持续到达的麦克风音频:在实时转录会话中将
gpt-realtime-whisper迁移到gpt-live-transcribe。 - 手动提交音频回合后需要更高准确度的转录:在WebSocket上的实时转录会话中使用
gpt-transcribe。
将实时音频和流式输出视为独立的决策。一个完成的文件可以产生流式转录事件,而实时会话可以等待音频回合提交后再生成增量。
2. 迁移录制的音频
最小的文件迁移保留端点、SDK调用和文件上传。替换模型标识符,然后消费JSON转录响应。
先决条件
- Python 3.11 或更高版本。
- OpenAI Python SDK:
python -m pip install --upgrade openai。 - 一个
OPENAI_API_KEY环境变量。 - 一个名为
meeting.wav的已完成录音,或更新audio_path以指向您自己的文件。 - 访问示例中使用的转录模型的权限。
文件示例会发起实时 API 请求。实时示例会构建会话负载。对于 gpt-live-transcribe,使用 WebSocket 或 WebRTC;对于已提交轮次的 gpt-transcribe,使用 WebSocket。
import json
from pathlib import Path
from openai import OpenAI
client = OpenAI()
audio_path = Path("meeting.wav")
之前 — Whisper 文件转录
with audio_path.open("rb") as audio:
before = client.audio.transcriptions.create(
model="whisper-1",
file=audio,
)
print(before.text)
之后 — GPT-Transcribe
with audio_path.open("rb") as audio:
after = client.audio.transcriptions.create(
model="gpt-transcribe",
file=audio,
response_format="json",
)
print(after.text)
注意事项
- 请注意,新模型返回 JSON。如果现有应用程序请求
text、verbose_json、srt或vtt,不要假设相同的response_format仍然有效。对于这些格式,请继续使用 Whisper,或者显式构建并测试您的应用程序所需的下游转换。
3. 更新语言提示和领域上下文
传统的 Whisper 集成通常发送单个 language 值,并将领域词汇放在自由形式的提示中。新模型接受多个预期的输入语言,并将结构化的关键词提示与一般提示分开。
之前 — 单语言 Whisper 请求
from openai import OpenAI
client = OpenAI()
with open("meeting.wav", "rb") as audio:
result = client.audio.transcriptions.create(
model="whisper-1",
file=audio,
language="en",
prompt="A support call about AC-42.",
)
print(result.text)
之后——多语言 GPT-Transcribe 请求
from openai import OpenAI
client = OpenAI()
with open("meeting.wav", "rb") as audio:
result = client.audio.transcriptions.create(
model="gpt-transcribe",
file=audio,
prompt="A customer support call about billing.",
extra_body={
"keywords": ["AC-42", "Premium Plus"],
"languages": ["en", "fr"],
},
)
print(result.text)
注意事项
- 使用
prompt描述录音的主题或场景。 - 使用
keywords提供可能实际说出的字面产品名称、药物名称、账户标识符或其他领域特定术语。 - 使用
languages指示预期的口语语言。 - 不要同时发送
language和languages。 - 在发出请求前验证关键字输入:每个关键字必须是单行字面量,且不得包含
<、>、回车符或换行符。无效的关键字输入将拒绝整个请求或会话更新。
4. 流式转录已完成文件
流式传输适用于转录输出,而非音频输入。应用程序首先提供完整的录音;然后 API 在转录该录音时流式传输文本。
之前——阻塞 Whisper 文件请求
with audio_path.open("rb") as audio:
before = client.audio.transcriptions.create(
model="whisper-1",
file=audio,
)
print(before.text)
# whisper-1 does not provide transcript.text.delta events.
之后 — 流式 GPT-Transcribe 文件请求
with audio_path.open("rb") as audio:
stream = client.audio.transcriptions.create(
model="gpt-transcribe",
file=audio,
stream=True,
)
for event in stream:
if event.type == "transcript.text.delta":
print(event.delta, end="", flush=True)
elif event.type == "transcript.text.done":
print("\nFinal:", event.text)
注意事项
- 使用转录事件来区分进行中的转录和已完成的转录。使用
transcript.text.delta事件更新您的转录或进度界面,然后使用transcript.text.done将转录标记为最终版本。 - 不要将文件流式传输标记为实时音频捕获:文件必须已经存在。
5. 迁移连续实时转录
对于实时字幕工作流,保留 Realtime 连接和转录会话架构。更改转录模型并更新特定于模型的配置。
之前 — GPT-Realtime-Whisper
legacy_realtime_session = json.loads(
r'''
{
"type": "session.update",
"session": {
"type": "transcription",
"audio": {
"input": {
"transcription": {
"model": "gpt-realtime-whisper",
"language": "en"
},
"turn_detection": null
}
}
}
}
'''
)
print(json.dumps(legacy_realtime_session, indent=2))
之后 — GPT-Live-Transcribe
live_transcription_session = json.loads(
r'''
{
"type": "session.update",
"session": {
"type": "transcription",
"audio": {
"input": {
"transcription": {
"model": "gpt-live-transcribe",
"prompt": "A support call about a plan.",
"keywords": ["AC-42", "Premium Plus"],
"languages": ["en", "fr"],
"delay": "low"
},
"turn_detection": null
}
}
}
}
'''
)
print(json.dumps(live_transcription_session, indent=2))
注意事项
- 继续处理
conversation.item.input_audio_transcription.delta和conversation.item.input_audio_transcription.completed事件。 - 保留基于 item_id 的现有对账逻辑。
- 使用模型的
delay设置来权衡更快的部分转录与更准确的最终转录。 - 保留现有的 WebSocket 或 WebRTC 传输方式;Realtime 转录支持两者。
6. 在已提交回合的 Realtime 会话中使用 GPT-Transcribe
GPT-Transcribe 不仅限于上传的文件。当你的应用在手动提交音频回合后需要更高准确度的转录时,可以在 WebSocket 上的 Realtime 会话中将其用作输入转录模型。
之前——旧版实时转录会话
legacy_live_session = json.loads(
r'''
{
"type": "session.update",
"session": {
"type": "transcription",
"audio": {
"input": {
"transcription": {
"model": "gpt-realtime-whisper",
"language": "en"
}
}
}
}
}
'''
)
print(json.dumps(legacy_live_session, indent=2))
之后——提交轮次的 GPT-Transcribe 会话
committed_turn_session = json.loads(
r'''
{
"type": "session.update",
"session": {
"type": "transcription",
"audio": {
"input": {
"transcription": {
"model": "gpt-transcribe",
"prompt": "A customer support call.",
"keywords": ["AC-42"],
"languages": ["en", "fr"]
},
"turn_detection": null
}
}
}
}
'''
)
print(json.dumps(committed_turn_session, indent=2))
注意事项
- 将音频追加到输入缓冲区,然后发送
input_audio_buffer.commit。转录按已提交的音频块进行,而非连续的实时字幕。GPT-Transcribe 可能会在该块的完成事件之前发出转录增量事件。
7. 更新响应和事件处理
GPT-Transcribe 可以在完成的文件和实时结果中包含检测到的输入语言。这些是模型返回的预测,而非对调用方语言提示的复述。
之前 — 没有语言预测的转录文本
legacy_transcription_response = json.loads(
r'''
{
"text": "Bonjour, pouvez-vous m'entendre ?"
}
'''
)
print(json.dumps(legacy_transcription_response, indent=2))
之后 — GPT-Transcribe 检测到的语言响应
detected_language_response = json.loads(
r'''
{
"text": "Bonjour, pouvez-vous m'entendre ?",
"languages": [
{ "code": "fr" }
]
}
'''
)
print(json.dumps(detected_language_response, indent=2))
language_codes = [
item["code"]
for item in detected_language_response.get("languages", [])
]
print("Detected languages:", language_codes)
注意事项
- 当模型无法做出可靠预测时,将
languages: []视为有效结果。 - 不要推断为无人说话、请求失败或返回了合成的
unknown语言。GPT-Live-Transcribe 在其初始契约中不返回检测到的语言预测。 - 对于 Realtime,检查
conversation.item.input_audio_transcription.completed;GPT-Transcribe 可能将相同的语言元数据附加到该事件。
8. 切换前检查兼容性
某些现有的转录功能在 gpt-transcribe 或 gpt-live-transcribe 中没有直接替代品。
- 字幕:如果集成依赖原生 SRT 或 VTT 输出,请保留
whisper-1。 - 时间戳:保留明确支持单词或片段时间戳的模型和响应格式。
- 翻译:如果应用需要将音频翻译成英语,请使用受支持的翻译模型保留
/v1/audio/translations。 - 说话人分离:当应用需要说话人标签时,在
/v1/audio/transcriptions上使用gpt-4o-transcribe-diarize,并设置response_format: "diarized_json"。对于超过 30 秒的录音,设置chunking_strategy: "auto"。此模型在 Realtime API 中不受支持。
9. 前后评估
在两个模型上使用相同的代表性音频片段。比较基线、直接模型替换以及添加新上下文字段的版本。这样可以区分模型本身的改进与提示、关键词或语言提示带来的改进。
评估转录质量
- 代表性录音的整体词错误率。
- 姓名、产品名、药物名、账户标识符、数字和电子邮件地址的精确匹配准确率。
- 口音、背景噪声、电话音频和短话语的表现。
- 语言切换和混合语言语音期间的准确性。
- 关键词幻觉:确认转录文本没有插入未实际说出的提示词。
- 最终转录文本的完整性以及预期的语言元数据。
评估流式传输和操作行为
- 首次转录增量的时间,分别报告文件流式传输和实时音频。
- 从显式提交的轮次到最终转录的时间。
- 中位数和尾部延迟,包括 p95 或团队现有的服务级别阈值。
- 部分转录文本在完成前变化的频率。
- 重叠轮次中的事件顺序和 item_id 对账。
- 重连、重试、空音频和中断会话的行为。
- 实际请求定价和来自已发布真实来源的生产速率限制。
常见迁移错误
- 仅因为
gpt-transcribe针对完整音频优化,就认为它与 Realtime 不兼容。 - 描述 GPT-Transcribe 无法流式传输,因为处理在提交后开始。
- 假设流式文件输出意味着端点接受持续的麦克风流。
- 同时发送旧版
language和新模型languages。 - 期望不支持字幕格式、时间戳、说话人标签或检测语言输出的模型提供这些功能。
- 将空的检测语言数组视为 API 错误。
- 强制将关键词插入转录文本,而不是将其视为提示。
- 假设每个 Realtime 模型都支持相同的语音活动检测和延迟控制。
相关资源
常见问题
常见错误及排查方法:1) 误认为gpt-transcribe不支持Realtime,实际可用于提交轮次;2) 混淆流式文件输出和实时音频流,文件流式要求完整音频已存在;3) 同时发送language和languages导致冲突,应只使用languages;4) 期望不支持的功能(如SRT/VTT字幕、时间戳、说话人分离),需保留whisper-1或使用专用模型;5) 将空的languages数组视为错误,应视为模型无法预测;6) 强制关键词插入转录文本,关键词仅作为提示;7) 忽略延迟设置,导致实时性能不佳。生产优化建议:使用流式输出减少等待时间,合理设置delay参数,利用关键词提升领域准确率,监控p95延迟和错误率,实施重连和重试机制。
企业应用扩展
进一步优化可考虑:1) 结合说话人分离模型gpt-4o-transcribe-diarize处理多说话人场景;2) 使用翻译模型扩展多语言支持;3) 实现自动语言检测和切换;4) 集成语音活动检测(VAD)优化实时转录;5) 利用评估框架持续监控模型性能,调整提示和关键词;6) 探索模型微调以适应特定领域;7) 结合缓存和批处理降低API成本。
总结
本教程面向有编程基础的开发者,详细讲解如何从Whisper迁移到OpenAI的新转录模型GPT-Transcribe和GPT-Live-Transcribe。内容涵盖迁移路径选择、文件转录、实时转录、语言提示更新、流式处理、响应处理、兼容性检查及评估方法。通过对比新旧代码示例,深入解析API变化、参数差异和事件处理机制,并提供常见错误排查与生产优化建议,帮助开发者平滑升级并充分利用新模型的上下文、多语言和低延迟特性。
- --
内容来源与验证
- 内容等级:PREMIUM_A
- 质量等级:S_CANDIDATE
- 难度:中级
- 验证等级:V1
- 原文作者:cguo-oai
- 原文日期:2026-07-28
- 来源许可:MIT
- 来源版本:
9fe66b673be1ba597c01f9faf7ff7bb038dffcee - 查看原文
站内还有更多完整实战教程
加入会员,解锁全部教程、完整代码与持续更新内容。
加入会员