Gemini 2.0 Flash 能看懂会议录像了,但真正落地纪要,还是得补上工程这一课
Gemini 2.0 Flash 能看懂会议录像了,但真正落地纪要,还是得补上工程这一课
上周一的项目复盘录了 80 分钟,我试了三种办法:先跑 ASR 再喂 LLM、直接手打、以及把视频扔给 Gemini 2.0 Flash。最后我还是坐下来手打了一遍——不是因为模型不行,而是因为“能看懂”离“能交付”中间,还隔着一段工程距离。
这篇文章不讲发布会,也不讲空泛的“多模态突破”,只回答一个很现实的问题:它到底替你省了哪一步,又把哪一步留给了你。
为什么我偏偏拿“会议录像转纪要”来测
会议录像是一个很残酷、也很诚实的场景。
因为它同时包含三件事:
- 音频:谁在说、说了什么,依赖语音识别和说话人区分;
- 视频:屏幕上展示了什么,PPT、表格、代码、图表都在这里;
- 时间轴:发言和画面必须对齐,不然纪要就会变成“内容都对,但上下文全错”。
换句话说,这不是单纯的“看字幕总结”,而是要把谁说的话和当时屏幕上发生的事绑在一起。这个场景足够高频:开会、复盘、需求评审、方案对齐,几乎每个团队都要碰。结果好不好,一眼就能判断,不需要专业评委打分。
如果一个模型连会议纪要都做不稳,那它的“多模态理解”大概率还停留在演示层。
Gemini 2.0 Flash 的多模态能力,到底新在哪
老方案的逻辑很直白:先把音频转成文字,再把文字交给大模型总结。
而 Gemini 2.0 Flash 这类新方案,关键变化不是“更聪明”,而是把视频画面和音频放进同一个上下文里联合推理。它不只是先看字幕再猜图,而是尝试同时处理“这一句是谁说的”“这时屏幕上是什么”“它们之间有没有对应关系”。
下面这张表,基本能说明差异:
| 维度 |ASR → LLM 旧方案 | Gemini 2.0 Flash 直接推理 |
| 准确率 | 音频转写通常稳定,但画面信息容易丢 | 对“发言内容 + 屏幕内容”的同步归因更自然 |
| 延迟 | 两段流程串起来,链路更长 | 一次调用完成主流程,体验更顺 |
| 工程复杂度 | 要接 ASR、说话人分离、时间轴对齐、摘要 | 接口更少,但 prompt 和切片策略更重要 |
这意味着什么?
不是说旧方案废了,而是新方案把“理解”前移了,把“拼接”后移了。实测流程:哪些步骤真的一步到位了
我按最朴素的方式跑了一遍:
1. 上传会议视频文件;
2. 让模型按照时间段输出结构化纪要;
3. 把结果直接解析成 JSON。
真正让我意外的是:“发言内容 + 画面内容同步归因”这一段,确实省掉了很多人工对齐。
比如某一段里,发言人正在解释接口变更,屏幕上正好是 PRD 的版本号和字段表,模型能把这两件事放进同一个纪要条目里,而不是拆成两段互不相干的摘要。
脱敏输出样例
{
"speaker": "产品负责人",
"time_range": "00:12:08 - 00:15:22",
"summary": [
"确认本周先冻结字段命名,避免前后端联调反复返工",
"下个版本只保留 3 个核心状态,其他状态先隐藏"
],
"screen_context": "共享屏幕显示 PRD 表格,标题为“字段定义 v1.7”,右侧高亮了状态列",
"action_item": "研发在周三前确认字段映射表,并回填到文档"
}
这个输出的价值不在于“写得漂亮”,而在于它已经接近可用的工作流中间件了:你不必先把视频拆成字幕、再把字幕对齐、最后再整理成纪要。
Python 调用示例
下面是一个示意版流程:上传视频、构造多模态 prompt、解析结构化输出。不同 SDK 版本的接口名可能略有差异,思路比写法更重要。
import os
import json
import re
from google import genai
API_KEY = os.getenv("GEMINI_API_KEY")
VIDEO_PATH = "meeting.mp4"
client = genai.Client(api_key=API_KEY)
1) 上传视频
video_file = client.files.upload(file=VIDEO_PATH)
2) 构造提示词
prompt = """
你是会议纪要抽取器。请根据视频中的音频与画面,输出严格 JSON。
要求:
1. 只输出 JSON,不要解释,不要 Markdown
2. 按时间顺序列出每个关键发言片段
3. 每条包含 speaker、time_range、summary、screen_context、action_item
4. 如果画面信息不足,screen_context 填 "unknown"
5. 如果无法确认说话人,speaker 填 "unknown"
输出格式:
{
"meeting_title": "",
"items": [
{
"speaker": "",
"time_range": "00:00:00 - 00:00:00",
"summary": ["", ""],
"screen_context": "",
"action_item": ""
}
]
}
"""
3) 调用多模态模型
resp = client.models.generate_content(
model="gemini-2.0-flash",
contents=[video_file, prompt]
)
text = resp.text.strip()
4) 解析 JSON
def extract_json(s: str):
match = re.search(r"\{.*\}", s, re.S)
if not match:
raise ValueError("No JSON found")
return json.loads(match.group(0))
result = extract_json(text)
print(json.dumps(result, ensure_ascii=False, indent=2))
还需要手动处理的坑,我遇到了三个
1. 长会议的时间窗口切片问题
80 分钟的会议,直接整段喂进去,最容易出现两个问题:
- 后半段上下文变弱;
- 关键节点被稀释,模型开始写“总体讨论了若干问题”这种正确但没用的话。
我的处理方式很简单:先按议题切片,再让模型分别产出局部纪要,最后人工合并。
别幻想一把梭,长视频更像一锅炖菜,先分盘再上桌,效果通常更稳。
2. 多人声纹混叠时,说话人识别并不总准
当两三个人插话、抢话、打断的时候,模型还是会把“谁在说”搞混。尤其是没有明确主持人的会议,纪要里很容易出现:
- speaker 标成
unknown; - 同一段话被归到两个不同人头上;
- 画面和音频的归因出现错位。
绕过办法也不复杂:把“说话人识别”从主任务里降级成辅助字段。
也就是说,先保证内容和时间轴正确,再接受一部分 speaker 不确定。比起写错内容,写成 unknown 更诚实,也更适合后处理。
3. 输出格式稳定性,比想象中更脆
这个坑最典型。
你只改一句 prompt,结果 JSON 就从“能解析”变成“夹杂解释文字”。
#### 坏例子
请总结会议内容,顺便告诉我重点。
会议主要讨论了接口变更、测试安排和发布节奏。下面我分三部分来说:
1. ...
2. ...
#### 好例子
只输出严格 JSON。
不要 Markdown。
不要前后解释。
不要使用代码块。
同样的视频,差的不是模型理解能力,而是输出约束的强度。
这也是为什么多模态产品要能用,prompt 版本管理几乎和模型本身一样重要。
工程化建议:把它做成可复用流水线
如果你想把这事落地,而不是停留在“我跑通了一个 demo”,建议按这个链路做:
1. 切片策略先行
以议题变化、说话人变化、屏幕页变化作为切片依据,而不是死按时间等分。
2. prompt 模板版本化
把字段定义、输出格式、容错规则写死,不要每次临时改口径。
3. 输出后处理最小化
先做 JSON 校验、字段补全、时间轴排序,再考虑复杂的二次摘要。
4. 人工只做最后一公里
让人去修“判断”,不要让人去抄“内容”。
如果你的会议不超过 45 分钟、发言人不超过 4 人、屏幕内容变化也不算特别频繁,现在就值得直接接入 API 试一版。
如果超过这个规模,先别急着替换现有方案,更稳的做法是继续用 ASR + LLM 双阶段,并把本文的切片方案加进去过渡。
文中的代码示例直接调用了 Gemini 2.0 Flash 的多模态接口。如果你想复现这个流程但还没有 API 访问权限,可以通过 api.884819.xyz 直接获取——支持按量调用,不需要绑定 Google 账号或处理地区限制,适合在国内环境快速跑通 demo。新用户注册即送体验token。
这次只测了“单个长视频 → 结构化文本”这一条链路。下一篇我想试的是另一个方向:多段短视频的跨片段推理——比如把同一个项目分散在五次周会里的讨论自动归总成一份决策日志。这个场景的难点完全不一样,到时候再说。
本文由8848AI原创,转载请注明出处。关注8848AI,带你从零开始学AI。#AI教程 #Gemini #多模态AI #会议纪要 #Prompt技巧 #AI工作流 #8848AI #人工智能