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

Извлечение 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

# Извлечь эмбеддинг спикера
.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-LMMLX~25 МБaufklarer/WeSpeaker-ResNet34-LM-MLX
WeSpeaker-ResNet34-LMCoreML~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)