Whisper API 教程 2026:转录、翻译与会议智能
使用 OpenAI Whisper 和 GPT-4o 构建自动会议转录、说话人分离和智能会议摘要
Whisper API 教程 2026:转录、翻译与会议智能
使用 OpenAI Whisper 和 GPT-4o 构建自动会议转录、说话人分离和智能会议摘要
2026 年使用 OpenAI Whisper API 进行音频转录的完整指南。涵盖实时转录、说话人识别、会议摘要、自动行动项提取以及构建完整的会议智能系统。
Whisper API 教程 2026:转录、翻译与会议智能
会议录音价值巨大,但大多数从未被回顾。本教程将构建一个自动化系统,对任何录制的会议进行转录、分析并提取可操作的情报。
Whisper 在 2026 年的能力
设置
python
from openai import OpenAI
from pathlib import Path
import jsonclient = OpenAI()
基础转录
python
def transcribe_audio(file_path: str, language: str = None) -> dict:
with open(file_path, "rb") as audio_file:
transcript = client.audio.transcriptions.create(
model="whisper-1",
file=audio_file,
response_format="verbose_json", # 包含时间戳和分段
timestamp_granularities=["word", "segment"],
language=language # None = 自动检测
)
return {
"text": transcript.text,
"language": transcript.language,
"duration": transcript.duration,
"segments": transcript.segments,
"words": transcript.words
}基本用法
result = transcribe_audio("meeting_recording.mp3")
print(f"语言: {result['language']}")
print(f"时长: {result['duration']:.0f}秒")
print(f"\n转录文本:\n{result['text'][:500]}...")
处理大文件:分块
python
from pydub import AudioSegment
import tempfile
import osdef transcribe_large_file(file_path: str, chunk_minutes: int = 10) -> str:
"""处理超过 25MB 的文件,通过分块实现。"""
audio = AudioSegment.from_file(file_path)
chunk_ms = chunk_minutes * 60 * 1000
full_transcript = []
for i in range(0, len(audio), chunk_ms):
chunk = audio[i:i + chunk_ms]
# 将块导出到临时文件
with tempfile.NamedTemporaryFile(suffix=".mp3", delete=False) as tmp:
chunk.export(tmp.name, format="mp3")
try:
result = transcribe_audio(tmp.name)
full_transcript.append(result["text"])
finally:
os.unlink(tmp.name)
return " ".join(full_transcript)
翻译(非英语转英语)
python
def translate_audio(file_path: str) -> str:
"""将任何语言转录并翻译成英语。"""
with open(file_path, "rb") as audio_file:
translation = client.audio.translations.create(
model="whisper-1",
file=audio_file
)
return translation.text将西班牙语/法语/德语/日语等翻译成英语
english_text = translate_audio("spanish_meeting.mp3")
print(english_text)
会议智能系统
核心功能:将原始转录转化为可操作的会议情报。
python
import re
from dataclasses import dataclass
from typing import List, Optional@dataclass
class MeetingInsights:
summary: str
action_items: List[dict]
decisions_made: List[str]
open_questions: List[str]
attendees_mentioned: List[str]
key_topics: List[str]
sentiment: str
follow_up_required: bool
MEETING_ANALYSIS_PROMPT = """分析此会议转录文本并提取结构化信息。
返回 JSON,格式为:
{
"summary": "3-5 句执行摘要",
"action_items": [
{
"task": "具体行动",
"owner": "人员姓名或 'unassigned'",
"due_date": "提到的日期或 null",
"priority": "high/medium/low"
}
],
"decisions_made": ["决策 1", "决策 2"],
"open_questions": ["问题 1", "问题 2"],
"attendees_mentioned": ["姓名 1", "姓名 2"],
"key_topics": ["主题 1", "主题 2"],
"sentiment": "positive/neutral/negative/mixed",
"follow_up_required": true/false
}
任务描述要具体。即使没有指定负责人,也要捕获所有行动项。"""
def analyze_meeting(transcript: str) -> MeetingInsights:
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": MEETING_ANALYSIS_PROMPT},
{"role": "user", "content": f"会议转录文本:\n\n{transcript}"}
],
response_format={"type": "json_object"}
)
data = json.loads(response.choices[0].message.content)
return MeetingInsights(
summary=data.get("summary", ""),
action_items=data.get("action_items", []),
decisions_made=data.get("decisions_made", []),
open_questions=data.get("open_questions", []),
attendees_mentioned=data.get("attendees_mentioned", []),
key_topics=data.get("key_topics", []),
sentiment=data.get("sentiment", "neutral"),
follow_up_required=data.get("follow_up_required", False)
)
说话人分离
python
def identify_speakers(transcript: str, known_attendees: List[str] = None) -> str:
"""识别并标记转录文本中的不同说话人。"""
attendee_context = ""
if known_attendees:
attendee_context = f"已知参会者:{', '.join(known_attendees)}"
response = client.chat.completions.create(
model="gpt-4o",
messages=[{
"role": "user",
"content": f"""识别此会议转录文本中的不同说话人。
{attendee_context}
格式为:
[SPEAKER A]: 文本
[SPEAKER B]: 文本
如果能够根据上下文(介绍、提到的名字)识别说话人,请使用实际姓名。否则使用 Speaker A、B、C 等。
转录文本:
{transcript[:8000]}""" # 截断以适应上下文窗口
}]
)
return response.choices[0].message.content
完整流水线
python
def process_meeting(audio_path: str, attendees: List[str] = None) -> dict:
print(f"正在处理:{audio_path}")
# 步骤 1:转录
print(" 转录音频...")
result = transcribe_audio(audio_path)
transcript = result["text"]
duration_minutes = result["duration"] / 60
# 步骤 2:识别说话人
print(" 识别说话人...")
labeled_transcript = identify_speakers(transcript, attendees)
# 步骤 3:提取洞察
print(" 提取会议洞察...")
insights = analyze_meeting(labeled_transcript)
# 步骤 4:格式化输出
output = {
"file": audio_path,
"duration_minutes": round(duration_minutes, 1),
"language": result["language"],
"transcript": labeled_transcript,
"insights": {
"summary": insights.summary,
"action_items": insights.action_items,
"decisions": insights.decisions_made,
"open_questions": insights.open_questions,
"key_topics": insights.key_topics,
"sentiment": insights.sentiment
}
}
# 步骤 5:保存结果
output_path = Path(audio_path).stem + "_intelligence.json"
with open(output_path, "w") as f:
json.dump(output, f, indent=2)
print(f" 完成!输出已保存至:{output_path}")
print(f" 发现 {len(insights.action_items)} 个行动项")
return output用法
meeting_data = process_meeting(
"q4_planning_meeting.mp3",
attendees=["Sarah (CEO)", "Marcus (CTO)", "Priya (VP Sales)"]
)打印摘要
print("\n=== 会议情报报告 ===")
print(f"时长:{meeting_data['duration_minutes']} 分钟")
print(f"\n摘要:\n{meeting_data['insights']['summary']}")
print(f"\n行动项:")
for item in meeting_data['insights']['action_items']:
owner = item.get('owner', '未分配')
due = item.get('due_date', '无日期')
print(f" [{item['priority'].upper()}] {item['task']} → {owner} ({due})")
与日历集成
python
import datetime
from googleapiclient.discovery import builddef post_to_google_calendar(meeting_data: dict, calendar_id: str, service):
"""将会议笔记添加到 Google 日历事件中。"""
action_items_text = "\n".join([
f"• {item['task']} ({item.get('owner', 'TBD')})"
for item in meeting_data['insights']['action_items']
])
description = f"""会议摘要
{meeting_data['insights']['summary']}
行动项
{action_items_text}
做出的决策
{chr(10).join(['• ' + d for d in meeting_data['insights']['decisions']])}"""
# 查找今天的会议事件并更新描述
now = datetime.datetime.utcnow()
events_result = service.events().list(
calendarId=calendar_id,
timeMin=now.strftime("%Y-%m-%dT00:00:00Z"),
maxResults=10,
singleEvents=True
).execute()
# 用会议笔记更新匹配的事件
# 实现取决于如何将录音与日历事件匹配
成本与性能
分析成本 (GPT-4o): 每次会议约 $0.10-0.30
每次会议总计: $0.40-1.40 —— 相比之下,人工转录每次会议 $10-20
结论
上述会议智能流水线将录制的会议转化为结构化的、可搜索的知识。每次会议成本低于 $1.50。按每周 10 次会议计算,每月 $60 即可确保不再丢失任何会议洞察。大多数团队发现仅行动项提取一项就足以证明成本的合理性——再也不用担心会议后谁负责什么了。
相关工具
相关教程
使用Whisper转录音频文件、会议和实时语音
使用 OpenAI Whisper API 为任何应用添加准确的语音转文字功能
掌握 GPT-4o 的多模态特性,包括图像分析、音频转录以及用于交互式应用的全新实时流式 API
OpenAI API 模式中的成本与吞吐量权衡——跨 openai 和 python 的批处理对比
使用自然语音 TTS 和自定义语音克隆构建语音 AI 应用
检测并分割音频流中的语音