Реалізація ідентифікації мовця (Speaker Identification)

Проектуємо та впроваджуємо системи штучного інтелекту: від прототипу до production-ready рішення. Наша команда поєднує експертизу в машинному навчанні, дата-інжинірингу та MLOps, щоб AI працював не в лабораторії, а в реальному бізнесі.
Показано 1 з 1Усі 1566 послуг
Реалізація ідентифікації мовця (Speaker Identification)
Середній
від 1 тижня до 3 місяців
Часті запитання

Напрямки AI-розробки

Етапи розробки AI-рішення

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1282
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1196
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    901
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1119
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    586
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    853

Реалізація ідентифікації промовця (Speaker Identification) Speaker Identification — визначення особистості промовця з бази відомих голосів. На відміну від діаризації («хто говорив колись»), тут треба відповісти «хто ця людина». Застосовується в системах автентифікації, персоналізованих помічників, моніторингу ефіру. ### Архітектура системи```

Audio → VAD → Speaker Encoder → Embedding → Similarity Search → Identity (ECAPA-TDNN) (d-vector) (cosine / ANN) ### Вилучення speaker embeddingspython from speechbrain.pretrained import SpeakerRecognition import torchaudio import torch

ECAPA-TDNN — state-of-the-art архитектура

model = SpeakerRecognition.from_hparams( source="speechbrain/spkrec-ecapa-voxceleb", savedir="tmp_spkrec" )

def get_embedding(audio_path: str) -> torch.Tensor: signal, sr = torchaudio.load(audio_path) if sr != 16000: signal = torchaudio.functional.resample(signal, sr, 16000) embedding = model.encode_batch(signal) return embedding.squeeze()

Регистрация нового говорящего

def register_speaker(name: str, audio_samples: list[str]): embeddings = [get_embedding(p) for p in audio_samples] mean_embedding = torch.stack(embeddings).mean(0) return mean_embedding # сохраняем в базу ### Пошук по базі голосівpython import faiss import numpy as np

Индекс для быстрого поиска (миллионы голосов)

index = faiss.IndexFlatIP(192) # cosine similarity через inner product speaker_names = []

def add_speaker(name: str, embedding: torch.Tensor): emb_np = embedding.numpy().reshape(1, -1) faiss.normalize_L2(emb_np) index.add(emb_np) speaker_names.append(name)

def identify_speaker(audio_path: str, threshold: float = 0.75) -> str: embedding = get_embedding(audio_path).numpy().reshape(1, -1) faiss.normalize_L2(embedding) distances, indices = index.search(embedding, k=1) score = float(distances[0][0]) if score >= threshold: return speaker_names[indices[0][0]] return "UNKNOWN"