library_name: transformers
license: apache-2.0
base_model: facebook/wav2vec2-large-xlsr-53
tags:
- generated_from_trainer
metrics:
- 准确率
- 精确率
- 召回率
- F1值
model-index:
- name: 基于facebook-wav2vec2-large-xlsr-53的语音情感识别
results: []
🎧 基于Wav2Vec2的语音情感识别
本项目利用Wav2Vec2模型实现语音情感识别,目标是将音频片段分类为快乐、悲伤、惊讶等不同情感类别。
🗂 数据集
训练与评估数据来源于以下多个数据集:
数据集包含标注不同情感的录音片段,情感分布如下表所示:
情感 |
数量 |
悲伤 |
752 |
快乐 |
752 |
愤怒 |
752 |
中性 |
716 |
厌恶 |
652 |
恐惧 |
652 |
惊讶 |
652 |
平静 |
192 |
该分布反映了数据集中情感的平衡性,部分情感样本量较多。训练时因样本不足排除了"平静"情感。
🎤 预处理
- 音频加载:使用Librosa加载音频文件并转换为numpy数组
- 特征提取:通过Wav2Vec2特征提取器处理音频数据,标准化特征输入
🔧 模型
采用Wav2Vec2 Large XLR-53模型进行微调:
⚙️ 训练参数
- 学习率:
5e-05
- 训练批大小:
2
- 评估批大小:
2
- 随机种子:
42
- 梯度累积步数:
5
- 有效批大小:
10
- 优化器:Adam(beta=(0.9,0.999),epsilon=1e-08)
- 学习率调度器:线性
- 预热比例:
0.1
- 训练轮次:
25
- 混合精度训练:原生AMP
使用Wandb进行实验跟踪
📊 评估指标
- 损失值:
0.4989
- 准确率:
0.9168
- 精确率:
0.9209
- 召回率:
0.9168
- F1分数:
0.9166
高指标值表明模型能有效识别语音情感
🧪 训练过程
完整训练日志可通过Wandb查看
训练损失 |
轮次 |
步数 |
验证损失 |
准确率 |
精确率 |
召回率 |
F1值 |
1.9343 |
0.9995 |
394 |
1.9277 |
0.2505 |
0.1425 |
0.2505 |
0.1691 |
... |
... |
... |
... |
... |
... |
... |
... |
0.2067 |
24.9873 |
9850 |
0.4959 |
0.8976 |
0.9032 |
0.8976 |
0.8975 |
🚀 使用指南
from transformers import AutoModelForAudioClassification, AutoFeatureExtractor
import librosa
import torch
import numpy as np
model_id = "firdhokk/speech-emotion-recognition-with-facebook-wav2vec2-large-xlsr-53"
model = AutoModelForAudioClassification.from_pretrained(model_id)
feature_extractor = AutoFeatureExtractor.from_pretrained(model_id, do_normalize=True, return_attention_mask=True)
id2label = model.config.id2label
def preprocess_audio(audio_path, feature_extractor, max_duration=30.0):
audio_array, sampling_rate = librosa.load(audio_path, sr=feature_extractor.sampling_rate)
max_length = int(feature_extractor.sampling_rate * max_duration)
if len(audio_array) > max_length:
audio_array = audio_array[:max_length]
else:
audio_array = np.pad(audio_array, (0, max_length - len(audio_array)))
inputs = feature_extractor(
audio_array,
sampling_rate=feature_extractor.sampling_rate,
max_length=max_length,
truncation=True,
return_attention_mask=True,
return_tensors="pt",
)
return inputs
def predict_emotion(audio_path, model, feature_extractor, id2label, max_duration=30.0):
inputs = preprocess_audio(audio_path, feature_extractor, max_duration)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = model.to(device)
inputs = {key: value.to(device) for key, value in inputs.items()}
with torch.no_grad():
outputs = model(**inputs)
logits = outputs.logits
predicted_id = torch.argmax(logits, dim=-1).item()
predicted_label = id2label[predicted_id]
return predicted_label
audio_path = "示例音频路径.wav"
predicted_emotion = predict_emotion(audio_path, model, feature_extractor, id2label)
print(f"预测情感: {predicted_emotion}")
🎯 环境版本
- Transformers 4.44.2
- Pytorch 2.4.1+cu121
- Datasets 3.0.0
- Tokenizers 0.19.1