PGVector per la voce: analisi approfondita degli embedding ad alta dimensione
November 5, 2024
•min read
Ingegneria
A cura del team di IdentityCall AI | Ingegneria | 10 min di lettura
Dall’audio alla matematica
Come si cerca una “voce” in un database? Non si può interrogare WHERE voice = 'John'.
Servono gli embedding vettoriali.
Questo articolo spiega come IdentityCall utilizza PostgreSQL + pgvector per eseguire un’identificazione biometrica fulminea su milioni di impronte vocali.
Il pipeline di vettorizzazione
- Generazione dello spettrogramma: l’audio grezzo (WAV) viene convertito in un cepstrum a frequenze Mel (spettrogramma).
- Rete codificatrice (ResNet/interaction): una rete neurale profonda elabora lo spettrogramma, simile a un’immagine.
- Estrazione dell’embedding: il penultimo strato della rete produce un array di numeri di dimensione fissa (float32).
- Dimensione: 256 per Voice ID (compatta, focalizzata sull’identità).
- Dimensione: 768 per la ricerca semantica (più ricca, focalizzata sul significato).
Esempio di embedding: [-0.024, 0.551, -0.112, ...]
Perché PGVector?
Tradizionalmente, i vettori venivano memorizzati in database specializzati (Pinecone, Milvus).
pgvector ci permette di memorizzare gli embedding accanto ai dati relazionali (ID utente, log delle chiamate) nel nostro database Postgres principale.
La distanza di “similarità del coseno”
Per trovare una corrispondenza, non cerchiamo una corrispondenza esatta (l’audio non è mai identico). Cerchiamo il “vicino più prossimo” nello spazio a 256 dimensioni.
Usiamo la distanza del coseno (che individua l’angolo tra due vettori).
- Distanza 0.0: identici.
- Distanza < 0.2: corrispondenza ad alta confidenza (stesso parlante).
- Distanza > 0.4: parlante diverso.
Indicizzazione per la velocità (IVFFlat vs HNSW)
Scansionare linearmente 1 milione di vettori è troppo lento (latenza!). Usiamo l’indicizzazione.
- HNSW (Hierarchical Navigable Small World): lo standard di riferimento. Costruisce un grafo che permette alla ricerca di “concentrarsi” sul vicinato di vettori rilevante in millisecondi.
-- Example PGVector Query
SELECT id, speaker_name, 1 - (embedding <=> '[...]'::vector) AS confidence
FROM voice_profiles
ORDER BY embedding <=> '[...]'::vector
LIMIT 1;
Il vantaggio architetturale
Mantenendo i vettori in Postgres, conserviamo la conformità ACID e l’integrità referenziale. Possiamo eliminare un utente e cancellare a cascata i suoi vettori vocali all’istante—un enorme vantaggio per il GDPR (diritto all’oblio).
Memorizzi la voce. Interroghi la matematica. Costruisca con l’API di IdentityCall.
Tags:
