# -*- 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 import shutil from openai import OpenAI # --- Configurações (Substitua os placeholders) --- VIDEO_URL = "https://www.youtube.com/watch?v=1htKBjuUWec" # Substitua pela URL do vídeo do YouTube OUTPUT_DIR = "./audio_analysis_output" # Diretório para salvar o áudio AUDIO_FILENAME = "downloaded_audio" TRANSCRIPT_FILENAME = "transcript.txt" # 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_or_clear_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}") else: # Limpa todos os arquivos e subdiretórios for filename in os.listdir(OUTPUT_DIR): file_path = os.path.join(OUTPUT_DIR, filename) try: if os.path.isfile(file_path) or os.path.islink(file_path): os.unlink(file_path) elif os.path.isdir(file_path): shutil.rmtree(file_path) except Exception as e: print(f"Erro ao excluir {file_path}: {e}") print(f"Diretório limpo: {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): """Baixa apenas o áudio do YouTube usando yt-dlp.""" output_path = f'{OUTPUT_DIR}/{AUDIO_FILENAME}.%(ext)s' 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[ext=m4a]', '-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 def extract_text_from_audio() -> str: """ Usa a API Whisper da OpenAI para transcrever o áudio em texto com quebras de linha naturais, removendo timestamps e IDs. Salva em arquivo .txt se o caminho for fornecido. """ client = OpenAI(api_key=os.getenv("OPENAI_API_KEY")) try: audio_path = f"{OUTPUT_DIR}/{AUDIO_FILENAME}.m4a" print(f"Iniciando transcrição (formato SRT simplificado): {audio_path}") with open(audio_path, "rb") as audio_file: transcription = client.audio.transcriptions.create( model="whisper-1", file=audio_file, response_format="srt" ) # Remove linhas com números e timestamps lines = transcription.splitlines() only_text = [line.strip() for line in lines if not re.match(r"^\d+$", line) and "-->" not in line] formatted_text = "\n".join(only_text) # Salva em .txt se desejado output_txt_path = f"{OUTPUT_DIR}/{TRANSCRIPT_FILENAME}" with open(output_txt_path, "w", encoding="utf-8") as f: f.write(formatted_text) print(f"Transcrição salva em: {output_txt_path}") return formatted_text except Exception as e: print(f"Erro ao transcrever áudio: {e}") return "" # --- Atualização do Bloco Principal --- # (Adicionar inicialização do cliente OpenAI e o loop de análise) if __name__ == "__main__": create_or_clear_output_directory() # Etapa 1: Baixar o vídeo video_downloaded_or_exists = False if VIDEO_URL != "URL_DO_SEU_VIDEO_AQUI": if download_audio(VIDEO_URL): print(f"AUDIO salvo em: {OUTPUT_DIR}") video_downloaded_or_exists = True else: print("Falha no download do vídeo. Pulando etapas dependentes.") else: print("Vídeo não informado") extract_text_from_audio()