Эмбеддинги спикеров
Извлечение 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
# Извлечь эмбеддинг спикера
.build/release/audio embed-speaker voice.wav
# JSON-вывод (включает 256-мерный вектор)
.build/release/audio embed-speaker voice.wav --json
# Выбрать движок инференса
.build/release/audio embed-speaker voice.wav --engine coreml
Опции
| Опция | Описание |
|---|---|
--engine | Движок инференса: mlx или coreml |
--json | Формат вывода JSON с полным вектором эмбеддинга |
Сценарии использования
Верификация спикера
Сравните два аудиосэмпла, чтобы определить, принадлежат ли они одному спикеру. Извлеките эмбеддинги обоих и вычислите косинусное сходство. Более высокое значение сходства указывает на более высокую вероятность того, что это один и тот же спикер.
import SpeechVAD
let model = try await WeSpeaker.loadFromHub()
let embedding1 = try await model.embed(audioFile: "sample1.wav")
let embedding2 = try await model.embed(audioFile: "sample2.wav")
let similarity = cosineSimilarity(embedding1, embedding2)
print("Similarity: \(similarity)") // > 0.7 обычно один и тот же спикер
Идентификация спикера
Сопоставьте неизвестный аудиосэмпл с базой данных зарегистрированных эмбеддингов спикеров. Зарегистрированный спикер с наибольшим косинусным сходством является предсказанной идентичностью.
Голосовой поиск
Проиндексируйте коллекцию аудиозаписей по эмбеддингу спикера, затем сделайте запрос с новым аудиосэмплом, чтобы найти все записи от того же спикера.
Эмбеддинги спикеров лучше всего работают с чистой речью длиной не менее 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 WeSpeaker.loadFromHub()
// Извлечь эмбеддинг из файла
let embedding = try await model.embed(audioFile: "voice.wav")
print("Embedding dimensions: \(embedding.count)") // 256
// Извлечь эмбеддинг из аудио-сэмплов
let samples: [Float] = loadAudio("voice.wav")
let embedding = try await model.embed(samples: samples, sampleRate: 16000)