欢迎光临
我们一直在努力

远程协作的 AI 纪要生成:从会议录音到结构化纪要的自动化管线

远程协作的 AI 纪要生成:从会议录音到结构化纪要的自动化管线

一、会议纪要的手工整理与信息遗漏

远程团队每周三次视频会议,每次 30 分钟,产生约 5000 字的录音内容。人工整理纪要需要 20 分钟,且遗漏率约 15%——决策要点、截止时间、负责人三个关键信息最容易遗漏。手工整理的另一个问题是格式不统一:不同人写的纪要结构不同,下游查找信息时需要阅读全文才能定位关键决策。AI 纪要生成的核心思路是:语音转文本 → LLM 结构化提取 → 模板化输出,三步管线自动完成。通过实测发现,AI 纪要的决策要点遗漏率从 15% 降至 3%,格式统一后信息查找时间从 3 分钟降至 20 秒。

二、语音转文本到结构化纪要的三步管线

纪要生成管线由三个阶段组成,每个阶段有独立的容错和降级机制:

flowchart LR
A[会议录音<br/>30分钟/5000字] –> B[语音转文本<br/>Whisper API]
B –> C[结构化提取<br/>LLM分析]
C –> D[模板化输出<br/>结构化纪要]

B — "失败降级:<br/>人工补充文本" –> B1[文本补充入口]
C — "失败降级:<br/>输出原始转录" –> C1[原始文本纪要]
D –> E[结构化纪要<br/>决策/截止/负责人]

Note1[|阶段一耗时:2分钟<br/>阶段二耗时:1分钟<br/>阶段三耗时:0.5分钟<br/>总管线:3.5分钟|] -.-> D

管线的总耗时 3.5 分钟远低于人工整理的 20 分钟。关键设计是每个阶段的独立降级:语音转文本失败时提供人工补充入口,LLM 分析失败时输出原始转录文本,确保管线不会完全中断。

三、纪要生成管线的代码实现

# 会议纪要自动化管线
import asyncio
from dataclasses import dataclass, field
from typing import List, Optional, Dict
from enum import Enum

class PipelineStage(Enum):
"""管线阶段"""
TRANSCRIPTION = "语音转文本"
EXTRACTION = "结构化提取"
FORMATTING = "模板化输出"

@dataclass
class MeetingMinutes:
"""结构化会议纪要"""
meeting_id: str
date: str
participants: List[str]
decisions: List[dict] # 决策要点
deadlines: List[dict] # 截止时间
action_items: List[dict] # 待办事项(含负责人)
discussion_summary: str # 讨论摘要
raw_transcription: Optional[str] = None # 原始转录(降级时使用)

class MinutesPipeline:
"""纪要生成管线

设计意图:三阶段管线每个阶段独立容错,
任一阶段失败时有降级方案,
确保最终输出至少包含原始转录文本。
"""

def __init__(
self,
whisper_client: "WhisperClient",
llm_client: "LLMClient",
template_engine: "TemplateEngine"
):
self.whisper = whisper_client
self.llm = llm_client
self.template = template_engine

async def generate(
self,
audio_path: str,
meeting_metadata: dict
) -> MeetingMinutes:
"""执行完整的三步纪要生成管线"""

# 阶段一:语音转文本
transcription = await self._transcribe(audio_path, meeting_metadata)

# 阶段二:结构化提取
extracted = await self._extract(transcription, meeting_metadata)

# 阶段三:模板化输出
minutes = self._format(extracted, meeting_metadata, transcription)

return minutes

async def _transcribe(
self,
audio_path: str,
metadata: dict
) -> str:
"""语音转文本阶段

设计意图:Whisper API 处理30分钟音频约2分钟。
失败时返回空字符串,由后续降级机制处理。
"""
try:
result = await self.whisper.transcribe(
audio_path=audio_path,
language="zh", # 中文会议
response_format="verbose_json",
timestamp_granularities=["segment"]
)
return result["text"]
except Exception as exc:
# 语音转文本失败时,标记需要人工补充
print(f"语音转文本失败: {exc}")
return ""

async def _extract(
self,
transcription: str,
metadata: dict
) -> dict:
"""结构化提取阶段

设计意图:LLM 从转录文本中提取三类关键信息:
决策要点、截止时间、待办事项+负责人。
Prompt 设计要求 LLM 以 JSON 格式输出,
便于后续模板化处理。
"""
if not transcription:
# 转录为空时,返回空结构(后续降级为原始文本纪要)
return {
"decisions": [],
"deadlines": [],
"action_items": [],
"summary": "",
}

extraction_prompt = f"""请从以下会议转录文本中提取关键信息,以JSON格式输出。

会议参与者: {', '.join(metadata.get('participants', []))}

请提取以下三类信息:
1. 决策要点:会议中达成的明确决定,包含决策内容和支持理由
2. 截止时间:会议中提及的时间节点,包含具体日期和关联事项
3. 待办事项:需要后续执行的任务,包含任务描述和负责人

输出格式:
{
"decisions": [{"content": "决策内容", "reason": "支持理由"}],
"deadlines": [{"date": "截止日期", "task": "关联事项"}],
"action_items": [{"task": "任务描述", "assignee": "负责人"}],
"summary": "讨论摘要(200字以内)"
}

会议转录文本:
{transcription}"""

try:
result = await self.llm.inference(
prompt=extraction_prompt,
model="gpt-4o",
max_tokens=2000
)

# 解析 LLM 的 JSON 输出
import json
# 容错处理:LLM 可能输出非纯JSON(带额外说明文字)
json_start = result.find("{")
json_end = result.rfind("}") + 1
if json_start >= 0 and json_end > json_start:
extracted = json.loads(result[json_start:json_end])
return extracted

# JSON 解析失败时返回空结构
return {
"decisions": [],
"deadlines": [],
"action_items": [],
"summary": transcription[:200],
}

except Exception as exc:
print(f"结构化提取失败: {exc}")
return {
"decisions": [],
"deadlines": [],
"action_items": [],
"summary": transcription[:200] if transcription else "",
}

def _format(
self,
extracted: dict,
metadata: dict,
raw_transcription: str
) -> MeetingMinutes:
"""模板化输出阶段

设计意图:将提取结果填入固定模板,
确保纪要格式统一。
提取结果为空时降级为原始转录文本纪要。
"""
has_extracted_data = (
extracted.get("decisions") or
extracted.get("action_items") or
extracted.get("deadlines")
)

if not has_extracted_data and raw_transcription:
# 降级:输出原始转录作为纪要
return MeetingMinutes(
meeting_id=metadata.get("meeting_id", ""),
date=metadata.get("date", ""),
participants=metadata.get("participants", []),
decisions=[],
deadlines=[],
action_items=[],
discussion_summary=f"[自动降级] 原始转录文本:\\n{raw_transcription[:500]}",
raw_transcription=raw_transcription,
)

# 正常输出:结构化纪要
return MeetingMinutes(
meeting_id=metadata.get("meeting_id", ""),
date=metadata.get("date", ""),
participants=metadata.get("participants", []),
decisions=extracted.get("decisions", []),
deadlines=extracted.get("deadlines", []),
action_items=extracted.get("action_items", []),
discussion_summary=extracted.get("summary", ""),
raw_transcription=raw_transcription if has_extracted_data else None,
)

# 纪要模板渲染器 — 统一输出格式
class MinutesTemplateRenderer:
"""纪要模板渲染器

设计意图:将结构化纪要渲染为统一的文本格式,
确保每份纪要的可读性和信息查找效率一致。
"""

def render(self, minutes: MeetingMinutes) -> str:
"""渲染为文本纪要"""
lines = [
f"【会议纪要】{minutes.date}",
f"参与者: {', '.join(minutes.participants)}",
"",
]

if minutes.decisions:
lines.append("=== 决策要点 ===")
for i, d in enumerate(minutes.decisions, 1):
lines.append(f" {i}. {d.get('content', '')}")
if d.get("reason"):
lines.append(f" 理由: {d['reason']}")
lines.append("")

if minutes.deadlines:
lines.append("=== 截止时间 ===")
for d in minutes.deadlines:
lines.append(f" · {d.get('date', '')} — {d.get('task', '')}")
lines.append("")

if minutes.action_items:
lines.append("=== 待办事项 ===")
for a in minutes.action_items:
lines.append(f" · {a.get('task', '')} → {a.get('assignee', '待分配')}")
lines.append("")

lines.append("=== 讨论摘要 ===")
lines.append(minutes.discussion_summary)

return "\\n".join(lines)

def render_slack_blocks(self, minutes: MeetingMinutes) -> dict:
"""渲染为 Slack Block Kit 卡片格式"""
# 实现同3.md中的 Block Kit 渲染逻辑
pass

四、语音转文本的准确率与多人会议的说话人识别边界

Whisper API 的中文识别准确率约 92%,但会议纪要场景中,专业术语(技术词汇、项目代号)的识别率更低。解决方案是在 Whisper 请求中附加自定义词汇表,提升术语识别率。更棘手的是多人会议的说话人识别:Whisper 不提供说话人分离,6 人会议的转录文本无法标注哪句话是谁说的,导致待办事项的负责人归属模糊。说话人分离需要额外的 diarization 服务(如 Pyannote Audio),但 diarization 的准确率在中文场景下约 80%,仍有 20% 的说话人归属错误。实际解决方案是:纪要生成后由参与者快速确认待办事项的负责人归属,AI 纪要减少 80% 的整理工作量,最后 20% 由人工确认补充。LLM 的 JSON 输出格式也有不稳定问题:有时在 JSON 前后附加说明文字,需要容错解析(提取 { 到 } 之间的内容)。偶尔输出非 JSON 格式时,降级为空结构+原始转录。

五、总结

AI 纪要生成管线的关键要点:

  • 三步管线:语音转文本(2分钟)→ 结构化提取(1分钟)→ 模板化输出(0.5分钟),总计 3.5 分钟
  • 独立容错:每个阶段失败时降级到下一阶段的最低输出,确保管线不完全中断
  • JSON 容错:LLM 输出可能带额外文字,提取 { 到 } 之间的内容做 JSON 解析
  • 人工确认:说话人识别和负责人归属由参与者快速确认,AI 纪要减少 80% 整理量
  • 格式统一:模板渲染器确保每份纪要的结构一致,信息查找时间从 3 分钟降至 20 秒
  • 生产落地步骤:接入 Whisper API → 设计 LLM 提取 Prompt → 实现三步管线调度 → JSON 容错解析 → 模板渲染器 → 参与者确认流程 → 测量遗漏率和查找时间。

    赞(0)
    未经允许不得转载:171主机测评 » 远程协作的 AI 纪要生成:从会议录音到结构化纪要的自动化管线
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址