🚀 🎧 ウィスパーによる音声感情認識
このプロジェクトは、Whisper モデルを利用して音声の感情を認識します。目的は、音声録音を Happy、Sad、Surprised などのさまざまな感情カテゴリに分類することです。
🚀 クイックスタート
このモデルを使用するには、以下のコードを参考にしてください。
from transformers import AutoModelForAudioClassification, AutoFeatureExtractor
import librosa
import torch
import numpy as np
model_id = "firdhokk/speech-emotion-recognition-with-openai-whisper-large-v3"
model = AutoModelForAudioClassification.from_pretrained(model_id)
feature_extractor = AutoFeatureExtractor.from_pretrained(model_id, do_normalize=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_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 = "/content/drive/MyDrive/Audio/Speech_URDU/Happy/SM5_F4_H058.wav"
predicted_emotion = predict_emotion(audio_path, model, feature_extractor, id2label)
print(f"Predicted Emotion: {predicted_emotion}")
✨ 主な機能
- Whisper モデルを利用した音声感情認識。
- 複数のデータセットを用いた学習と評価。
- 音声データの前処理と特徴抽出。
📦 インストール
必要なライブラリのバージョンは以下の通りです。
Property |
Details |
Transformers |
4.44.2 |
Pytorch |
2.4.1+cu121 |
Datasets |
3.0.0 |
Tokenizers |
0.19.1 |
📚 ドキュメント
🗂 データセット
学習と評価に使用されるデータセットは、複数のデータセットから収集されています。
データセットには、さまざまな感情でラベル付けされた録音が含まれています。以下は、データセット内の感情の分布です。
Emotion |
Count |
sad |
752 |
happy |
752 |
angry |
752 |
neutral |
716 |
disgust |
652 |
fearful |
652 |
surprised |
652 |
calm |
192 |
この分布は、データセット内の感情のバランスを反映しており、一部の感情は他の感情よりも多くのサンプルを持っています。学習時には、"calm" 感情はサンプル数が少ないため除外されました。
🎤 前処理
- 音声読み込み:Librosa を使用して音声ファイルを読み込み、numpy配列に変換します。
- 特徴抽出:音声データは、Whisper Feature Extractor を使用して処理され、モデルへの入力用に音声特徴を標準化および正規化します。
🔧 モデル
使用されるモデルは、Whisper Large V3 モデルで、音声分類 タスク用に微調整されています。
感情ラベルは数値IDにマッピングされ、モデルの学習と評価に使用されます。
⚙️ 学習
モデルは以下のパラメータで学習されます。
- 学習率:
5e-05
- 学習バッチサイズ:
2
- 評価バッチサイズ:
2
- 乱数シード:
42
- 勾配累積ステップ:
5
- 総学習バッチサイズ:
10
(勾配累積後の実効バッチサイズ)
- オプティマイザ:Adam(パラメータ:
betas=(0.9, 0.999)
、epsilon=1e-08
)
- 学習率スケジューラ:
linear
- 学習率スケジューラのウォームアップ比率:
0.1
- エポック数:
25
- 混合精度学習:Native AMP(自動混合精度)
これらのパラメータは、特に Whisper のような大規模なデータセットと深いモデルを扱う場合に、効率的なモデル学習と安定性を保証します。学習には Wandb が実験の追跡と監視に使用されています。
📊 評価指標
モデルの学習後に得られた評価指標は以下の通りです。
- 損失:
0.5008
- 正解率:
0.9199
- 適合率:
0.9230
- 再現率:
0.9199
- F1スコア:
0.9198
これらの指標は、音声感情認識タスクにおけるモデルの性能を示しています。正解率、適合率、再現率、およびF1スコアの高い値は、モデルが音声データから感情状態を効果的に識別していることを示しています。
🧪 結果
学習後、モデルはテストデータセットで評価され、結果はこの リンク の Wandb で監視されています。
Training Loss |
Epoch |
Step |
Validation Loss |
Accuracy |
Precision |
Recall |
F1 |
0.4948 |
0.9995 |
394 |
0.4911 |
0.8286 |
0.8449 |
0.8286 |
0.8302 |
0.6271 |
1.9990 |
788 |
0.5307 |
0.8225 |
0.8559 |
0.8225 |
0.8277 |
0.2364 |
2.9985 |
1182 |
0.5076 |
0.8692 |
0.8727 |
0.8692 |
0.8684 |
0.0156 |
3.9980 |
1576 |
0.5669 |
0.8732 |
0.8868 |
0.8732 |
0.8745 |
0.2305 |
5.0 |
1971 |
0.4578 |
0.9108 |
0.9142 |
0.9108 |
0.9114 |
0.0112 |
5.9995 |
2365 |
0.4701 |
0.9108 |
0.9159 |
0.9108 |
0.9114 |
0.0013 |
6.9990 |
2759 |
0.5232 |
0.9138 |
0.9204 |
0.9138 |
0.9137 |
0.1894 |
7.9985 |
3153 |
0.5008 |
0.9199 |
0.9230 |
0.9199 |
0.9198 |
0.0877 |
8.9980 |
3547 |
0.5517 |
0.9138 |
0.9152 |
0.9138 |
0.9138 |
0.1471 |
10.0 |
3942 |
0.5856 |
0.8895 |
0.9002 |
0.8895 |
0.8915 |
0.0026 |
10.9995 |
4336 |
0.8334 |
0.8773 |
0.8949 |
0.8773 |
0.8770 |
📄 ライセンス
このプロジェクトは、Apache-2.0ライセンスの下で公開されています。