EN

Whisper API 教程 2026:转录、翻译与会议智能

使用 OpenAI Whisper 和 GPT-4o 构建自动会议转录、说话人分离和智能会议摘要

返回教程列表🌐 Read in English
进阶28 分钟

Whisper API 教程 2026:转录、翻译与会议智能

使用 OpenAI Whisper 和 GPT-4o 构建自动会议转录、说话人分离和智能会议摘要

2026 年使用 OpenAI Whisper API 进行音频转录的完整指南。涵盖实时转录、说话人识别、会议摘要、自动行动项提取以及构建完整的会议智能系统。

Whisper API 教程 2026:转录、翻译与会议智能

会议录音价值巨大,但大多数从未被回顾。本教程将构建一个自动化系统,对任何录制的会议进行转录、分析并提取可操作的情报。

Whisper 在 2026 年的能力

  • 99+ 种语言,高准确率
  • 专业词汇(医学、法律、技术)
  • 多种音频格式:MP3、MP4、MPEG、MPGA、M4A、WAV、WEBM
  • 词级时间戳
  • 通过 API 提供 large-v3 模型
  • 设置

    python
    from openai import OpenAI
    from pathlib import Path
    import json

    client = 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 os

    def 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 build

    def 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() # 用会议笔记更新匹配的事件 # 实现取决于如何将录音与日历事件匹配

    成本与性能

    文件长度转录时间API 成本

    30 分钟会议~45 秒$0.27 60 分钟会议~90 秒$0.54 2 小时会议~3 分钟$1.08

    分析成本 (GPT-4o): 每次会议约 $0.10-0.30

    每次会议总计: $0.40-1.40 —— 相比之下,人工转录每次会议 $10-20

    结论

    上述会议智能流水线将录制的会议转化为结构化的、可搜索的知识。每次会议成本低于 $1.50。按每周 10 次会议计算,每月 $60 即可确保不再丢失任何会议洞察。大多数团队发现仅行动项提取一项就足以证明成本的合理性——再也不用担心会议后谁负责什么了。

    相关工具

    openaiwhisperpython