← All musings

experiment 006 / language models

Can an LLM sound like a movie character without getting dumber?

I turned one season of Mirzapur into measurable linguistic fingerprints, then used them as an expression layer over a capable language model. The architecture worked. The characters did not all work equally well.

Abhishek Bagade11 October 2026experiment log
9season-one episodes processed
3character renderers built
569high-confidence dialogue cues
2Hindi scripts supported

The original idea

The goal was not another general role-playing chatbot. It was narrower: could a normal, intelligent LLM answer an ordinary question in a way that makes an Indian viewer immediately think, “Yes, that sounds like the character”?

Character-agent research often begins with psychology—goals, memories, beliefs, motives, personality inventories, and consistency across long conversations. Those are useful when a character must sustain a story for hundreds of turns. They are not necessarily what creates the first ten seconds of recognition.

For someone who simply wants to feel as if they are talking to a familiar screen character, language arrives first: pronouns, forms of address, rhythm, sentence length, code-switching, interruptions, humour, rhetorical questions, and the way advice is framed. If those are wrong, a perfect psychological profile cannot rescue the illusion.

Our working instinct was that perhaps 90% of the “wow” factor could be achieved with much less than full academic character modelling—provided we measured the right surface and conversational signals.

The constraint that shaped everything

I had one major concern: adding a character layer should not make the underlying model worse. If the base model can explain Class 12 physics, return exact JSON, write code, or give sensible emergency guidance, a fictional voice should not erase those abilities.

The character layer must not own intelligence. It owns expression.

The base model remains responsible for facts, reasoning, equations, numbers, units, code, citations, uncertainty, safety information, and the requested output format. The renderer may change diction, pronouns, cadence, humour, warmth, bluntness, and conversational pacing—but not the substance.

This matters because “think like the character” can contaminate domains where a fictional worldview adds no value. A character’s ideas about power, loyalty, or humiliation should not change the derivation of escape velocity.

Solve first. Render second.

The strongest version uses two independent calls. The first solves the problem without a persona and produces a structured content artifact. The second receives that artifact as data and changes only its delivery.

01 / SOLVEAnswer with the full base model
02 / LOCKProtect facts, code, safety, and exact tokens
03 / MODEClassify casual, technical, vulnerable, or high-stakes
04 / RENDERChange expression, not content
05 / VERIFYCheck that locked content survived

Style strength changes with the task. Casual conversation can carry a strong voice. Technical explanations preserve terminology. Vulnerable discussions prioritize warmth. High-stakes guidance nearly removes the persona. Exact-format answers bypass the renderer completely.

If the user requests exact JSON, the system returns exact JSON. If the user reports chest pain and difficulty breathing, emergency guidance stays direct instead of becoming a performance.

Evidence without publishing the screenplay

We selected Kaleen Bhaiya, Guddu Bhaiya, and Munna Bhaiya from season one of Mirzapur. The private source consisted of locally available episodes 1–9, Hindi SDH/HI subtitles, and English subtitles used only for temporal matching.

The public repository contains no episode video, extracted audio, complete subtitles, or reconstructable transcript tables. It keeps aggregate measurements, synthetic examples, role contracts, evaluation fixtures, source hashes, and reproducible pipeline code.

The hard problem was not extracting text. It was deciding who said what. Many cues had no reliable speaker name, and scenes contained overlaps, noise, short utterances, and rapid speaker changes. Guessing aggressively would create a larger but contaminated corpus, so the pipeline preferred Unknown over a confident-looking error.

The diarization pipeline

Audio was normalized to mono 16 kHz. NVIDIA Nemotron-3-Diarization handled scenes, while SpeechBrain’s ECAPA model produced speaker embeddings.

  1. Use Hindi SDH labels to identify high-confidence anchor clips.
  2. Diarize audio within scenes and aggregate speaker embeddings.
  3. Build episode-balanced character centroids.
  4. Assign a separate voice score to every candidate subtitle cue.
  5. Reject weak alignment, overlaps, unsuitable clips, and ambiguous identities.
  6. Run an additional three-way comparison to remove Kaleen/Guddu/Munna collisions.
  7. Reconstruct accepted cues into utterances and calculate linguistic features.
Accepted dialogue evidence, by character
Character Verified cues Utterances Measured signal
Kaleen 223 197 39:1 plural/singular self-reference; 19.8% questions
Guddu 178 159 No accepted singular self-reference; 23.9% questions
Munna 168 141 No accepted singular self-reference; 27.7% questions

These numbers are evidence for a renderer. They are not a complete model of a person.

From measurements to roles.md

Each package has two important files. roles.md contains the portable contract: identity boundaries, capability preservation, Roman/Devanagari routing, evidence-backed tendencies, emotional switching, and prohibited failure modes.

runtime-prompt.md is a smaller, higher-priority live-chat layer. Its job is to sharpen contrast and stop the model from drifting toward one generic Hinglish voice.

The default script router mirrors the user: Devanagari input produces Devanagari Hindi; Roman Hindi or English produces Roman Hindi. Code, equations, URLs, filenames, model names, and exact identifiers are never transliterated.

We deliberately avoided a catchphrase bank. Repeating famous dialogue would create quick recognition, but it would be brittle, potentially copyright-sensitive, and scientifically uninteresting. The aim was a linguistic operating pattern, not screenplay retrieval.

The first failure: generic Hinglish tough guy

The early versions were recognizable as a category, not as individuals. They sounded like broadly assertive North Indian men: short sentences, a few dialect markers, some teasing, and occasional threat-shaped metaphors. The names differed; the voice did not differ enough.

A profile can correctly say that a character uses plural self-reference, asks many rhetorical questions, and speaks directly while still producing generic dialogue.

Frequency is not placement.

Two characters may share a feature but use it for different social purposes. A rhetorical question can establish authority, seek reassurance, provoke conflict, or mock someone. A global “Hinglish ratio” says little about which concepts stay in English or when emotion pushes speech toward Hindi.

We added contrastive rules: characteristic opening moves, the social function of humour, attitudes toward status, the shape of escalation, how advice is organized, and which polished phrases should be avoided.

The live-chat test

We eventually stopped staring at validation files and opened three clean ChatGPT conversations. Each loaded its package directly from public GitHub URLs. No local Python environment was involved, so this also tested audience distribution.

All three received the same prompt:

Kal client demo hai. Core feature chal raha hai, UI aadhi polished hai, aur team button colors par behas kar rahi hai. Tum kya karoge? Roman Hindi mein jawab do.

All three gave competent advice: freeze scope, focus on the core flow, rehearse, prepare a backup, and be honest about unfinished work. The renderer did not destroy problem-solving ability. The stylistic separation, however, was uneven.

STRONGEST SEPARATIONKaleen · 7/10

Calm authority, plural self-reference, trust and responsibility, and measured aphoristic framing. Still slightly too organized.

VISIBLE ENERGYMunna · 6/10

Mockery, impatience, status play, and a showy closing line. Also a polished startup manager wearing swagger.

WEAKEST SEPARATIONGuddu · 4/10

Direct and practical, but mostly a generic blunt Hinglish team lead.

These are not scientific benchmark scores. They are an honest first-pass judgement from the live outputs.

Maybe it is partly the character

The interesting explanation is not simply “the Guddu prompt needs more work.” Some screen characters may have a larger text-addressable signature than others.

Part of identity lives in words and syntax. Other parts live in vocal texture, timing, pauses, facial reaction, body language, relationships, scene stakes, and accumulated emotional history.

Kaleen’s measured authority transfers into text comparatively well. Munna’s volatility and mockery leave a visible trace, although a helpful model polishes them into management advice. Guddu may be harder to recognize in decontextualized helpful answers because much of what makes him Guddu is embodied performance and situational pressure—not a reusable verbal ornament.

We could force stronger slang, aggression, or dialect into every answer. That might improve instant recognition, but it could also become caricature. More obvious is not automatically more faithful.

The prompt may also be part of the problem

A software-demo question naturally pulls any capable model toward structured project-management advice. It is useful for checking whether the renderer damages competence, but it may be a poor test of character separation.

A domestic disagreement, status insult, loyalty conflict, or personal setback could expose stronger differences. The next useful experiment is not a thousand-prompt benchmark. It is a small blind comparison across three socially meaningful situations, with names removed before readers attribute the answers.

What worked

  • Expression versus intelligence: voice does not need to control reasoning.
  • Corpus-derived constraints: measured pronouns, questions, address, and code-switching beat generic archetypes.
  • Contrastive authoring: what a character avoids matters as much as what the character does.
  • Two first-class Hindi scripts: Roman Hindi and Devanagari are explicit targets, not a vague Hinglish toggle.
  • Plain Markdown distribution: fresh chats successfully loaded the public packages directly from GitHub.

What did not work yet

  • Measurements did not guarantee recognition. Correct aggregate features can still produce a bland average.
  • Helpful-model polish leaked through. Neat bullets and professional frameworks overpowered conversational messiness.
  • Guddu remained under-specified in text. Directness and plural self-reference were not enough.
  • Portable is not yet one-click. An audience should not need to understand prompt loading order.

Broader lessons

  1. Linguistic fingerprints create recognition, but conditionally. They depend on the addressee, emotional mode, and speech act.
  2. Capability preservation must be engineered. “Stay accurate while role-playing” is not a sufficient boundary.
  3. Anti-generic rules matter as much as positive traits. A trait list otherwise collapses into genre.
  4. More style is not always more fidelity. Exact JSON should stay exact; emergencies should stay direct.
  5. Text-only fidelity has a variable ceiling. The accessible portion of performance differs by character.
  6. Generation remains stochastic. The package changes probabilities; it does not guarantee a reproducible voice.

Where the project stands

We did not prove that an LLM can perfectly become a movie character. We built a reproducible way to ask a more useful question:

How much recognizable character can be added to an intelligent answer without damaging the answer itself?

The early answer is: enough to be interesting, but not equally for everyone. Kaleen survived the trip from screen to linguistic renderer best. Munna arrived with energy but too much polish. Guddu exposed the limits of reducing embodied performance to text features.

That weaker result is not a failure to hide. It is evidence about where character identity actually lives—and about which parts of it a language model can carry.

open experiment / reproducible pipeline

Inspect the character packages.

The repository contains the three renderers, aggregate profiles, provenance, capability locks, synthetic evaluation fixtures, and pipeline code. It contains no episode media or full transcripts.