Эмбеддинги спикеров

Извлечение 256-мерных L2-нормализованных векторов спикеров через WeSpeaker ResNet34-LM. Эти эмбеддинги захватывают уникальные голосовые характеристики спикера и могут использоваться для идентификации, верификации и голосового поиска.

Архитектура

WeSpeaker ResNet34-LM — это глубокая резидуальная сеть, обученная для обучения представлений спикеров.

ЭтапДетали
InputConv2d (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-LMMLX~25 МБaufklarer/WeSpeaker-ResNet34-LM-MLX
WeSpeaker-ResNet34-LMCoreML~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