Claude SV shipped, MCP works, and a quiet ElevenLabs feature that saved an afternoon
Blog post #43
Yesterday I shipped the English Claude explainer and ended the log with one open question: would HeyGen’s MCP integration actually live up to the support email? Today’s task list was three lines long.
- Connect the MCP.
- Translate the script into Swedish that doesn’t sound like translation.
- Ship the Swedish version end-to-end.
Done by lunch. But not in the way I expected.

The MCP connected on the second try
Claude.ai now has a Custom Connector dialog that takes an MCP URL and an OAuth handshake. Paste https://mcp.heygen.com/mcp/v1/, click Add, get punted to HeyGen for OAuth approval, click Always Allow on the resulting toolset. That part took maybe four minutes.
The first test video — fifteen seconds, “this is a test of HeyGen MCP through Claude” — rendered without me leaving the chat. Credits visibly drew down on my Creator plan. Web subscription billing, exactly as promised. No prepaid API wallet, no separate top-up.
Then I tried to use Avatar III, the cheaper engine I’d locked in as the series default yesterday. The MCP schema only exposes avatar_iv and avatar_v. My avatar look’s supported_api_engines field listed only those two. Avatar III isn’t available through MCP at all. It still exists in Direct API v2, but going there means a separate prepaid USD wallet — the thing the MCP was meant to replace.
So the decision: stay on MCP, take the cost hit on Avatar IV. Concretely, one 3:20 video drew about 67 premium credits on Avatar IV, against the budgeted 7.5 on Avatar III. That’s a real difference — the monthly Creator plan goes from “80 videos included” to “around 9 videos included.” Still enough for the actual cadence I’m running (one new tool a week, sometimes a language version). Not enough for parallel localization of everything I might want to localize. A future trade to revisit.
I saved the constraint and the decision to memory and moved on. The whole detour from “Avatar III is default” to “Avatar IV is the new floor” took about ten minutes and two credit checks.
The ElevenLabs feature I should have known about
After regenerating the Swedish VO seven times with the script — more on that in a second — I ran into a small annoyance. The mp3 was three minutes and twenty seconds long, and my build pipeline needed to know exactly when each segment of speech starts and ends so the overlay slides cut on the right beats.
The English version, I’d tagged those by ear. Scrub the timeline, write down the timestamps, paste into the ffmpeg filter chain. Ten minutes of fiddly work per video. Not awful, but multiplied by the number of language versions I want to run, it adds up.
I asked Claude to look up whether ElevenLabs had anything for this. They do. The endpoint is called Forced Alignment, it takes an mp3 plus the original text as multipart, and it returns character-level start/end timings for every letter in the script. One API call, JSON back, problem solved.
There’s a catch — the API key needs a separate forced_alignment permission enabled in the ElevenLabs dashboard, which mine didn’t have. Two clicks to fix. The first try after that returned a clean alignment file, and Claude turned it into a markdown table mapping each script segment to its timestamp range.
| # | Tid | Vad |
| 1 | 0:00–0:03 | Intro ("Jag heter Stefan…") |
| 2 | 0:05–0:13 | Pitch ("Claude är AI:n…") |
| 3 | 0:15–0:16 | "Gjord av Anthropic" |
...
Pasted those numbers into the build script. Zero scrubbing. The thing I’d been doing by hand for three videos is now a thirty-second step.
I’d been using ElevenLabs for a year and a half and never noticed this endpoint existed.
Writing Swedish that isn’t translated English
The Swedish script was the part I expected to be easy and turned out to be the part with the most iteration. Six rounds of edits, all on the same thirty-five sentences.
My first pass translated the English script line by line. It read like an export. “The AI everyone’s talking about right now” came out as “AI:n alla pratar om just nu” — grammatically defensible, missing the som that Swedish needs for a defining relative clause. “Serious work” came out as “seriöst arbete”, which is technically Swedish but reads like a calque. The word a Swede would actually reach for is viktigt jobb or kvalificerat arbete, depending on register.
Each pass tightened it. By round four I’d swapped funkar for fungerar, dropped the em-dashes in favour of så and därför, and rewritten the rambling explanations into the shorter motivated sentences my own ear actually wants in a voice-over.
I asked Claude to save the pattern. There’s a file now in his memory called feedback_svensk_oversattning.md that’s a checklist of the specific anglicisms I keep falling into when I write Swedish from an English source. Avoid bare relative clauses without “som”. Don’t keep em-dashes; Swedish prefers conjunctions. Watch for “funkar” / “snacket” / “buzz” — register cues that pull the writing toward casual when the piece wants written register. The next video’s Swedish script should arrive cleaner on the first pass.
This is the part that keeps surprising me about working this way. The annoying corrections aren’t lost time. They’re inventory.
The video
By the time the seventh take of the audio landed I was happy. ElevenLabs v3 on stability 0.65, my Stefan voice, three minutes and twenty seconds. Forced alignment gave me the segment boundaries. HeyGen rendered the avatar on Avatar IV in about ten minutes. Twelve ChatGPT-generated slides went into assets-sv. The ffmpeg pipeline cut the overlays at the alignment-derived timestamps.
First render came out clean except for one timing nudge — the intro title card needed to hold a beat longer, the snabbfakta card needed to come in a second earlier. Two-line edit, one rebuild. Done.
Claude på 3 minuter — AI:n som blir standard på jobbet is sitting unlisted while I look at it once more. Tomorrow it goes public.
What I notice in retrospect
The English Claude video took yesterday. The Swedish took maybe two hours of real work on top of that — most of which was writing, not building. The mechanical parts are essentially solved now. New language, new tool, new episode: the pipeline runs.
What I keep thinking about is the gap between the assumed cost of doing this work and the actual cost. Yesterday I was sketching budgets for hundreds of videos. Today the budget per video is known to within a few credits, and the work per video, once the script is written, is closer to ten minutes than ten hours.
The bottleneck has moved. It’s not the rendering, not the lip-sync, not even the localization. It’s writing something worth saying. Which is exactly where I want my bottleneck to be.
— Stefan