Spaces:
Sleeping
Sleeping
File size: 3,035 Bytes
30944a6 5468aff 30944a6 |
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 |
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 ""
|