🚀 基於語音的壓力識別 (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:使用交叉熵損失在所有四種模態(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 或討論。
🔧 技術細節
此文檔未提及足夠詳細的技術實現細節(超過 50 字),暫不提供相關內容。
📄 許可證
本項目使用 MIT 許可證。