🚀 音声ベースのストレス認識 (StudentNet)
forwarder1121/voice-based-stress-recognition
モデルカード
このプロジェクトは音声ベースのストレス認識モデルで、知識蒸留技術を用いて軽量な StudentNet
を訓練します。オーディオ入力を利用して、エッジデバイスやモバイルアプリでリアルタイムのストレス検出を行うことができます。
🚀 クイックスタート
以下は完全なサンプルです。これにより、Hub からモデルコード (models.py
) と重みを動的にダウンロードし、Hugging Face Transformers API を介して推論を実行します。
from huggingface_hub import hf_hub_download
import importlib.util
from transformers import AutoConfig, AutoModelForAudioClassification
import torch
import torch.nn.functional as F
def main():
repo = "forwarder1121/voice-based-stress-recognition"
code_path = hf_hub_download(repo_id=repo, filename="models.py")
spec = importlib.util.spec_from_file_location("models", code_path)
models = importlib.util.module_from_spec(spec)
spec.loader.exec_module(models)
cfg = AutoConfig.from_pretrained(repo, trust_remote_code=True)
model = AutoModelForAudioClassification.from_pretrained(
repo,
trust_remote_code=True,
torch_dtype="auto"
)
model.eval()
batch_size = 1
DIM_W2V = 512
x_w2v = torch.randn(batch_size, DIM_W2V, dtype=next(model.parameters()).dtype)
with torch.no_grad():
outputs = model(x_w2v)
probs = F.softmax(outputs.logits, dim=-1)
print(f"無ストレス: {probs[0,0]*100:.1f}%")
print(f"有ストレス: {probs[0,1]*100:.1f}%")
if __name__ == "__main__":
main()
✨ 主な機能
- 軽量な
StudentNet
アーキテクチャに基づいており、エッジデバイスやモバイルアプリでのリアルタイム推論に適しています。
- 知識蒸留技術を採用し、マルチモーダルの
TeacherNet
から知識を抽出します。
- オーディオ入力のみで、二値ストレス検出に使用できます。
💻 使用例
基本的な使用法
上記の「クイックスタート」セクションのコードは基本的な使用例で、モデルコードと重みを動的にダウンロードし、推論を行う方法を示しています。
📚 ドキュメント
モデル詳細
- モデル名:音声ベースのストレス認識 (StudentNet)
- リポジトリアドレス:https://huggingface.co/forwarder1121/voice-based-stress-recognition
- ライセンス:MIT
- ライブラリバージョン:PyTorch ≥1.7
モデルアーキテクチャ:
軽量な MLP ベースの StudentNet
で、StressID データセットで訓練されたマルチモーダルの TeacherNet
から蒸留されました。
-
入力:512 次元のオーディオ埋め込み
-
埋め込み仕様:
このモデルは fairseq の Wav2Vec2(ベース)モデルによって生成された 512 次元の埋め込みを入力として期待しています。
-
層構造:
- Linear(512→128) → ReLU → Dropout(0.3) → LayerNorm
- Dropout(0.3) → Linear(128→128) → ReLU → Dropout(0.3)
- Linear(128→2) → Softmax
出力:
二値分類のストレス確率:
- インデックス 0 → “無ストレス”
- インデックス 1 → “有ストレス”
想定用途と制限
想定用途:
- オーディオ入力のみを使用し、エッジデバイスやモバイルアプリでリアルタイムの二値ストレス検出を行います。
- 事前計算されたオーディオ埋め込みのみが提供される場合の軽量な推論に使用します。
制限:
- 多クラスのストレス強度予測には適していません。
- StressID データで訓練されているため、他の言語や録音設定では性能が低下する可能性があります。
- オーディオが明瞭で W2V 埋め込みが正確であることを前提としており、高い背景雑音は精度を低下させる可能性があります。
訓練データ
- データセット:StressID
- 収集されたモーダリティ:心電図(ECG)、呼吸数(RR)、皮膚電気活動(EDA)、顔/ビデオ、音声
- ラベル:自己評価で 0 - 10 の範囲で、二値ストレスに変換されます(<5 は 0、≥5 は 1)
- 分割:
train
分割のみを使用して TeacherNet
を訓練し、test
分割は最終評価に使用します。
- 複数の分割に同じ被験者のタスクが含まれないようにします。
訓練プロセス
- TeacherNet:交差エントロピー損失を使用して、すべての 4 つのモーダリティ(ECG、RR、EDA、ビデオ)で訓練します。
- StudentNet:オーディオ埋め込みと蒸留損失を使用して訓練します:
loss = CE(student_logits, labels) \
+ α * MSE(student_features, teacher_features)
- α ∈ {0, 1e−7, 1e−6} で、α = 1e−6 のとき性能が最適です。
- オプティマイザ:AdamW、学習率 lr = 1e−4、バッチサイズ batch_size = 8、エポック数 epochs = 100、早期終了の忍耐度 early stopping patience = 100。
評価
- TeacherNet(マルチモーダル):
- 正解率 ≈ 0.82、マクロ F1 値 ≈ 0.80、UAR ≈ 0.79
- StudentNet(α = 0):
- 正解率 ≈ 0.65、マクロ F1 値 ≈ 0.62、UAR ≈ 0.61
- StudentNet(α = 1e−6):
- 正解率 ≈ 0.76、マクロ F1 値 ≈ 0.74、UAR ≈ 0.73
⚡️ Wav2Vec2 埋め込みの説明
- このモデルのオーディオ入力は、fairseq の Wav2Vec2(ベース)モデル(
torchaudio.pipelines.WAV2VEC2_BASE
)を使用して 512 次元の埋め込みに変換する必要があります。
- 訓練中に埋め込み抽出に使用された正確なモデル重みは、このリポジトリのルートディレクトリに
wav2vec_large.pt
として提供されています。
- 生のオーディオでこのモデルを使用して推論を行うには:
- torchaudio/fairseq を使用して
wav2vec_large.pt
をロードします。
- 入力オーディオの 512 次元オーディオ埋め込みを生成します。
- この埋め込みを
StudentNet
に渡します。
引用
このモデルを研究で使用する場合は、以下を引用してください。
@inproceedings{your2025voice,
title={Lightweight Audio-Embedding-Based Stress Recognition via Multimodal Knowledge Distillation},
author={Your Name and …},
booktitle={Conference/Journal},
year={2025}
}
連絡先
何か質問があれば、forwarder1121@huggingface.co までご連絡ください。また、issue やディスカッションを自由に開いてください。
📄 ライセンス
このプロジェクトは MIT ライセンスを使用しています。