AI职场压力监测与调节助手
下面是一个基于Python的AI职场压力监测与调节助手程序,它结合了创新与变革管理课程的理念,通过分析用户的语音/文字情绪,提供个性化的放松文案和心理疏导建议。
import tkinter as tk
from tkinter import ttk, scrolledtext, messagebox
import random
import datetime
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import numpy as np
import pandas as pd
from PIL import Image, ImageTk
import os
import threading
import time
# 模拟语音识别模块
class SpeechRecognizer:
def __init__(self):
self.phrases = [
"我感觉工作压力好大,项目 deadline 快到了",
"最近团队变动很大,我有点适应不过来",
"老板总是给我额外任务,我感到不堪重负",
"同事之间竞争激烈,关系有点紧张",
"我对自己的职业发展感到迷茫",
"工作量太大,我经常加班到深夜",
"我觉得自己在工作中没有得到足够的认可",
"公司变革太快,我有点跟不上节奏",
"我担心自己会被裁员",
"工作与生活平衡被打破了"
]
def recognize_speech(self):
"""模拟语音识别过程"""
time.sleep(2) # 模拟识别延迟
return random.choice(self.phrases)
# 情绪分析模块
class EmotionAnalyzer:
def __init__(self):
# 关键词映射情绪
self.keyword_map = {
"压力大": "stress", "deadline": "stress", "不堪重负": "stress",
"紧张": "anxiety", "担心": "anxiety", "迷茫": "confusion",
"裁员": "fear", "竞争": "competition", "认可": "recognition",
"加班": "burnout", "平衡": "balance", "变革": "change",
"适应": "adaptation", "发展": "growth", "团队": "teamwork"
}
# 情绪映射到建议
self.emotion_advice = {
"stress": {
"emoji": "😰",
"level": "高",
"description": "您表现出明显的压力迹象",
"suggestions": [
"尝试番茄工作法:25分钟专注工作+5分钟休息",
"将大任务分解为小目标,每完成一项给自己小奖励",
"每天安排15分钟'担忧时间',专门思考压力源",
"练习4-7-8呼吸法:吸气4秒,屏气7秒,呼气8秒"
],
"relaxation": [
"想象自己站在宁静的海边,听着海浪声",
"回忆一次让您感到自豪的成功经历",
"写下三件今天值得感恩的小事",
"听一段自然声音的音频(雨声、鸟鸣)"
]
},
"anxiety": {
"emoji": "😟",
"level": "中高",
"description": "您表现出焦虑情绪",
"suggestions": [
"建立早晨仪式:起床后先喝杯水,做5分钟伸展",
"创建每日优先级清单,只关注最重要的3件事",
"限制咖啡因摄入,尤其在下午",
"练习正念冥想:每天10分钟专注于呼吸"
],
"relaxation": [
"尝试渐进式肌肉放松:从脚趾到头部逐部位紧张再放松",
"写下所有担忧,然后撕碎象征性释放",
"观看一段萌宠视频,观察它们的无忧无虑",
"哼唱一首熟悉的歌曲,感受旋律带来的平静"
]
},
"confusion": {
"emoji": "🤔",
"level": "中",
"description": "您对职业方向感到困惑",
"suggestions": [
"与导师或职业教练进行一次结构化对话",
"制作个人技能地图:列出优势、待发展领域",
"探索公司内部轮岗机会或跨部门项目",
"参加行业交流活动,了解不同职业路径",
"设定3个月短期目标,明确可衡量的里程碑"
],
"relaxation": [
"绘制您的理想工作环境图,包括物理和情感要素",
"读一本关于职业发展的励志书籍",
"采访一位您敬佩的职业人士的经历",
"尝试新技能学习,激活大脑的探索模式"
]
},
"fear": {
"emoji": "😨",
"level": "高",
"description": "您表达了对未来的担忧",
"suggestions": [
"更新简历和LinkedIn资料,增强掌控感",
"识别可控与不可控因素,专注前者",
"建立应急基金,增加财务安全感",
"发展副业或提升技能,创造更多可能性",
"定期进行自我肯定练习:写下自己的价值"
],
"relaxation": [
"练习自我同情冥想:像安慰朋友一样对待自己",
"创建愿景板:可视化理想的工作生活场景",
"回顾过去克服困难的经历,提醒自己的韧性",
"种植小盆栽,观察生命成长的疗愈力量"
]
},
"burnout": {
"emoji": "😫",
"level": "高",
"description": "您显示出职业倦怠迹象",
"suggestions": [
"严格执行工作边界:设定下班时间和免打扰时段",
"每周安排半日'数字排毒'时间",
"学会说'不',保护自己的时间和精力",
"寻找工作中的意义点,哪怕是很小的贡献",
"确保每晚7-8小时高质量睡眠"
],
"relaxation": [
"泡个热水澡,加入几滴薰衣草精油",
"做30分钟有氧运动,促进内啡肽分泌",
"准备健康零食盒,避免血糖波动影响情绪",
"整理工作空间,创造清爽环境"
]
},
"neutral": {
"emoji": "😐",
"level": "低",
"description": "您的情绪状态相对平稳",
"suggestions": [
"建立晨间习惯:运动、冥想或阅读",
"定期与同事进行非工作话题的交流",
"主动寻求反馈,了解改进空间",
"规划小型职业发展学习活动"
],
"relaxation": [
"欣赏办公室窗外的风景,练习专注当下",
"尝试新口味的茶或咖啡,体验微小变化",
"给绿植浇水,观察生命细节",
"写工作日记,记录积极时刻"
]
}
}
def analyze_text(self, text):
"""分析文本情绪"""
emotions = []
for keyword, emotion in self.keyword_map.items():
if keyword in text:
emotions.append(emotion)
if not emotions:
return "neutral"
# 返回出现频率最高的情绪
return max(set(emotions), key=emotions.count)
def get_advice(self, emotion):
"""获取情绪对应的建议"""
return self.emotion_advice.get(emotion, self.emotion_advice["neutral"])
# 创新与变革管理建议生成器
class ChangeManagementAdvisor:
def __init__(self):
self.quotes = [
"变革不是威胁,而是机遇。拥抱变化者将引领未来。",
"创新源于不同视角的碰撞,保持开放心态至关重要。",
"在变革时期,学习能力比现有知识更重要。",
"真正的稳定来自于适应变化的能力,而非固守现状。",
"每一次组织变革都是重塑自我的机会,你是自己职业生涯的CEO。",
"创新往往发生在学科交叉处,拓展你的知识边界。",
"领导变革的关键不是消除不确定性,而是学会在不确定中前行。",
"文化变革始于个体行为的改变,从自身做起。",
"数字化转型不仅是技术升级,更是思维方式的转变。",
"可持续的创新需要将人、流程和技术有机结合。"
]
self.strategies = {
"压力管理": [
"实施EAP员工援助计划,提供专业心理咨询",
"建立压力监测系统,定期评估团队心理状态",
"推广正念领导力培训,管理者以身作则",
"设计弹性工作安排,尊重工作生活边界"
],
"变革适应": [
"创建变革故事:清晰传达'为什么变'和'变向何方'",
"建立变革大使网络,培养内部倡导者",
"采用分阶段实施策略,降低变革冲击",
"设立短期胜利庆祝机制,维持变革动力"
],
"创新激发": [
"设立'创新沙盒'实验区,允许试错",
"举办跨学科创新挑战赛,打破部门墙",
"实施'20%时间'政策,鼓励自主探索",
"建立快速原型迭代机制,加速创意验证"
],
"团队协作": [
"引入协作技术工具,减少沟通摩擦",
"设计跨职能团队任务,促进知识共享",
"建立心理安全机制,鼓励建设性冲突",
"实施团队反思会议,持续优化协作方式"
]
}
def get_random_quote(self):
return random.choice(self.quotes)
def get_strategy(self, category):
return random.choice(self.strategies[category])
# 主应用类
class StressMonitorApp:
def __init__(self, root):
self.root = root
self.root.title("AI职场压力监测与调节助手")
self.root.geometry("1000x700")
self.root.configure(bg="#f0f8ff")
# 初始化组件
self.speech_recognizer = SpeechRecognizer()
self.emotion_analyzer = EmotionAnalyzer()
self.change_advisor = ChangeManagementAdvisor()
# 创建历史记录
self.history = []
# 创建UI
self.create_widgets()
# 加载图标
self.load_images()
# 初始显示
self.show_welcome()
def load_images(self):
# 创建简单的表情图标
self.emojis = {
"stress": self.create_emoji_image("😰"),
"anxiety": self.create_emoji_image("😟"),
"confusion": self.create_emoji_image("🤔"),
"fear": self.create_emoji_image("😨"),
"burnout": self.create_emoji_image("😫"),
"neutral": self.create_emoji_image("😐")
}
def create_emoji_image(self, emoji_char):
# 创建一个包含表情符号的图像
fig, ax = plt.subplots(figsize=(2, 2))
ax.text(0.5, 0.5, emoji_char, fontsize=40, ha='center', va='center')
ax.axis('off')
canvas = FigureCanvasTkAgg(fig, master=self.root)
canvas.draw()
return canvas
def create_widgets(self):
# 创建主框架
main_frame = ttk.Frame(self.root)
main_frame.pack(fill=tk.BOTH, expand=True, padx=20, pady=20)
# 左侧面板 - 输入区域
left_frame = ttk.LabelFrame(main_frame, text="压力输入与分析")
left_frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=True, padx=10, pady=10)
# 输入方式选择
input_frame = ttk.Frame(left_frame)
input_frame.pack(fill=tk.X, padx=10, pady=10)
ttk.Label(input_frame, text="输入方式:").pack(side=tk.LEFT)
self.input_var = tk.StringVar(value="text")
ttk.Radiobutton(input_frame, text="文字输入", variable=self.input_var,
value="text", command=self.toggle_input).pack(side=tk.LEFT, padx=5)
ttk.Radiobutton(input_frame, text="语音输入", variable=self.input_var,
value="voice", command=self.toggle_input).pack(side=tk.LEFT, padx=5)
# 文字输入区域
self.text_frame = ttk.Frame(left_frame)
self.text_frame.pack(fill=tk.X, padx=10, pady=5)
ttk.Label(self.text_frame, text="描述您的职场压力:").pack(anchor=tk.W)
self.text_input = scrolledtext.ScrolledText(self.text_frame, height=5, wrap=tk.WORD)
self.text_input.pack(fill=tk.X, pady=5)
self.text_input.insert(tk.END, "例如:我感觉工作压力好大,项目 deadline 快到了...")
# 语音输入按钮
self.voice_frame = ttk.Frame(left_frame)
self.voice_btn = ttk.Button(self.voice_frame, text="开始语音识别", command=self.start_voice_recognition)
self.voice_btn.pack(pady=10)
self.voice_status = ttk.Label(self.voice_frame, text="")
self.voice_status.pack()
# 分析按钮
btn_frame = ttk.Frame(left_frame)
btn_frame.pack(fill=tk.X, padx=10, pady=10)
ttk.Button(btn_frame, text="分析压力状态", command=self.analyze_stress).pack(pady=5)
# 右侧面板 - 结果显示
right_frame = ttk.LabelFrame(main_frame, text="分析与建议")
right_frame.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True, padx=10, pady=10)
# 情绪分析结果
self.result_frame = ttk.Frame(right_frame)
self.result_frame.pack(fill=tk.X, padx=10, pady=10)
ttk.Label(self.result_frame, text="情绪分析结果:", font=("Arial", 10, "bold")).pack(anchor=tk.W)
self.emotion_result = ttk.Label(self.result_frame, text="等待分析...", font=("Arial", 12))
self.emotion_result.pack(anchor=tk.W, pady=5)
# 建议区域
self.advice_frame = ttk.Frame(right_frame)
self.advice_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
# 标签页
self.notebook = ttk.Notebook(self.advice_frame)
self.notebook.pack(fill=tk.BOTH, expand=True)
# 心理疏导建议标签
self.counseling_tab = ttk.Frame(self.notebook)
self.notebook.add(self.counseling_tab, text="心理疏导建议")
self.counseling_text = scrolledtext.ScrolledText(self.counseling_tab, wrap=tk.WORD)
self.counseling_text.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)
self.counseling_text.insert(tk.END, "分析结果将显示在这里...")
self.counseling_text.config(state=tk.DISABLED)
# 放松文案标签
self.relaxation_tab = ttk.Frame(self.notebook)
self.notebook.add(self.relaxation_tab, text="放松文案")
self.relaxation_text = scrolledtext.ScrolledText(self.relaxation_tab, wrap=tk.WORD)
self.relaxation_text.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)
self.relaxation_text.insert(tk.END, "放松内容将显示在这里...")
self.relaxation_text.config(state=tk.DISABLED)
# 创新与变革管理标签
self.change_tab = ttk.Frame(self.notebook)
self.notebook.add(self.change_tab, text="创新与变革管理")
self.change_text = scrolledtext.ScrolledText(self.change_tab, wrap=tk.WORD)
self.change_text.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)
self.change_text.insert(tk.END, "创新与变革建议将显示在这里...")
self.change_text.config(state=tk.DISABLED)
# 底部功能区
bottom_frame = ttk.Frame(main_frame)
bottom_frame.pack(fill=tk.X, padx=10, pady=10)
ttk.Button(bottom_frame, text="查看历史记录", command=self.show_history).pack(side=tk.LEFT, padx=5)
ttk.Button(bottom_frame, text="压力趋势图", command=self.show_trend).pack(side=tk.LEFT, padx=5)
ttk.Button(bottom_frame, text="退出", command=self.root.quit).pack(side=tk.RIGHT, padx=5)
# 初始隐藏语音相关元素
self.toggle_input()
def toggle_input(self):
if self.input_var.get() == "text":
self.text_frame.pack(fill=tk.X, padx=10, pady=5)
self.voice_frame.pack_forget()
else:
self.text_frame.pack_forget()
self.voice_frame.pack(fill=tk.X, padx=10, pady=5)
def start_voice_recognition(self):
self.voice_btn.config(state=tk.DISABLED)
self.voice_status.config(text="正在聆听...请说话")
# 模拟语音识别线程
threading.Thread(target=self.simulate_voice_recognition, daemon=True).start()
def simulate_voice_recognition(self):
# 模拟语音识别过程
time.sleep(2)
text = self.speech_recognizer.recognize_speech()
# 更新UI
self.root.after(0, lambda: self.update_voice_result(text))
def update_voice_result(self, text):
self.text_input.delete(1.0, tk.END)
self.text_input.insert(tk.END, text)
self.voice_btn.config(state=tk.NORMAL)
self.voice_status.config(text=f"识别成功: {text}")
def analyze_stress(self):
# 获取输入文本
if self.input_var.get() == "text":
text = self.text_input.get(1.0, tk.END).strip()
if not text or text.startswith("例如:"):
messagebox.showwarning("输入为空", "请输入您的压力描述")
return
else:
text = self.text_input.get(1.0, tk.END).strip()
if not text:
messagebox.showwarning("识别失败", "未能识别到有效语音内容")
return
# 分析情绪
emotion = self.emotion_analyzer.analyze_text(text)
advice_data = self.emotion_analyzer.get_advice(emotion)
# 添加到历史记录
timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
self.history.append({
"timestamp": timestamp,
"text": text,
"emotion": emotion,
"advice": advice_data
})
# 显示结果
self.display_results(emotion, advice_data)
# 显示创新与变革管理建议
self.display_change_management_advice()
def display_results(self, emotion, advice_data):
# 更新情绪结果
self.emotion_result.config(
text=f"{advice_data['emoji']} {emotion.upper()} ({advice_data['level']}压力水平) - {advice_data['description']}"
)
# 更新心理疏导建议
self.counseling_text.config(state=tk.NORMAL)
self.counseling_text.delete(1.0, tk.END)
self.counseling_text.insert(tk.END, f"【{emotion.upper()}情绪疏导建议】\n\n")
for i, suggestion in enumerate(advice_data["suggestions"], 1):
self.counseling_text.insert(tk.END, f"{i}. {suggestion}\n")
self.counseling_text.config(state=tk.DISABLED)
# 更新放松文案
self.relaxation_text.config(state=tk.NORMAL)
self.relaxation_text.delete(1.0, tk.END)
self.relaxation_text.insert(tk.END, f"【{emotion.upper()}情绪放松文案】\n\n")
for i, relaxation in enumerate(advice_data["relaxation"], 1):
self.relaxation_text.insert(tk.END, f"• {relaxation}\n")
self.relaxation_text.insert(tk.END, "\n【每日正念提醒】\n\n")
self.relaxation_text.insert(tk.END, "此刻的呼吸,连接着生命的能量。\n")
self.relaxation_text.insert(tk.END, "感受空气进入鼻腔的清凉,充满肺部的舒展。\n")
self.relaxation_text.insert(tk.END, "让思绪如云朵般飘过,不执着,不评判。\n")
self.relaxation_text.insert(tk.END, "你在此刻是安全的,完整的。")
self.relaxation_text.config(state=tk.DISABLED)
def display_change_management_advice(self):
# 获取随机引言
quote = self.change_advisor.get_random_quote()
# 获取随机策略
strategies = []
for category in self.change_advisor.strategies:
strategies.append(f"{category}: {self.change_advisor.get_strategy(category)}")
# 更新创新与变革管理建议
self.change_text.config(state=tk.NORMAL)
self.change_text.delete(1.0, tk.END)
self.change_text.insert(tk.END, f"【创新与变革智慧】\n\n\"{quote}\"\n\n")
self.change_text.insert(tk.END, "【实用变革策略】\n\n")
for strategy in strategies:
self.change_text.insert(tk.END, f"• {strategy}\n")
self.change_text.insert(tk.END, "\n【变革适应宣言】\n\n")
self.change_text.insert(tk.END, "我接纳变化为成长的催化剂,\n")
self.change_text.insert(tk.END, "在不确定中保持内在指南针,\n")
self.change_text.insert(tk.END, "将挑战转化为展现韧性的舞台,\n")
self.change_text.insert(tk.END, "以学习者姿态拥抱每个新可能。")
self.change_text.config(state=tk.DISABLED)
def show_history(self):
if not self.history:
messagebox.showinfo("历史记录", "暂无分析记录")
return
history_win = tk.Toplevel(self.root)
history_win.title("压力分析历史记录")
history_win.geometry("600x400")
frame = ttk.Frame(history_win)
frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
columns = ("时间", "压力描述", "情绪类型")
tree = ttk.Treeview(frame, columns=columns, show="headings")
for col in columns:
tree.heading(col, text=col)
tree.column(col, width=150)
tree.column("压力描述", width=250)
for record in self.history:
tree.insert("", tk.END, values=(
record["timestamp"],
record["text"][:50] + "..." if len(record["text"]) > 50 else record["text"],
record["emotion"]
))
scrollbar = ttk.Scrollbar(frame, orient=tk.VERTICAL, command=tree.yview)
tree.configure(yscroll=scrollbar.set)
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
tree.pack(fill=tk.BOTH, expand=True)
ttk.Button(history_win, text="关闭", command=history_win.destroy).pack(pady=10)
def show_trend(self):
if len(self.history) < 2:
messagebox.showinfo("压力趋势", "需要至少两次分析才能显示趋势")
return
trend_win = tk.Toplevel(self.root)
trend_win.title("压力趋势分析")
trend_win.geometry("800x500")
# 提取数据
timestamps = [datetime.datetime.strptime(r["timestamp"], "%Y-%m-%d %H:%M:%S") for r in self.history]
emotions = [r["emotion"] for r in self.history]
# 情绪映射到数值
emotion_values = {
"stress": 5, "anxiety": 4, "confusion": 3,
"fear": 4, "burnout": 5, "neutral": 1
}
values = [emotion_values.get(e, 2) for e in emotions]
# 创建图表
fig, ax = plt.subplots(figsize=(10, 6))
ax.plot(timestamps, values, 'o-', color='#1f77b4', linewidth=2, markersize=8)
# 添加标签
for i, txt in enumerate(emotions):
ax.annotate(txt, (timestamps[i], values[i]),
textcoords="offset points", xytext=(0,10), ha='center')
# 设置图表属性
ax.set_title("职场压力变化趋势", fontsize=14)
ax.set_xlabel("时间", fontsize=10)
ax.set_ylabel("压力水平", fontsize=10)
ax.grid(True, linestyle='--', alpha=0.7)
ax.set_yticks([1, 2, 3, 4, 5])
ax.set_yticklabels(["低", "较低", "中", "较高", "高"])
plt.xticks(rotation=45)
plt.tight_layout()
# 嵌入到Tkinter
canvas = FigureCanvasTkAgg(fig, master=trend_win)
canvas.draw()
canvas.get_tk_widget().pack(fill=tk.BOTH, expand=True)
ttk.Button(trend_win, text="关闭", command=trend_win.destroy).pack(pady=10)
def show_welcome(self):
welcome_msg = (
"欢迎使用AI职场压力监测与调节助手!\n\n"
"本系统结合创新与变革管理理念,通过智能分析帮助您:\n"
"• 识别职场压力源与情绪状态\n"
"• 提供个性化心理疏导建议\n"
"• 推送定制化放松文案\n"
"• 分享变革适应与创新策略\n\n"
"使用方法:\n"
"1. 选择输入方式(文字或语音)\n"
"2. 描述您的职场压力状况\n"
"3. 点击'分析压力状态'获取建议\n\n"
"祝您工作顺利,身心安康!"
)
messagebox.showinfo("欢迎使用", welcome_msg)
if __name__ == "__main__":
root = tk.Tk()
app = StressMonitorApp(root)
root.mainloop()
程序功能说明
这个AI职场压力监测与调节助手具有以下核心功能:
1. 多模态输入支持
- 文字输入:用户可以直接输入文字描述职场压力
- 语音输入:模拟语音识别功能(实际应用中可集成真实语音API)
2. 智能情绪分析
- 基于关键词识别情绪类型(压力、焦虑、困惑、恐惧、倦怠等)
- 评估压力水平(高、中、低)
- 提供情绪描述和表情符号可视化
3. 个性化建议推送
- 心理疏导建议:针对不同情绪提供具体应对策略
- 放松文案:包含正念练习、想象引导等放松技巧
- 创新与变革管理建议:结合课程内容提供职场适应策略
4. 历史记录与趋势分析
- 保存每次分析结果
- 可视化压力变化趋势
- 查看历史记录详情
5. 创新与变革管理整合
- 引用经典变革管理名言
- 提供实用的变革适应策略
- 分享创新激发方法
创新与变革管理课程整合
程序特别融入了创新与变革管理的核心理念:
1. 变革适应策略
- 强调变化作为成长机会的心态
- 提供分阶段实施、短期胜利庆祝等实用方法
2. 创新激发机制
- 建议设立"创新沙盒"实验区
- 提倡跨学科协作和"20%时间"政策
3. 压力管理与心理安全
- 整合EAP员工援助计划
- 强调建立心理安全机制的重要性
4. 持续学习与适应能力
- 突出学习能力比现有知识更重要的理念
- 鼓励发展适应变化的核心能力
使用说明
1. 运行程序后,选择输入方式(文字或语音)
2. 描述您的职场压力状况
3. 点击"分析压力状态"按钮
4. 查看右侧面板的分析结果和建议
5. 使用底部按钮查看历史记录或压力趋势图
这个程序通过结合情绪分析和创新管理理论,为用户提供了一个全面的职场压力管理解决方案,帮助用户更好地应对变革中的挑战。
我是编程小白,请大家多多指教,谢谢!