import json
import requests
import os
from moviepy.editor import ImageClip, AudioFileClip
--- Configurações ---
Carregar configurações
try:
with open("config.json", "r") as f:
config = json.load(f)
except FileNotFoundError:
print("❌ ERRO: O arquivo 'config.json' não foi encontrado.")
print("Por favor, crie um arquivo config.json com suas chaves de API.")
raise SystemExit("Encerrando o script.")
if not openrouter_key:
print("❌ ERRO: 'openrouter_api_key' não encontrada em config.json.")
raise SystemExit("Encerrando o script.")
if not eleven_key:
print("❌ ERRO: 'elevenlabs_api_key' não encontrada em config.json.")
raise SystemExit("Encerrando o script.")
if not huggingface_key:
print("❌ ERRO: 'huggingface_api_key' não encontrada em config.json.")
raise SystemExit("Encerrando o script.")
--- Funções ---
Função para gerar roteiro com OpenRouter
def gerar_roteiro_openrouter(prompt, api_key):
url = "https://openrouter.ai/api/v1/chat/completions"
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json",
}
data = {
"model": "openai/gpt-3.5-turbo", # Ou outro modelo de sua escolha disponível no OpenRouter
"messages": [{"role": "user", "content": prompt}],
"max_tokens": 500,
}
print("📝 Gerando roteiro com OpenRouter (GPT-3.5-Turbo)... Aguarde...")
response = requests.post(url, headers=headers, json=data)
if response.status_code != 200:
print("❌ ERRO na requisição para OpenRouter:")
print(f"Status: {response.status_code}")
print(f"Resposta da API: {response.text}")
raise SystemExit("Encerrando o script por erro na API do OpenRouter.")
print("✔ Roteiro gerado com sucesso.")
return response.json()["choices"][0]["message"]["content"]
Função para gerar imagem com Hugging Face (Stable Diffusion)
headers = {
"Authorization": f"Bearer {huggingface_key}",
"Content-Type": "application/json"
}
payload = {
"inputs": prompt
}
print("🎨 Gerando imagem com Hugging Face (Stable Diffusion v1.5)... Aguarde...")
response = requests.post(url, headers=headers, json=payload)
if response.status_code != 200:
print("❌ ERRO ao gerar imagem:")
print(f"Status: {response.status_code}")
print(f"Resposta da API (texto): {response.text}")
raise SystemExit("Erro ao gerar imagem com Hugging Face. Verifique o modelo e a chave da API.")
image_bytes = response.content
if not image_bytes:
print("❌ ERRO: A API do Hugging Face retornou conteúdo de imagem vazio.")
raise SystemExit("Erro ao gerar imagem com Hugging Face: conteúdo vazio.")
print(f"✔ Imagem gerada com sucesso. Tamanho: {len(image_bytes)} bytes.")
return image_bytes
--- Processo Principal ---
1. Gerar roteiro bizarro com OpenRouter
prompt = """
Crie um roteiro curto e bizarro para um vídeo de até 30 segundos. Tema: Um cara está fritando hambúrguer.
Quando alguém pergunta se o lanche está pronto, o hambúrguer vira ele e ele vira o hambúrguer na frigideira.
O tom deve ser engraçado e surreal. Fale como se fosse um diálogo falado por um narrador.
"""
os.makedirs("audios", exist_ok=True)
roteiro_path = "audios/roteiro.txt"
with open(roteiro_path, "w", encoding="utf-8") as f:
f.write(roteiro)
print(f"Roteiro salvo em: {roteiro_path}")
2. Gerar imagem com Hugging Face
imagem_prompt = "um homem assustado fritando hambúrguer, e o rosto dele aparece no hambúrguer, estilo surreal, engraçado, cores vibrantes, alta qualidade"
imagem_binaria = gerar_imagem_huggingface(imagem_prompt, huggingface_key)
os.makedirs("imagens", exist_ok=True)
imagem_path = "imagens/fritador.png"
with open(imagem_path, "wb") as f:
f.write(imagem_binaria)
print(f"Imagem salva em: {imagem_path}")
if res.status_code != 200:
print("❌ ERRO ao gerar voz com ElevenLabs:")
print(f"Status: {res.status_code}")
print(f"Resposta da API: {res.text}")
raise SystemExit("Encerrando o script por erro na API do ElevenLabs.")
audio_path = "audios/voz.mp3"
with open(audio_path, "wb") as f:
f.write(res.content)
print(f"Áudio salvo em: {audio_path}")
4. Montar vídeo com imagem e voz
print("🎬 Montando vídeo com imagem e áudio... Pode demorar um pouco...")
imagem = ImageClip(imagem_path).set_duration(10).resize(height=720) # Define duração inicial. O áudio ajustará
audio = AudioFileClip(audio_path)
Define a duração da imagem como a duração do áudio para que o vídeo não termine antes do áudio
imagem = imagem.set_duration(audio.duration)
video = imagem.set_audio(audio)
os.makedirs("videos", exist_ok=True)
final_video_path = "videos/hamburguer_final.mp4"
video.write_videofile(final_video_path, fps=24) # fps=24 é um bom padrão
print(f"✅ VÍDEO CRIADO COM SUCESSO EM: {final_video_path}")
input("Pressione Enter para sair...")