Skip to content
Chandler Nguyen
AI10 min read

I Tried to Replace ElevenLabs With a Local Voice App on a 16 GB Mac

VoiceStudio hit GitHub Trending as a fully local ElevenLabs alternative. I installed it on a 16 GB Mac, hit the failures nobody demos, and used the surviving pipeline to produce the Chinese and Korean editions of my course.

VoiceStudio hit #1 on GitHub Trending in September. The description was the part that got me: the open-source, fully local ElevenLabs alternative — voice cloning, dubbing, a 646-language catalogue, no account, no API key, no per-character bill.

I had paid ElevenLabs close to $200 across the English and Japanese narration. So the question was not abstract. Can a 16 GB Mac run this thing? How hard is it to set up? Is the voice good enough to put in front of paying customers? And if the answer is yes, what exactly is ElevenLabs selling that a local app cannot?

The git history for this experiment runs from 17 October 2026 (the first local-TTS spec commit) to 26 October (both localized editions built). That is nine days, not a quarter. The Chinese and Korean audio sets are complete: 258 pairs each, 3 h 06 m and 3 h 25 m of narration.

What VoiceStudio actually is

VoiceStudio is a desktop app, not a Python script you babysit. It wraps a local API and exposes a catalogue of 16 TTS engines and 11 speech-recognition engines behind one interface. It runs on macOS, Windows, Linux and Docker. The app is AGPL-3.0 (repository, retrieved 25 October 2026).

The repository had roughly 85,000 stars by 25 October, about six months after it was created on 9 April 2026. It was the top repository on GitHub Trending on at least two days in September. The licence is the first surprise. The app is open source; the model weights are not automatically the same licence. The default OmniVoice engine has separate terms, and its pretrained weights are non-commercial (model card, retrieved 25 October 2026). CosyVoice 3 — the engine I ended up using — is Apache-2.0. VoxCPM2 is Apache-2.0 too.

That distinction is the first real lesson. “Open-source ElevenLabs alternative” is a statement about the application. It is not a statement about the weights, the voices, or the output. If you are using this for paid work, you have to do the licence archaeology yourself, engine by engine.

Can a 16 GB Mac run it?

Yes. Not always well, and not always the engine you wanted.

Setup was not the hard part. Install the app, open it, pick an engine, let it download weights. The hard part was finding an engine that would finish a 258-slide batch on this machine without falling over.

I tried VoxCPM2 first. It runs on Apple’s MPS and sounds good. Under load on a 16 GB Apple Silicon Mac it drove free memory down to about 8%, swap climbed past 9 GB, and requests timed out. A module-1 pilot produced 1 of 36 slides before I stopped it. The model was not producing a bad voice; it was failing to complete a long batch under memory pressure.

I moved to CosyVoice 3 on CPU. It completed the workload. The reference clip has to be 30 seconds or shorter, which is a real constraint when you are cloning a voice. The 30-second sample I used was 24 kHz mono.

Then the batch still failed — for a reason that had nothing to do with the model.

The failure that looked like a model problem

After an hour, I had 4 of 258 audio pairs. The logs showed retries, then local worker-pool 429s, then orphaned jobs. The obvious conclusion was that the local engine could not handle Chinese.

It could. The problem was Node’s fetch. Its default headers timeout is five minutes. Some Chinese slides took five to seven minutes to synthesize. The client abandoned the request while the worker was still generating it, then retried and enqueued a second job for the same slide. The queue filled with work nobody was waiting for.

A retry is not a fix if the server is still working on the request you abandoned.

Once speech went through a Node http/https transport with a longer timeout, module 1 finished 36/36. The first complete Chinese checkpoint reached 258/258 pairs and 3 h 05 m 57 s of narration. It took 28 h 12 m 41 s of calendar time from first file to last — a number that includes failures, pauses, hardening and retries, not a clean synthesis benchmark. The worst slide took 37 minutes across three attempts.

That is the honest shape of local inference. The model is not a magic box that turns text into audio at the speed of the demo. It is a batch job with a long tail, and the tail is where the engineering lives.

The machine set the architecture

A 16 GB Mac is not a TTS server. Normal slides finished in 2–6 minutes; the pathological ones took 13–23. The worst took 37m 09s across three attempts. Every serious improvement in the pipeline was about surviving the slow machine, not beating a hosted service on speed.

The controls that survived:

  • A TtsEngine seam, so local and hosted narration could be selected explicitly instead of hardwired. The seam landed on 19 October; local selection followed on 21 October.
  • A real transport timeout, because the default five-minute assumption was shorter than the work.
  • Single-run and worker locks, stop-on-failure, and a drained worker before retry, because retrying into a busy engine is not a retry.
  • Resumable sentence chunks, because restarting a 30-minute slide from zero wastes the machine’s only scarce resource.
  • Safe replacement, because a failed new take must not destroy a good old one.
  • A per-module worker reset, as a precaution against memory drift across a long run.
  • Sample-rate normalization, because one assembly produced a 63-minute audio track by concatenating 24 kHz and 44.1 kHz segments. It looked like a plausible file until I checked the duration.
  • caffeinate -i, documented on 24 October — day eight. I had been running multi-hour batches on a Mac that was free to take a nap. It is the least sophisticated line in the pipeline and possibly the most important. I felt like a noob. I was one.

The point is not that the pipeline is impressive. It is that the pipeline is the product. The eight days went into making a slow local engine behave like infrastructure: stop on failure, resume where it broke, never replace a good take with an unverified one, and keep the machine awake.

Why Cantonese is missing

On 21 October I dropped Cantonese from the program. The reason was evidence, not ideology: there was no validated local Cantonese path for this course. VoxCPM2 had no yue support. CosyVoice lists yue, but I had not validated it for this course. I could have shipped a guess, or used a voice nobody had listened to in the language. A wrong Cantonese edition is worse than no Cantonese edition. The site still has a zh-HK locale for articles; the course is Simplified Chinese, not Traditional Chinese or Cantonese.

The pipeline can produce a file in a language the model has not been validated for. The gate has to be a human saying no.

258/258 is not the same as correct

The first complete Chinese checkpoint had 16 slides with at least one missing sentence. The slide count was right. The pairs existed. The narration was still wrong on sixteen slides. They were found by checking text coverage against the script, then repaired one by one.

That changed the gate. “All files exist” became “all files exist, the narration covers the script, and a sample from every module has been heard.” Full parity is the gate; a green batch is not the product.

Is the quality good enough?

The repaired samples I heard are good enough for this course; full acceptance is a separate gate. That is an owner judgement, not a certification.

I transcribed the audio with the local ASR and compared it to the script. The early spot-check mean was 0.903. The full Chinese checkpoint mean was 0.908. These are normalized text-similarity scores, not measures of naturalness or speaker similarity. The worst slide — module 4, slide 8 — scored 0.776; it misheard a brand name. A code-switch slide in module 6 produced gibberish, then a repeated paragraph, then a truncation; sentence-level chunking repaired it to 0.909.

The voice is clear, consistent, and recognisably mine — to my ear. It is not ElevenLabs-polished. The Chinese and Korean editions were not line-edited by a human native speaker; I reviewed them with an AI editor and listened to samples. That limitation belongs on the course page, not only in a blog post.

If your bar is “sounds like a studio VO”, pay someone. If your bar is “clear, consistent, mine, and good enough to teach from”, local is now in reach.

What it cost

ElevenLabs: close to $200 for the English and Japanese narration, including the voice clone.

Local: one Mac, no additional per-character TTS invoice for these runs, no cloud TTS or ASR spend. The first Chinese checkpoint cost 28 hours of calendar time for 3 hours of audio, plus the engineering and QA time in the table above. Electricity was not measured.

The $200 bought a voice, a workflow, and someone else’s uptime. The local path bought less dependence on a hosted narration API, local voice handling, and a bill that does not grow with every re-render — and cost days of engineering on a timeout that was never in the model. Translation drafting still used cloud Claude; only narration and ASR stayed on the Mac.

So how defensible is ElevenLabs?

This is where I have to be careful, because one course on one Mac is not a market.

What changed for this workload is the marginal narration bill. If you are authorized to clone the voice, the workload is batch, you can verify the output, and you can tolerate a slow tail, local inference removes the per-character cost of another pass or another language. That is a real consideration for a developer choosing an API for a batch pipeline.

What a hosted service still provides is harder to replace:

  • A quality ceiling. The output I tested locally is not the best hosted voice I have heard.
  • Latency. A local batch is minutes per slide. A product that answers in real time is a different engineering problem.
  • Operational reliability. I had to debug a five-minute timeout, a memory ceiling, worker drain and a licence.
  • Voice rights and compliance. Cloning is a legal surface, not a feature. Using a hosted API does not transfer the customer’s responsibility to hold the rights and consents.
  • Breadth. CosyVoice lists support for my four launch languages; I validated Chinese, and Korean validation is in progress. A global product needs many more.

The honest conclusion is narrower than “open source kills ElevenLabs”. Local inference changed the calculation for my batch re-render workload. It did not replace the product you call when interactive latency, a wide voice catalogue, contracted support or a specific quality ceiling matters. Those are my judgement calls from one project, not a market forecast.

Why this became a course story

I did not set out to write about voice models. I set out to ship a course in more languages than I could produce alone.

The same operating model the course teaches is what produced the Chinese edition and is producing the Korean one: research, plan, build a pipeline, verify the output, keep the parts a human has to own. One advertising operator, Claude for translation drafting, a local open-weights voice for narration, no localization vendor, no dubbing studio.

That is how I applied parts of the operating model to my own product.

If you are in advertising and wondering whether AI is a threat or leverage, this is the leverage version. You do not need a large team. You need taste, a checklist, and the willingness to debug the last mile.

What I would tell another developer

  • Try local when you are authorized to clone the voice, the workload is batch, you can verify output, and you can tolerate a slow tail.
  • Pay for hosted when you need real-time latency, a wide voice catalogue, contracted uptime, or a specific quality ceiling.
  • Check the weights licence before you build a paid product on an “open-source” app. AGPL-3.0 allows commercial use under its conditions; the model weights and voice rights are separate questions.
  • Test the worst case, not the demo. The worst case is not a longer prompt. It is a long code-switch slide, a transport timeout, and a retry queue at the same time.

FAQ

Can a 16 GB Mac run local voice cloning?

Yes. CosyVoice 3 runs on CPU; VoxCPM2 needed more memory headroom than this machine had under load. Expect minutes per slide, not seconds.

Is open-source TTS good enough for a paid course?

The repaired Chinese samples I heard are clear and consistent, not studio-polished. That is an owner judgement, not native-speaker certification.

Is VoiceStudio free for commercial use?

The app is AGPL-3.0, which allows commercial use under its conditions. Model weights carry their own licences; OmniVoice’s pretrained weights are non-commercial. Check each engine before you ship.

Were the Chinese and Korean editions translated by AI?

Yes — drafted with Claude and reviewed with an AI editor, not by a human native speaker. Narration and ASR ran locally with CosyVoice 3 and the local transcription model; translation drafting used the cloud.

How long does a 258-slide course take?

The Chinese checkpoint: 28 hours of calendar time for 3 h 06 m of audio, including failures and retries, with a 16-slide repair pass after it. The Korean checkpoint: 31 hours for 3 h 25 m, including a wedged-worker detour and two repaired slides.

The course

The course is AI-Native Media Operations — seven modules, sixteen templates, and narration in English, Japanese, Simplified Chinese and Korean.