Files
transcripcion-whisper/whisper-distributed/receiver/app.py

108 lines
3.3 KiB
Python
Raw Normal View History

2025-05-30 19:09:28 +02:00
#!/usr/bin/env python
import os
import time
import pika
import json
import logging
from pathlib import Path
from datetime import datetime
# Configuración de logging
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger('receiver')
# Configuración de RabbitMQ
RABBITMQ_HOST = 'rabbitmq'
RABBITMQ_USER = 'user'
RABBITMQ_PASS = 'password'
SPLIT_QUEUE = 'audio_split_queue'
# Directorios
INPUT_DIR = '/app/input'
SHARED_DIR = '/app/shared'
def connect_to_rabbitmq():
"""Establece conexión con RabbitMQ"""
tries = 0
while True:
try:
credentials = pika.PlainCredentials(RABBITMQ_USER, RABBITMQ_PASS)
connection = pika.BlockingConnection(
pika.ConnectionParameters(
host=RABBITMQ_HOST,
credentials=credentials
)
)
return connection
except pika.exceptions.AMQPConnectionError:
tries += 1
logger.warning(f"Intento {tries}: No se pudo conectar a RabbitMQ. Reintentando en 5 segundos...")
time.sleep(5)
def process_audio_file(filepath):
"""Procesa un archivo de audio y lo envía a la cola de RabbitMQ"""
filename = os.path.basename(filepath)
file_id = f"{int(datetime.now().timestamp())}_{filename}"
# Guardar una copia en el directorio compartido
shared_path = os.path.join(SHARED_DIR, file_id)
os.system(f"cp {filepath} {shared_path}")
# Enviar mensaje a RabbitMQ para procesamiento
connection = connect_to_rabbitmq()
channel = connection.channel()
# Declarar la cola
channel.queue_declare(queue=SPLIT_QUEUE, durable=True)
# Preparar mensaje
message = {
'file_id': file_id,
'filename': filename,
'filepath': shared_path,
'timestamp': datetime.now().isoformat()
}
# Publicar mensaje
channel.basic_publish(
exchange='',
routing_key=SPLIT_QUEUE,
body=json.dumps(message),
properties=pika.BasicProperties(
delivery_mode=2 # mensaje persistente
)
)
logger.info(f"Archivo {filename} enviado a la cola {SPLIT_QUEUE} con ID {file_id}")
connection.close()
def monitor_input_directory():
"""Monitorea el directorio de entrada para nuevos archivos de audio"""
# Asegurar que el directorio compartido existe
os.makedirs(SHARED_DIR, exist_ok=True)
# Crear conjunto de archivos ya procesados
processed_files = set()
logger.info(f"Iniciando monitoreo del directorio {INPUT_DIR}")
while True:
# Buscar archivos de audio en el directorio de entrada
audio_extensions = ['.mp3', '.wav', '.flac', '.m4a', '.ogg']
for ext in audio_extensions:
for audio_file in Path(INPUT_DIR).glob(f'*{ext}'):
filepath = str(audio_file)
if filepath not in processed_files:
logger.info(f"Nuevo archivo detectado: {filepath}")
process_audio_file(filepath)
processed_files.add(filepath)
# Esperar antes de volver a comprobar
time.sleep(10)
if __name__ == "__main__":
logger.info("Servicio receptor iniciado")
monitor_input_directory()