Эмбеддинги спикеров
Извлечение 256-мерных L2-нормализованных векторов спикеров через WeSpeaker ResNet34-LM. Эти эмбеддинги захватывают уникальные голосовые характеристики спикера и могут использоваться для идентификации, верификации и голосового поиска.
Архитектура
WeSpeaker ResNet34-LM — это глубокая резидуальная сеть, обученная для обучения представлений спикеров.
| Этап | Детали |
|---|---|
| Input | Conv2d (1 в 32 канала) |
| ResNet34 | [3, 4, 6, 3] резидуальных блоков |
| Stats Pooling | Среднее + стандартное отклонение по времени |
| Проекция | Linear (5120 в 256) |
| Выход | L2-нормализованный 256-мерный эмбеддинг |
Размер модели: ~6.6M параметров, ~25 МБ на диске.
Мел-признаки
Модель использует 80-мерные мел-частотные признаки, вычисленные с окном Хэмминга. Логарифмическое масштабирование использует простую формулу log(max(mel, 1e-10)) без дополнительной нормализации. Батч-нормализация сливается в Conv2d-слои на этапе конвертации для эффективности инференса.
Использование CLI
# Extract speaker embedding
.build/release/speech embed-speaker voice.wav
# JSON output (includes the 256-dim vector)
.build/release/speech embed-speaker voice.wav --json
# Choose inference engine
.build/release/speech embed-speaker voice.wav --engine coreml
Опции
| Опция | Описание |
|---|---|
--engine | Движок инференса: mlx или coreml |
--json | Формат вывода JSON с полным вектором эмбеддинга |
Сценарии использования
Верификация спикера
Сравните два аудиосэмпла, чтобы определить, принадлежат ли они одному спикеру. Извлеките эмбеддинги обоих и вычислите косинусное сходство. Более высокое значение сходства указывает на более высокую вероятность того, что это один и тот же спикер.
import SpeechVAD
let model = try await WeSpeakerModel.fromPretrained()
let samples1: [Float] = loadAudio("sample1.wav")
let samples2: [Float] = loadAudio("sample2.wav")
let embedding1 = model.embed(audio: samples1, sampleRate: 16000)
let embedding2 = model.embed(audio: samples2, sampleRate: 16000)
let similarity = WeSpeakerModel.cosineSimilarity(embedding1, embedding2)
print("Similarity: \(similarity)") // > 0.7 typically same speaker
Идентификация спикера
Сопоставьте неизвестный аудиосэмпл с базой данных зарегистрированных эмбеддингов спикеров. Зарегистрированный спикер с наибольшим косинусным сходством является предсказанной идентичностью.
Голосовой поиск
Проиндексируйте коллекцию аудиозаписей по эмбеддингу спикера, затем сделайте запрос с новым аудиосэмплом, чтобы найти все записи от того же спикера.
Эмбеддинги спикеров лучше всего работают с чистой речью длиной не менее 2-3 секунд. Очень короткие клипы или зашумлённые записи могут давать менее надёжные эмбеддинги. Для шумного аудио рассмотрите применение улучшения речи сначала.
Загрузка моделей
| Модель | Бэкенд | Размер | HuggingFace |
|---|---|---|---|
| WeSpeaker-ResNet34-LM | MLX | ~25 МБ | aufklarer/WeSpeaker-ResNet34-LM-MLX |
| WeSpeaker-ResNet34-LM | CoreML | ~25 МБ | aufklarer/WeSpeaker-ResNet34-LM-CoreML |
Swift API
import SpeechVAD
let model = try await WeSpeakerModel.fromPretrained()
// Extract embedding from audio samples
let samples: [Float] = loadAudio("voice.wav")
let embedding = model.embed(audio: samples, sampleRate: 16000)
print("Embedding dimensions: \(embedding.count)") // 256