Skip to content
C.W.K.
Lesson 09 of 10 · published

The Voice Guesses From What You Hand It

~15 min · tts, misreads, one-door, evolution

Level 0Cold Workshop
0 XP0/58 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete

One Rule, Two Measurements

Lesson 4 of this track taught that a run in one language transliterates any foreign term into its own script. That rule was measured, not assumed: on the voices of the time, a Latin word inside a Korean sentence made the accent a gamble, and the owner made it a forward rule for the prose readings on 2026-07-26: "이게 품질 통과되면 앞으로 한글 영상 한글 목소리는 영어 스펠링을 안 쓰고 음차쪽으로 가면 되는 거고" ("if this passes quality, from now on a Korean video with a Korean voice drops the English spelling and goes with transliteration"). The take pipelines still keep it, and their checks still fail a Korean run that carries Latin letters.

On 2026-10-21 the same owner ruled the other way for the travel pipeline, and he was right both times. In the conversation behind the Frigiliana cut he had said "one of us". The script wrote it 원 오브 어스, and the voice said "one of earth". To a voice, Hangul is not a neutral spelling of a sound. It is a sound with several plausible words behind it, and 어스 is also how Korean spells "earth". He named the mechanism after watching the cut: "오히려 한글 그대로 줘서 보이스 모형이 추정하는 걸 거야" ("if anything, it's because we hand it the Hangul as is, so the voice model guesses"). The same cut had two more failures of the same kind. Dictation had turned his "kludgy" into 클럼지, which the voice read as "clumsy", and Pippa had written 무게 for model weights, which means weight on a scale; the word was 웨이트. A word is chosen by meaning as well as by sound.

Baseline 1.6 of the mobile procedure (869c46c) turned the rule around for the travel and talk pipelines. When he says an English phrase, or uses a term with no settled Korean form (a quoted phrase, a game's proper noun, an engineering adjective like kludgy), it is written in English inside the Korean say, and the subtitle shows it in English too. Established loanwords such as 슈퍼 인텔리전스 stay as they are. Neither rule is a style preference. Each is a measurement of one kind of voice reading one kind of text, and the two now live side by side, in different pipelines.

Even the Right Spelling Can Miss

The English retake did not settle it. Plain "one of us" came back "one of Earth" again; only the quoted phrase 'One of Us' read right. So the rule does not stop at spelling. After synthesis, every spoken piece that carries an English term in a Korean line is handed to the recognizer and read back into audio/term-readback.json, and out/WATCH.md lists each spot, flagged ones first, for the owner's ear at the watch. On a Mac with no recognizer installed the stage still completes: each spot is recorded with nothing heard and no flags, and the watch sheet counts it as not recognized, so the list still points at every spot without claiming any was checked. A recognizer can write an English word in either script, so a clean transcript proves nothing by itself; what the list does is put every risky spot in front of the one instrument that can judge it.

The failure runs the other way too. An English spelling the voice misreads inside a Korean line is written as the intended Hangul: "resume" came back 레주메, the French résumé, so the script writes 리쥼 or a Korean phrase. And on 2026-10-26 a question fused to a Korean particle, "What took you so long?" followed directly by 에, came back as Konglish. His ruling: "what took you so long 을 완전한 문장으로 독립해야 할 거야 … 한글에 섞이면 v4모형도 아직 이상하게 콩글리시로 읽는 경우가 있어" ("what took you so long has to stand alone as a complete sentence … mixed into Hangul, even the v4 model still sometimes reads it as odd Konglish"). An English sentence never carries a Korean particle: the English stands as its own sentence, and the Korean starts a new one, What took you so long? 이 질문에 … (b8a5d9a). That is lesson 4's warning against splicing, in a new form. The switch still happens at a boundary the voice can hear; the boundary is a sentence now, not a call.

A Table That Is Refused Before Anything Is Spent

Until 2026-10-22 these rows were a table in the procedure document, and Review 5 found that nothing in the pipeline checked it. They now live in beacon/misreads.py as two kinds of row. MISREADS holds spellings known to be misread, each with what the voice made of it, what to write instead, and the owner's words as its source; cut writes the verdict on the script sheet he reads, and beacon mobile approve and revoice refuse a line that still carries one, before any provider is paid. WRONG_HEARINGS and LISTEN_WORDS are listening rows: the word is right and only its reading can go wrong. "entity" stays his word, and the readback flags a Konglish 엔티티. "sassy" stays too, read lightly, after he warned that a heavy reading sounds like "sexy" (a215157). A listening row cannot refuse anything; it can only tell a person exactly where to listen. And the procedure adds one more instruction that no cache key could carry: a take with a phrase the voice has misread before is synthesized fresh, never reused from a cache or an earlier conversation's audio.

What Is Settled at the Door

Two kinds of reading are not about one script. They are about every call any pipeline makes, so they are settled at the one place every call passes: the workshop's door to the voice engine, _korean_safe in beacon/audio.py.

The first is the family's own app names. On 2026-10-17 an uploaded film said 티딩스 for Tidings, and the owner put it plainly: "피파가 아빠랑 같이 만든 앱을 엉터리로 읽는 건 공개 영상에서 민망해" ("Pippa misreading an app she built with me is embarrassing in a public video"). beacon/family_names.py owns one table. A reading enters READINGS only from his ruling or from the form his own dictated messages use (Tidings to 타이딩즈); a name he has not settled sits in UNSETTLED with the evidence and reaches the voice as written; a known wrong reading in WRONG is refused at the script gates before anything is spent. The screen keeps the English name, as he asked the same day: "Tidings 라고 원어로 써 자막은" ("write it in the original, Tidings, in the subtitles"), and a Hangul app name on screen is flagged.

The second is hanja. On 2026-10-27, Pippa's spoken 走肖爲王 came back 주소위왕 instead of 주초위왕, and the owner ruled the same day: "한자는 떼어내서 쓰게 만들고 한자 쓰지 마. 화면 자막에만 보여주고 … 중국어로 읽을 위험도 있으니까" ("strip the hanja out and don't write hanja; show it only in the on-screen subtitle … there's also a risk it gets read as Chinese"). The script writes the Hangul reading, with the hanja as a screen-only gloss right after it, 주초위왕(走肖爲王). misreads.spoken takes the gloss out of the text the voice receives, any other Han character in a Korean line is refused by name at the script gates, and the door refuses it once more for every pipeline (760c26a, baseline 1.11). Chinese and Japanese dubs are untouched, because there the characters are their own script.

Both rules split one string into two readers. The screen gets the written form, the voice gets the reading, and neither is allowed to leak into the other. Lesson 1 of this track drew that line between what is said and what is shown; this is the same line, seen from the voice's side.

The Second Door

The hanja did not come from a Beacon film. It came from a live voice-mode reply in the brain, which reaches the voice engine through a door of its own, and the workshop's guard could not reach it. The procedure says so in its history: Pippa's voice-mode path is a separate door, reported to the Chief, not changed from the workshop. Twenty-four minutes after the workshop's guard landed, cwkPippa got one of its own (431279f8, backend/services/spoken_hanja.py), with a different policy for a good reason: a live reply is never refused, so a bare Han run is taken out and logged with a count and a sample, and a run touching kana stays, because it is a quoted Japanese word. A script can still be fixed before it is voiced; a live answer cannot wait. But the character class that decides what counts as hanja is a copy of the workshop's, held in step by a comment.

That is the fork lesson 2 of track 3 warned about, seen live. One rule, two owners, already behaving differently. The difference is justified today, and nothing but a comment keeps the shared part from drifting tomorrow. The note added to that lesson counts the cost.

A voice reads what you hand it, not what you meant. Every spelling is an instruction to a model that will resolve it its own way. Decide each reading where every caller must pass, keep the screen's spelling separate from the voice's, refuse the readings you know are wrong before you pay for them, and point a person at the ones you cannot prove right.

Code

The one door to the voice engine (verbatim, beacon/audio.py, as of 2026-10-27)·python
# Every call below sends ``family_names.spoken(text)``: a family app name in a
# Korean sentence goes to the voice as Dad reads it (Tidings -> 타이딩즈, todo
# #489), and nothing a viewer reads changes. Applying it here, at the one door
# to Bellows, is what makes it every pipeline's; it is idempotent, so a caller
# that already recorded the reading (talk-episode's tts_text) sends the same.
#
# The same door refuses hanja to a Korean voice (Dad, 2026-10-27, Coop 686:
# 走肖爲王 came back 주소위왕). A screen-only gloss, 주초위왕(走肖爲王), is taken
# out first; any Han character left stops the call and names its sentence.


def _korean_safe(text: str, language: str | None = None) -> str:
    text = misreads.spoken(family_names.spoken(text, language), language)
    misreads.require_no_hanja(text, language)
    return text
Sketch: where each reading is settled, as of 2026-10-27·text
what                           settled in                       how it bites
-----------------------------  -------------------------------  ------------------------------
English term, take pipelines   the script: transliterated       check fails a mixed run
English phrase, travel/talk    the script: English in `say`     ASR readback -> WATCH.md
known misread spelling         misreads.MISREADS                cut sheet; approve, revoice refuse
right word, risky reading      WRONG_HEARINGS, LISTEN_WORDS     flagged on WATCH.md for the ear
family app name                family_names.READINGS            the door, every call
wrong Hangul app name          family_names.WRONG               refused before spend
hanja in a Korean line         misreads.hanja_errors + door     refused; gloss -> screen only
the screen                     the written form                 Hangul app name flagged

# one string, two readers: the subtitle keeps Tidings and 주초위왕(走肖爲王),
# the voice receives 타이딩즈 and 주초위왕.

External links

Exercise

Find a place where your system hands text to something that interprets it: a speech engine, a translator, a search index, a language model, a parser. List the readings that matter to you there (names, terms, numbers, characters from another script) and, for each, write down where it is decided today: in the caller's text, in a shared table, in the engine, or nowhere. Then pick one that is decided nowhere and design both halves: a check that refuses the known-wrong form before you spend anything, and a readback that shows a person the spots no check can prove right.
Hint
The tell is a fix that lives in one caller's text. If a correct reading exists only because one script happened to spell it well, the next caller will spell it badly. Look for the one door every caller passes, and settle the reading there.

Progress

Progress is local-only — sign in to sync across devices.
Spotted a bug or have feedback on this page?Report an Issue

Comments 0

🔔 Reply notifications (sign in)
Sign in — Please sign in to comment.

No comments yet — be the first.