PGVector para voz: análise aprofundada de embeddings de alta dimensão
November 5, 2024
•min read
Engenharia
Pela equipa de IdentityCall AI | Engenharia | 10 min de leitura
Do áudio à matemática
Como se procura uma “voz” numa base de dados? Não se pode consultar WHERE voice = 'John'.
É preciso embeddings vetoriais.
Este artigo explica como a IdentityCall utiliza PostgreSQL + pgvector para realizar identificação biométrica ultrarrápida sobre milhões de impressões vocais.
O pipeline de vetorização
- Geração de espetrograma: O áudio bruto (WAV) é convertido num cepstro de frequência Mel (espetrograma).
- Rede codificadora (ResNet/interação): Uma rede neuronal profunda processa o espetrograma semelhante a uma imagem.
- Extração de embedding: A penúltima camada da rede produz um vetor de números de tamanho fixo (float32).
- Dimensão: 256 para Voice ID (compacto, focado na identidade).
- Dimensão: 768 para pesquisa semântica (mais rica, focada no significado).
Exemplo de embedding: [-0.024, 0.551, -0.112, ...]
Porquê o PGVector?
Tradicionalmente, os vetores eram armazenados em bases de dados especializadas (Pinecone, Milvus).
O pgvector permite-nos armazenar embeddings ao lado dos dados relacionais (ID de utilizador, registos de chamadas) na nossa base de dados Postgres principal.
A distância de “semelhança de cosseno”
Para encontrar uma correspondência, não procuramos uma correspondência exata (o áudio nunca é idêntico). Procuramos o “vizinho mais próximo” no espaço de 256 dimensões.
Usamos a distância de cosseno (que identifica o ângulo entre dois vetores).
- Distância 0.0: Idêntico.
- Distância < 0.2: Correspondência de alta confiança (mesmo locutor).
- Distância > 0.4: locutor diferente.
Indexação para velocidade (IVFFlat vs HNSW)
Percorrer 1 milhão de vetores linearmente é demasiado lento (latência!). Usamos indexação.
- HNSW (Hierarchical Navigable Small World): O padrão de referência. Constrói um grafo que permite à pesquisa “aproximar-se” da vizinhança relevante de vetores em milissegundos.
-- Exemplo de consulta PGVector
SELECT id, speaker_name, 1 - (embedding <=> '[...]'::vector) AS confidence
FROM voice_profiles
ORDER BY embedding <=> '[...]'::vector
LIMIT 1;
A vantagem da arquitetura
Ao manter os vetores no Postgres, mantemos a conformidade ACID e a integridade referencial. Podemos eliminar um utilizador e eliminar em cascata os seus vetores de voz instantaneamente — uma grande vantagem para o RGPD (direito ao esquecimento).
Armazene a voz. Consulte a matemática. Construa com a API da IdentityCall.
Tags:
