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
# Trích xuất speaker embedding
.build/release/speech embed-speaker voice.wav
# Đầu ra JSON (bao gồm vector 256 chiều)
.build/release/speech embed-speaker voice.wav --json
# Chọn engine suy luận
.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 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 thường là cùng người nói
Đị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 WeSpeaker.loadFromHub()
// Trích xuất embedding từ tệp
let embedding = try await model.embed(audioFile: "voice.wav")
print("Embedding dimensions: \(embedding.count)") // 256
// Trích xuất embedding từ mẫu âm thanh
let samples: [Float] = loadAudio("voice.wav")
let embedding = try await model.embed(samples: samples, sampleRate: 16000)