VelvetShark

One bored voice: how I rebuilt the Polish lektor with the technology he inspired

The Lektor: the voice that started a $22B company

Poland never dubbed foreign films the way Germany or Spain did. No cast of voice actors, no lip-sync. One man, the lektor, read every line of every character, flat and unbothered, over the original audio turned down to a murmur.

Stallone and the terrorist he's fighting: same voice. The love confession and the answer to it: same voice, same register, maybe half a second apart.

The style is called szeptanka, "whispering". To anyone who didn't grow up with it, it sounds like a broken television. To 38 million Poles it sounds like home.

It's also, quietly, one of the origin stories of a $22 billion company. ElevenLabs founders Mati Staniszewski and Piotr Dąbkowski have told it many times: growing up in Poland watching Hollywood flattened into one monotone voice made them want machines that could speak every language properly. Staniszewski once described Polish dubbing to Forbes as simply "terrible". In June 2026 the Polish government invested in ElevenLabs. In July a share sale reportedly valued the company at $22 billion.

It seemed like the right week to close the loop and rebuild the lektor with the technology he inspired.

So: The Lektor. Drop in any video up to 90 seconds and get it back with one deadpan Polish voice reading translated dialogue over the ducked original. This post is about the part that turned out to be genuinely interesting: the timing.

Why not the Dubbing API?

ElevenLabs has a Dubbing API. It's good. It's also exactly wrong for this.

It replaces each speaker with a matching voice in the target language. A modern, well-produced dub. The lektor is the opposite aesthetic in every dimension: one voice for everyone, no emotion matching, no lip-sync ambition, and, critically, the original stays audible underneath.

The flatness isn't a limitation to engineer away. It IS the product. So the pipeline is hand-rolled: speech-to-text, translation, single-voice TTS, a timing engine, an ffmpeg mix.

The pipeline in one paragraph

scribe_v2 transcribes the clip with word-level timestamps and speaker diarization. Words merge into utterances (gaps under 600 ms, same speaker). Claude translates them into Polish with a register prompt whose most important line is CONDENSE: a real lektor reads 20 to 30% fewer syllables than the original. He has to. He starts late and there's another line coming.

Each Polish line is synthesized with eleven_multilingual_v2. The plan was eleven_v3, but it over-acted, and the steadier model turned out to be the more lektor one. The voice itself was built with Voice Design: a middle-aged Polish male, flat prosody, slight paper-reading quality. No real lektor was cloned. Not Knapik, not Gudowski, nobody. The voice is an archetype, not a person.

Getting that voice right took four rounds. The first three attempts failed in an instructive way: I kept asking for "completely flat, monotone, robotic" and kept getting either overacted narrators or creepy robot bass. Then I ran the actual acoustic numbers on a real lektor recording and learned the target isn't monotone at all. A real lektor sits in a natural mid-range, moves his pitch like a normal speaker, and barely pauses. What reads as "flat" is the absence of acting, not the absence of intonation. He has normal melody and zero emotional investment. Once the voice brief said that instead, it worked.

The timing algorithm (the actual craft)

Everything that makes the output feel like television instead of a bad dub lives in four rules:

  1. The lektor starts 600 to 900 ms after the original line. You hear the original actor for most of a second before the Polish arrives. That's the signature. The original is briefly alive, then the voice settles over it.

  2. When the Polish is too long for its window (next line's start minus this line's start, minus a 300 ms margin), speed it up, but never beyond 1.12x. Past that it stops sounding bored and starts sounding busy, which is worse than wrong.

  3. If it still doesn't fit, let it run over the next original line by up to 800 ms. This is authentic. The real lektor famously runs over. Beyond 800 ms, the line goes back to the LLM with one instruction: shorten by 30%. Re-synthesize, re-schedule.

  4. Where nobody speaks, nothing happens. The original audio plays at full volume. Music breathes, explosions explode. Ducking only exists where the lektor is actually talking (down to about 30%, with 180 ms ramps).

One more constraint falls out of the premise: there is exactly one voice, so a line can never start before the previous one has finished. If line n runs long, line n+1 waits, then has less room, and may itself get sped up or shortened. Long dialogue scenes cascade exactly like they do on real Polish TV, where the lektor gradually falls behind and then catches up in a gap.

The scheduler is a deterministic pure function: segments and TTS durations in, a placement list out. I unit-tested it with synthetic cases before any real audio existed. Fifteen tests covering each rule, the cascade, and the flag-for-shortening path. Here's a real schedule from one of the gallery clips:

# lektor schedule (delay=700ms maxAtempo=1.12 maxOverlap=800ms margin=300ms)
seg | orig_start | lektor_at | delay | atempo | dur_ms | overlap_next | recondense
0 | 299 | 999 | 700 | 1.120 | 6386 | 326 | no
1 | 7059 | 7759 | 700 | 1.120 | 11154 | 0 | no
2 | 18979 | 19679 | 700 | 1.000 | 6966 | 0 | no
3 | 32899 | 33599 | 700 | 1.097 | 10840 | 0 | no
4 | 44739 | 45439 | 700 | 1.000 | 3576 | 0 | no
5 | 49639 | 50339 | 700 | 1.120 | 2114 | 113 | no
6 | 52340 | 53040 | 700 | 1.120 | 5971 | 171 | no
7 | 58840 | 59540 | 700 | 1.120 | 3400 | 0 | no
8 | 63159 | 63859 | 700 | 1.120 | 2612 | 772 | no
9 | 65699 | 66471 | 772 | 1.000 | 3344 | 0 | no

Look at segment 9: it starts 772 ms after its original line instead of 700, because segment 8 ran long and pushed it. The cascade, working as intended.

The hardest thing the scheduler has chewed through is the gallery's His Girl Friday clip: 402 words in 90 seconds, the fastest dialogue ever put on film. Fifty segments, twenty-six of which had to go back to the LLM for shortening. The lektor keeps up. Barely, and that's the joke.

The mix

Static ffmpeg volume automation from the placement list, because predictable beats clever. One duck window per lektor line with 180 ms edge ramps, adelay to place each segment, amix, then loudness normalization. The video stream is copied, never re-encoded, so a 60-second clip mixes in seconds.

There's also a lo-fi pass on the lektor track: band-limited to roughly telephone-era frequencies, lightly compressed, with a hint of slapback echo. The raw TTS sounded too clean, like a podcast. The lektor lived inside a 1990s television, and the sound needed to remember that.

What it cost

All the gallery clips, all the QA runs, and the entire four-round voice design session came to about $1.50 of ElevenLabs usage, plus Claude for translations, but it was within my monthly subscription, so I didn't pay anything extra. The entire cultural memory of a nation, reproduced for less than a coffee.

Try it

The site is thelektor.pl. The switch on every clip, Original/Lektor at the same timeline position, is the whole argument. Flip it mid-scene.

And if you just want to hear him: thelektor.pl/powiedz reads anything you type, in any language, with professional indifference.

No lektors were cloned in the making of this site.

If you like what you see, you'll find more stuff like this on my Twitter.

Shark footer