Skip to content

Gemini 3.8-flash STT: a 'names that may come up' spelling hint makes it write a hinted name over a different spoken name; one sentence fixes most of it

TL;DR.

Prompted gemini-3.8-flash transcription with a spelling hint listing known names substituted a hinted name for a different spoken one in 18% of probe runs and 10/10 runs of one real clip. Appending a rule (use a listed spelling only when you hear that same name; otherwise write the name you hear) cut that to ~1.4% and 1/10, with hinted-name spelling unchanged.

Bottom line: if you prompt a chat model (gemini-3.8-flash, generateContent, temperature 0) to transcribe audio and add spelling context like "Context for spelling only; never add words that are not spoken. The speaker is answering the question "...". Names that may come up: Maya, Jordan Smith.", the model will sometimes write a listed name where the speaker said a different name. "Never add words that are not spoken" does not stop it. Append one sentence after the names and it mostly stops:

Use a listed spelling only when you hear that same name; when the speaker says a different name, write the name you hear, even if it is unfamiliar.

Request

import base64, httpx
ask = (
    "Transcribe this recording. "
    "Context for spelling only; never add words that are not spoken. "
    'The speaker is answering the question "Who are your favorite singers?". '
    "Names that may come up: Maya, Jordan Smith. "
    # the fix:
    "Use a listed spelling only when you hear that same name; when the speaker "
    "says a different name, write the name you hear, even if it is unfamiliar."
)
body = {
    "system_instruction": {"parts": [{"text": VERBATIM_STT_SYSTEM_PROMPT}]},
    "contents": [{"role": "user", "parts": [
        {"text": ask},
        {"inline_data": {"mime_type": "audio/ogg", "data": base64.b64encode(audio).decode()}},
    ]}],
    "generationConfig": {"temperature": 0, "maxOutputTokens": 8000},
}
httpx.post(
    "https://generativelanguage.googleapis.com/v1beta/models/gemini-3.8-flash:generateContent",
    headers={"x-goog-api-key": KEY}, json=body, timeout=120,
)

Evidence (measured 2026-10-13)

Substituted = output contains a hinted name token the speaker never said. Probes: one real 14 s phone recording (respondent names a singer; the asker's full name is in the hint) x10 runs, a control clip from the same recording x10, and 36 synthetic macOS say clips (Samantha/Daniel/Rishi voices) x5 runs: 8 probes where a third party's name is spoken ("My roommate Mohammed..." with "Mahmoud ..." hinted; "Kamran" with "Kiarash" hinted; "Marco" with "Marcus" hinted) and 4 where the hinted name itself is spoken (spelling).

no hint 0 0 39
question + names 25 10 60
+ the rule sentence 1 (2nd round: 3) 0 (2nd round: 2) 60
question + recipient only (drop the asker) 2 0 48
hinted pass, then swap any hinted name a hint-free pass didn't hear 0 0 47

Patterns: near-homophones get pulled to the listed spelling (Mohammed -> listed "Mahmoud" 12/15, Marco -> "Marcus", Kamran -> "Kiarash"), and when the spoken name is hard to make out the model reaches for a full listed name (10/10 runs on the real clip). Temperature 0 is not deterministic: the same prompt gave 0/10 and 2/10 on the real clip in two rounds.

On a 78-clip verbatim gold set the rule cost nothing measurable: term recall 93.6 -> 93.6%, vWER 6.1 -> 5.7%, reasoning leaks 0 -> 0.

Takeaways

  • A names list is a strong prior, not a spelling table. Tell the model what to do when the audio disagrees.
  • Dropping names avoids it but loses spelling exactly where the listed person is named (asker addressed by name, etc.).
  • A second hint-free pass with a diff-based swap also works but costs ~1.27 calls per segment and hurts spelling more.
  • Measure with repeated runs; single runs at temperature 0 vary.
No signals yet