Speaker Embedding

Trích xuất các vector người nói 256 chiều đã chuẩn hoá L2 bằng WeSpeaker ResNet34-LM. Những embedding này nắm bắt các đặc trưng giọng nói riêng biệt của một người nói và có thể dùng cho định danh, xác minh và tìm kiếm bằng giọng nói.

Kiến trúc

WeSpeaker ResNet34-LM là một mạng dư sâu được huấn luyện cho học biểu diễn người nói.

Giai đoạnChi tiết
Đầu vàoConv2d (1 sang 32 kênh)
ResNet34Khối dư [3, 4, 6, 3]
Stats PoolingTrung bình + độ lệch chuẩn theo thời gian
Phép chiếuLinear (5120 sang 256)
Đầu raEmbedding 256 chiều đã chuẩn hoá L2

Kích thước mô hình: ~6.6M tham số, ~25 MB trên đĩa.

Đặc trưng mel

Mô hình dùng đặc trưng mel 80 chiều tính với cửa sổ Hamming. Phép co log dùng công thức đơn giản log(max(mel, 1e-10)) không cần chuẩn hoá thêm. Batch normalization được hợp nhất vào các lớp Conv2d tại thời điểm chuyển đổi để tăng hiệu quả suy luận.

Sử dụng 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

Tuỳ chọn

Tuỳ chọnMô tả
--enginemlx hoặc coreml cho WeSpeaker; redimnet2 cho định danh có tên; camplusplus cho nhân bản CosyVoice
--jsonĐịnh dạng đầu ra JSON với toàn bộ vector embedding

Định danh giọng nói có tên bằng ReDimNet2-B6

Dùng --engine redimnet2 để đối chiếu giọng nói sạch giữa nhiều bản ghi. Mô hình trả về embedding 192 chiều đã chuẩn hoá từ ít nhất hai giây lời nói. Cửa sổ CoreML cố định sáu giây lặp lại mẫu ngắn và cắt giữa mẫu dài hơn.

Các không gian embedding riêng biệt

ReDimNet2 dành cho hồ sơ giọng nói có tên. Diarization tiếp tục dùng embedding WeSpeaker riêng. Không thể so sánh ReDimNet2, WeSpeaker độc lập và centroid của Community-1 với nhau.

Tình huống sử dụng

Xác minh người nói

So sánh hai mẫu âm thanh để xác định chúng có cùng người nói hay không. Trích xuất embedding của cả hai rồi tính độ tương đồng cosine. Điểm tương đồng càng cao thì xác suất cùng người nói càng cao.

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

Định danh người nói

So khớp một mẫu âm thanh chưa biết với cơ sở dữ liệu các embedding người nói đã đăng ký. Người nói đã đăng ký có độ tương đồng cosine cao nhất là danh tính được dự đoán.

Tìm kiếm bằng giọng nói

Đánh chỉ mục một tập hợp các bản ghi âm theo speaker embedding, rồi truy vấn với một mẫu mới để tìm tất cả bản ghi của cùng người nói.

Lưu ý quan trọng

Speaker embedding hoạt động tốt nhất với giọng nói sạch dài ít nhất 2-3 giây. Clip rất ngắn hoặc bản ghi nhiễu có thể tạo ra embedding kém tin cậy. Cân nhắc áp dụng tăng cường giọng nói trước cho âm thanh có nhiễu.

Tải xuống mô hình

Mô hìnhBackendKích thướcHuggingFace
WeSpeaker-ResNet34-LMMLX~25 MBaufklarer/WeSpeaker-ResNet34-LM-MLX
WeSpeaker-ResNet34-LMCoreML~25 MBaufklarer/WeSpeaker-ResNet34-LM-CoreML
ReDimNet2-B6CoreML~25 MiBaufklarer/ReDimNet2-B6-CoreML

API Swift

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