Google 发布 Gemini 3.5 Transcribe 专用语音转写模型,支持毫秒级时间戳和智能去除语气词,提供 Colab notebook 和 AI Studio 演示。
你可能用过 Gemini 分析数小时的视频、总结播客,或根据会议录音回答问题(如果你还没这么用过,确实应该试试,非常实用!)。但当你只需要一份干净、高精度、结构化的音频转写文本时,启动一个大型推理模型配合复杂的提示词,往往像用大锤敲核桃——杀鸡用牛刀。
这时就该 Gemini 3.5 Transcribe(gemini-3.5-transcribe)登场了。
这是 Google 基于 Gemini 音频理解核心打造的专用语音转文本模型,针对快速、精准、低成本的转写场景做了专门优化。无论你需要法庭记者式的逐字转写(精确到毫秒级时间戳),还是为阅读优化的摘要(去掉所有尴尬的"嗯""啊"),这个模型都能原生支持,无需任何提示词技巧。
🚀 动手优先:如果你想直接运行代码体验,打开交互式 Gemini Transcribe Colab 笔记本!它已经可以运行,可以直接体验模型效果。偏好零代码的可视化界面?你也可以直接在 Google AI Studio 中测试语音识别。
以下是本指南的内容概要:
为什么要用专用转写模型?(音频理解 vs 转写)
安装配置与 Files API
引导语言与代码切换(85+ 种地区语言)
自定义词表:技术术语不再拼错
杀手级功能:智能转写 vs 逐字转写模式
说话人区分:谁说了什么?
词级时间戳:每个单词的精确时间偏移
决策矩阵:该用哪种配置?
实时流式转写呢?
为什么要用专用转写模型?
在看代码之前,先把概念理清楚。你可能疑惑:"我直接把 MP3 上传给 Gemini 3.7 说'转写这个'不行吗?"
可以,但 gemini-3.5-transcribe 的差异化在于:
提示:如果你需要针对音频内容提问("Alice 的行动项是什么?"),用 Gemini 3.7 这样的多模态模型。如果你需要的是转写文本、字幕或整理好的听写笔记,用 Gemini Transcribe!
Gemini 3.5 Transcribe 模型通过现代 Google GenAI SDK(google-genai v2.0+)使用 Interactions API 运行。
首先安装 SDK:
pip install -U "google-genai>=2.0.0"
确保你从 Google AI Studio 获取了 API 密钥,并将其设置为 GEMINI_API_KEY,然后看看音频是如何传给模型的:
from google import genai
client = genai.Client()
# 1. 通过 Files API 上传音频文件
audio_file = client.files.upload(file="meeting_recap.mp3")
# 2. 使用上传文件的 URI 请求转写
interaction = client.interactions.create(
model="gemini-3.5-transcribe",
input=[{"type": "audio", "uri": audio_file.uri}],
)
print(interaction.output_text)
观看下面的演示视频,看看基准转写效果——轻松处理自然语音和双语切换:
为什么要用 Files API?
处理音频和视频时,永远不要将原始音频字节以 base64 编码内联到 API 请求中——这会使 payload 大小膨胀 33%,容易触发网络超时,而且如果想重新运行查询还需要重新上传相同的字节。
Files API 优雅地解决了这个问题:
大文件支持:上传音频和视频文件每个最高 2 GB(项目总存储 20 GB)。
临时生命周期:文件存储 48 小时后自动清理。
完全免费!Files API 的存储和上传不收取任何额外费用——只有在实际对模型进行推理时才需要支付 token 处理费用。
正如你在上面的视频中看到的,Gemini Transcribe 开箱即用地自动识别口语语言,并无缝处理代码切换(同一个人在同一句话中混用多种语言——比如说法语和英语时自由切换,这种事我经常遇到!)。
但是,如果你知道你的音频只涉及某种特定语言或地区方言,可以在 transcription_config 中传入显式的 BCP-47 语言代码来偏置识别:
interaction = client.interactions.create(
model="gemini-3.5-transcribe",
input=[{"type": "audio", "uri": spanish_audio.uri}],
generation_config={
"transcription_config": {
# 显式语言提示
"language_codes": ["es-ES"],
}
},
)
print(interaction.output_text)
注意:将 language_codes 留空([])或省略它,会启用覆盖 85+ 支持语言和地区变体的全自动检测。查看音频转写文档获取完整的语言代码列表。
每个开发者都遭受过 ASR 模型拼错专有名词、混淆专业库名和日常词典词汇(把"ScaNN"变成"scan",或把"Qdrant"变成"quadrant"),或者发明听起来相似的词("Sitsi"代替"CitC","Thiago"代替"Tiago")。
通过 custom_vocabulary,你可以传入最多 1000 个领域特定的术语列表,模型会偏置识别这些词:
interaction = client.interactions.create(
model="gemini-3.5-transcribe",
input=[{"type": "audio", "uri": team_briefing.uri}],
generation_config={
"transcription_config": {
"custom_vocabulary": [
"Guillaume Vernade",
"ScaNN",
"Qdrant",
"Cilium",
"Weaviate",
"Milvus",
"Buganizer",
"Tiago",
"CitC",
"CL",
"spaCy",
],
}
},
)
print(interaction.output_text)
观看下面的并排对比视频,看看模型在有无自定义词表偏置情况下的表现差异:
注意默认语音识别如何回退到基于音标词典的猜测(Vernat、Scan、Quadrant、Syllium、Thiago、Sitsi、Spacey)。相比之下,提供 custom_vocabulary 可以保证团队成员姓名、小众工具、内部基础设施和开源库的名称 100% 精确转写。
提示:不要只在自定义词表里放缩写词。把团队成员的姓名、内部服务代号、GitHub 仓库句柄、产品品牌名称和小众行业术语都加进去。
这绝对是 Gemini 3.5 Transcribe 我最爱的能力。
默认情况下,语音转文本模型以逐字模式运行:它们记录一切,包括每个紧张的结巴、清理喉咙、语速停顿和口头习惯。
当你在转写演讲排练、访谈或语音备忘录时,阅读原始逐字文本非常痛苦:
--- 逐字输出 ---
"Uh, hello. Good evening, everyone. Um, I'd like to start by, well, first of all, thank you all for coming. Today is, um, a very special day, or rather, evening? No, afternoon? Right, evening. We are here to celebrate, uh, sorry, let me just find my notes. Ah, here. We are here to honor, no, not honor, but, um, to mark the launch of our new, sorry, my glasses are a bit foggy, the new marketing campaign. No, wait, product campaign? Product, yes. Um, where was I? Ah, yes. It has been a long journey, a very, uh, challenging, well, not challenging in a bad way, but, you know, difficult? No, rewarding. Rewarding is the word. So, um, yes, cheers to, wait, we don't have glasses yet. Thank you."
如果你切换到 mode={"type": "smart"},模型会执行智能阅读优化:
去除流畅性中断:剥离口语填充词("um"、"uh"、"you know")。
内联自我修正:自动解决口头失误("Tuesday, wait no, Wednesday" → "Wednesday")。
结构化格式化:将列表、项目符号、数字、货币($26M)和自然段落格式化。
开启方式如下:
interaction_smart = client.interactions.create(
model="gemini-3.5-transcribe",
input=[{"type": "audio", "uri": audio_file.uri}],
generation_config={
"transcription_config": {
"mode": {
"type": "smart",
},
}
},
)
print(interaction_smart.output_text)
看看同一段排练音频的清理后结果:
--- 智能转写输出 ---
Good evening everyone. First of all, thank you all for coming. Today is a very special evening. We are here to mark the launch of our new product campaign.
It has been a long journey, a very rewarding one. So, cheers to that.
观看下面的并排对比视频,看看原始流畅性中断如何被剥离,同时你可以听到实际音频:
(如果视频无法加载,你可以直接听 rehearsing.wav。)
重要注意事项:由于智能转写使用语言模型来清理流畅性中断并结构化输出,它可能会略微重写、省略或改述所说的内容,以使其听起来自然简洁。如果你需要法庭级别的逐字记录、医学转录或字幕同步(每个精确音节都很重要),请使用逐字模式!
另请注意,智能模式与词级时间戳和说话人区分不兼容(它们需要 {"type": "verbatim"})。
需要知道多人会议或播客中是谁在发言?用 diarization_mode="speaker" 启用说话人区分:
interaction = client.interactions.create(
model="gemini-3.5-transcribe",
input=[{"type": "audio", "uri": meeting_audio.uri}],
generation_config={
"transcription_config": {
"mode": {
"type": "verbatim",
"diarization_mode": "speaker",
},
}
},
)
要干净地提取每个说话人的轮次,遍历 step 注解:
def print_diarized_transcript(interaction):
words = []
for step in getattr(interaction, "steps", []) or []:
for content in getattr(step, "content", []) or []:
for annotation in getattr(content, "annotations", []) or []:
if getattr(annotation, "type", None) == "word_info":
words.append(annotation)
current_speaker = None
current_turn = []
for w in words:
speaker = getattr(w, "speaker", "spk:0")
if speaker != current_speaker:
if current_turn:
print(f"[{current_speaker}]: {' '.join(current_turn)}")
current_speaker = speaker
current_turn = [w.text]
else:
current_turn.append(w.text)
if current_turn:
print(f"[{current_speaker}]: {' '.join(current_turn)}")
print_diarized_transcript(interaction)
[spk:0]: One chocolatine, please.
[spk:1]: Tiago, arrête. It is a pain au chocolat.
[spk:0]: Wait, a guy from the south west told me it's chocolatine.
[spk:1]: Do not listen to them. 90% of France and the entire universe calls it pain au chocolat. Chocolatine is a myth.
[spk:0]: Meu Deus, you French are intense. In Brazil, people fight the exact same way over bolacha versus biscoito.
[spk:1]: Well, here pain au chocolat is the only real word.
[spk:0]: Fine. Two pain au chocolat, please. As long as it has chocolate, tá valendo.
观看下面的演示视频,两位同事辩论 pain au chocolat vs. chocolatine。注意波形线如何动态改变颜色(Tiago 时为青色,同事时为橙色),每个说话人交替时:
(直接音频链接:听 pain_au_chocolat.wav)
当你需要精确同步——例如跳转到视频中的特定时间点、构建交互式转写或对齐文本与波形——你可以请求词级毫秒级起始和结束偏移。
配置 timestamp_granularities=["word"](并可选择结合 diarization_mode="speaker"):
interaction = client.interactions.create(
model="gemini-3.5-transcribe",
input=[{"type": "audio", "uri": audio_file.uri}],
generation_config={
"transcription_config": {
"mode": {
"type": "verbatim",
"timestamp_granularities": ["word"],
"diarization_mode": "speaker",
},
}
},
)
每个识别的单词都会在其 content 注解中附带精确的时间偏移(以及说话人轮次):
words = []
for step in getattr(interaction, "steps", []) or []:
for content in getattr(step, "content", []) or []:
for annotation in getattr(content, "annotations", []) or []:
if getattr(annotation, "type", None) == "word_info":
words.append(annotation)
for w in words[:6]:
spk = getattr(w, "speaker", "spk:0")
print(f"[{w.start_offset:>7} -> {w.end_offset:>7}] ({spk}) {w.text}")
[ 0.000s -> 0.400s] (spk:0) One
[ 0.400s -> 1.200s] (spk:0) chocolatine,
[ 1.200s -> 1.800s] (spk:0) please.
[ 3.200s -> 3.700s] (spk:1) Tiago,
[ 3.700s -> 4.200s] (spk:1) arrête.
[ 4.200s -> 4.500s] (spk:1) It
有了词时间戳能做什么?
为每个单词提供毫秒级偏移解锁了大量能力:
即时字幕(.srt / .ass):将单词分组为 3-5 秒的字幕块,用于 YouTube、Premiere 或 Final Cut。
卡拉OK和动态字幕:说话时实时高亮每个单词(类似 TikTok / YouTube Shorts)。
点击播放搜索:构建音视频搜索索引,点击任何搜索关键词立即将播放器定位到精确的毫秒时间。
波形和视觉动画:在屏幕上触发视觉事件或高亮特定口语短语。
💡 幕后揭秘:上面的演示视频实际上就是用这个做的!词时间戳提供了精确的毫秒计时,用于对齐字幕卡片、高亮自定义术语("oatmilk"),以及在说话人切换时将波形线颜色从青色变为橙色。
如果你想要完整的 Python 函数来将这些单词注解转换为标准 .srt 字幕文件,可以在交互式 Cookbook Colab 笔记本中直接找到。
以下是一个快速参考表,帮助你根据使用场景选择正确的设置:
上面涵盖的所有内容都是针对预录音频文件(通过 Files API 的 unary 模式)。
Gemini 还支持使用 gemini-3.5-transcribe-live 和 Live API 通过 WebSocket 进行实时流式转写。它允许你直接从麦克风流式传输原始 16 位 PCM 块(每个 100ms),并在说话时立即接收临时的部分假设(interim_input_transcription)和最终确定的文本。
然而,使用异步 Python workers(asyncio)进行实时 WebSocket 流式传输、处理音频分块以及管理安全客户端应用的临时 valet 令牌要复杂得多,值得单独写一篇教程。
如果你现在就想深入研究实时流式传输代码:
📖 打开 Gemini Transcribe Colab 笔记本(包含可运行的实时流式传输和临时令牌创建代码单元!)
📚 阅读 ai.google.dev 上的官方 Gemini 实时转写文档。
Gemini 3.5 Transcribe 给你两全其美的体验:当你需要时间戳和说话人区分时提供严格、毫秒精确的逐字数据,当你想要人类阅读的干净文本时提供智能去除流畅性中断的智能模式。
你试过在自己的语音录音或会议中使用智能模式吗?在评论区分享你的想法和边缘用例!🚀