← Back to blogVoltar ao blog

AI voice-overs on a cloud GPU: ComfyUI on Modal, set up with Claude Code

Good open text-to-speech models now sound close to a studio narrator, but they want a real GPU. If your computer doesn’t have one, you can rent one by the second from Modal and run ComfyUI on it. Claude Code can write nearly all of that setup for you.

This guide covers the setup from your side of the keyboard: what you create yourself, what you ask Claude for, and the decisions that affect quality and cost. It doesn’t depend on a particular model or voice. Once it runs, you can point it at whichever speech model suits you, or at image and video models too. It is the companion to our guide on making motion graphics videos with Claude Code, which is where we use the voice.

An example of what you get: one line straight out of the model, and the same line after a simple mastering pass.

Straight from the model
After mastering

The pieces

  • Modal runs your code in containers on cloud GPUs. You describe the container in Python. It starts when a request comes in, shuts down when idle, and bills by the second.
  • ComfyUI is an open source node editor for running image, video and audio models. You get a browser UI to experiment in, and an API that scripts can call.
  • Custom nodes add models to ComfyUI. For speech, a node pack such as TTS Audio Suite brings in several open text-to-speech engines.
  • Claude Code writes the Modal app, the client script and the audio processing, and runs the commands with you.
your computerClaude Code + a smallclient script ModalComfyUI on a GPUpassword on the UIstops when idle modelsvolume outputsvolume textaudio
The whole setup: one Modal app, two storage volumes and a script on your computer.

Step 1: the parts only you can do

Claude can write all the code, but some steps involve your accounts, your money and your tokens. Do these yourself:

  • Create a Modal account and add a payment method.
  • Install the client and log in: pip install modal, then modal setup. This opens your browser.
  • Create a Hugging Face account and an access token with read permission. Some models are gated, so accept their terms on the model page first.
  • Store your secrets in Modal from your own terminal, so they never pass through a chat: one for the Hugging Face token, and one for a username and password for the ComfyUI page. For example: modal secret create huggingface-secret HF_TOKEN=...

The password matters more than it looks. A Modal web endpoint is public. Anyone who finds the URL could run jobs on your GPU, on your bill, unless the page asks for a login.

Step 2: ask Claude Code for the app

Open Claude Code in an empty folder and describe what you want. Be clear about the decisions and leave the plumbing to Claude. A prompt along these lines works:

Set up ComfyUI on Modal in this folder.
- One Modal app. Build the image in code and pin ComfyUI and every custom node to a commit.
- Install these custom nodes: <the node packs for the models you want>.
- Keep models in one Modal volume, and outputs, inputs and saved workflows in another.
- Put the ComfyUI web page behind a login, using the secret <name>.
- Use a <GPU type> GPU and shut the container down after <N> minutes without requests.
- Write a small Python script that sends a workflow to the API, waits for it,
  downloads the outputs and unloads the models.
- Write a smoke test that builds the image and checks that every custom node imports.
Explain each modal command I need to run, and what it will cost per hour.

Claude writes the files and walks you through modal deploy, which prints the URL of your ComfyUI page. You don’t need to read every line it writes. Do read the GPU setting and the idle timer, because those two decide the bill.

Two decisions are yours:

  • The GPU. Bigger GPUs cost more per hour. A speech model needs far less memory than a video model, so pick the smallest GPU your models fit on and check the price on Modal’s pricing page. If you plan to run video models in the same app later, you may want a larger one.
  • The idle timer. A cold start takes a minute or two. A longer idle window suits a session of trying things in the browser. A script that only generates and exits can use a short one.

Step 3: find a voice, then keep it

Speech models usually offer three ways to get a voice: built-in preset speakers, a voice designed from a written description, or a clone of a reference recording. Ask Claude to generate the same line several ways, listen, and pick.

Two lessons apply whichever model you use:

  • Make it repeatable. A designed voice can come out slightly different each time, even with the same settings. Once you like a take, keep that audio and its exact transcript, and use it as the reference for cloning from then on. With a fixed seed, the voice stays the same across videos.
  • Only clone what you may use. Use a voice you designed, recorded yourself, or have written permission to use. Don’t clone a real person without consent.

Step 4: audition and steer

For each video, give Claude the final script and ask for every line in a few variations (different seeds or settings). Once the GPU is warm, a line takes seconds. Then listen and say what is wrong in plain words: “too slow and flat, it needs more rhythm”, “warmer”, “less breathy”. Claude adjusts the settings, tries other variants, or changes the speed of the takes afterwards.

Two habits save retakes:

  • Spell names the way they sound. Models stumble on brand names and invented words. Writing them phonetically in the script, with hyphens where needed, usually fixes the pronunciation.
  • Check the words, not just the sound. Ask Claude to run a speech-to-text pass on every take and compare it with the script. You also get the timing of each word, which you need when you put the voice on the picture.

Step 5: master it by ear

A raw take sounds like a podcast. Describe the sound you want and let Claude build it, usually with ffmpeg filters alone:

Master these takes for a <trailer / explainer / calm narrator> voice-over:
<deeper, warmer, brighter, drier...>. Normalise the loudness for <platform>.
Give me a before and after of one line.

Judge it by listening, not by the filter list. If something sounds off, such as echo, harshness or a boomy low end, say so in those words. You heard one result at the top of this post.

Step 6: put the voice on the picture

In your video project, ask Claude to place each line on the frame where it belongs, time the animation to the spoken words, and lower the sound effects while the voice speaks. The motion graphics guide covers that side: how to make motion graphics videos with Claude Code.

Keep the bill small

While running a per-hour GPU price, billed by the second
While idle nothing, once the container has shut down
A voice session a cold start, then seconds per line
Storage models live in a volume; check your plan’s allowance before you download large ones

Before you close the laptop, open the Modal dashboard and check that nothing is still running. A container stays up until its idle timer runs out, so when you are done for the day, stop it from the dashboard, or ask Claude to.

If you would like help with a setup like this, or with getting AI-built software into production, run our free technical diagnostic or write to us.

Voice-overs com IA numa GPU na cloud: o ComfyUI no Modal, configurado com o Claude Code

Os bons modelos open source de text-to-speech já soam quase como um narrador de estúdio, mas precisam de uma GPU a sério. Se o seu computador não tem uma, pode alugá-la ao segundo no Modal e correr lá o ComfyUI. O Claude Code consegue escrever quase toda essa configuração por si.

Este guia mostra a configuração do seu lado do teclado: o que cria sozinho, o que pede ao Claude e as decisões que pesam na qualidade e no custo. Não depende de nenhum modelo nem de nenhuma voz em particular. Quando estiver a funcionar, pode apontá-lo para o modelo de voz que lhe for mais útil, ou também para modelos de imagem e de vídeo. Acompanha o nosso guia sobre fazer vídeos de motion graphics com o Claude Code, que é onde usamos a voz.

Um exemplo do resultado: uma frase tal como sai do modelo e a mesma frase depois de uma masterização simples.

Tal como sai do modelo
Depois da masterização

As peças

  • Modal corre o seu código em containers com GPUs na cloud. O container descreve-se em Python. Arranca quando chega um pedido, desliga-se quando fica parado e é cobrado ao segundo.
  • ComfyUI é um editor de nodes open source para correr modelos de imagem, vídeo e áudio. Tem uma interface no browser para fazer experiências e uma API que os scripts podem chamar.
  • Custom nodes acrescentam modelos ao ComfyUI. Para voz, um pacote de custom nodes como o TTS Audio Suite traz vários motores open source de text-to-speech.
  • Claude Code escreve a app Modal, o script cliente e o processamento de áudio, e corre os comandos consigo.
o seu computadorClaude Code + umscript cliente ModalComfyUI numa GPUUI com passwordpara quando parado modelosvolume resultadosvolume textoáudio
A configuração completa: uma app Modal, dois volumes de armazenamento e um script no seu computador.

Passo 1: a parte que é só sua

O Claude pode escrever todo o código, mas alguns passos envolvem as suas contas, o seu dinheiro e os seus tokens. Faça estes sozinho:

  • Crie uma conta no Modal e adicione um método de pagamento.
  • Instale o cliente e inicie sessão: pip install modal e depois modal setup. Isto abre o browser.
  • Crie uma conta no Hugging Face e um token de acesso com permissão de leitura. Alguns modelos têm acesso restrito, por isso aceite primeiro os termos na página do modelo.
  • Guarde os seus secrets no Modal a partir do seu próprio terminal, para que nunca passem por um chat: um para o token do Hugging Face e outro com um username e uma password para a página do ComfyUI. Por exemplo: modal secret create huggingface-secret HF_TOKEN=...

A password é mais importante do que parece. Um endpoint web do Modal é público. Quem encontrar o URL pode correr trabalhos na sua GPU, pagos por si, a menos que a página peça login.

Passo 2: peça a app ao Claude Code

Abra o Claude Code numa pasta vazia e descreva o que quer. Seja claro nas decisões e deixe os pormenores técnicos para o Claude. Um prompt deste género funciona:

Configura o ComfyUI no Modal nesta pasta.
- Uma única app Modal. Constrói a imagem em código e fixa o ComfyUI e cada custom node num commit.
- Instala estes custom nodes: <os custom nodes dos modelos que quer usar>.
- Guarda os modelos num volume do Modal, e os resultados, entradas e workflows guardados noutro.
- Põe a página web do ComfyUI atrás de um login, com o secret <nome>.
- Usa uma GPU <tipo de GPU> e desliga o container ao fim de <N> minutos sem pedidos.
- Escreve um pequeno script em Python que envia um workflow para a API, espera que termine,
  descarrega os resultados e liberta os modelos da memória.
- Escreve um smoke test que constrói a imagem e verifica que todos os custom nodes são importados.
Explica cada comando modal que tenho de correr e quanto vai custar por hora.

O Claude escreve os ficheiros e acompanha-o no modal deploy, que mostra o URL da sua página do ComfyUI. Não precisa de ler todas as linhas que ele escreve. Leia a definição da GPU e o idle timeout, porque são esses dois que decidem a fatura.

Há duas decisões que são suas:

  • A GPU. As GPUs maiores custam mais por hora. Um modelo de voz precisa de muito menos memória do que um modelo de vídeo, por isso escolha a GPU mais pequena onde os seus modelos cabem e veja o preço na página de preços do Modal. Se tenciona correr modelos de vídeo na mesma app mais tarde, talvez lhe convenha uma maior.
  • O idle timeout. Um cold start demora um ou dois minutos. Um idle timeout mais longo serve para uma sessão de experiências no browser. Um script que só gera e sai pode usar um curto.

Passo 3: encontre uma voz e fique com ela

Os modelos de text-to-speech costumam oferecer três formas de obter uma voz: vozes predefinidas incluídas no modelo, uma voz desenhada a partir de uma descrição escrita, ou um clone de uma gravação de referência. Peça ao Claude para gerar a mesma frase de várias formas, ouça e escolha.

Há duas lições que valem para qualquer modelo:

  • Torne-a repetível. Uma voz desenhada pode sair um pouco diferente de cada vez, mesmo com as mesmas definições. Quando gostar de um take, guarde esse áudio e a transcrição exata, e use-o daí em diante como referência para clonar. Com uma seed fixa, a voz mantém-se igual de vídeo para vídeo.
  • Clone só o que pode usar. Use uma voz que desenhou, que gravou ou que tem autorização escrita para usar. Não clone uma pessoa real sem consentimento.

Passo 4: ouça e oriente

Para cada vídeo, dê ao Claude o guião final e peça cada frase em algumas variações (seeds ou definições diferentes). Com a GPU já quente, uma frase demora segundos. Depois ouça e diga o que está mal em palavras simples: “demasiado lenta e monótona, precisa de mais ritmo”, “mais quente”, “menos sussurrada”. O Claude ajusta as definições, experimenta outras variantes ou muda a velocidade dos takes no fim.

Há dois hábitos que poupam repetições:

  • Escreva os nomes como se dizem. Os modelos tropeçam em nomes de marcas e palavras inventadas. Escrevê-los foneticamente no guião, com hífenes onde for preciso, costuma corrigir a pronúncia.
  • Verifique as palavras, não só o som. Peça ao Claude para passar cada take por um speech-to-text e comparar o texto com o guião. Fica também com o tempo de cada palavra, que vai precisar quando juntar a voz à imagem.

Passo 5: masterize de ouvido

Um take em bruto soa a podcast. Descreva o som que quer e deixe o Claude construí-lo, normalmente só com filtros do ffmpeg:

Masteriza estes takes para um voice-over de <trailer / vídeo explicativo / narrador calmo>:
<mais grave, mais quente, mais brilhante, mais seca...>. Normaliza o volume para <plataforma>.
Dá-me um antes e depois de uma frase.

Avalie de ouvido, não pela lista de filtros. Se alguma coisa soar mal, como eco, aspereza ou graves a ribombar, diga-o com essas palavras. Ouviu um resultado no início deste artigo.

Passo 6: junte a voz à imagem

No seu projeto de vídeo, peça ao Claude para colocar cada frase no frame certo, sincronizar a animação com as palavras faladas e baixar os efeitos sonoros enquanto a voz fala. O guia de motion graphics trata dessa parte: como fazer vídeos de motion graphics com o Claude Code.

Manter a fatura baixa

A correr um preço por hora da GPU, cobrado ao segundo
Parado nada, depois de o container se desligar
Uma sessão de voz um cold start e depois segundos por frase
Armazenamento os modelos ficam num volume; veja o limite do seu plano antes de descarregar modelos grandes

Antes de fechar o portátil, abra o dashboard do Modal e confirme que não ficou nada a correr. Um container só se desliga quando o idle timeout chega ao fim, por isso, quando acabar o trabalho do dia, pare-o no dashboard ou peça ao Claude que o faça.

Se quiser ajuda com uma configuração como esta, ou para pôr em produção software feito com IA, faça o nosso diagnóstico técnico gratuito ou escreva-nos.