AI for Mental Health Screening and Assessment
Module: Healthcare AI | Difficulty: Advanced
Speech Prosody Features
Depression Severity (PHQ-9)
Facial Action Units (AUs)
Mental Health AI Performance
| Condition | Modality | AUC | Accuracy | |-----------|----------|-----|----------| | Depression | Speech + facial | 0.87 | 0.82 | | Anxiety | Speech | 0.84 | 0.79 | | PTSD | Speech + text | 0.86 | 0.81 | | Bipolar | Behavioral | 0.83 | 0.78 | | Suicide Risk | Text + speech | 0.85 | 0.80 |
import torch
import torch.nn as nn
class SpeechEmotionAnalyzer(nn.Module):
def __init__(self, num_emotions=7):
super().__init__()
self.conv1 = nn.Conv1d(40, 64, kernel_size=5)
self.conv2 = nn.Conv1d(64, 128, kernel_size=3)
self.lstm = nn.LSTM(128, 64, batch_first=True, bidirectional=True)
self.emotion_head = nn.Linear(128, num_emotions)
self.depression_head = nn.Linear(128, 1)
def forward(self, mel_spectrogram):
x = torch.relu(self.conv1(mel_spectrogram))
x = torch.relu(self.conv2(x))
x = x.permute(0, 2, 1)
lstm_out, _ = self.lstm(x)
x = lstm_out[:, -1, :]
emotions = self.emotion_head(x)
depression = torch.sigmoid(self.depression_head(x))
return emotions, depression
class FacialExpressionAnalyzer(nn.Module):
def __init__(self):
super().__init__()
self.backbone = models.resnet18(pretrained=True)
num_features = self.backbone.fc.in_features
self.backbone.fc = nn.Identity()
self.au_head = nn.Linear(num_features, 20)
self.emotion_head = nn.Linear(num_features, 7)
def forward(self, face_image):
features = self.backbone(face_image)
action_units = torch.sigmoid(self.au_head(features))
emotions = self.emotion_head(features)
return action_units, emotions
def compute_prosody_features(audio_signal, sr=16000):
import librosa
f0, voiced_flag, _ = librosa.pyin(audio_signal, fmin=50, fmax=500, sr=sr)
return {
'f0_mean': np.nanmean(f0),
'f0_std': np.nanstd(f0),
'f0_range': np.nanmax(f0) - np.nanmin(f0),
'voiced_fraction': np.mean(voiced_flag),
}
speech_model = SpeechEmotionAnalyzer()
mel_spec = torch.randn(1, 40, 200)
emotions, depression = speech_model(mel_spec)
print(f'Emotion logits: {emotions.shape}')
print(f'Depression score: {depression.item():.4f}')
face_model = FacialExpressionAnalyzer()
face = torch.randn(1, 3, 224, 224)
aus, emo = face_model(face)
print(f'Action units: {aus.shape}')
print(f'Facial emotions: {emo.shape}')
prosody = compute_prosody_features(np.random.randn(16000))
print(f'Prosody features: {prosody}')
Research Insight: Multimodal approaches combining speech, facial expressions, and text achieve the best performance for mental health screening because depression and anxiety manifest differently across modalities. Speech features capture psychomotor retardation, facial expressions reveal emotional blunting, and text analysis detects negative cognitive patterns.