Final_Assignment_Template / tool_audio_extractor.py
gdms's picture
processador de imagem chamando GPT, mas falhando na contagem
f77d0ec
raw
history blame
5 kB
# -*- 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()