当你能熟练调用 AI 接口处理文本以后,再回头看音视频数据,会有一个很直观的感受:它仍然是最难处理的“非结构化数据”。文本可以随便切、随便拼,但音频一旦牵涉到说话人、口音、背景噪声、多种语言混用,整个转录流程就会变得异常复杂。
Gemini 3.5 Transcribe 发布的信息里,最值得关注的一个关键词就是“多语言转录”。这个能力看起来没有聊天机器人那么炫,却切中了大量音视频业务团队的痛点。这里先给一个明确判断:Gemini 3.5 Transcribe 的价值不在“又多了一个语音识别引擎”,而在于它把语音识别、语言判断、上下文理解放在了同一条模型链路里,让开发者不再需要手工组装三套工具。
本文会从问题背景、核心概念、环境准备、代码接入、结果验证、常见排错和工程建议几个维度展开。如果你正在做会议纪要、字幕生成、客服质检、播客内容结构化,这篇文章会直接给你一条可以落地的接入路径。
1. 为什么多语言转录值得重新做一遍
很多人对“转录”有一个误会,以为转录就等于语音识别。在单语场景下,这种理解问题不大;但一旦进入多语言场景,转录任务的复杂度就不再是“把声音变成文字”这么简单了。
一个最常见的场景是跨国会议:老板用中文发言,同事用英文回应,中间偶尔还会冒出一个日语产品名。传统 ASR 不管配置成中文还是英文,都会在语言切换的位置出问题。结果是,本该生成一段干净纪要的音频,最后得到一段夹杂大量错别字、连人名和专有名词都拼不对的文本。
过去解决这个问题,业界常规做法是三步走:
- 先用语音识别引擎把音频转成文本,这一步通常只能按一种主语言识别。
- 再对识别结果做语言检测,判断哪一段是中文、哪一段是英文。
- 如果业务要求统一语言,还要把文本再交给翻译服务。
这条链路不是不能用,但它有一个天生的毛病:每一步都可能出错,而错误会沿着链路不断叠加。比如语音识别的断句边界可能跟翻译模型的断句边界不一致,最后不仅语言标记是乱的,连字幕时间轴都会整体偏移。
Gemini 3.5 Transcribe 真正有吸引力的地方就在这里:它把“识别出说了什么、判断是哪一种语言、理解上下文语义”放在同一个模型链路里完成。从工程角度看,这是把三个服务变成一个模型调用,省掉的不只是代码量,更是整套链路的调试成本。
所以我的判断是:Gemini 3.5 Transcribe 不是单纯追赶“识别率”的升级,而是把多语言转录从“拼装流水线”变成“原生能力”。如果你之前被多语言识别问题折磨过,这个变化值得认真评估。
2. 多语言转录的核心概念与适用场景
2.1 转录、语音识别和多语言转录到底有什么区别
先把概念边界说清楚。
语音识别(ASR,Automatic Speech Recognition)通常指“音频到文本”的转换,核心评价指标是字错误率。它关心的是“每个字是不是听对了”。
转录(Transcribe)是一个更宽泛的概念,包含语音识别,但还会涉及说话人区分、标点恢复、语言标记、文本规范化、时间戳对齐等。也就是说,转录不仅要知道“说了什么”,还要知道“谁说的、怎么说、什么时候说的”。
多语言转录则是在转录的基础上,额外增加了一项能力:识别文本中的多种语言,并准确标注。真正的难点不是“模型认识几种语言”,而是“模型能不能在同一个音频里准确判断语言切换点”。
举个例子,一段音频是这样的:
- 0.0 到 3.0 秒:中文
- 3.0 到 6.5 秒:英文
- 6.5 到 8.0 秒:中文
如果模型判断语言切换点偏了 0.5 秒,或者把英文内容按中文发音去解码,转录结果就会连续出错。所以,这里真正考验的是模型对语言边界的感知能力,而不只是词汇量大小。
2.2 什么样的项目真正需要多语言转录
不是所有音视频项目都需要多语言转录,但以下几类场景会非常依赖它。
| 场景 | 原来的痛点 | 多语言转录带来的变化 |
|---|---|---|
| 跨国会议纪要 | 中英混合发言被当成单语识别,结果大量乱码 | 直接标出每段语言,纪要可直接归档分享 |
| 海外客服质检 | 客户讲中文,客服讲英文,质检系统无法自动理解 | 按语言区分对话双方,再统一做质检规则匹配 |
| 播客和视频字幕 | 嘉宾来自不同国家,制作字幕要手动切语言 | 输出带时间戳的转录文本,字幕生成效率大幅提升 |
| 音视频内容搜索 | 转录文本如果不准确,用户搜不到关键内容 | 语言标注准确后,可以按“语言 + 关键词”过滤 |
| 翻译转写流水线 | 先识别再翻译,断句不一致导致翻译质量下降 | 一次转录拿到带语义上下文的长段落,翻译更连贯 |
如果你的业务只是“单语种录音转文字”,比如一个纯中文访谈,那用传统 ASR 可能更简单,没必要引入大模型转录。但凡是数据里已经有中英混合、粤普混合、中英日专有名词混用,多语言转录就是刚需。
2.3 Gemini 3.5 Transcribe 与普通 ASR 的差异
用大白话说,普通 ASR 的目标是“听见”,Gemini 3.5 Transcribe 的目标是“听懂之后把语言理清楚”。
这里有一个容易被忽视的技术背景:传统 ASR 是典型的“声学模型 + 语言模型”架构,输出文本通常只有一个主语言。例如你部署一个中文识别模型,它在遇到英文句子时,会把英文单词近似成中文发音去解码;部署一个英文识别模型,又会出现相反的问题。
Gemini 3.5 Transcribe 如果按照多语言转录的产品定位去理解,它更接近大模型直接对音频 token 做多语言解码。这种架构的变化,使得它不需要你在调用前硬性指定主语言,而是可以在同一段音频里动态判断每一句该用哪种语言解释。
从原理上讲,这种能力来自大规模多语言语料训练。它不只是认识中文、英文各自长得什么样,还知道这两种语言在同一个上下文里如何交替出现。这是传统 ASR 很难做到的。
3. 环境准备与前置条件
在写代码之前,先把环境准备好。这里以 Python 为例,因为 Python 在音视频处理和 AI 接口调用场景下生态最完整。
3.1 运行环境
- 操作系统:Windows 10/11、macOS 或 Linux 均可。
- Python 版本:建议 Python 3.9 或更高版本。
- 包管理工具:推荐使用 pip 和 venv。
- 网络要求:可以正常访问 AI 服务的 API 地址。
如果你还没有创建项目目录,可以先执行下面两条命令:
mkdir gemini-transcribe-demo cd gemini-transcribe-demo python -m venv venv激活虚拟环境:
# Windows venv\Scripts\activate # macOS / Linux source venv/bin/activate3.2 安装依赖
下面是我的建议依赖清单。注意,版本号是演示用参考值,实际安装时请以官方最新文档为准,不需要完全照抄。
# 项目路径:requirements.txt # 版本号是演示参考值,实际以官方最新文档为准 google-genai>=0.5.0 python-dotenv>=1.0.0安装命令:
pip install -r requirements.txtpython-dotenv是用来读取.env环境变量的,主要作用是避免把 API Key 硬编码在代码里。这是一个工程好习惯,也方便在部署时统一管理密钥。
3.3 准备 API 密钥
调用 Gemini 3.5 Transcribe 接口需要有效的 API Key。操作路径通常是:登录 AI 服务控制台,创建或选择一个项目,然后在 API Key 管理页面生成新的密钥。把密钥写在.env文件里:
# 项目路径:.env GEMINI_API_KEY=你的API密钥 GEMINI_ENDPOINT=https://generativelanguage.googleapis.com这里要特别提醒:.env文件一定不要提交到 Git 仓库。建议在.gitignore中加上.env。下面是一条基本的安全清单:
- 不要在前端 HTML、JavaScript 或移动端代码里直接暴露 API Key。
- 不要把 API Key 写在博客示例代码的字符串常量里。
- 如果担心密钥泄露,尽快在控制台撤销并重新生成。
- 在服务端环境变量或密钥管理服务中保存密钥。
- 对密钥规划好权限,只授予这个项目需要的最小范围。
4. 核心流程拆解
接入 Gemini 3.5 Transcribe 的核心流程可以拆成六步:
- 读取本地音频文件。
- 把音频内容编码后放到请求中。
- 调用 Gemini 3.5 Transcribe 模型。
- 解析返回的转录文本。
- 写入 SRT 字幕或 JSON 结构。
- 对结果做质量检查。
下面逐个说清楚。
4.1 读取音频文件
音频文件可能是mp3、wav、m4a、flac等格式。不同模型支持的音频格式会有差异,建议在请求前确认格式,必要时先用ffmpeg转成 wav 或 mp3。比如:
ffmpeg -i input.m4a -ar 16000 -ac 1 output.wav这里把音频转换成 16kHz 采样率、单声道,能显著减小文件体积,同时降低传输耗时。对语音识别类任务来说,16kHz 单声道已经能覆盖绝大多数语音内容。
4.2 构建请求内容
大多数生成式 AI 接口都支持多模态输入,音频可以作为“内联数据”直接传给模型。需要注意,音频文件如果太大,单次请求会超时。一般建议把单次请求的音频控制在几十秒到几分钟以内,长音频需要分段处理。
4.3 调用与解析
调用 Gemini 模型时,建议把 temperature 设为 0。转录任务属于事实提取类任务,不需要创造性输出,温度越低,越不容易产生幻觉,也越能保持原文内容稳定。如果你发现转录结果里出现带有主观色彩的改写,大概率是温度设置的问题。
4.4 输出结构化
多语言转录落地时,最有用的是结构化输出。建议在 prompt 里明确要求模型返回 JSON,包含start、end、language、text四个字段。这样后续生成字幕、做关键词匹配、按语言过滤都会非常方便。
5. Gemini 3.5 Transcribe 完整示例代码实现
下面是一套可以直接运行的完整示例代码。代码里的模型 ID 以官方最新文档为准,在当前发布信息中模型名称为gemini-3.5-transcribe。
5.1 音频转录示例
# 项目路径:transcribe_demo.py import os import json from pathlib import Path from dotenv import load_dotenv from google import genai from google.genai import types # 读取 .env 环境变量 load_dotenv() client = genai.Client( api_key=os.getenv("GEMINI_API_KEY"), endpoint=os.getenv("GEMINI_ENDPOINT", "https://generativelanguage.googleapis.com"), ) PROMPT = """请对这段音频进行多语言转录。 要求: 1. 识别并保留原始语言,不要翻译。 2. 当同一段音频出现多种语言时,按说话片段标注语言代码,如 zh、en、ja。 3. 输出严格的 JSON 数组,不要输出其他解释文字。 4. 格式如下: [ { "start": 0.0, "end": 3.2, "language": "zh", "text": "识别出的文本" } ] """ def transcribe_audio(audio_path: str) -> str: audio_file = Path(audio_path) if not audio_file.exists(): raise FileNotFoundError(f"音频文件不存在: {audio_path}") # 读取音频文件字节 audio_bytes = audio_file.read_bytes() # 构建多模态请求 response = client.models.generate_content( model="gemini-3.5-transcribe", contents=[ PROMPT, types.Part.from_bytes( data=audio_bytes, mime_type="audio/mpeg", ), ], config=types.GenerateContentConfig( temperature=0.0, ), ) return response.text def save_srt(transcript_json: str, output_path: str) -> None: """把 JSON 格式的转录结果转换为 SRT 字幕文件。""" segments = json.loads(transcript_json) srt_lines = [] for index, seg in enumerate(segments, start=1): start = format_srt_time(seg["start"]) end = format_srt_time(seg["end"]) text = f'[{seg["language"]}] {seg["text"]}' srt_lines.append(f"{index}\n{start} --> {end}\n{text}\n") Path(output_path).write_text("\n".join(srt_lines), encoding="utf-8") def format_srt_time(seconds: float) -> str: """把秒数转换为 SRT 字幕时间格式。""" ms = int((seconds - int(seconds)) * 1000) h, remain = divmod(int(seconds), 3600) m, s = divmod(remain, 60) return f"{h:02d}:{m:02d}:{s:02d},{ms:03d}" if __name__ == "__main__": result = transcribe_audio("sample_meeting.mp3") print(result) save_srt(result, "sample_meeting.srt")这段代码的逻辑分成三块:
transcribe_audio:读取音频并调用 Gemini 3.5 Transcribe 模型。save_srt:把返回的 JSON 转录结果转成 SRT 字幕。format_srt_time:把3.2秒这样的浮点数转成00:00:03,200字幕格式。
跑起来之前,先在项目目录放一个测试音频文件,比如sample_meeting.mp3。然后执行:
python transcribe_demo.py如果一切正常,终端会打印出 JSON 数组,同时项目目录下会生成sample_meeting.srt文件。
5.2 使用 curl 调用接口
如果你不想用 Python,也可以用 curl 直接调用。把音频文件转成 Base64 编码后放到请求体里。注意,下面的接口路径需要以官方文档为准。
curl -X POST "https://generativelanguage.googleapis.com/v1beta/models/gemini-3.5-transcribe:generateContent" \ -H "Content-Type: application/json" \ -H "x-goog-api-key: $GEMINI_API_KEY" \ -d '{ "contents": [ { "role": "user", "parts": [ { "text": "请对这段音频进行多语言转录,并标注每段语言代码。" }, { "inline_data": { "mime_type": "audio/mpeg", "data": "BASE64_AUDIO_DATA" } } ] } ], "generationConfig": { "temperature": 0.0 } }'生成 Base64 音频数据可以用这条命令:
base64 -i sample_meeting.mp3 | tr -d '\n'但在真实项目中,我更推荐用 Python SDK。原因有三个:
- Python SDK 会处理请求细节,出错信息更容易排查。
- 长音频切分、重试、并发都要写代码,只靠 curl 难以维护。
- 后续接字幕生成、内容结构化,还需要 JSON 解析,Python 更方便。
5.3 长音频分段处理示例
Gemini 3.5 Transcribe 如果同时限制单次请求的音频时长,就需要对长音频做分段。下面是一个伪代码级的处理框架,你可以按实际项目调整。
# 项目路径:batch_transcribe.py from pathlib import Path from transcribe_demo import transcribe_audio, save_srt # 伪代码:根据实际音频工具实现分段逻辑 def split_audio_segments(audio_path: str, segment_seconds: int = 60): """把音频按固定秒数切分,返回每段临时文件的路径。""" # 在实现中,你可以用 ffmpeg 命令行完成: # ffmpeg -i audio.mp3 -f segment -segment_time 60 -c copy segment_%03d.mp3 pass def transcribe_long_audio(audio_path: str): segments = split_audio_segments(audio_path) all_results = [] for segment_file in segments: result = transcribe_audio(segment_file) all_results.append(result) # 假设每段结果都是 JSON 数组,这里做简单拼接 import json merged = [] for result in all_results: merged.extend(json.loads(result)) save_srt(json.dumps(merged, ensure_ascii=False), "long_audio.srt") return merged分段有一个关键点:如果音频断句可能跨片段,最好在每段之间保留 1 到 2 秒重叠,切分时不要切在说话中间。比较稳妥的方案是,先用简单的静音检测找分段点,再按分段点从原文件截取,而不是盲目按固定秒数切。
固定 60 秒切分的方案,适合已经录制好的、节奏稳定的音频,比如播客、课程。如果是对讲类音频,分段则可能把一句完整的话截成两半,导致转录质量下降。这一点需要在实际项目里做针对性测试。
5.4 输出格式与 prompt 设计
上面代码里,我用了很长一段 prompt 来要求 JSON 结构化输出。这里有一个实践经验:转录模型的 prompt 越具体,输出越稳定。尤其是“不要输出其他解释文字”这句,能有效避免模型在 JSON 前后加多余说明。
如果你的业务里需要多语言统一翻译,可以把 prompt 改成“将英文部分翻译为中文,只保留中文输出”。如果你想保留原文,就让模型按语言输出。这个选择会直接影响下游使用,建议在上线前就跟业务方确认清楚。
6. 运行结果与效果验证
6.1 预期输出
假设测试音频里是一段中英混合对话,转录结果的 JSON 可能长这样:
[ { "start": 0.0, "end": 3.2, "language": "zh", "text": "各位好,今天我们主要讨论一下海外市场的上线计划。" }, { "start": 3.2, "end": 7.1, "language": "en", "text": "Sure. Let's share the launch timeline with everyone." }, { "start": 7.1, "end": 9.8, "language": "zh", "text": "好的,那就先从时间线开始。" } ]注意,这不是我声称的一定会出现的输出,而是一个结构示例。实际结果会因音频质量、说话人口音、文件格式和模型版本而不同。关键验证点有两个:
- 语言代码是否正确。中英混合音频应该能准确标出
zh和en。 - 时间戳是否对齐。播放音频时,字幕出现的时机应与说话内容基本吻合。
6.2 用代码验证时间戳对齐
如果你生成了一堆转录结果,想批量检查时间戳是否合理,可以用下面这个方法:
# 校验时间戳是否单调递增 def validate_segments(segments): previous_end = 0.0 for seg in segments: if seg["start"] < previous_end - 0.5: return False, f"时间戳重叠: {seg}" previous_end = seg["end"] return True, "时间戳校验通过"时间戳重叠超过一定阈值,通常是分段或模型输出不稳定造成的,需要回到音频切分环节检查。
6.3 如何判断转录质量
转录质量不能只看“能不能识别出几个词”,要从三个维度综合评估:
- 语义完整性:是否能把一句完整的话切成一句完整文本,而不是拆成碎片。
- 语言准确性:多语言段落是否按正确语言解码,尤其是中文英文交界处。
- 专有名词:产品名、人名、地名是否保持一致。专有名词最容易在 ASR 链路里被改写。
建议准备一个不超过 30 秒的固定测试音频集,包含不同口音、不同语言组合、不同噪声环境。每次更新模型版本或调整 prompt 后,都先跑一遍固定音频集再上线。这是控制转录质量回归最直接的方法。
7. 常见问题与排查思路
多语言转录接入时,最常见的问题不是“API 不会调”,而是“调通了但结果不可用”。下面整理了一份排查清单。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 接口返回 404 或模型不存在 | 模型 ID 输入错误,或官方模型列表有调整 | 查看官方文档中的最新模型 ID | 改掉模型名,按文档最新值填写 |
| 返回 400 参数错误 | 请求里缺少必要字段,或音频格式不受支持 | 查看错误消息里的具体字段名 | 补充字段,使用 wav/mp3 等受支持格式 |
| 识别结果全是同一语言 | 提示词没有要求输出语言标记 | 检查返回文本里是否包含 language 字段 | 在 prompt 中显式要求标注每段语言 |
| 中文识别夹英文错误 | 中英混合但语言切换点判断失败 | 单独用中英交替的 10 秒样本测试 | 在 prompt 中说明“可能会中英混用,请按段落识别语言并保留专有名词” |
| 长音频请求超时 | 单次音频文件过大 | 查看文件大小与请求耗时 | 改用分段处理或异步任务接口 |
| 返回空文本 | 音频静音段过长、音质过低或采样率异常 | 试听音频,查看波形和采样率 | 用 ffmpeg 转成 16kHz 单声道后重试 |
| 输出有额外解释文字 | prompt 未强调“只输出 JSON” | 查看返回文本首尾内容 | 在 prompt 中加“不要输出解释文字” |
| 成本超预期 | 大量音频反复重试 | 查看调用日志和每次音频时长 | 增加缓存,相同音频不重复调用 |
排查时有一个顺序建议:先确认网络和鉴权,再确认文件和格式,再确认模型 ID,最后才调 prompt。不要一上来就反复改 prompt,那样会浪费很多时间。
8. 最佳实践与工程建议
8.1 音频预处理是转录质量的天花板
同样的模型,给它一段有回声、低音量、电话录音的音频,和给它一段干净录音,效果差距巨大。建议把音频预处理放到 pipeline 的第一步:
- 统一转成 16kHz、单声道、16bit 的 PCM/WAV。
- 用噪音抑制工具去掉明显底噪。
- 对过长的静音段做压缩。
- 对音量过低的音频做响度归一化。
这一步看起来耗时,但能显著减少下游重试次数。尤其多语言转录对“清晰度”要求不低,人声不干净,模型连语言边界都难判断。
8.2 敏感音频数据的授权问题
如果转录内容涉及客户录音、内部会议、医疗访谈等场景,必须先确认你拥有处理和使用这些音频数据的权限。在使用 Gemini 3.5 Transcribe 这类外部 AI 服务时,要把敏感信息脱敏后再上传,或者选择本地化部署方案。
对于企业内部项目,最稳妥的做法是:
- 先做数据分类,把包含身份证号、银行卡号、病历号的音频单独处理。
- 在音频上传前,用脱敏工具把敏感部分静音或替换成提示音。
- 在传输层启用加密,在服务端配置访问白名单。
- 定期轮换 API 密钥,确保权限最小化。
8.3 缓存机制
很多业务场景中,同一段音频可能被多次调用。比如会议结束后,产品、运营、客服可能都会拉取同一份转录结果。建议在服务端加一层缓存,以音频文件的 MD5 值作为 key。
import hashlib import json from pathlib import Path def get_audio_md5(audio_path: str) -> str: block_size = 1024 * 1024 md5 = hashlib.md5() with open(audio_path, "rb") as f: while chunk := f.read(block_size): md5.update(chunk) return md5.hexdigest() def read_cache_or_transcribe(audio_path: str, cache_dir: str = "cache"): audio_id = get_audio_md5(audio_path) cache_file = Path(cache_dir) / f"{audio_id}.json" if cache_file.exists(): return json.loads(cache_file.read_text(encoding="utf-8")) result = transcribe_audio(audio_path) Path(cache_dir).mkdir(parents=True, exist_ok=True) cache_file.write_text(result, encoding="utf-8") return json.loads(result)这里要注意:如果业务要求实时性,缓存时间可以设置短一些;如果音频内容不可变,缓存可以长期保留。使用缓存之前,也要先确认版权和数据合规方面允许长期保存转录结果。
8.4 错误重试与降级
外部 AI 接口调用难免遇到限流或临时故障,重试时需要注意:
- 对超时错误做指数退避重试,避免短时间内频繁请求。
- 对 4xx 参数错误不要盲目重试,先修复请求内容。
- 如果主服务不可用,可以降级到本地 ASR,保证基础功能不中断。
- 把失败请求记录到日志系统,方便事后分析。
单纯的“失败就重试 3 次”不够。更合理的策略是:
第一次失败 -> 等 1 秒重试 第二次失败 -> 等 4 秒重试 第三次失败 -> 等 16 秒重试 第三次仍然失败 -> 写入失败队列,进入人工补偿流程8.5 多语言转录的工程化输出
转录结果最终会交给不同系统消费,建议统一封装成结构化的转录对象,而不是到处传字符串。一个紧凑的转录对象可以包含:
audio_id: 音频唯一标识 segments: 分段数组 - start - end - language - text - speaker_id(可选) - confidence(可选) created_at: 创建时间 model_version: 模型版本这样下游消费方只依赖数据字段,不依赖具体接口格式。后续切换模型或升级 prompt 时,只要字段兼容,上层代码就不需要大改。
9. 一份可直接使用的接入清单
与其做长篇总结,不如直接给你一份可执行的接入清单。这篇文章写到这里,核心就是把“Gemini 3.5 Transcribe 支持多语言转录”这个信息,翻译成可以直接落地的工程动作。
第一步,确认你的场景确实需要多语言转录,而不是普通单语 ASR。如果音频以单语为主,传统 ASR 更简单,成本也更低。
第二步,准备测试音频集。至少准备三段,分别是纯中文、纯英文、中英混合各 30 秒左右,音质尽量贴近真实业务数据。
第三步,搭建环境并跑通transcribe_demo.py。先不要追求完整业务逻辑,确认 API 能通、模型能返回结构、语言标记能输出即可。
第四步,验证 SRT 字幕是否与音频对齐。如果时间戳偏移超过预期,回到音频预处理环节检查。
第五步,针对真实业务音频,压缩、切分、脱敏、缓存、重试几步都做好之后,再评估成本和准确率,决定是否放大到生产环境。
多语言转录这个方向,未来会有更多模型跟进。但工具会变,底层的问题和工程方法不会变:要理解语言边界、要做预处理、要处理好长音频、要保护敏感数据、要保持输出结构化。把这几件事做好,不管换成哪个模型,你的接入链路都能复用。