Experiencia Sonora
Cambiar Idioma
Lyra: Estoy aquí. ¿Qué quieres descubrir hoy?

Hola, soy Lyra, tu guía en este portafolio.

High-Performance Distributed Audio Processing | Edge AI Estado: Completado (Proyecto Universitario)

AudioDAS

Motor de procesamiento de audio distribuido con concurrencia extrema (hilos, semáforos, canales), Edge AI en el navegador y streaming eficiente (HTTP 206).

Portada de AudioDAS

Vista General del Proyecto

Diseñé y desarrollé AudioDAS, el motor de procesamiento para un Sistema de Asistencia Digital real. Implementé una Clean Architecture bajo un Monolito Modular en .NET 9. Optimicé el servidor usando el Task Parallel Library (TPL), el patrón Producer-Consumer con System.Threading.Channels, y control de concurrencia con SemaphoreSlim para evitar saturación de CPU. El sistema orquesta múltiples tareas en paralelo: compresión AAC con FFmpeg, filtrado de audio, y dos subprocesos Python consecutivos (Whisper + Flan-T5) para transcripción y resumen. Todo ello con un tiempo de respuesta p95 de 205 ms y 0% error bajo pruebas de estrés con k6. Además, implementé Edge AI en el frontend (ONNX Runtime WebAssembly) para validar el audio localmente antes de subirlo, reduciendo drásticamente el tráfico de red. El streaming final usa HTTP 206 Partial Content para reproducción instantánea sin descargas completas.

RolPerformance & Concurrency Engineer
ClienteProyecto académico – Laboratorio de Sistemas Distribuidos (Jala University)
DuraciónMarzo 2026 - Abril 2026
Año2026

Diseño de Arquitectura

Modular Monolith / Event-Driven Background ProcessingRESTful API v1 + HTTP 206 Partial Content
Diagrama de Contexto: Usuarios, Frontend con Edge AI, Backend .NET, Workers, FFmpeg y Modelos Python

Diagrama de Contexto: Usuarios, Frontend con Edge AI, Backend .NET, Workers, FFmpeg y Modelos Python

Diagrama de Contenedores: API .NET, Background Worker, Channel, PostgreSQL, Subprocesos Python y FFmpeg

Diagrama de Contenedores: API .NET, Background Worker, Channel, PostgreSQL, Subprocesos Python y FFmpeg

Módulos Core

Concurrencia extrema: Hilos, Semáforos y Channels

Implementación del patrón Producer-Consumer con System.Threading.Channels para encolar tareas sin bloqueo. Uso de SemaphoreSlim (configuración 2-2-2) para limitar el paralelismo: máximo 2 procesos FFmpeg simultáneos y 2 inferencias de IA. El worker consume tareas y lanza tres hilos paralelos con TPL (Task Parallel Library), logrando compresión y filtrado de audio en paralelo con IA, sin saturar el CPU ni bloquear las peticiones HTTP.

Edge AI en el cliente: ONNX Runtime WebAssembly

El frontend (Next.js) ejecuta el modelo Whisper-tiny (ONNX) dentro de un Web Worker. Decodifica el audio localmente con AudioContext, transcribe y valida el dominio (ej. 'economía') antes de la subida. Si no es válido, se rechaza el archivo; si lo es, se sube. Esto ahorra ancho de banda y evita procesar basura en el servidor.

Procesamiento paralelo en servidor con Python subprocesses

El worker principal lanza dos subprocesos Python secuenciales: primero Whisper (ggml-tiny.bin) para transcripción, luego Flan-T5-small para resumen. Ambos modelos se cargan una sola vez en RAM (Singleton) y se ejecutan bajo el mismo semáforo de IA, garantizando que no haya más de dos inferencias simultáneas. El resultado es un resumen de 50 caracteres optimizado para metadatos.

Compresión y normalización con FFmpeg (concurrente)

Dos tareas independientes ejecutan FFmpeg en paralelo: una comprime a AAC (para retención legal de 5 años), otra aplica filtro de eco y produce MP3 filtrado. Ambas comparten un semáforo de 2 instancias, por lo que nunca se supera el límite de procesos pesados. El resto de peticiones HTTP siguen respondiendo sin esperar.

Streaming inteligente con HTTP 206 Partial Content

El endpoint /stream soporta el header 'Range' y responde con '206 Partial Content' y 'Accept-Ranges: bytes'. El reproductor HTML5 puede solicitar solo el fragmento necesario (por ejemplo, bytes=0- para comenzar rápido). Al hacer seek, el navegador genera automáticamente nuevas peticiones de rango, descargando solo los bytes necesarios sin tener que cargar el archivo completo.

Pruebas de estrés y monitoreo de concurrencia

Suite de pruebas con k6 que simuló 1000 usuarios concurrentes subiendo archivos y reproduciendo streaming. Se midió el throughput, latencia p95 (205 ms) y uso de semáforos. Además, pruebas unitarias con xUnit, Moq y FluentAssertions cubren la lógica de dominio y aplicación.

Infraestructura contenerizada y despliegue reproducible

Docker multi-etapa con .NET 9 SDK y runtime, más FFmpeg preinstalado. Los modelos de IA (Whisper, Flan-T5) se empaquetan como volúmenes o se descargan en el primer arranque. El frontend Next.js se sirve desde otro contenedor. Todo orquestado con docker-compose para desarrollo y producción.

Tecnologías Implementadas

frontend

Next.js 16TypeScriptTailwind CSSONNX Runtime WebAssemblyReactWeb Workers

backend

.NET 9C#PostgreSQLEntity Framework CoreSystem.Threading.ChannelsTPLSemaphoreSlim

ai And Media

Whisper.net (ggml)FFmpegGoogle Flan-T5-smallONNX (Xenova/whisper-tiny)

tools

DockerDocker Composek6xUnitMoqFluentAssertions

Galería del Sistema

Captura 1 de AudioDAS
Captura 2 de AudioDAS
Captura 3 de AudioDAS
Captura 4 de AudioDAS
Captura 5 de AudioDAS