CoolFace
Apppublic

thaliszu/karionV4

sourceHugging Faceapache-2.0updated 1y agoView on Hugging Face
0likes
audio_processor_cloud.py205 linesDownload Raw Back to root
1import os2import json3import base644import tempfile5from pydub import AudioSegment6import speech_recognition as sr7 8class AudioProcessorCloud:9    """10    Classe para processamento de áudio compatível com ambientes cloud11    que utiliza armazenamento temporário em vez de arquivos persistentes.12    """13    14    def __init__(self):15        self.temp_dir = tempfile.mkdtemp()16        print(f"Diretório temporário para processamento de áudio: {self.temp_dir}")17    18    def processar_audio_base64(self, audio_base64, formato="wav"):19        """20        Processa áudio a partir de string base64 e retorna a transcrição.21        22        Args:23            audio_base64: String base64 contendo os dados do áudio24            formato: Formato do áudio (wav, mp3, etc.)25            26        Returns:27            Texto transcrito do áudio28        """29        try:30            # Decodificar base6431            audio_bytes = base64.b64decode(audio_base64)32            33            # Salvar em arquivo temporário34            temp_audio_path = os.path.join(self.temp_dir, f"temp_audio.{formato}")35            with open(temp_audio_path, "wb") as f:36                f.write(audio_bytes)37            38            # Converter para WAV se não for WAV39            if formato.lower() != "wav":40                audio = AudioSegment.from_file(temp_audio_path, format=formato)41                temp_wav_path = os.path.join(self.temp_dir, "temp_audio.wav")42                audio.export(temp_wav_path, format="wav")43                temp_audio_path = temp_wav_path44            45            # Transcrever áudio46            texto = self.transcrever_audio(temp_audio_path)47            48            # Limpar arquivos temporários49            try:50                os.remove(temp_audio_path)51                if formato.lower() != "wav":52                    os.remove(os.path.join(self.temp_dir, "temp_audio.wav"))53            except Exception as e:54                print(f"Aviso: Não foi possível remover arquivos temporários: {e}")55            56            return texto57        58        except Exception as e:59            print(f"Erro ao processar áudio base64: {e}")60            return f"Erro ao processar áudio: {str(e)}"61    62    def transcrever_audio(self, caminho_audio):63        """64        Transcreve áudio para texto usando reconhecimento de fala.65        66        Args:67            caminho_audio: Caminho para o arquivo de áudio68            69        Returns:70            Texto transcrito do áudio71        """72        try:73            recognizer = sr.Recognizer()74            75            with sr.AudioFile(caminho_audio) as source:76                audio_data = recognizer.record(source)77                78                # Tentar reconhecer com Google (requer conexão com internet)79                try:80                    texto = recognizer.recognize_google(audio_data, language="pt-BR")81                    return texto82                except sr.UnknownValueError:83                    return "Não foi possível entender o áudio"84                except sr.RequestError as e:85                    # Fallback para reconhecimento offline86                    try:87                        texto = recognizer.recognize_sphinx(audio_data, language="pt-br")88                        return texto89                    except:90                        return f"Erro no serviço de reconhecimento: {e}"91        92        except Exception as e:93            print(f"Erro ao transcrever áudio: {e}")94            return f"Erro ao transcrever áudio: {str(e)}"95    96    def processar_audio_upload(self, arquivo_upload):97        """98        Processa áudio a partir de um arquivo de upload e retorna a transcrição.99        Esta função é compatível com a interface Gradio.100        101        Args:102            arquivo_upload: Caminho para o arquivo de upload temporário103            104        Returns:105            Texto transcrito do áudio106        """107        try:108            # Determinar formato do arquivo109            nome_arquivo = os.path.basename(arquivo_upload)110            formato = nome_arquivo.split(".")[-1].lower()111            112            # Converter para WAV se não for WAV113            if formato != "wav":114                audio = AudioSegment.from_file(arquivo_upload, format=formato)115                temp_wav_path = os.path.join(self.temp_dir, "temp_upload.wav")116                audio.export(temp_wav_path, format="wav")117                arquivo_audio = temp_wav_path118            else:119                arquivo_audio = arquivo_upload120            121            # Transcrever áudio122            texto = self.transcrever_audio(arquivo_audio)123            124            # Limpar arquivos temporários125            if formato != "wav":126                try:127                    os.remove(temp_wav_path)128                except Exception as e:129                    print(f"Aviso: Não foi possível remover arquivo temporário: {e}")130            131            return texto132        133        except Exception as e:134            print(f"Erro ao processar áudio de upload: {e}")135            return f"Erro ao processar áudio: {str(e)}"136    137    def gravar_audio(self, segundos=5):138        """139        Grava áudio do microfone e retorna a transcrição.140        Esta função não é compatível com ambientes cloud sem acesso a hardware.141        142        Args:143            segundos: Duração da gravação em segundos144            145        Returns:146            Texto transcrito do áudio ou mensagem de erro147        """148        try:149            # Esta função não funcionará em ambientes cloud sem acesso a hardware150            return "A gravação de áudio não está disponível em ambientes cloud. Por favor, faça upload de um arquivo de áudio."151        152        except Exception as e:153            print(f"Erro ao gravar áudio: {e}")154            return f"Erro ao gravar áudio: {str(e)}"155    156    def limpar_temporarios(self):157        """158        Limpa todos os arquivos temporários criados durante o processamento.159        """160        try:161            for arquivo in os.listdir(self.temp_dir):162                caminho = os.path.join(self.temp_dir, arquivo)163                if os.path.isfile(caminho):164                    os.remove(caminho)165            166            return True167        except Exception as e:168            print(f"Erro ao limpar arquivos temporários: {e}")169            return False170 171# Função para adicionar à interface Gradio172def processar_audio_interface(arquivo_upload=None, audio_base64=None):173    """174    Função para processar áudio na interface Gradio.175    176    Args:177        arquivo_upload: Arquivo de áudio enviado pelo usuário178        audio_base64: String base64 contendo os dados do áudio179        180    Returns:181        Texto transcrito do áudio182    """183    try:184        processador = AudioProcessorCloud()185        186        if arquivo_upload:187            return processador.processar_audio_upload(arquivo_upload)188        elif audio_base64:189            # Remover cabeçalho da string base64 se presente190            if "," in audio_base64:191                audio_base64 = audio_base64.split(",")[1]192            193            return processador.processar_audio_base64(audio_base64)194        else:195            return "Nenhum áudio fornecido para processamento."196    197    except Exception as e:198        print(f"Erro ao processar áudio na interface: {e}")199        return f"Erro ao processar áudio: {str(e)}"200 201# Requisitos para adicionar ao requirements.txt:202# pydub>=0.25.1203# SpeechRecognition>=3.8.1204# firebase-admin>=5.3.0205