🚀 基於Wav2vec 2.0(6層)的年齡和性別識別模型
本模型旨在解決音頻信號中年齡和性別識別的問題,通過輸入原始音頻信號,輸出年齡和性別的預測結果,為音頻分析領域提供了有效的解決方案。
🚀 快速開始
本模型以原始音頻信號作為輸入,輸出年齡預測值(範圍約為 0...1,對應 0...100 歲)以及性別預測(表示為兒童、女性或男性的概率)。此外,它還會提供最後一個變壓器層的池化狀態。
該模型是在 Wav2Vec2-Large-Robust 的基礎上,通過在 aGender、Mozilla Common Voice、Timit 和 Voxceleb 2 數據集上進行微調而創建的。對於此版本的模型,我們僅訓練了前六個變壓器層。
模型的 ONNX 導出文件可從 doi:10.5281/zenodo.7761387 獲取。更多詳細信息請參考相關 論文 和 教程。
✨ 主要特性
- 輸入輸出明確:接受原始音頻信號作為輸入,輸出年齡和性別預測結果以及最後一個變壓器層的池化狀態。
- 微調訓練:基於預訓練模型 Wav2Vec2-Large-Robust,在多個數據集上進行微調。
- 部分層訓練:僅訓練了前六個變壓器層。
- ONNX 導出:提供模型的 ONNX 導出文件。
📦 安裝指南
文檔未提及安裝步驟,故跳過此章節。
💻 使用示例
基礎用法
import numpy as np
import torch
import torch.nn as nn
from transformers import Wav2Vec2Processor
from transformers.models.wav2vec2.modeling_wav2vec2 import (
Wav2Vec2Model,
Wav2Vec2PreTrainedModel,
)
class ModelHead(nn.Module):
r"""Classification head."""
def __init__(self, config, num_labels):
super().__init__()
self.dense = nn.Linear(config.hidden_size, config.hidden_size)
self.dropout = nn.Dropout(config.final_dropout)
self.out_proj = nn.Linear(config.hidden_size, num_labels)
def forward(self, features, **kwargs):
x = features
x = self.dropout(x)
x = self.dense(x)
x = torch.tanh(x)
x = self.dropout(x)
x = self.out_proj(x)
return x
class AgeGenderModel(Wav2Vec2PreTrainedModel):
r"""Speech emotion classifier."""
def __init__(self, config):
super().__init__(config)
self.config = config
self.wav2vec2 = Wav2Vec2Model(config)
self.age = ModelHead(config, 1)
self.gender = ModelHead(config, 3)
self.init_weights()
def forward(
self,
input_values,
):
outputs = self.wav2vec2(input_values)
hidden_states = outputs[0]
hidden_states = torch.mean(hidden_states, dim=1)
logits_age = self.age(hidden_states)
logits_gender = torch.softmax(self.gender(hidden_states), dim=1)
return hidden_states, logits_age, logits_gender
device = 'cpu'
model_name = 'audeering/wav2vec2-large-robust-6-ft-age-gender'
processor = Wav2Vec2Processor.from_pretrained(model_name)
model = AgeGenderModel.from_pretrained(model_name)
sampling_rate = 16000
signal = np.zeros((1, sampling_rate), dtype=np.float32)
def process_func(
x: np.ndarray,
sampling_rate: int,
embeddings: bool = False,
) -> np.ndarray:
r"""Predict age and gender or extract embeddings from raw audio signal."""
y = processor(x, sampling_rate=sampling_rate)
y = y['input_values'][0]
y = y.reshape(1, -1)
y = torch.from_numpy(y).to(device)
with torch.no_grad():
y = model(y)
if embeddings:
y = y[0]
else:
y = torch.hstack([y[1], y[2]])
y = y.detach().cpu().numpy()
return y
print(process_func(signal, sampling_rate))
print(process_func(signal, sampling_rate, embeddings=True))
高級用法
文檔未提及高級用法相關內容,故跳過此部分。
📚 詳細文檔
數據集
屬性 |
詳情 |
數據集 |
agender、mozillacommonvoice、timit、voxceleb2 |
推理
推理功能:可用
標籤
屬性 |
詳情 |
標籤 |
speech、audio、wav2vec2、audio-classification、age-recognition、gender-recognition |
🔧 技術細節
本模型基於 Wav2vec 2.0 架構,通過在多個數據集上進行微調,僅訓練了前六個變壓器層,以實現對音頻信號中年齡和性別的有效識別。模型期望輸入為原始音頻信號,輸出包括年齡預測值、性別概率分佈以及最後一個變壓器層的池化狀態。
📄 許可證
本模型使用的許可證為:cc-by-nc-sa-4.0