22 de setembro de 2026 / Laboratório pessoal
Como dei telefone para a Edwiges (1/3): Minha assistente criando voz e vida.
Eu já falava com a Edwiges no computador. Queria receber os avisos mesmo longe dele. Foi aí que entraram a ElevenLabs e a Twilio.

Eu já conversava por voz com a Edwiges dentro do meu WSL, o ambiente Linux que uso no Windows. O Whisper escuta, a Edwiges responde e o Kokoro fala. Funcionava bem. Só que eu precisava estar no meu computador, olhando para o terminal.
Eu queria que, quando acontecesse alguma coisa, o aviso chegasse até onde eu estivesse. E o único canal que sempre está comigo é o telefone.
Eu queria ser acordado se o ambiente com Kubernetes que eu gerencio ficasse fora do ar. Já havia monitoramento. Faltava fazer o alerta sair da tela e chegar até mim. Então construí um comando para a Edwiges gerar o recado com a ElevenLabs e pedir a ligação à Twilio.
Esta é a primeira de três partes. Aqui conto como fiz o telefone tocar.
Falar no microfone não é a mesma coisa que ligar
No meu computador, sou eu que começo a conversa. O Whisper transforma minha fala em texto, a Edwiges responde e o Kokoro transforma a resposta em áudio. Whisper e Kokoro rodam localmente; isso não quer dizer que o modelo do Claude também esteja na minha GPU.
Quando o telefone toca, a situação muda. Quem atende pode estar no meio de qualquer coisa e precisa entender o recado nos primeiros segundos.
Eu queria uma mensagem curta, dizendo o que aconteceu e onde olhar. Nessa ligação, eu só ouço o áudio preparado pelo script. Para responder à Edwiges pelo telefone, precisaria montar também o caminho de volta.
Por que a ligação não usa o Kokoro?
O Kokoro vai continuar nas minhas conversas do dia a dia. Ele roda localmente, usando a minha GPU, então posso ter conversas longas sem consumir créditos da ElevenLabs. Tem o custo de energia e o tempo que eu dedico à manutenção, mas essa conversa local não usa os serviços da Twilio nem da ElevenLabs.
Para as ligações, escolhi a Twilio e a ElevenLabs porque eram os dois provedores que eu conhecia com as integrações de que precisava. A ElevenLabs transforma o texto do recado em um arquivo de áudio com a voz que escolhi. Depois, esse arquivo fica hospedado em um endereço que a Twilio consegue acessar. A Twilio faz a ligação e, quando eu atendo, toca o recado.
Assim, continuo usando o Kokoro nas conversas no meu computador e deixo a ElevenLabs e a Twilio para os avisos por telefone.
O caminho do áudio até o telefone
O primeiro passo foi escrever o recado e pedir à ElevenLabs para transformá-lo em um MP3. Até aí, eu tinha um arquivo na minha máquina. Faltava fazer esse arquivo chegar à ligação.
Este é o pedido à API da ElevenLabs. A chave e o identificador da voz vêm de variáveis de ambiente:
curl --fail-with-body --silent --show-error \
--output say.mp3 \
--request POST \
"https://api.elevenlabs.io/v1/text-to-speech/${ELEVENLABS_VOICE_ID}?output_format=mp3_44100_128" \
--header "xi-api-key: ${ELEVENLABS_API_KEY}" \
--header "Content-Type: application/json" \
--data '{"text":"Alerta crítico no laboratório. Veja o WhatsApp.","model_id":"eleven_multilingual_v2"}'
No protótipo, subi o MP3 em uma hospedagem temporária e usei o endereço do arquivo na chamada. Para dizer à Twilio o que fazer depois que alguém atendesse, enviei instruções em TwiML, o formato que ela usa para controlar a ligação.
A instrução Play pede para buscar o áudio na URL e tocar:
# Exemplo didático: este POST cria uma chamada real e pode gerar cobrança.
# TWILIO_TO deve vir de um destino revisado e autorizado.
curl --fail-with-body --silent --show-error \
--request POST \
"https://api.twilio.com/2010-04-01/Accounts/${TWILIO_ACCOUNT_SID}/Calls.json" \
--user "${TWILIO_ACCOUNT_SID}:${TWILIO_AUTH_TOKEN}" \
--data-urlencode "To=${TWILIO_TO}" \
--data-urlencode "From=${TWILIO_FROM}" \
--data-urlencode 'Twiml=<Response><Play>https://example.com/say.mp3</Play></Response>'
Esses exemplos mostram a síntese e a chamada. Entre uma coisa e outra, ainda há o upload. Antes de ligar, é preciso conferir se veio um áudio válido, se o endereço funciona e se o destino foi autorizado. Se a API devolver um erro, o script precisa parar antes de publicar o arquivo.
O endereço example.com é só ilustrativo. Na chamada real, a URL precisa continuar válida até a Twilio buscar o arquivo. Se houver parâmetros nela, também é preciso escapá-los corretamente no XML.
O áudio ficou público, e isso me incomodou
A hospedagem temporária resolveu o teste, mas qualquer pessoa com aquela URL poderia baixar o recado.
O texto passa pela ElevenLabs, e o áudio fica na hospedagem e pode ser mantido em cache pela telefonia. Por isso, o recado precisa ser genérico. Nome de cliente, credencial e detalhe interno do ambiente ficam de fora.
Uma alternativa para evoluir isso é hospedar o arquivo sob meu controle, com uma URL assinada: um link que autoriza o acesso por um prazo definido. Eu ainda teria que implementar e testar essa alternativa.
O que ainda depende do meu computador
A Twilio faz a ligação nos servidores dela. Mas a Edwiges precisa conseguir executar o comando na minha máquina para pedir o áudio e a chamada. Se o computador desligar ou ficar sem internet antes disso, o aviso não sai.
Eu já consigo receber o recado longe do meu computador. Para receber também um aviso de que a própria máquina caiu, precisaria de outro serviço observando e disparando o alerta de fora dela.
O primeiro toque
Antes de usar esse comando nos alertas, eu precisava conferir se o texto virava um áudio compreensível e se esse áudio chegava ao telefone. Não queria descobrir que o recado estava baixo ou longo demais quando precisasse dele.
Comecei pelo modo de ensaio: o script gera o MP3, hospeda o arquivo e para antes de pedir a ligação à Twilio. Assim, eu podia ouvir a mensagem e conferir o endereço do áudio antes de ligar para alguém.
Mesmo sem discar, o ensaio já usa a geração de áudio da ElevenLabs, que pode consumir o saldo do plano ou gerar cobrança. Ao fazer a ligação real, entra também a cobrança de telefonia da Twilio, que depende do destino e da duração da chamada.
A mensagem de teste também precisava ser genérica, sem dados de cliente, credenciais ou detalhes internos do ambiente.
Depois, fiz a ligação de teste para minha mãe. Aí testei também o que o ensaio não cobria: a chamada pela Twilio e a reprodução do áudio no telefone.
Quanto isso custa de verdade
Na prática, esse laboratório me custou pouco. Para dar uma referência a quem quiser montar algo parecido, calculei um mês de uso leve com os preços oficiais consultados em 30/09/2026. Os valores estão em dólares e são uma simulação, não a reprodução da minha fatura.
Na Twilio, a conta combina o aluguel mensal do número com o consumo. Colocar saldo na conta é uma recarga; esse valor não vira uma assinatura a ser somada novamente às ligações e mensagens.
Para o exemplo, considerei um número local dos EUA habilitado para voz e SMS, com os avisos chegando a celulares no Brasil. Na ElevenLabs, seriam 10 gerações de 200 caracteres no modelo Multilingual v2: 10 × 200 = 2.000 caracteres no mês.
Fontes dos preços: número local na Twilio · ligações para o Brasil · SMS para o Brasil · planos da ElevenLabs. Consulta em 30/09/2026.
Ver os valores e a conta em texto
- Número na Twilio: US$1,15 por mês pelo número local americano
- 10 ligações, com 1 minuto faturado cada: 10 × US$0,0663 = US$0,663
- 10 SMS de um segmento para o Brasil: 10 × US$0,0599 = US$0,599
- ElevenLabs Starter: US$6 por mês, com 75.000 caracteres desse modelo incluídos pela API. Os 2.000 caracteres do exemplo cabem nesse limite, sem somar outra cobrança de geração
A conta fica em US$1,15 + US$0,663 + US$0,599 + US$6 = US$8,412, ou aproximadamente US$8,41 por mês para voz e telefonia nesse cenário.
Para testes pessoais não comerciais, o Free inclui 10.000 caracteres desse modelo pela API. Se esses forem os únicos usos, os 2.000 caracteres também cabem nele. Nesse caso, o Free substitui o Starter e o subtotal cai para US$2,41, respeitando as regras de uso não comercial e de atribuição ao compartilhar o áudio.
Dois detalhes mudam a conta: a Twilio arredonda a duração de cada chamada para cima, em minutos, e SMS é cobrado por segmento. Por isso, considerei um minuto faturado por ligação e mensagens que caibam em um segmento. Novas gerações de áudio, repetições e outros usos precisam entrar na soma também.
No primeiro ano, paguei US$1,99 pelo domínio finfy.me numa promoção. Esse custo fica separado da conta mensal. A renovação é anual e pode ter outro valor.
Agora a Edwiges liga. Mas quando ela deve ligar?
A Edwiges já podia usar o comando para me ligar. O próximo passo era fazer isso a partir dos alertas, sem que eu precisasse pedir cada chamada. Para isso, eu precisava definir para quem ela poderia ligar e em quais situações.
Esse é o assunto da próxima parte. Até mais, pessoal! 👋
Para entender as ferramentas
- Whisper: reconhecimento e transcrição de fala, no repositório da OpenAI
- Kokoro: modelo de texto para voz, na página do autor
- ElevenLabs: como gerar fala pela API
- ElevenLabs: o que são créditos e como o uso é contabilizado
- ElevenLabs: cobrança e medição de uso da API
- Twilio: o que é TwiML e como ele controla uma chamada
- Twilio: como Play busca e reproduz o áudio, incluindo formatos e cache
- Twilio: criação e acompanhamento das chamadas
Teste seu conhecimento
6 perguntas sobre este post
Questão 1
Resposta correta: Eu queria receber os avisos mesmo longe do meu computador
Sua resposta:
A conversa por voz local funcionava bem. Faltava fazer o alerta sair da tela e chegar até mim pelo telefone.
Questão 2
Resposta correta: Porque eram os provedores que eu conhecia com as integrações de que precisava
Sua resposta:
Escolhi a ElevenLabs e a Twilio porque conhecia esses provedores e eles tinham as integrações de que precisava. O Kokoro continua nas conversas no computador.
Questão 3
Resposta correta: Porque a Twilio busca o áudio por uma URL para tocá-lo na chamada
Sua resposta:
A Twilio busca o arquivo indicado em Play. A URL precisa estar acessível e válida no momento da busca; ser temporária não torna a hospedagem privada.
Questão 4
Resposta correta: Gera o áudio e hospeda o arquivo, mas para antes de discar
Sua resposta:
O ensaio permite revisar a mensagem e o endereço do áudio antes de ligar. Ele ainda usa a geração de áudio da ElevenLabs, mas não cria a chamada na Twilio.
Questão 5
Resposta correta: Aluguel do número, ligações e SMS na Twilio, mais o plano da ElevenLabs escolhido
Sua resposta:
O exemplo soma o aluguel mensal do número, os minutos de ligação, os segmentos de SMS e o Starter da ElevenLabs. O Free é uma alternativa para uso permitido, não uma cobrança adicional. O domínio é separado, com custo anual.
Questão 6
Resposta correta: Não: se o comando para antes de enviar o pedido, a chamada não é iniciada
Sua resposta:
A Twilio executa a chamada após receber a solicitação. O comando na minha máquina precisa conseguir enviar esse pedido, e o áudio precisa estar acessível quando a Twilio buscá-lo.