/audio/speech é fácil. Narrar um artigo real é onde os problemas interessantes aparecem: o endpoint aceita no máximo 4096 caracteres por requisição, cada voz pertence a um modelo específico, os formatos de áudio diferem de modelo para modelo, e texto escrito para ser lido não se parece em nada com texto escrito para ser ouvido.
Neste tutorial trabalhamos os quatro pontos. O resultado é um script que transforma uma URL em um único arquivo de áudio:
- Escolher um modelo e uma voz adequados para narração de textos longos
- Fazer uma única requisição de fala e salvar o áudio
- Dividir um artigo longo em pedaços que caibam no limite de caracteres
- Unir os pedaços sintetizados em um único arquivo sem emendas audíveis
- Reescrever o artigo em algo que valha a pena ouvir
- Combinar as peças, e então dar uma olhada em streaming para uso interativo
Configuração
Você precisa do Python 3.9 ou mais recente, do pacoterequests e de uma chave de API Venice.
1. Escolha um modelo e uma voz
Vozes pertencem a modelos. Enviar uma voz de uma família para um modelo de outra é o erro inicial mais comum, então comece listando o que cada modelo realmente aceita:model_spec.voices é a lista autoritativa de vozes de um modelo, e supported_formats diz quais valores de response_format ele aceita. Remova o | length da consulta para imprimir os nomes das vozes.
Vamos usar tts-xai-v1 com a voz eve. Ele suporta pcm, o que torna a união dos pedaços simples na seção 4.
A velocidade de síntese varia muito mais entre modelos TTS do que a qualidade da saída, e a diferença é grande o suficiente para mudar sua arquitetura. Meça uma requisição realista contra dois ou três candidatos antes de se comprometer. Um pedaço que um modelo retorna em poucos segundos pode levar vários minutos em outro.
2. Faça uma única requisição
O corpo da resposta é áudio bruto, e não JSON, então escreva os bytes diretamente em um arquivo.3. Divida o texto no limite de 4096 caracteres
O campoinput aceita no máximo 4096 caracteres. Textos mais longos são rejeitados imediatamente, em vez de silenciosamente truncados:
narrate.py:
max_chars padrão é 1500, e não algo próximo do teto de 4096, e isso é intencional. O tempo de síntese cresce com o comprimento da entrada, então pedaços menores retornam mais cedo e, como executam em paralelo, terminam o trabalho todo mais rápido. Eles também tornam as tentativas de repetição baratas quando uma requisição falha.
4. Una os pedaços em um único arquivo
Concatenar áudio codificado como MP3 é pouco confiável, porque cada pedaço carrega seus próprios cabeçalhos de frame. Solicitarpcm evita o problema por completo. PCM é composto por amostras brutas sem contêiner, então unir é apenas concatenar bytes, e o módulo wave da biblioteca padrão do Python escreve o cabeçalho para nós.
ThreadPoolExecutor.map retorna os resultados na ordem em que as entradas foram submetidas, então os pedaços chegam em ordem de leitura mesmo tendo sido sintetizados ao mesmo tempo.
Para descobrir a taxa de qualquer modelo, peça um clipe curto como wav e leia o cabeçalho que ele devolve:
5. Prepare o texto para soar bem
Markdown extraído lido em voz alta literalmente é quase impossível de escutar. URLs são o exemplo mais claro. Um modelo de fala soletra caractere por caractere, entãohttps://docs.venice.ai/llms.txt sai como:
h t t p s dois-pontos barra barra docs ponto venice ponto a i l l m s ponto t x tCabeçalhos, marcadores de lista, tabelas e blocos de código causam versões menores do mesmo problema. Em vez de brigar com Markdown usando expressões regulares, podemos pedir a um modelo de chat que reescreva o artigo como algo destinado a ser falado. Crie
article_to_audio.py:
URL_PATTERN fica como rede de segurança para o link ocasional que o modelo deixe passar.
6. Juntando tudo
O ponto de entrada faz o scrape, escreve o roteiro, o salva e narra:script.txt ao lado do áudio vale as duas linhas. Quando uma narração soa errada, o roteiro quase sempre mostra por quê, e você pode corrigir sem pagar para sintetizar de novo.
Venice is built on a simple but powerful principle. User privacy comes first. The platform’s entire architecture flows from this philosophical commitment.
Streaming para uso interativo
A narração em lote otimiza o tempo total. Uma interface de voz tem a prioridade oposta, que é entregar o primeiro áudio o mais rápido possível. Definirstreaming: true retorna o corpo frase a frase à medida que é gerado, então a reprodução pode começar em cerca de um segundo em vez de esperar pelo clipe completo.
pcm a mp3 quando estiver alimentando a Web Audio API de um navegador ou um dispositivo de áudio diretamente, pois não precisa de etapa de decodificação.
Opções de requisição que vale a pena conhecer
Erros
Como os pedaços são independentes, uma falha custa no máximo um deles, e refazer
synthesize para esse pedaço é sempre seguro.
Próximos passos
Algumas extensões naturais a partir daqui:- Faça cache do áudio por um hash do texto, voz e modelo, para que parágrafos inalterados nunca sejam sintetizados novamente.
- Substitua por uma voz clonada com Clonagem de Voz, para que a narração use a sua própria.
- Gere o texto de origem em vez de fazer scrape, usando Respostas com Citações usando Web Search.
- Adicione áudio de introdução ou de fundo com Música e Efeitos Sonoros.
Texto para Fala
Referência para o endpoint de fala e seus parâmetros.
Clonagem de Voz
Narre com uma voz personalizada em vez de uma predefinida.
Respostas com Citações usando Web Search
Gere o texto que esta ferramenta narra.
Fala para Texto
Transcreva áudio para verificar uma narração de ponta a ponta.