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 ""