Gemini转录末尾吞词:补2秒静音找回3个词
2026 年 8 月 26 日,Google 推出 Gemini 3.5 Transcribe,把语音转文字从”听打”做成带整理的转录;到 10 月 31 日晚,它在 Google AI 开发者论坛上攒出一个很具体的投诉:音频结尾没有静音垫子时,模型会吞掉最后 2–3 个词。同帖给出的兜底办法是——尾部补 2 秒静音,文字就完整了。
为什么是现在值得看:这个模型正被推进 Android 版 Gboard 的 Rambler、macOS 版 Gemini 的”Speak to Window”,Chrome 侧也预告了集成(INSIDE,2026-08-26)。而 Google 同期对外的口径是:预录音频字词错误率仅 2.6%,最终转录速度改善 70%(Google 引用 Artificial Analysis 数据,INSIDE 转述)。在这个精度叙事下,末尾整段丢掉 2–3 个词属于另一类故障:不是听错字,是根本没写出来。放到语音输入场景,这正是最容易让人重复说一遍、又永远补不回来的那种失败。
下面凡标注”我的推算”的,是我依据帖子里的公开数字或公开代码路径算出来的,不是官方结论;其余事实均出自文末链接原文。
症状比想象中窄:两个长文件、一个短片段
发帖人 linohype 给出的测试条件相当具体:241 秒和 260 秒的德语 MP3,单声道、64 kbit/s、44.1 kHz,解码无报错,说话内容一直延续到文件末尾。转录结果缺最后 2–3 个词,最后一句从中间被切断,verbatim(忠实转录)与 smart(智能整理)两种模式”切在完全相同的那个词上”。
三个排除性证据值得单独拎出来,因为它们把问题从”你的环境有毛病”推回到模型侧:
一是稳定复现。同一文件两次独立运行,断在同一处,不是随机抖动。
二是排除了客户端解析问题。原始 interaction 里只有一个 model_output 步骤、一个文本内容项,状态为 completed,缺的词在整个响应体里根本不存在。
三是整段音频确实都被处理了。帖子给出的输入量是”全长约每秒 25 个 token”,260 秒对应 6500 个音频 token。
| 测试条件 | 结果 |
|---|---|
| 241 s 德语 MP3,说话延续到结尾 | 末尾缺 2–3 个词 |
| 260 s 德语 MP3,说话延续到结尾 | 末尾缺 2–3 个词 |
| 同一文件截取 21 s 片段 | 完整,加不加尾部静音都一样 |
| 同一文件尾部补 2 s 静音 | 完整 |
| gemini-2.5-flash 转同一文件 | 完整 |
补静音的对照实验:两条命令加一次校验
兜底思路很朴素:在音频流末尾接一段静音,让”语音结束”这个边界不与文件结束重合。下面这段命令按帖子描述的做法复现”追加 2 秒静音”,输出再喂给转录接口:
# 追加 2 秒静音(常规做法,会重新编码)
ffmpeg -i input.mp3 -af "apad=pad_dur=2" -ac 1 -ar 44100 output_padded.mp3
# 顺带检查文件时长是否真的多了 2 秒
ffprobe -v error -show_entries format=duration -of csv=p=0 output_padded.mp3
需要说清一处口径差异:帖子里强调的是”追加静音 MP3 帧、原音频不重新编码”,而上面这条 ffmpeg 命令会整体重编码。为了对齐帖子的结论,下面用一个只看尾部词数的脚本做对照,而不是肉眼比:
# 对比原始版与补静音版的转写结尾(对照帖子里的两个 interaction 结果)
def tail(text, n=8):
return " ".join(text.strip().split()[-n:])
a = tail(open("transcript_original.txt", encoding="utf-8").read())
b = tail(open("transcript_padded.txt", encoding="utf-8").read())
print("原始 :", a)
print("补静音:", b)
print("尾部一致:", a == b)
如果原始版的末尾停在半句话上,而补静音版多出完整结尾,就复现了帖子里的现象。
另一个可复算的自查点是 token 密度。帖子公开的数字是约每秒 25 个音频 token、260 秒对应 6500 个,所以:
# 按帖子的公开密度做 sanity check(这是按公开数字推算,不是官方阈值)
DUR=260
echo "预期音频 token ≈ $((DUR * 25))"
如果你的调用返回的输入 token 数与”音频时长 × 25″大致相当,说明整段音频确实进了模型,问题不在上传环节;这比反复重传文件要省事。
另一类”没转出来”:OpenAI 兼容代理会整段静默丢弃
2026 年 9 月 9 日,CLIProxyAPI 项目的 issue #5722 记录了完全不同形态的一次丢失。该项目在 Gemini → OpenAI chat-completions 响应转换器里只处理 text、functionCall、inlineData 三种 part,而 gemini-3.5-transcribe 把转录结果放在独立的 audioTranscription part 里。转换后 choices[0].message.content 是空字符串,completion_tokens 为 0;流式(streamGenerateContent?alt=sse)形状相同、结局相同。
复算这一步并不需要自己造数,只要顺着公开的代码路径走一遍:
模型侧输出 parts = [ audioTranscription(text) ]
转换器已实现的分支 = { text, functionCall, inlineData }
→ audioTranscription 未命中任何分支
→ content = "" 且 completion_tokens = 0
| 调用路径 | 模型是否转出了文本 | 客户端看到什么 |
|---|---|---|
| 直接走 Gemini API(Files + Interactions) | 转出 | 正常的文本内容项 |
经 OpenAI 兼容端点 /v1/chat/completions |
转出 | 空字符串、0 token |
| 经 OpenAI 兼容端点流式 | 转出 | 空 delta |
按这个复算可以推出一个操作性结论(我的推算):遇到”HTTP 200、但内容为空”的工单,先怀疑协议转换层有没有把 audioTranscription part 映射成文本 part,而不是先怀疑模型能力、额度或网络。
两种”缺字”别混成一件事
同一社区里同时存在几种外观相似、机理不同的故障,值得分开看。官方论坛挂着 2026-08-28 的 “Gemini-3.5-transcribe returns empty transcription (HTTP 200, zero output tokens) on all documented REST paths”,2026-08-04 的 “gemini-3.5-live-translate-preview consistently truncates the last words of translated audio output”,以及 10 月关于 Gemini-3.8-flash-tts 尾音毛刺的主题。这些说明”末尾出不来字”在 Google 的音频模型线上不是孤例。
但它们不是同一个 bug:论坛主帖里的末尾缺词只出现在长文件上,补静音即可恢复;CLIProxyAPI 那个属于协议层整段丢失,与文件长短无关;实时转录则是另一回事——GitHub 上 DevEmperor/DictateKeyboard 的 issue #372 记录了停止录音时最终几个词经常缺失,那属于流式尾帧处理,与离线文件末尾截断不是同一条路径。
还有一个容易被忽略的跨源矛盾:按 INSIDE 的报道,smart 模式无法与逐字时间戳、说话者识别同时使用,想拿到时间戳就必须切回 verbatim。但论坛主帖明确写了两种模式”切在完全相同的那个词上”——也就是说,换模式解决不了末尾截断,指望靠降级到 verbatim 兜底的用户可以省一次折腾。
官方口径与实测之间的盲区
Google 对外主推的是 2.6% 的预录音频字词错误率、85 种以上语言自动识别、最多 3 名说话者标注、最多 1000 个自定义词汇(ectimes,2026-08-30,中文社区视角转述)。这些指标和能力都成立,但它们衡量的是”听错了多少字”,不是”尾部有没有被切掉”。
按我的理解,这类指标对系统性末尾截断天然不敏感:被切掉的词不作为错字计入错误率,而是干脆不在输出里。这意味着官方给出的精度数字和你手上的”最后一句少几个词”可以同时为真,不构成矛盾,别用 2.6% 去反驳用户报告,反过来也别拿用户报告去否定整体精度。
截至 2026 年 10 月 31 日晚 8:32 发帖,回复区只有一位 11 月 1 日凌晨 5:23 的用户要求提供代码和输入以便复现,尚未看到官方工程师给出的结论。帖子同时贴出了两组 interaction ID:原文件(缺词)与补静音(完整),任何拿到同一文件的人都能复现同一结果——这也是它比口头抱怨更有价值的原因。
对使用者的边界判断
如果你的语音输入或批量转录流水线用了 Gemini 3.5 Transcribe,最省事的做法是在客户端侧统一给音频补一段尾部静音,成本是几毫秒音频加一次 ffmpeg 调用;如果你走的是 OpenAI 兼容协议,先查转换层有没有处理 audioTranscription part。这两条都是我的经验判断,不是官方说法,官方尚未就这个现象发布修复说明或变更记录。
参考来源
-
bug(translator): Gemini 3.5 Transcribe transcripts (audioTranscription parts) are silently
-
Google 版 Typeless?轉錄工具 Gemini 3.5 Transcribe:逐字稿會自己刪掉「嗯、啊」,Chrome 也將導入 – INSIDE
-
Google AI Developers Forum:Gemini-3.5-transcribe drops the last 2–3 words when audio ends without trailing silence(2026-10-31,一手用户报告,含复现条件与 interaction ID):https://discuss.ai.google.dev/t/gemini-3-5-transcribe-drops-the-last-2-3-words-when-audio-ends-without-trailing-silence/197164
-
CLIProxyAPI issue #5722:Gemini 3.5 Transcribe 的 audioTranscription part 在 OpenAI 兼容响应中被静默丢弃(2026-09-09):https://github.com/router-for-me/CLIProxyAPI/issues/5722
-
INSIDE:Google 版 Typeless?轉錄工具 Gemini 3.5 Transcribe(2026-08-26,含 smart/verbatim 与时间戳互斥、WER 与速度数据):https://www.inside.com.tw/article/42217-google-gemini-3-5-transcribe-smart-transcription-chrome
-
葉時天空(ectimes):AI 語音轉錄再進化 Google Gemini 3.5 Transcribe 主打智慧整理(2026-08-30,中文社区视角):https://www.ectimes.org.tw/2026/08/ai%E8%AA%9E%E9%9F%B3%E8%BD%89%E9%8C%84%E5%86%8D%E9%80%B2%E5%8C%96%E3%80%80google-gemini-3-5-transcribe%E4%B8%BB%E6%89%93%E6%99%BA%E6%85%A7%E6%95%B4%E7%90%86/
-
GitHub:DevEmperor/DictateKeyboard issue #372,Gemini 3.5 Transcribe Live 停止时末尾词缺失:https://github.com/DevEmperor/DictateKeyboard/issues/372
评论区
登录后可评论。