VoiceStudio runs on a VDS without a graphics card, but on CPU only part of it is fast enough for real work. In our lab test on 4 CPU cores, VoiceStudio 0.5.6 transcribed a 75-second recording in about 20 seconds with Whisper small, and its small KittenTTS voice read text aloud at about 1.6 seconds of compute per second of speech. Voice cloning with the default OmniVoice model also worked, but a cloned clip of 6 to 9 seconds took between 4 and 6.5 minutes. So a CPU server is a good home for private transcription and simple text to speech, and a patient one for short cloned clips. Audiobooks or video dubbing in a cloned voice belong on a GPU.
Key facts, checked on 15 October 2026:
- VoiceStudio is the project debpalash/VoiceStudio. It had about 68,300 GitHub stars on 15 October 2026. The latest release is v0.5.6, from 23 September 2026.
- The app is AGPL-3.0. Its default voice model, k2-fsa/OmniVoice (0.6 billion parameters), has Apache-2.0 code but CC-BY-NC weights, so it is not for commercial use.
- The Docker image is 11 GB in our lab and is published for x86-64 (linux/amd64) only. The Docker guide publishes it on port 3900 (not 8000), bound to 127.0.0.1, and it needs an admin API key.
- In our lab the OmniVoice download was 3.27 GB, and the app used 0.8 GB of RAM when idle, about 3.7 GB with OmniVoice loaded and up to 5.5 GB at peak.
- VoiceStudio's own model licence inventory lists 56 model repositories. None is marked as cleared for commercial use yet.
The short answer: what works on CPU
Speed in speech tools is usually given as a real-time factor (RTF): seconds of computing per second of audio produced. An RTF of 1 means a 10-second clip takes 10 seconds to make. Below 1 is faster than real time. Above 1 means you wait. All numbers below come from our lab, on a container with 4 cores and 6 GB of RAM.
| Feature | Works on CPU? | What we measured |
|---|---|---|
| Transcription, Whisper small | Yes, well | 75 s of speech in 19 to 20 s, no word errors |
| Transcription, Whisper large-v3 turbo | Yes, slower | 75 s of speech in 66 to 74 s, 1 word missed, 4.8 GB RAM peak |
| Text to speech, KittenTTS (8 preset English voices) | Yes | RTF 1.5 to 1.9; 75 s of speech in 124 s |
| Text to speech, OmniVoice (default engine) | Slowly | RTF 24 to 36 with default settings; RTF 12 with 8 steps, which hurt quality |
| Voice cloning, OmniVoice | Slowly, short clips only | 9.2 s of audio in 228 s with 8 steps; 6.5 s in 379 s at default steps |
| Video dubbing, audiobooks in a cloned voice | Not practical | Not tested; it would chain the slow cloning step for every line |
Dubbing and long cloned narration need a graphics card to be practical, so we did not test them as working.
How we tested
Our lab host is an Amsterdam server with an AMD EPYC 7742 processor. Its 8 cores were shared with other test labs during the run, and the load changed a lot. That is why the same job varied by up to 40% between runs. Your speed on a real plan can differ from ours in either direction. We gave VoiceStudio a Debian 13 container with 4 cores and 6 GB of RAM, which is close to a VDS Small with 2 GB less memory. We forced CPU mode, so no part of the test used a GPU.
We never used a real person's voice. The test speech came from KittenTTS's built-in voice. That synthetic voice was also the reference for the cloning test. Every output was then transcribed back with Whisper to check that the words came out right.
Install VoiceStudio with Docker on a VDS
VoiceStudio has desktop apps for Windows, macOS and Linux. On a server you use the Docker image, which serves the same interface to your browser. Docker runs each app in its own container with everything it needs; our Docker on a VPS guide explains the basics.
Step 1: Docker and a normal user
# as root
apt-get update
apt-get install -y docker.io docker-compose curl python3 ffmpeg
useradd -m -s /bin/bash -G sudo,docker studio
su - studio
On Debian 13 this gave us Docker 26.1.5 and Docker Compose 2.26.1. The user name studio is our choice. Debian already has a group called voice, so that name fails with "group voice exists". Members of the docker group can control the whole server, so give this user a strong password or SSH key.
Step 2: the Compose file and an API key
# as the studio user
mkdir ~/voicestudio && cd ~/voicestudio
nano compose.yml
Paste this, then save with Ctrl+O, Enter and Ctrl+X. It is a shorter version of the project's own deploy/docker-compose.yml, pinned to version 0.5.6 and forced to CPU:
# compose.yml, used by the studio user
services:
voicestudio:
image: ghcr.io/debpalash/voicestudio:0.5.6
container_name: voicestudio
ports:
- "127.0.0.1:3900:3900"
volumes:
- voicestudio-data:/app/omnivoice_data
environment:
- OMNIVOICE_API_KEY=${OMNIVOICE_API_KEY:?set OMNIVOICE_API_KEY in .env}
- OMNIVOICE_DEVICE=cpu
- OMNIVOICE_ANALYTICS_DISABLED=1
restart: unless-stopped
volumes:
voicestudio-data:
127.0.0.1 keeps the port closed to the internet. OMNIVOICE_DEVICE=cpu stops the app from looking for a GPU, and the analytics line switches off its opt-in usage statistics. Now create the admin key, which the web interface asks for on first visit:
# as the studio user, in ~/voicestudio
echo "OMNIVOICE_API_KEY=$(python3 -c 'import secrets; print(secrets.token_urlsafe(32))')" > .env
chmod 600 .env
docker pull ghcr.io/debpalash/voicestudio:0.5.6
docker compose up -d
curl -s http://127.0.0.1:3900/health
The image is 11 GB. In our lab the download and unpacking took 18 minutes 20 seconds; a server with a fast disk and network will often be quicker. After up -d, the health check answered in 12 seconds with {"status":"ok","device":"cpu","version":"0.5.6"}.
Step 3: download the models you need
Models are installed from the Model Catalogue in the web interface, or with the same API calls we used. Load the key into your shell first:
# as the studio user, in ~/voicestudio
set -a; . ./.env; set +a
curl -s -X POST http://127.0.0.1:3900/models/install \
-H "Authorization: Bearer $OMNIVOICE_API_KEY" -H "Content-Type: application/json" \
-d '{"repo_id":"KittenML/kitten-tts-mini-0.8"}'
Run the install call again with k2-fsa/OmniVoice and Systran/faster-whisper-small as the repo_id to get the cloning model and the small Whisper model. You can follow the downloads in the Model Catalogue. OmniVoice's 3.27 GB arrived in about 41 seconds on our lab's connection. The first generation also downloads a 56 MB AudioSeal model, which VoiceStudio uses to hide an inaudible watermark in every clip it makes. After the downloads, models took 5.5 GB in the data volume and Docker's folder had grown to 22 GB, so keep at least 40 GB free.
Step 4: open the interface through an SSH tunnel
# on your own computer
ssh -N -L 3900:127.0.0.1:3900 studio@YOUR_SERVER_IP
Leave that window open and browse to http://localhost:3900. Paste the key from .env when the page asks for it. Without the key, the API answers 401 and {"detail":"API key required"}, as it did when we tried.
Transcription: the part that shines on a CPU
Speech to text runs on Whisper models through faster-whisper, which uses compact 8-bit numbers (int8) on CPU. This is where a VDS earns its keep: you can turn meetings, interviews or voice notes into text without sending the audio to anyone. Choose the model, then send a file to the OpenAI-style endpoint:
# as the studio user, in ~/voicestudio, with the key loaded
curl -s -X POST http://127.0.0.1:3900/engines/select \
-H "Authorization: Bearer $OMNIVOICE_API_KEY" -H "Content-Type: application/json" \
-d '{"family":"asr","backend_id":"faster-whisper","model_id":"Systran/faster-whisper-small"}'
time curl -s http://127.0.0.1:3900/v1/audio/transcriptions \
-H "Authorization: Bearer $OMNIVOICE_API_KEY" \
-F "file=@hello.mp3" -F "model=whisper-1"
On our 75-second test recording (155 words), Whisper small needed 19 to 20 seconds and got every word right. At that pace an hour of clear speech would take roughly 16 minutes; we worked that out from the 75-second test, and real recordings with noise or several speakers will be slower.
Whisper large-v3 turbo is better with accents and poor audio, and it took 66 to 74 seconds for the same file, about real time. It also showed why memory matters more than cores here. With the TTS models already in memory, loading it pushed the container past 6 GB and the kernel killed the app. Docker restarted it on its own, and the retry worked with a 4.8 GB peak. Large models need memory headroom, which is the main reason we size this app by RAM first.
Text to speech: one fast voice, one slow one
For plain narration, KittenTTS is the CPU choice. It is an 80 MB Apache-2.0 model with eight preset English voices and no cloning. The endpoint copies OpenAI's speech API, so many existing scripts and tools work with it:
# as the studio user, in ~/voicestudio, with the key loaded
time curl -s http://127.0.0.1:3900/v1/audio/speech \
-H "Authorization: Bearer $OMNIVOICE_API_KEY" -H "Content-Type: application/json" \
-d '{"model":"kittentts","voice":"default","input":"Your order has shipped and will arrive on Friday.","response_format":"mp3"}' \
-o hello.mp3
Across all our KittenTTS runs the RTF was 1.5 to 1.9, so 10 minutes of speech takes 15 to 19 minutes. That is fine for a queue of notifications, help-desk phrases or article read-outs, but not for a live voice assistant.
OmniVoice, the default engine, covers more than 600 languages and sounds more natural, but on our 4 cores a 10-second sentence took 4 to 6 minutes (RTF 24 to 36). Cutting its diffusion steps from the default to 8 halved the time, yet Whisper then heard "low-school" where the text said "local". VoiceStudio's quantised OmniVoice GGUF engine is meant for CPU-only machines, but its program file is not in the 0.5.6 Docker image, and the app reported it as unavailable.
Voice cloning on CPU: it works, measured in minutes
Cloning means the model copies a voice from a short reference recording, 3 to 10 seconds by the docs. We used a 10-second clip of the synthetic KittenTTS voice, plus its exact transcript, and asked for a new sentence:
# as the studio user, in ~/voicestudio, with the key loaded
time curl -s http://127.0.0.1:3900/generate \
-H "Authorization: Bearer $OMNIVOICE_API_KEY" \
-F "text=Thanks for calling. We will get back to you within one working day." \
-F "ref_audio=@ref.wav" -F "ref_text=$(cat ref.txt)" \
-o cloned.wav
It took 6 minutes 19 seconds for 6.5 seconds of audio, and Whisper read it back word for word. With -F "num_step=8" added, a 9.2-second clip took 3 minutes 48 seconds. Memory peaked at 5.5 GB. A first try with a longer 15-second reference ran out of our 6 GB and was killed after 10 minutes, so keep reference clips short.
So cloning on CPU is fine for a handful of short lines, such as a voicemail greeting in your own consented voice, prepared overnight. A one-hour audiobook at these speeds would run for days, and that is the point where a GPU server or a cloud voice service is the honest answer.
Consent, deepfake rules and model licences
A voice clone can be used to deceive, and laws now treat it that way. Read this before you upload any reference clip.
- Only clone voices you have documented permission for: your own, or a speaker who agreed in writing to the exact use. Keep that consent on file. A recording of an identifiable person is personal data under the GDPR.
- Never impersonate real people. Fraud, defamation and impersonation laws apply whatever tool made the audio, and our acceptable use policy forbids it on our servers.
- In the EU, Article 50 of the AI Act (Regulation 2024/1689) applies from 2 August 2026. Anyone who publishes deepfake audio must disclose that it was artificially generated.
- In the US, the FCC ruled in February 2024 that AI-generated voices in robocalls count as "artificial" voices under the TCPA (FCC). Such calls need the same prior consent as other prerecorded or artificial-voice calls.
- Check each model's licence. OmniVoice's weights are CC-BY-NC, meaning non-commercial use only. KittenTTS is Apache-2.0, and the Whisper models we used are MIT. VoiceStudio's README says a paid app licence does not grant model rights.
VoiceStudio helps a little here: it marks every output with an AudioSeal watermark, and voice profiles have a consent field. Neither replaces your own written permission. This is general information, not legal advice.
Which plan and which city
RAM decides the plan first, because a model that doesn't fit is killed, not slowed down. Cores decide how long you wait. Dedicated cores matter for batch jobs: on a VDS your queue gets the same CPU time every night, while shared cores depend on what other customers are doing.
| Plan | Specs | Fit for VoiceStudio |
|---|---|---|
| VPS Mini | 4 shared vCPU, 4 GB RAM, 80 GB NVMe | Too tight. With OmniVoice loaded the app held 3.7 GB, and a clone peaked at 5.5 GB. |
| VDS Small | 4 dedicated vCPU, 8 GB RAM, 240 GB NVMe | The starting point. Same cores as our test and more RAM. Whisper small transcription, KittenTTS, occasional short clones. |
| VDS Medium | 8 dedicated vCPU, 16 GB RAM, 480 GB NVMe | Room for Whisper large-v3 turbo and OmniVoice at the same time, and for a busy team's transcription queue. |
| VDS Large | 16 dedicated vCPU, 32 GB RAM, 960 GB NVMe | Several users or other apps beside it. Cloning stays slow on any CPU. |
We did not measure the 8 and 16 core plans. More cores should help, but how much depends on how well each model uses them. All plans run on KVM with unmetered traffic, their own IPv4 and IPv6, and you can move up a plan later from the client area with a short reboot. Prices and current plans are on the plans page.
For a web interface, distance matters less than for a game, but you will feel it when you upload files and play back clips. In our own ping.pe test on 6 October 2026, published on our location pages, Amsterdam answered Frankfurt in 6.6 ms and London in 6.7 ms (VPS Netherlands), and Prishtina answered Skopje in 3 ms and Vienna in 18.6 ms (VPS Kosovo). For Dublin, WonderNetwork's published averages from the same day put London about 11 ms away (VPS Ireland). If your recordings must stay inside the EU, pick Amsterdam or Dublin. For teams in Kosovo and the region, Prishtina is the closest. Availability by city is on the plans page.
Keep the studio private
VoiceStudio holds voice recordings, which are about as personal as data gets. Keep three habits:
- Leave the port on
127.0.0.1and use the SSH tunnel above, or a private network such as Tailscale. The project's docs advise against exposing it directly to the internet. - If several people need it in a browser, put it behind HTTPS with a login using our reverse proxy guide, and keep the long API key secret.
- Pin a version tag as we did.
:latestfollows the development branch, while:0.5.6or:stablefollow releases. Update withdocker compose pullanddocker compose up -d.
To check memory while a job runs, docker stats --no-stream and free -m are enough. Our final reading, with models loaded and idle, was 4.05 GB.
If you also want a local chat assistant on the same kind of server, see our test of Open WebUI 0.12 on a CPU VPS and the broader AI apps on a VPS page. For publishing finished audio as a stream or podcast library, see Jellyfin, Plex and Icecast on a VPS.
Frequently asked questions
Can VoiceStudio run without a GPU?
Yes. VoiceStudio 0.5.6 detects CPU-only machines and runs there. In our test on 4 CPU cores, transcription with Whisper small and text to speech with KittenTTS were practical. Voice cloning with the default OmniVoice model worked, but a 6 to 9 second clip took 4 to 6.5 minutes.
How much RAM does VoiceStudio need?
In our lab VoiceStudio used 0.8 GB idle, about 3.7 GB with the OmniVoice model loaded and up to 5.5 GB while cloning. Loading Whisper large-v3 turbo on top of the TTS models went past 6 GB and was killed. Plan for at least 8 GB, and 16 GB if you use large models together.
How fast is voice cloning on a CPU server?
Slow. On 4 cores of an AMD EPYC 7742, OmniVoice made 6.5 seconds of cloned speech in 379 seconds at default quality, and 9.2 seconds in 228 seconds with 8 diffusion steps. That suits a few short lines, not audiobooks or dubbing.
Is VoiceStudio free for commercial use?
The app itself is AGPL-3.0, but each model has its own licence. The default OmniVoice weights are CC-BY-NC, so commercial use is not allowed. KittenTTS is Apache-2.0 and Whisper is MIT. VoiceStudio's own inventory marks no model as cleared for commercial use, so check each one.
Is it legal to clone someone's voice?
Only with that person's documented permission, and never to deceive. In the EU, AI Act Article 50 has required disclosure of published deepfake audio since 2 August 2026. In the US, the FCC treats AI voices in robocalls as artificial voices that need consent. Get legal advice for commercial projects.
Which port does VoiceStudio use in Docker?
The Docker image listens on port 3900. The official Compose file publishes it as 127.0.0.1:3900, so only the server itself can reach it. Open it from your computer with an SSH tunnel, or through a reverse proxy with HTTPS and the admin API key.
Start with the transcription box
On CPU, VoiceStudio is best as a private transcription and narration box. Whisper small turns speech into text about four times faster than real time, and KittenTTS reads text aloud a little slower than real time. Cloning works for short clips if you can wait, and only with consent. A VDS Small covers that, and a VDS Medium adds room for large models side by side. If you are unsure which plan or city fits your audio workload, ask us on Telegram.