Get started

Engineering NotesVoice and meetings

Transcripts misspell internal names; the minutes model fixes them

When a meeting recording is transcribed, internal system names and product names come out as the common word that sounds closest. The collaboration tool "Notion" becomes "lotion" (in Korean, 노션 becomes 로션). If you try to fix this at the speech recognition stage, by passing the recognizer a word list or by rewriting the transcript with rules, unrelated words get pulled toward the list too. And even with a corrected transcript, when the model writing the minutes doesn't understand a passage and flattens it into a sentence with no name ("moved the notes to a documentation tool"), the name is gone from the minutes people actually read.

So we leave the transcript exactly as heard and give a glossary to the model that writes the minutes and segment summaries. Every term and its meaning goes into the system prompt; misheard spellings go in only when this transcript actually contains them, placed right before the transcript. This post covers where transcription-stage fixes break, where the glossary sits in the prompt, the rules for finding misheard spellings, and who adds them.

Transcription gets internal names wrong, and the minutes drop them

Speech recognition models most often miss names they barely heard in training: internal systems, project abbreviations, customers' product names. The errors take three shapes.

Shape Example Where it happens
Written as a similar-sounding common word "Notion" → "lotion" Transcription
An English product name's Korean transliteration wobbles "Opus" → "오프스", "Qwen" → "QM" Transcription
The minutes drop the name and generalize "put it in lotion" → "put it in a documentation tool" Minutes

The third happens in summarization. When the minutes model can't make sense of a misheard passage, it discards the name and writes a description instead. "lotion" stays in the script (the tab that shows the raw transcript), and the minutes say nothing about which tool the notes moved to.

Fixing the transcript also changes words that were right

There are two common transcription-stage fixes: give the recognizer a list of words to favor (hotwords), or replace misheard spellings in the transcript with the correct ones.

Hotwords work well when you pass only relevant names. With seven names that actually came up in the meeting, "lotion" became "Notion" and "QM" became "Qwen". The trouble starts when you pass every registered term each time. With 50 terms unrelated to the meeting, "채팅 형태로" ("in chat form") turned into "채팅 힌트로" ("as a chat hint"). Relevant names do the same thing. "ClovaNote", picked from the meeting title, pulled in the similar-sounding "글로드 오프스" (Claude Opus) and wrote it as "ClovaNote" in both of two runs.

Replacement is rule-based, predictable and the simplest to build. But it ignores context, so in a meeting that really is about skin care, "lotion" becomes "Notion" too. You could pass per-word confidence scores and tell the model to fix only low-confidence words. In Korean, though, only 4 of 15 misheard proper nouns scored below 0.6, and a name misheard repeatedly scored higher, not lower.

Context belongs to the model that reads the whole meeting and writes the minutes. Given "I put the meeting notes in lotion", that model knows "lotion" means Notion. So we leave the transcript as is and leave the correction to the model that writes the minutes and segment summaries.

The whole glossary goes in the system prompt; misheard spellings only when found

Meetings use the organization glossary that data questions and document generation also use, plus a personal glossary each person keeps for their own meetings (“Revenue differs by team, so questions carry the approved definition”). The minutes use three fields: the term, its meaning, and misheard spellings (how transcription tends to get the term wrong).

The glossary goes into the prompt in two places.

The first is the glossary block in the system prompt. It merges the organization's active terms with the meeting owner's personal terms and includes every term and meaning. When both have the same term, the personal one wins. Separate organization and personal blocks would list the same term twice, leaving the model unsure which meaning to follow. Other people's personal terms are never read. Lines are sorted by term, so the same glossary produces the same string in every meeting, and because it sits at the start of the system prompt, it benefits from prompt caching.

The block's guidance tells the model two things. Use the glossary spelling only when a transcript word sounds like a term and the context fits; otherwise keep the transcript wording. And when a passage is about something a term names, write that term even if the transcript spelled it wrong, rather than an unnamed description. The second instruction targets the third shape above.

The second place is mishearing hints. The model gets only the misheard spellings actually found in this transcript, phrased as "this word may be that term" with a count. The original spelling is shown with its particle attached (로션이라고, "lotion, he said") so the model can find the spot to fix. Hints change from meeting to meeting, so they go into the user message right before the transcript; in the system prompt they would force the cached prefix to be recomputed for every meeting. Hints are capped (50 lines by default) and filled starting with the most frequent terms, and the number of lines cut by the cap is logged.

Minutes model input: glossary in the system prompt, mishearing hints before the transcript
Figure 1. Minutes model input: glossary in the system prompt, mishearing hints before the transcript

Once the minutes are written, the same string search runs over them and logs how many of the hinted misheard spellings remain. Not every one left is wrong; some meetings really are about lotion.

Misheard spellings are found with particles attached, never inside other words

Misheard spellings are found by string matching, so the same transcript always produces the same hints. Korean attaches particles and endings to words, so we wrote our own boundary rules.

  • The leading boundary is strict. If the character before a match is Hangul, a Latin letter or a digit, it doesn't count. "로션" inside "플로션" is not a match.
  • A spelling that ends in a Hangul syllable has no trailing boundary. With a particle or ending attached, as in "로션이라고", it is still the same word.
  • A spelling that ends in a Latin letter or similar matches only when the next character is a space, a symbol or Hangul. qwen이 matches; qwens doesn't.
  • At the same position, the longer spelling matches first.
  • Matching ignores case.

The term's own correct spelling is searched for too, and protected. If the term is "ClovaNote" and a misheard spelling is "Clova", the longer spelling matches first, so a correctly written "ClovaNote" is caught whole and left out of the hints.

Some rules apply when a term is added. Each follows from the search rules above.

Rule Why
A misheard spelling has at least two characters, not counting spaces With no trailing boundary, a one-character spelling would match the first character of unrelated words
A misheard spelling must not contain the term Register "필수동반 패치" as a misheard form of "필수동반" and the correctly written term loses the "패치" (patch) next to it
An active term in the same glossary can't be a misheard spelling It would turn that term into a different one
Spellings with commas or line breaks are rejected Silently cleaning them up would make what the user entered differ from what gets sent, and nobody could explain why a word isn't being fixed

People add misheard spellings; the AI finds only terms and meanings

The most accurate misheard spellings come from the meeting screen. Select a misspelled word in the minutes or the script and Add to glossary appears; it opens the add dialog with your selection already in the misheard field. Type the correct spelling and it goes into your personal glossary. That spelling is exactly how your meeting got it wrong. Admins add terms the whole organization should use. Terms people add take effect immediately without review, and every addition, edit and deletion of an organization term is recorded in the audit log.

Find terms with AI pulls candidate proper nouns, the kind people will say aloud in meetings, from material the organization already has. For the organization glossary you choose organization document collections and analyzed databases; for a personal glossary, document collections of groups you belong to. Group-only documents are never used for organization candidates, because those candidates are visible to admins outside the group and would apply to every meeting in the organization.

Candidates from this extraction carry only a term, a meaning and sources. Asked to guess misheard spellings, the model tends to produce real everyday words: "팀즈" (Teams) as a mishearing of "TIMS", "제이슨" (Jason) of "JSON", "리스트" (list) of "LIST". Approve one of those and the minutes start turning ordinary words into proper nouns.

The model decides only which words are this organization's proper nouns and which source uses them in that sense. If the term doesn't actually appear, under the boundary rules above, in the excerpt of the source the model cited, the code drops the candidate. The code also filters out names no one says aloud in a meeting, such as table names and underscore-joined identifiers.

A candidate is used only after a person picks and adds it. Every active term goes into the minutes glossary, so an unrelated term could pull unrelated words toward it. Deciding to drop widely known names or real people's names can't be done by rule, so that decision stays with people.

With a glossary, some flattened names survive in the minutes

We took one 10-minute meeting transcript, generated several versions of the minutes per condition, and counted whether each proper noun survived.

Name No glossary Terms and meanings only
Opus 0/7 7/7
Qwen 0/7 5/7
Notion, ClovaNote 0/7 0/7

Without a glossary, the misheard passages were flattened into unnamed descriptions in every version. With terms and meanings alone, some names survived in most versions. On a different model, where Opus and Qwen stayed at zero with terms and meanings only, adding mishearing hints brought each back in 2 of 5 versions.

Notion and ClovaNote never appeared under any condition. The hints were there and correct, but the model generalized the passage anyway, so this is a choice about what to keep in the summary, not a spelling problem. That is why the glossary guidance separately says to name a term when a passage is about it rather than write an unnamed description. In control meetings where people really meant "lotion" and "opus", not a single wrong correction appeared.

Thirty-six terms with short meanings added about 550 input tokens; the mishearing hints added about 126 more and left the cached prefix unchanged. Results vary widely by model even under the same condition (Opus with terms and meanings only: 7/7 on one model, 0/5 on another), so we compare conditions only within the same model and the same run.

Design choices

The transcript is kept exactly as heard. A rewritten transcript loses the evidence of what was actually transcribed. The cost is that the script keeps showing the wrong spellings, and people check doubtful spellings in the minutes against it.

Correction is left to the minutes model, which reads the whole meeting. Bulk replacement of same-sounding words is simpler and more predictable, but it changes places that should not change. In exchange, the model's output is not corrected or verified afterward, so a correction based on a misread context stays in the minutes, and the count of remaining misheard spellings shows up only in logs.

A Hangul spelling has no trailing boundary, so compounds match too: "로션" inside "로션크림" (lotion cream) becomes a hint. Drawing the boundary with a list of particles produces an endless stream of edge cases from endings and compounds, so the boundary stays simple and the guidance ("use it only when the context fits") does the rest. A misheard spelling that overlaps the start of a common word can simply be written longer.

The glossary block includes every term instead of selecting, and the number of terms is capped instead: 200 each for the organization and personal glossaries by default, adjustable in the installation settings. Each line holds only a term (up to 64 characters) and a meaning (up to 100), so counting one token per Hangul character, a block with both caps full is about 70,000 tokens. Before raising the caps, fit this block plus a long meeting's transcript into the context window. An organization with more than a few hundred proper nouns should start with the names that come up most in meetings.

Editing the glossary leaves existing minutes as they are. Changes apply from the next minutes and segment summaries; to apply them to a past meeting, the meeting owner regenerates its minutes. If minutes changed on their own every time the glossary did, the version someone received would no longer match the one on screen.