从Whisper迁移到GPT-Transcribe和GPT-Live-Transcribe指南

本教程面向有编程基础的开发者,详细讲解如何从Whisper迁移到OpenAI的新转录模型GPT-Transcribe和GPT-Live-Transcribe。内容涵盖迁移路径选择、文件转录、实时转录、语言提示更新、流式处理、响应处理、兼容性检查及评估方法。通过对比新旧代码示例,深入解析API变化、参数差异和事件处理机制,并提供常见错误排查与生产优化建议,帮助开发者平滑升级并充分利用新模型的上下文、多语言和低延迟特性。

技术背景

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。实时集成继续配置转录会话并处理转录事件。不同之处在于支持的请求字段、输出格式以及上下文/多语言提示。

保持不变的内容

变化的内容

1. 选择迁移路径

2. 迁移录制的音频

最小的文件迁移保留端点、SDK调用和文件上传。替换模型标识符,然后消费JSON转录响应。

先决条件

文件示例会发起实时 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)

注意事项

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)

注意事项

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)

注意事项

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

注意事项

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

注意事项

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)

注意事项

8. 切换前检查兼容性

某些现有的转录功能在 gpt-transcribe 或 gpt-live-transcribe 中没有直接替代品。

9. 前后评估

在两个模型上使用相同的代表性音频片段。比较基线、直接模型替换以及添加新上下文字段的版本。这样可以区分模型本身的改进与提示、关键词或语言提示带来的改进。

评估转录质量

评估流式传输和操作行为

常见迁移错误

相关资源

常见问题

常见错误及排查方法: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变化、参数差异和事件处理机制,并提供常见错误排查与生产优化建议,帮助开发者平滑升级并充分利用新模型的上下文、多语言和低延迟特性。

内容来源与验证

继续系统学习

站内还有更多完整实战教程

加入会员,解锁全部教程、完整代码与持续更新内容。

加入会员
查看全部语音与实时 API教程