thaliszu/karionV4
0
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 