PGVector para voz: análisis en profundidad de embeddings de alta dimensión
November 5, 2024
•min read
Ingeniería
Por el equipo de IdentityCall AI | Ingeniería | 10 min de lectura
Del audio a las matemáticas
¿Cómo buscas una “voz” en una base de datos? No puedes consultar WHERE voice = 'John'.
Necesitas embeddings vectoriales.
Este artículo explica cómo IdentityCall utiliza PostgreSQL + pgvector para realizar una identificación biométrica ultrarrápida sobre millones de huellas de voz.
El pipeline de vectorización
- Generación del espectrograma: el audio crudo (WAV) se convierte en un cepstrum de frecuencias Mel (espectrograma).
- Red codificadora (ResNet/interaction): una red neuronal profunda procesa el espectrograma, similar a una imagen.
- Extracción del embedding: la penúltima capa de la red produce un arreglo de números de tamaño fijo (float32).
- Dimensión: 256 para Voice ID (compacto, centrado en la identidad).
- Dimensión: 768 para búsqueda semántica (más rico, centrado en el significado).
Ejemplo de embedding: [-0.024, 0.551, -0.112, ...]
¿Por qué PGVector?
Tradicionalmente, los vectores se almacenaban en bases de datos especializadas (Pinecone, Milvus).
pgvector nos permite almacenar los embeddings junto a los datos relacionales (ID de usuario, registros de llamadas) en nuestra base de datos Postgres principal.
La distancia de “similitud coseno”
Para encontrar una coincidencia, no buscamos una coincidencia exacta (el audio nunca es idéntico). Buscamos el “vecino más cercano” en el espacio de 256 dimensiones.
Usamos la distancia coseno (que identifica el ángulo entre dos vectores).
- Distancia 0.0: idénticos.
- Distancia < 0.2: coincidencia de alta confianza (mismo hablante).
- Distancia > 0.4: hablante diferente.
Indexación para ganar velocidad (IVFFlat vs HNSW)
Escanear 1 millón de vectores de forma lineal es demasiado lento (¡latencia!). Usamos indexación.
- HNSW (Hierarchical Navigable Small World): el estándar de oro. Construye un grafo que permite a la búsqueda “acercarse” al vecindario relevante de vectores en milisegundos.
-- Example PGVector Query
SELECT id, speaker_name, 1 - (embedding <=> '[...]'::vector) AS confidence
FROM voice_profiles
ORDER BY embedding <=> '[...]'::vector
LIMIT 1;
La ventaja arquitectónica
Al mantener los vectores en Postgres, conservamos el cumplimiento ACID y la integridad referencial. Podemos eliminar un usuario y borrar en cascada sus vectores de voz al instante, una gran ventaja para el derecho al olvido del RGPD (GDPR).
Almacena la voz. Consulta las matemáticas. Construye con la API de IdentityCall.
Tags:
