|
from transformers import ( |
|
WhisperProcessor, WhisperForConditionalGeneration, |
|
AutoModelForSequenceClassification, AutoTokenizer |
|
) |
|
import torch |
|
|
|
class ModelManager: |
|
def __init__(self): |
|
self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu") |
|
self.models = {} |
|
self.tokenizers = {} |
|
self.processors = {} |
|
|
|
def load_models(self): |
|
|
|
self.processors['whisper'] = WhisperProcessor.from_pretrained("openai/whisper-base") |
|
self.models['whisper'] = WhisperForConditionalGeneration.from_pretrained( |
|
"openai/whisper-base" |
|
).to(self.device) |
|
|
|
|
|
self.tokenizers['emotion'] = AutoTokenizer.from_pretrained("arpanghoshal/EmoRoBERTa") |
|
self.models['emotion'] = AutoModelForSequenceClassification.from_pretrained( |
|
"arpanghoshal/EmoRoBERTa" |
|
).to(self.device) |
|
|
|
|
|
self.tokenizers['clinical'] = AutoTokenizer.from_pretrained( |
|
"emilyalsentzer/Bio_ClinicalBERT" |
|
) |
|
self.models['clinical'] = AutoModelForSequenceClassification.from_pretrained( |
|
"emilyalsentzer/Bio_ClinicalBERT" |
|
).to(self.device) |
|
|
|
def transcribe(self, audio_input): |
|
inputs = self.processors['whisper']( |
|
audio_input, |
|
return_tensors="pt" |
|
).input_features.to(self.device) |
|
|
|
generated_ids = self.models['whisper'].generate(inputs) |
|
transcription = self.processors['whisper'].batch_decode( |
|
generated_ids, |
|
skip_special_tokens=True |
|
)[0] |
|
return transcription |
|
|
|
def analyze_emotions(self, text): |
|
inputs = self.tokenizers['emotion']( |
|
text, |
|
return_tensors="pt", |
|
padding=True, |
|
truncation=True, |
|
max_length=512 |
|
).to(self.device) |
|
|
|
outputs = self.models['emotion'](**inputs) |
|
probs = torch.nn.functional.softmax(outputs.logits, dim=-1) |
|
|
|
emotions = ['anger', 'fear', 'joy', 'love', 'sadness', 'surprise'] |
|
return {emotion: float(prob) for emotion, prob in zip(emotions, probs[0])} |
|
|
|
def analyze_mental_health(self, text): |
|
inputs = self.tokenizers['clinical']( |
|
text, |
|
return_tensors="pt", |
|
padding=True, |
|
truncation=True, |
|
max_length=512 |
|
).to(self.device) |
|
|
|
outputs = self.models['clinical'](**inputs) |
|
scores = torch.sigmoid(outputs.logits) |
|
|
|
return { |
|
'depression_risk': float(scores[0][0]), |
|
'anxiety_risk': float(scores[0][1]), |
|
'stress_level': float(scores[0][2]) |
|
} |