Spaces:
Sleeping
Sleeping
File size: 6,856 Bytes
314503f |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 |
# -*- coding: utf-8 -*-
"""
Script para baixar um vídeo do YouTube, extrair frames, analisar com GPT-4o e contar aves.
"""
import os
import subprocess
import cv2
import base64
import time
import json
import re
# --- Configurações (Substitua os placeholders) ---
VIDEO_URL = "https://www.youtube.com/watch?v=L1vXCYZAYYM" # Substitua pela URL do vídeo do YouTube
RESULTS_FILE = os.path.join(OUTPUT_DIR, "analysis_results.json")
OUTPUT_DIR = "./video_analysis_output" # Diretório para salvar o vídeo e os frames
AUDIO_FILENAME = "downloaded_audio"
VIDEO_PATH = os.path.join(OUTPUT_DIR, AUDIO_FILENAME)
# Verifica se a URL foi definida
if VIDEO_URL == "URL_DO_SEU_VIDEO_AQUI":
print("AVISO: A URL do vídeo não foi definida. Por favor, edite o script e insira a URL desejada.")
# exit(1)
# --- Funções ---
def create_output_directory():
"""Cria o diretório de saída se não existir."""
if not os.path.exists(OUTPUT_DIR):
os.makedirs(OUTPUT_DIR)
print(f"Diretório criado: {OUTPUT_DIR}")
def retirar_sufixo_codec_arquivo(directory) -> None:
for filename in os.listdir(directory):
# Procura padrão como ".f123" antes da extensão
new_filename = re.sub(r'\.f\d{3}(?=\.\w+$)', '', filename)
if new_filename != filename:
old_path = os.path.join(directory, filename)
new_path = os.path.join(directory, new_filename)
os.rename(old_path, new_path)
print(f"Renomeado: {filename} → {new_filename}")
def download_audio(url, output_path):
"""Baixa apenas o áudio do YouTube usando yt-dlp."""
print(f"Baixando áudio de {url} para {output_path}...")
try:
# Comando yt-dlp para baixar o melhor áudio disponível e convertê-lo para mp3
command = [
'yt-dlp',
'-f', 'bestaudio',
'--extract-audio',
'--audio-format', 'mp3', # Pode ser 'mp3', 'm4a', 'wav', etc.
'-o', output_path,
url
]
result = subprocess.run(command, check=True, capture_output=True, text=True)
retirar_sufixo_codec_arquivo(OUTPUT_DIR)
print("Download de áudio concluído com sucesso.")
return True
except subprocess.CalledProcessError as e:
print(f"Erro ao baixar o áudio: {e}")
print(f"Saída do erro: {e.stderr}")
return False
except FileNotFoundError:
print("Erro: O comando 'yt-dlp' não foi encontrado. Certifique-se de que ele está instalado e no PATH do sistema.")
return False
# --- Atualização do Bloco Principal ---
# (Adicionar inicialização do cliente OpenAI e o loop de análise)
if __name__ == "__main__":
create_output_directory()
# Etapa 1: Baixar o vídeo
video_downloaded_or_exists = False
if VIDEO_URL != "URL_DO_SEU_VIDEO_AQUI":
if download_video(VIDEO_URL, VIDEO_PATH):
print(f"Vídeo salvo em: {VIDEO_PATH}")
video_downloaded_or_exists = True
else:
print("Falha no download do vídeo. Pulando etapas dependentes.")
elif os.path.exists(VIDEO_PATH):
print(f"URL não fornecida, mas vídeo encontrado em {VIDEO_PATH}. Tentando processar.")
video_downloaded_or_exists = True
else:
print("URL do vídeo não fornecida e vídeo local não encontrado. Pulando download e extração.")
# Etapa 2: Extrair frames
if video_downloaded_or_exists:
extracted_frames = extract_frames(VIDEO_PATH, OUTPUT_DIR, FRAME_INTERVAL_SECONDS)
else:
print("Pulando extração de frames pois o vídeo não está disponível.")
# Etapa 3 e 4: Codificar e Analisar Frames
if extracted_frames and openai_client:
print(f"\nIniciando análise de {len(extracted_frames)} frames com {GPT_MODEL}...")
for frame_path in extracted_frames:
print(f"\nProcessando frame: {frame_path}")
# Extrai timestamp do nome do arquivo, se possível
timestamp_str = "unknown"
try:
# Exemplo: frame_0000_time_0.00s.png
parts = os.path.basename(frame_path).split('_')
if len(parts) >= 4 and parts[2] == 'time':
timestamp_str = parts[3].replace('s.png','')
except Exception:
pass # Mantém 'unknown' se o parsing falhar
# Codifica o frame
base64_image = encode_frame_to_base64(frame_path)
if base64_image:
# Analisa o frame com GPT-4o
# analysis_result = analyze_frame_with_gpt4o(openai_client, base64_image, PROMPT_TEXT)
result_entry = {
"frame_path": frame_path,
"timestamp_approx_sec": timestamp_str,
"analysis": f' pulado frame {frame_path}' #analysis_result
}
analysis_results_list.append(result_entry)
# Pausa opcional para evitar rate limiting
time.sleep(1) # Pausa de 1 segundo entre as chamadas
else:
print(f"Falha ao codificar o frame {frame_path}. Pulando análise.")
analysis_results_list.append({
"frame_path": frame_path,
"timestamp_approx_sec": timestamp_str,
"analysis": {"error": "Failed to encode frame to base64."}
})
print("\nAnálise de todos os frames concluída.")
elif not extracted_frames:
print("Nenhum frame foi extraído. Pulando etapa de análise.")
elif not openai_client:
print("Cliente OpenAI não inicializado (verifique a API Key). Pulando etapa de análise.")
# Próxima etapa: Compilar resultados
print(f"\nPróxima etapa a ser implementada: Compilação dos resultados ({len(analysis_results_list)} análises) em um relatório.")
# ... (código anterior para inicialização, download, extração, análise) ...
# Etapa 5: Compilar e Salvar Resultados
if analysis_results_list:
print(f"\nCompilando {len(analysis_results_list)} resultados da análise...")
if save_results_to_json(analysis_results_list, RESULTS_FILE):
print("Compilação e salvamento dos resultados concluídos.")
else:
print("Falha ao salvar os resultados da análise.")
else:
print("Nenhum resultado de análise para compilar.")
print("\n--- Processo de Análise de Vídeo Concluído ---")
print(f"Verifique o diretório '{OUTPUT_DIR}' para os frames extraídos (se aplicável).")
print(f"Verifique o arquivo '{RESULTS_FILE}' para os resultados da análise (se aplicável).")
print("Lembre-se de substituir os placeholders para URL_DO_SEU_VIDEO_AQUI e SUA_CHAVE_API_OPENAI_AQUI no script.")
|