import os import re import subprocess from openai import OpenAI from constantes import YOUTUBE_COOKIE_PATH from file_util import File_Util class Audio_Util: """ Manipulação de audio """ @staticmethod def download_audio_from_url(url: str, output_path: str, audio_file_name: str) -> str: """ Baixa um arquivo de áudio a partir de uma URL. Args: url: url do audio output_path: local esperado para gravação do audio audio_file_name: nome do arquivo que deve ser utilizado para download """ audio_path = f'{output_path}/{audio_file_name}.%(ext)s' print(f"Baixando áudio de {url} para {audio_path}...") try: # Comando yt-dlp para baixar o melhor áudio disponível e convertê-lo para mp3 command = [ 'yt-dlp', "--cookies", YOUTUBE_COOKIE_PATH, '-f', 'bestaudio[ext=m4a]', '-o', audio_path, url ] result = subprocess.run(command, check=True, capture_output=True, text=True) lista_arquivos = File_Util.retirar_sufixo_codec_arquivo(output_path) print("Download de áudio concluído com sucesso.") return f"{output_path}/{lista_arquivos[0]}" 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 @staticmethod def extract_text_from_audio_file(audio_path: str) -> 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"{audio_path}" 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) print("========== Texto do Audio ===========") print(only_text) print("======================================") return formatted_text except Exception as e: print(f"Erro ao transcrever áudio: {e}") return ""