1. 项目概述

心理疗愈AI数字人是结合自然语言处理、情感计算和对话系统技术的创新应用,旨在为用户提供7×24小时的心理支持和情感陪伴。本系统采用多模态交互方式,整合了文本、语音和视觉信息,构建了一个具有情感感知能力的虚拟疗愈助手。

2. 系统架构设计

import torch
import torch.nn as nn
import torch.nn.functional as F
import numpy as np
from transformers import BertModel, BertTokenizer
import speech_recognition as sr
from gtts import gTTS
import cv2
from fer import FER

class MentalHealthAIAgent:
    def __init__(self):
        self.emotion_detector = FER()
        self.speech_recognizer = sr.Recognizer()
        self.tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')
        self.bert_model = BertModel.from_pretrained('bert-base-chinese')
        self.dialog_manager = DialogManager()
        self.therapy_engine = TherapyEngine()
        
    def process_multimodal_input(self, text_input=None, audio_input=None, video_input=None):
        """处理多模态输入数据"""
        modalities = {}
        
        if text_input:
            modalities['text'] = self._process_text(text_input)
            
        if audio_input:
            modalities['audio'] = self._process_audio(audio_input)
            
        if video_input:
            modalities['video'] = self._process_video(video_input)
            
        return self._fuse_modalities(modalities)

3. 情感识别模块

class EmotionRecognizer(nn.Module):
    def __init__(self, bert_hidden_size=768, num_emotions=7):
        super(EmotionRecognizer, self).__init__()
        self.bert = BertModel.from_pretrained('bert-base-chinese')
        self.emotion_classifier = nn.Sequential(
            nn.Linear(bert_hidden_size, 512),
            nn.ReLU(),
            nn.Dropout(0.3),
            nn.Linear(512, 256),
            nn.ReLU(),
            nn.Dropout(0.2),
            nn.Linear(256, num_emotions)
        )
        self.emotion_labels = ['愤怒', '厌恶', '恐惧', '快乐', '悲伤', '惊讶', '中性']
        
    def forward(self, input_ids, attention_mask):
        outputs = self.bert(input_ids=input_ids, attention_mask=attention_mask)
        pooled_output = outputs.pooler_output
        emotion_logits = self.emotion_classifier(pooled_output)
        return emotion_logits
    
    def predict_emotion(self, text):
        """预测文本情感"""
        inputs = self.tokenizer(text, return_tensors='pt', 
                               truncation=True, padding=True, max_length=128)
        
        with torch.no_grad():
            emotion_logits = self.forward(inputs['input_ids'], inputs['attention_mask'])
            probabilities = F.softmax(emotion_logits, dim=-1)
            predicted_class = torch.argmax(probabilities, dim=-1).item()
            
        return {
            'emotion': self.emotion_labels[predicted_class],
            'confidence': probabilities[0][predicted_class].item(),
            'all_probabilities': {
                label: prob.item() for label, prob in 
                zip(self.emotion_labels, probabilities[0])
            }
        }

class FacialEmotionDetector:
    def __init__(self):
        self.detector = FER()
        
    def detect_emotion_from_frame(self, frame):
        """从视频帧检测面部表情"""
        try:
            emotions = self.detector.detect_emotions(frame)
            if emotions:
                dominant_emotion = max(emotions[0]['emotions'], 
                                     key=emotions[0]['emotions'].get)
                return {
                    'dominant_emotion': dominant_emotion,
                    'emotion_scores': emotions[0]['emotions'],
                    'bounding_box': emotions[0]['box']
                }
        except Exception as e:
            print(f"面部情感检测错误: {e}")
        return None

4. 对话管理系统

class DialogManager:
    def __init__(self):
        self.conversation_history = []
        self.user_profile = {}
        self.therapy_context = {}
        
    def generate_response(self, user_input, user_emotion, context):
        """生成治疗性回应"""
        # 基于认知行为疗法(CBT)原则的回应生成
        cbt_strategies = {
            '悲伤': self._handle_sadness,
            '焦虑': self._handle_anxiety,
            '愤怒': self._handle_anger,
            'default': self._general_support
        }
        
        strategy = cbt_strategies.get(user_emotion, cbt_strategies['default'])
        response = strategy(user_input, context)
        
        self._update_conversation_history(user_input, response, user_emotion)
        return response
    
    def _handle_sadness(self, user_input, context):
        """处理悲伤情绪的策略"""
        empathetic_responses = [
            "听起来你现在很难过,能和我多分享一些你的感受吗?",
            "悲伤是人之常情,我在这里陪着你。",
            "感谢你愿意分享这些,你的感受很重要。"
        ]
        
        probing_questions = [
            "这种感受持续多久了?",
            "有没有什么时候感觉会好一些?",
            "你希望得到什么样的支持呢?"
        ]
        
        return np.random.choice(empathetic_responses) + " " + np.random.choice(probing_questions)
    
    def _handle_anxiety(self, user_input, context):
        """处理焦虑情绪的策略"""
        grounding_techniques = [
            "让我们做个简单的呼吸练习:吸气4秒,屏息4秒,呼气6秒。",
            "你能告诉我现在看到的5样东西吗?这能帮助我们回到当下。",
            "焦虑就像波浪,它会达到顶峰然后逐渐消退。"
        ]
        
        return np.random.choice(grounding_techniques)
    
    def _update_conversation_history(self, user_input, response, emotion):
        """更新对话历史"""
        self.conversation_history.append({
            'timestamp': datetime.now(),
            'user_input': user_input,
            'response': response,
            'emotion': emotion,
            'turn_count': len(self.conversation_history) + 1
        })
        
        # 保持最近50轮对话
        if len(self.conversation_history) > 50:
            self.conversation_history = self.conversation_history[-50:]

5. 心理疗愈引擎

class TherapyEngine:
    def __init__(self):
        self.cbt_techniques = CBTTechniques()
        self.mindfulness_exercises = MindfulnessExercises()
        self.crisis_detector = CrisisDetector()
        
    def assess_mental_state(self, conversation_history, current_emotion):
        """评估用户心理状态"""
        risk_factors = self.crisis_detector.assess_risk(conversation_history)
        emotional_intensity = self._calculate_emotional_intensity(conversation_history)
        
        return {
            'risk_level': risk_factors['level'],
            'recommended_intervention': self._select_intervention(
                current_emotion, risk_factors, emotional_intensity
            ),
            'emotional_trend': self._analyze_emotional_trend(conversation_history)
        }
    
    def _select_intervention(self, emotion, risk_factors, intensity):
        """选择合适的干预措施"""
        if risk_factors['level'] == 'high':
            return {
                'type': 'crisis_intervention',
                'action': '提供紧急资源和建议联系专业帮助',
                'resources': self._get_emergency_resources()
            }
        
        interventions = {
            'low': {
                '悲伤': '积极活动安排',
                '焦虑': '呼吸练习和正念',
                '愤怒': '认知重构和放松技巧'
            },
            'medium': {
                '悲伤': '行为激活和感恩练习',
                '焦虑': '渐进式肌肉放松和认知挑战',
                '愤怒': '情绪调节和问题解决训练'
            }
        }
        
        risk_level = 'low' if intensity < 0.6 else 'medium'
        return interventions[risk_level].get(emotion, '一般性心理教育')

class CBTTechniques:
    """认知行为疗法技术库"""
    
    def cognitive_restructuring(self, negative_thought):
        """认知重构技术"""
        cognitive_distortions = self._identify_distortions(negative_thought)
        
        if cognitive_distortions:
            challenge_questions = [
                f"这个想法'{negative_thought}'有什么证据支持或反对?",
                "有没有其他更平衡的看法?",
                "如果朋友有这样的想法,你会怎么对他说?"
            ]
            return challenge_questions
        return ["让我们换个角度看看这个问题。"]
    
    def _identify_distortions(self, thought):
        """识别认知扭曲"""
        distortions = []
        
        distortion_patterns = {
            '全有全无': r'(总是|从不|完全|绝对)',
            '过度概括': r'(每个人|没人|所有事情)',
            '灾难化': r'(万一|糟糕透顶|完蛋了)'
        }
        
        for distortion, pattern in distortion_patterns.items():
            if re.search(pattern, thought):
                distortions.append(distortion)
                
        return distortions

class CrisisDetector:
    """危机检测模块"""
    
    def __init__(self):
        self.crisis_keywords = {
            'high': ['自杀', '不想活了', '结束一切', '死了算了'],
            'medium': ['绝望', '撑不下去', '看不到希望', '痛苦难忍'],
            'low': ['难过', '压力大', '睡不着', '没胃口']
        }
    
    def assess_risk(self, conversation_history):
        """评估危机风险"""
        recent_text = ' '.join([turn['user_input'] for turn in conversation_history[-5:]])
        
        risk_score = 0
        for level, keywords in self.crisis_keywords.items():
            for keyword in keywords:
                if keyword in recent_text:
                    risk_score += {'high': 3, 'medium': 2, 'low': 1}[level]
        
        if risk_score >= 3:
            return {'level': 'high', 'action': 'immediate_intervention'}
        elif risk_score >= 2:
            return {'level': 'medium', 'action': 'close_monitoring'}
        else:
            return {'level': 'low', 'action': 'routine_support'}

6. 多模态响应生成

class ResponseGenerator:
    def __init__(self):
        self.tts_engine = gTTS
        self.visual_feedback = VisualFeedback()
        
    def generate_multimodal_response(self, text_response, emotion_context):
        """生成多模态响应"""
        response_package = {
            'text': text_response,
            'audio': self._generate_speech(text_response, emotion_context),
            'visual': self._generate_visual_feedback(emotion_context),
            'timing': self._calculate_response_timing(text_response)
        }
        return response_package
    
    def _generate_speech(self, text, emotion_context):
        """生成语音响应"""
        try:
            # 根据情感调整语音参数
            speech_params = self._adjust_speech_parameters(emotion_context)
            tts = self.tts_engine(text=text, lang='zh-cn', slow=speech_params['slow'])
            
            audio_buffer = io.BytesIO()
            tts.write_to_fp(audio_buffer)
            audio_buffer.seek(0)
            
            return {
                'audio_data': audio_buffer.read(),
                'duration': speech_params['duration_estimate'],
                'emotional_tone': speech_params['tone']
            }
        except Exception as e:
            print(f"语音生成错误: {e}")
            return None
    
    def _adjust_speech_parameters(self, emotion_context):
        """根据情感调整语音参数"""
        emotion_speed_map = {
            '悲伤': {'slow': True, 'tone': 'gentle'},
            '焦虑': {'slow': True, 'tone': 'calm'},
            '愤怒': {'slow': False, 'tone': 'soothing'},
            'default': {'slow': False, 'tone': 'neutral'}
        }
        
        params = emotion_speed_map.get(emotion_context['dominant_emotion'], 
                                     emotion_speed_map['default'])
        params['duration_estimate'] = len(emotion_context['text']) * 0.1  # 粗略估计
        return params

class VisualFeedback:
    """视觉反馈生成"""
    
    def generate_avatar_expression(self, user_emotion, therapeutic_context):
        """生成数字人表情"""
        expression_map = {
            '悲伤': {'expression': 'empathetic', 'posture': 'leaning_forward'},
            '焦虑': {'expression': 'calm', 'posture': 'open'},
            '愤怒': {'expression': 'neutral', 'posture': 'non_threatening'},
            'default': {'expression': 'warm', 'posture': 'relaxed'}
        }
        
        return expression_map.get(user_emotion, expression_map['default'])

7. 系统集成与部署

class MentalHealthAISystem:
    def __init__(self):
        self.agent = MentalHealthAIAgent()
        self.emotion_recognizer = EmotionRecognizer()
        self.response_generator = ResponseGenerator()
        self.session_manager = SessionManager()
        
    def process_user_interaction(self, user_input, modality='text'):
        """处理用户交互的主流程"""
        try:
            # 1. 情感分析
            emotion_analysis = self.emotion_recognizer.predict_emotion(user_input)
            
            # 2. 对话管理
            context = self.session_manager.get_current_context()
            therapeutic_response = self.agent.dialog_manager.generate_response(
                user_input, emotion_analysis['emotion'], context
            )
            
            # 3. 心理状态评估
            mental_state = self.agent.therapy_engine.assess_mental_state(
                self.agent.dialog_manager.conversation_history,
                emotion_analysis['emotion']
            )
            
            # 4. 生成多模态响应
            final_response = self.response_generator.generate_multimodal_response(
                therapeutic_response, emotion_analysis
            )
            
            # 5. 更新会话状态
            self.session_manager.update_session(
                user_input, final_response, emotion_analysis, mental_state
            )
            
            return {
                'success': True,
                'response': final_response,
                'emotional_state': emotion_analysis,
                'mental_health_assessment': mental_state,
                'suggested_follow_up': self._suggest_follow_up(mental_state)
            }
            
        except Exception as e:
            return {
                'success': False,
                'error': str(e),
                'fallback_response': "我注意到有些技术问题,但我仍然在这里倾听你。能再告诉我一次你的感受吗?"
            }
    
    def _suggest_follow_up(self, mental_state):
        """建议后续行动"""
        if mental_state['risk_level'] == 'high':
            return {
                'action': '紧急干预',
                'message': '我注意到你现在可能很痛苦,建议立即联系心理健康专业人士。',
                'resources': ['心理危机干预热线: 400-161-9995', '就近医院心理科']
            }
        else:
            return {
                'action': '继续对话',
                'message': '让我们继续探索你的感受和想法。'
            }

# 系统部署示例
if __name__ == "__main__":
    therapy_ai = MentalHealthAISystem()
    
    # 模拟用户交互
    test_inputs = [
        "最近感觉特别难过,做什么都提不起兴趣",
        "我总是担心工作会出错,晚上睡不着",
        "有时候觉得活着太累了"
    ]
    
    for user_input in test_inputs:
        print(f"用户: {user_input}")
        response = therapy_ai.process_user_interaction(user_input)
        print(f"AI助手: {response['response']['text']}")
        print(f"检测情绪: {response['emotional_state']['emotion']}")
        print(f"风险评估: {response['mental_health_assessment']['risk_level']}")
        print("-" * 50)

8. 伦理考虑与安全措施

class EthicsAndSafety:
    def __init__(self):
        self.privacy_protocol = PrivacyProtocol()
        self.bias_detector = BiasDetector()
        
    def ensure_ethical_interaction(self, user_input, system_response):
        """确保符合伦理的交互"""
        safety_checks = {
            'privacy': self.privacy_protocol.check_privacy_violation(user_input),
            'bias': self.bias_detector.detect_bias(system_response),
            'boundaries': self._check_professional_boundaries(system_response)
        }
        
        if any(safety_checks.values()):
            return self._get_safe_fallback_response()
        
        return system_response
    
    def _check_professional_boundaries(self, response):
        """检查专业边界"""
        boundary_violations = [
            "给出医疗诊断",
            "开具处方药物",
            "声称替代专业治疗"
        ]
        
        return any(violation in response for violation in boundary_violations)

class PrivacyProtocol:
    """隐私保护协议"""
    
    def __init__(self):
        self.sensitive_patterns = [
            r'\d{18}|\d{17}X',  # 身份证号
            r'\d{11}',  # 手机号
            r'\d{16}|\d{19}'  # 银行卡号
        ]
    
    def anonymize_text(self, text):
        """匿名化敏感信息"""
        anonymized_text = text
        for pattern in self.sensitive_patterns:
            anonymized_text = re.sub(pattern, '[匿名信息]', anonymized_text)
        return anonymized_text

总结

本文详细介绍了心理疗愈AI数字人的完整设计与实现方案。系统整合了先进的情感计算、自然语言处理和多模态交互技术,同时强调了伦理考量和用户安全。该架构具有良好的扩展性,可以进一步集成更多的心理疗愈技术和个性化适应功能。

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐