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ạn | Chi tiết |
|---|---|
| Đầu vào | Conv2d (1 sang 32 kênh) |
| ResNet34 | Khối dư [3, 4, 6, 3] |
| Stats Pooling | Trung bình + độ lệch chuẩn theo thời gian |
| Phép chiếu | Linear (5120 sang 256) |
| Đầu ra | Embedding 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ọn | Mô tả |
|---|---|
--engine | Engine suy luận: mlx hoặc coreml |
--json | Định dạng đầu ra JSON với toàn bộ vector embedding |
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.
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ình | Backend | Kích thước | HuggingFace |
|---|---|---|---|
| WeSpeaker-ResNet34-LM | MLX | ~25 MB | aufklarer/WeSpeaker-ResNet34-LM-MLX |
| WeSpeaker-ResNet34-LM | CoreML | ~25 MB | aufklarer/WeSpeaker-ResNet34-LM-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