Communitygithub.com

wael-wq/natural-voice

Transformar uma narração ElevenLabs robótica em algo que soa humano — reescreva o roteiro para o ouvido, dirija-o com tags de áudio, ajuste estabilidade e velocidade, gere takes com semente e escolha o que flui melhor.

O que é natural-voice?

Este skill resolve o problema de narrações geradas por IA que soam robóticas, entrecortadas ou sem emoção no ElevenLabs. Em vez de manipular a voz, a abordagem principal é reescrever o roteiro para ser ouvido e não lido, usando três ferramentas Python sem dependências: `speakable.py` para diagnosticar se o texto é 'falável', `takes.py` para gerar takes com sementes controladas e `gaps.py` para rankear takes por pausas dentro das frases. O fluxo inclui diagnóstico, reescrita com regras como usar contrações, números por extenso e conectar fragmentos com 'e', 'então', direção com tags de áudio no formato [excited], e ajustes de parâmetros (estabilidade 0.30–0.40, velocidade 1.0–1.08). Suporta ElevenLabs v4, é gratuito para rodar (exceto chamadas pagas com aviso prévio de custo) e pode ser usado em qualquer plataforma que integre ElevenLabs.

Funciona com✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/wael-wq/natural-voice-skill/tree/HEAD

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

O que natural-voice faz?

A maioria das narrações ElevenLabs que soam "robóticas" não é um problema de voz. É um problema de roteiro. O modelo lê exatamente o que recebe, e um roteiro escrito para os olhos (manchetes, fragmentos com ponto final, dígitos, travessões) sai staccato independentemente de qual voz o lê.

Três ferramentas nesta pasta realmente funcionam. Use-as; não julgue o fluxo apenas lendo o texto.

python3 speakable.py script.txt                  # isto foi escrito para o ouvido?
python3 takes.py script.txt --voice VOICE_ID     # takes com sementes (pago, pergunta primeiro)
python3 gaps.py takes/                           # classifica os takes por pausas dentro das frases

Todas são Python 3.9+ puro, sem pacotes. gaps.py usa ffmpeg se estiver no PATH para confirmar as pausas no próprio áudio.

O ciclo

1. Diagnostique antes de mudar qualquer coisa. Se já existe um take, execute gaps.py nele. Uma pausa acima de 0,2 s dentro de uma frase (não após uma vírgula ou ponto final) é o que as pessoas ouvem como "IA". No nosso take anterior, a voz parou 0,3 s antes de "run" e novamente antes de "Instagram", no meio da chamada. Nada na nossa edição causou isso: as pausas estavam no arquivo bruto.

2. Reescreva para o ouvido. Execute speakable.py e corrija cada sinalização. As regras:

  • Frases, não manchetes. "13 free Claude skills now run your Instagram." é um título. "Thirteen free Claude skills run your whole Instagram." é algo que uma pessoa diz.
  • Listas usam vírgulas, não pontos finais. "Reels. Captions. Carousels." faz o modelo parar três vezes. "reels, captions, carousels, stories" flui.
  • Números por extenso na linha falada: "eighty-four out of a hundred", não "84 out of 100". O texto na tela pode manter os dígitos.
  • Contrações (you've, it's, we'll). Ninguém diz "you have" em voz alta.
  • Conecte os fragmentos com "so", "and", "then". Uma conjunção é uma dica para o modelo continuar.
  • Sem travessões. O ElevenLabs trata um travessão como uma pausa curta e diz que é "menos consistente". Use uma vírgula para continuar, ou reticências para uma pausa.
  • Sem SSML. <break time="1s"/> não é suportado no Eleven v4 ou v3.

3. Dirija-o. O Eleven v4 aceita tags de áudio entre colchetes. Coloque uma tag no início de uma batida, não em cada linha, e faça com que corresponda ao que a linha está fazendo. Veja tags.md para a lista. speakable.py sinaliza tags que não conhece, porque uma tag desconhecida pode ser lida como um efeito sonoro.

[excited] Thirteen free Claude skills run your whole Instagram.
[mischievously] So we let it write this Reel...

Pontuação também é direção. Reticências adicionam uma pausa com peso, exclamação adiciona energia, e MAIÚSCULAS adicionam ênfase (use uma vez, na palavra que importa).

4. Configurações. No eleven_v4:

configuraçãousopor que
stability0.30 a 0.40Mais baixo dá "alcance emocional mais amplo"; o padrão 0.5 é mais plano. Abaixo de 0.3, um take pode derivar.
similarity_boost0.75o padrão; mantém a voz em si
style0o padrão; qualquer outra coisa adiciona latência
speed1.0 a 1.08a faixa permitida é 0.7 a 1.2; narração social fica logo acima de 1

5. Três takes, mesmo texto, sementes diferentes. Um take é um cara ou coroa. Execute takes.py com sementes 1, 2 e 3, depois gaps.py para classificá-los. Ouça os dois primeiros e escolha pelo ouvido. Guarde a semente: ela faz uma reexecução ficar próxima do mesmo take (ElevenLabs chama de "best effort", não garantido).

6. Edite com cuidado. Se seu editor cortar silêncios, mantenha cerca de um segundo após frases e a maior parte de um segundo após vírgulas. Pausas cortadas para a mesma duração curta sempre são a outra coisa que soa feita por máquina.

7. Ainda soa gerado? Pare de girar botões. Grave você mesmo dizendo a linha no seu telefone e passe pelo Conversor de Voz do ElevenLabs (speech-to-speech) na voz que deseja. Seu tempo, ênfase e emoção são transferidos; apenas a voz muda.

O que medimos

Em um dos nossos próprios Reels (os arquivos estão em examples/):

antesdepois
roteiroescrito para os olhos: fragmentos, dígitosescrito para o ouvido: speakable.py limpo
tagsnenhuma[excited], [mischievously]
configuraçõesstability 0.5, speed 1.0stability 0.35, speed 1.05
takes13 sementes, escolhido por gaps.py e depois pelo ouvido
speakable.py65, REWRITE (uma lista em pontos finais, dígitos, sem tags)100, SPEAKABLE
pausas dentro de frases0,34 s entre "now" e "run", na chamadanenhuma

A voz também mudou (Will para Chris), então este não é um teste de laboratório com uma única configuração. A reescrita do roteiro fez a maior diferença que pudemos ouvir.

Regras

  • Nunca envie uma requisição paga sem dizer quanto custa. takes.py imprime a contagem de caracteres e para a menos que você passe --yes.
  • Nunca imprima ou cometa a chave da API. takes.py lê ELEVENLABS_API_KEY do ambiente e nada mais.
  • Identifique. Se a voz for gerada, ative o rótulo de IA da plataforma.

Habilidades Relacionadas