/audio/speech e o resultado da conversão para a voz George. As formas de onda estão no mesmo eixo de tempo, e os intervalos entre as frases caem nos mesmos lugares.

/audio/voice-changer/: quote cota o preço de uma duração, queue envia a gravação e faz a cobrança, retrieve faz polling até o MP3 ficar pronto e complete exclui a mídia armazenada depois que você a obtém. O formato é o mesmo dos endpoints de música, mas o caminho é diferente e um não aceita os modelos do outro.
Os exemplos pressupõem que VENICE_API_KEY está definida:
Escolha um modelo
Os modelos de trocador de voz ficam emGET /models?type=music com model_spec.voice_changer definido como true; não há um filtro de tipo dedicado. No momento existe apenas um, elevenlabs-voice-changer: ele aceita origens mp3, wav, ogg, mp4 ou aac de até 300 segundos, oferece 20 vozes nomeadas com Aria como padrão, aceita um Voice ID bruto da ElevenLabs no lugar de um nome e suporta remove_background_noise e seed. Esses detalhes podem mudar, então leia-os da API. Esta consulta retorna tudo de que o restante do guia depende:
400. Uma gravação mais longa que max_source_audio_duration_seconds retorna 422 antes de qualquer cobrança, com o limite na mensagem.
Uma coisa que a API não verifica no momento do queue é o nome da voz. Se você enfileirar uma voice que o modelo não tem, ainda assim recebe 200 e um queue_id; a rejeição chega no primeiro retrieve, com a cobrança reembolsada. Você recebe o dinheiro de volta, mas perde a viagem de ida e volta, então verifique voices antes de enfileirar.
1. Obtenha uma cotação de preço
A cobrança é feita pela duração da gravação de origem, arredondada para cima para o próximo minuto inteiro. Paraelevenlabs-voice-changer, isso significa $0.35 para qualquer coisa até 60 segundos, $0.69 até 120, $1.04 até 180, $1.38 até 240 e $1.73 até 300. Um clipe de 7 segundos custa o mesmo que um de 60 segundos, e 60,5 segundos são cobrados como dois minutos. Se você tem muitos segmentos curtos, junte-os em um único arquivo que fique abaixo de um limite de minuto, em vez de enfileirar cada um separadamente. As faixas vêm de pricing.durations em /models.
A cotação recebe um número inteiro de segundos e não precisa de chave de API:
2. Enfileire a conversão
Envie a gravação como uploadfile multipart ou como um audio_url em um corpo JSON, mas não ambos. Uma URL precisa ser publicamente acessível sem cabeçalhos ou cookies; a Venice busca os bytes por conta própria e nunca repassa a URL ao provedor. A Venice verifica os bytes, não a extensão, então o arquivo precisa realmente estar em um dos contêineres aceitos, e arquivos com faixa de vídeo são rejeitados.
Com curl -F, não mexa no Content-Type para que o curl possa definir o boundary do multipart, e envie remove_background_noise como true/false e seed como dígitos.
voice para usar default_voice. Quando supports_custom_voice_id é true, voice também pode ser um Voice ID do provedor; para elevenlabs-voice-changer, isso significa qualquer voz da ElevenLabs à qual você tenha acesso, incluindo vozes da biblioteca que não estão na lista voices da Venice. remove_background_noise e seed são aceitos somente quando o modelo informa suporte a eles.
A resposta fornece o identificador para tudo o que vem a seguir:
duration_seconds é a duração que a Venice mediu e a faixa na qual você foi cobrado. Se você cotou 60 e aqui aparece 61.2, você pagou por dois minutos. Guarde model e queue_id; retrieve e complete precisam de ambos, e o ID vale por 24 horas.
A cobrança acontece neste momento, não quando o áudio volta, então não repita uma requisição de queue. Se você tem um queue_id, faça polling com ele. Se a resposta nunca chegou, enviar a gravação novamente pode gerar uma cobrança dupla. O queue é limitado a 40 requisições por minuto e o retrieve a 120; ambos informam x-ratelimit-remaining-requests.
3. Faça polling e baixe
Chame retrieve com os valores da resposta de queue:audio/mpeg e o corpo é o MP3. Decida com base no Content-Type.
Os dois números estão em milissegundos: quanto tempo os jobs desse modelo costumam levar e há quanto tempo o seu está em execução. A diferença é uma boa primeira espera, mas a média é apenas uma referência. Uma origem de 148 segundos levou 24 segundos contra uma média de 7, então em entradas mais longas execution_duration vai ultrapassar average_execution_time. Quando isso acontecer, passe a usar um intervalo fixo de alguns segundos e continue. Clipes curtos vão no sentido contrário: o exemplo de 7 segundos voltou já no primeiro polling.
A resposta concluída traz x-venice-audio-duration (segundos), x-venice-inference-time, x-venice-audio-format, x-venice-model-id e x-venice-model-name. A saída é sempre MP3 mono de 128 kbps a 44,1 kHz, independentemente do que você enviou. A duração do áudio deve coincidir com a da origem com diferença de poucos milissegundos; se a diferença for maior que isso, ouça antes de publicar.
Se falhar
Um job que o provedor aceitou e depois falhou volta como um status de erro comerror e credits_refunded no corpo. true significa que a cobrança foi estornada. false com uma mensagem terminando em “please contact support” significa que o próprio reembolso falhou e o próximo polling tentará novamente. O resultado fica armazenado, então fazer polling de novo o reproduz.
Um job que nunca chegou ao provedor tem outra aparência. O retrieve continua respondendo PROCESSING por até 10 minutos, depois retorna 504 e reembolsa você, então espere pelo menos esse tempo com um job em PROCESSING antes de considerá-lo travado. O conjunto completo de resultados terminais está na referência de retrieve.
Limpeza
Passedelete_media_on_completion: true em retrieve e a mídia armazenada será excluída na mesma chamada que entrega o áudio. Qualquer retrieve posterior para esse ID retorna 404. Se quiser baixar mais de uma vez, não use essa opção e chame complete quando terminar. O complete retorna {"success": true} e pode ser chamado repetidamente com segurança.
Exemplo completo
Tudo o que foi visto acima, de ponta a ponta: verifica se a voz existe, cota, envia, faz polling até o áudio chegar e o salva. O prazo é de 12 minutos para que uma falha de despacho apareça como reembolso e não como timeout.delete_media_on_completion e chame complete você mesmo se precisar do arquivo mais de uma vez.