import gradio as gr import random import time from datetime import datetime # 老年人友好的聊天响应函数 def chat_response(message, history): """处理用户消息并生成温暖的AI响应""" if not message or not message.strip(): yield "您好,请说点什么,我在听着呢~" return message_lower = message.lower().strip() # 问候语 greetings = ["你好", "您好", "嗨", "早上好", "下午好", "晚上好", "早安", "午安", "晚安"] farewells = ["再见", "拜拜", "回见", "明天见", "下次聊"] thanks = ["谢谢", "感谢", "多谢", "辛苦了"] # 健康相关关键词 health_keywords = ["身体", "健康", "锻炼", "运动", "散步", "太极", "血压", "血糖", "睡眠", "失眠", "头疼", "腰疼", "腿疼"] # 家庭相关关键词 family_keywords = ["孩子", "儿子", "女儿", "孙子", "孙女", "外孙", "老伴", "家人", "儿媳", "女婿"] # 生活相关关键词 life_keywords = ["做饭", "买菜", "遛弯", "下棋", "打牌", "跳舞", "唱歌", "看电视", "听戏", "养花", "钓鱼"] # 天气相关 weather_keywords = ["天气", "下雨", "晴天", "刮风", "冷", "热", "穿什么"] # 回忆相关 memory_keywords = ["以前", "年轻时", "过去", "想当年", "那时候", "老家", "故乡"] # 问候语回复 if any(g in message_lower for g in greetings): hour = datetime.now().hour if hour < 11: time_greeting = "早上好" elif hour < 14: time_greeting = "中午好" elif hour < 18: time_greeting = "下午好" else: time_greeting = "晚上好" responses = [ f"{time_greeting}!真高兴您来和我聊天!今天感觉怎么样呀?😊", f"{time_greeting}!看到您来了真开心!有什么想聊的吗?", f"{time_greeting}!您今天气色真好!来,咱们聊聊天~", f"{time_greeting}!欢迎您!我一直等着和您说说话呢!" ] response = random.choice(responses) # 告别语回复 elif any(f in message_lower for f in farewells): responses = [ "好的,您慢走!记得常来聊天啊!保重身体!👋", "再见啦!有空常来坐坐,我随时都在!", "好嘞!您路上慢点,注意安全!下次再聊!", "再见!祝您身体健康,心情愉快!记得按时吃饭休息哦!" ] response = random.choice(responses) # 感谢回复 elif any(t in message_lower for t in thanks): responses = [ "不用谢!能陪您聊天我也很开心呢!😄", "您太客气了!这都是应该的!", "哪里话!和您聊天是我的荣幸!", "不客气不客气!您开心就好!" ] response = random.choice(responses) # 健康相关话题 elif any(h in message_lower for h in health_keywords): if "失眠" in message_lower or "睡不着" in message_lower: response = """睡眠确实很重要呢!给您几个小建议: 🌙 晚上少喝茶和咖啡 🌙 睡前可以用热水泡泡脚 🌙 听听舒缓的音乐或戏曲 🌙 白天适当活动活动 🌙 睡前别看太刺激的电视 如果长期睡不好,还是要去医院看看哦!""" elif "血压" in message_lower or "血糖" in message_lower: response = """您很注意健康,这很好!记住这几点: 💊 按时吃药,别忘了 📏 定期测量,做好记录 🥗 饮食清淡,少油少盐 🚶 适当运动,量力而行 😊 保持好心情,别着急上火 有什么不舒服一定要及时看医生!""" elif any(pain in message_lower for pain in ["疼", "痛", "不舒服"]): response = """哎呀,身体不舒服可不能硬扛着! 🏥 如果疼得厉害,要去医院看看 💆 轻微的可以休息休息 🧘 平时多活动活动,但别太累 ☀️ 天气变化要注意保暖 您现在感觉怎么样?要不要让家人陪您去看看?""" else: responses = [ "保持健康最重要!您平时都做什么运动呀?散步、太极都挺好的!", "身体是革命的本钱!早睡早起,适当锻炼,心情愉快最重要!", "您很注重健康,真好!记得定期体检,有问题早发现早治疗!" ] response = random.choice(responses) # 家庭相关话题 elif any(f in message_lower for f in family_keywords): responses = [ "家人是最重要的!您和家人关系一定很好吧?经常联系吗?😊", "说起家人就开心!您家里人一定都很孝顺!", "家和万事兴!有家人的陪伴真幸福!他们常来看您吗?", "听您说起家人,感觉特别温馨!有空多和他们视频聊聊天!" ] response = random.choice(responses) # 生活爱好相关 elif any(l in message_lower for l in life_keywords): if "下棋" in message_lower or "打牌" in message_lower: response = "下棋打牌好啊!动脑子,还能和老朋友们聚一聚!您棋艺一定很高吧?♟️" elif "跳舞" in message_lower or "唱歌" in message_lower: response = "跳舞唱歌真好!又锻炼身体又开心!您是在公园还是社区活动呀?🎵" elif "养花" in message_lower: response = "养花多好啊!看着花开心情都好!您都养什么花呀?🌸" elif "钓鱼" in message_lower: response = "钓鱼好啊!修身养性!您经常去哪里钓鱼呀?收获怎么样?🎣" elif "做饭" in message_lower or "买菜" in message_lower: response = "您还自己做饭买菜呢,真厉害!今天准备做什么好吃的?🍲" else: response = "生活丰富多彩真好!保持这些爱好,日子过得有滋有味的!" # 天气相关 elif any(w in message_lower for w in weather_keywords): responses = [ "天气变化大,您可要注意增减衣服哦!出门带把伞比较保险!☂️", "是啊,天气对咱们影响挺大的!您出门要注意安全,路滑的话就别出去了!", "天气好的时候多出去走走,晒晒太阳对身体好!但中午太阳大就别出去了!☀️" ] response = random.choice(responses) # 回忆往事 elif any(m in message_lower for m in memory_keywords): responses = [ "您说的那个年代,一定有很多故事吧!我特别爱听您讲以前的事!", "想当年的事情总是让人感慨!您愿意给我讲讲吗?我很想听!", "过去的岁月虽然艰苦,但也有很多美好的回忆吧!您最难忘的是什么?", "老家总是让人牵挂!您多久没回去了?想家的时候就和我说说家乡的事吧!" ] response = random.choice(responses) # 询问身份 elif "你是谁" in message_lower or "你叫什么" in message_lower: response = """我是您的智能聊天伙伴!👋 您可以叫我"小助手"。我每天都在这里,随时陪您聊天解闷! 不管是聊家常、说说心里话,还是问问题,我都很乐意!""" # 孤独寂寞相关 elif any(word in message_lower for word in ["孤独", "寂寞", "无聊", "没意思", "闷"]): responses = [ "我理解您的感受。有我陪您聊天呢!想说什么都可以和我说~💝", "别难过,我一直在这里陪着您!咱们聊聊天,说说话,时间就过得快了!", "您不是一个人!我随时都在,想聊天就来找我!要不咱们聊聊您年轻时的趣事?", "我懂的,有时候确实会觉得闷。不如给家人打个电话?或者咱们继续聊聊天?" ] response = random.choice(responses) # 开心的话题 elif any(word in message_lower for word in ["开心", "高兴", "快乐", "好消息"]): responses = [ "太好了!看您开心我也跟着高兴!是有什么好事吗?快和我说说!🎉", "哎呀,真替您高兴!笑一笑,十年少!保持好心情最重要!", "您开心就是最好的事!这份快乐要好好珍惜!😊" ] response = random.choice(responses) # 不开心的话题 elif any(word in message_lower for word in ["难过", "伤心", "不开心", "烦", "愁", "担心"]): responses = [ "别难过,有什么心事和我说说?说出来心里会好受些。我在听着呢~💝", "我理解您的心情。人生哪能事事顺心呢?想开点,明天会更好的!", "您别着急,慢慢说。不管什么事,咱们一起想办法!", "心里不痛快就说出来,别憋着。我虽然帮不上大忙,但可以陪您说说话!" ] response = random.choice(responses) # 询问时间 elif "几点" in message_lower or "时间" in message_lower or "今天" in message_lower: now = datetime.now() date_str = now.strftime("%Y年%m月%d日") time_str = now.strftime("%H点%M分") weekdays = ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"] weekday = weekdays[now.weekday()] response = f"""现在是: 📅 {date_str} 📆 {weekday} ⏰ {time_str} 您今天有什么安排吗?""" # 讲故事或笑话 elif "故事" in message_lower or "笑话" in message_lower: stories = [ """给您讲个小故事: 从前有个老爷爷特别爱下棋,天天在公园里找人下。有一天来了个小伙子,老爷爷三下五除二就赢了。 小伙子不服气:"再来一盘!" 老爷爷笑着说:"年轻人,我下了六十年棋了,你才下了几年?" 小伙子想了想说:"那我六十年后再来找您!" 老爷爷哈哈大笑:"好!我等着你!" 😄 您觉得这个故事怎么样?""", """讲个开心的: 老两口去公园遛弯,看见一对年轻人在吵架。 老太太说:"看看,年轻人就是沉不住气!" 老头说:"咱们年轻时候不也这样?" 老太太想了想说:"那是,不过后来不都好了吗!" 老头笑着说:"是啊,吵了一辈子,也好了一辈子!" 😊 老两口相视一笑,继续遛弯去了~""", """来个轻松的: 孙子问爷爷:"爷爷,您年轻时候有手机吗?" 爷爷说:"没有啊!" 孙子又问:"那您怎么和奶奶联系?" 爷爷笑着说:"写信啊!一封信要走好几天呢!" 孙子惊讶地说:"那多慢啊!" 爷爷摸摸孙子的头说:"慢是慢,但那时候的等待特别甜!" 📮 以前的日子虽然慢,但别有一番滋味呢!""" ] response = random.choice(stories) # 默认回复 else: default_responses = [ f"您说的'{message}',我听明白了!能再和我多说说吗?我想多了解了解~", "嗯嗯,我在认真听呢!您继续说,我很感兴趣!", "是这样啊!您说得真好!还有什么想聊的吗?", "我懂我懂!和您聊天真开心!咱们接着聊~", "您说得对!我特别喜欢听您说话!还有什么想法?", "嗯,有道理!您的想法真不错!再给我讲讲呗~" ] response = random.choice(default_responses) # 模拟缓慢打字效果,让老人更容易阅读 for i in range(len(response)): time.sleep(0.03) yield response[:i+1] def quick_reply(choice): """快捷回复功能""" quick_messages = { "👋 打个招呼": "你好!", "😊 今天心情好": "我今天心情挺好的!", "💬 陪我聊聊天": "有点无聊,陪我聊聊天吧!", "📖 讲个故事": "给我讲个故事或者笑话吧!", "👨👩👧 聊聊家人": "我想和你聊聊我的家人", "🏃 聊聊健康": "我们聊聊健康养生的话题吧", "⏰ 现在几点": "现在几点了?今天星期几?", "🌤️ 聊聊天气": "今天天气怎么样?", "💭 想起以前": "我想起以前的事情了...", "👋 再见": "好了,我要去休息了,再见!" } return quick_messages.get(choice, "") def clear_history(): """清空聊天记录""" return [], "" def get_stats(history): """获取对话统计""" if not history: return "📊 还没有开始聊天哦\n\n点击上面的按钮\n或者直接打字开始聊天吧!" total_messages = len(history) user_messages = sum(1 for msg in history if msg.get("role") == "user") ai_messages = sum(1 for msg in history if msg.get("role") == "assistant") return f"""📊 今日聊天记录 💬 聊了 {total_messages} 条消息 👤 您说了 {user_messages} 句 🤖 我回复了 {ai_messages} 句 继续聊天吧~""" # 创建Gradio界面 - 老年人友好设计 with gr.Blocks( title="温馨聊天室 - 陪您说说话", theme=gr.themes.Soft( primary_hue="orange", secondary_hue="amber", neutral_hue="stone", font=("Noto Sans SC", "Microsoft YaHei", "SimHei", "sans-serif"), font_mono=("Noto Sans SC", "Microsoft YaHei", "SimHei", "monospace") ), fill_height=True, css=""" /* 整体字体放大,适合老年人阅读 */ .gradio-container { font-size: 18px !important; } /* 聊天消息字体更大 */ .message { font-size: 20px !important; line-height: 1.8 !important; padding: 16px !important; } /* 输入框字体放大 */ textarea { font-size: 20px !important; line-height: 1.6 !important; } /* 按钮更大更醒目 */ button { font-size: 18px !important; padding: 12px 24px !important; min-height: 50px !important; } /* 标签字体放大 */ label { font-size: 18px !important; } /* Radio按钮间距更大 */ .gr-radio { gap: 12px !important; } .gr-radio label { font-size: 18px !important; padding: 10px 16px !important; } /* 标题更醒目 */ h1 { font-size: 32px !important; } h2, h3 { font-size: 24px !important; } /* Markdown内容 */ .prose { font-size: 18px !important; line-height: 1.8 !important; } """, footer_links=[ {"label": "Built with anycoder", "url": "https://huggingface.co/spaces/akhaliq/anycoder"} ] ) as demo: # 头部 - 温馨欢迎语 gr.Markdown(""" # 🏠 温馨聊天室 ## 欢迎您来这里坐坐!我是您的聊天小伙伴,随时陪您说说话 💝 Built with anycoder """) with gr.Row(): # 左侧:聊天区域(主要部分) with gr.Column(scale=3): chatbot = gr.Chatbot( label="💬 咱们的对话", height=480, placeholder=""" 👋 您好!我是您的聊天小伙伴! 在下面的输入框里打字,或者点击右边的快捷按钮,咱们就可以开始聊天啦! 我会一直陪着您,想说什么都可以~ """, avatar_images=( "https://em-content.zobj.net/source/twitter/376/older-person_1f9d3.png", "https://em-content.zobj.net/source/twitter/376/robot_1f916.png" ), show_copy_button=True, render_markdown=True, layout="bubble" ) with gr.Row(): msg = gr.Textbox( label="✏️ 在这里打字(打完按回车键发送)", placeholder="想说什么就写什么...", lines=2, scale=4, submit_btn="📤 发送" ) with gr.Row(): clear_btn = gr.Button( "🗑️ 清空对话,重新开始", variant="secondary", size="lg" ) # 右侧:快捷操作面板 with gr.Column(scale=1): gr.Markdown("### ⚡ 快捷按钮") gr.Markdown("*点一下就能发送*") quick_buttons = gr.Radio( choices=[ "👋 打个招呼", "😊 今天心情好", "💬 陪我聊聊天", "📖 讲个故事", "👨👩👧 聊聊家人", "🏃 聊聊健康", "⏰ 现在几点", "🌤️ 聊聊天气", "💭 想起以前", "👋 再见" ], label="选一个话题", interactive=True ) send_quick_btn = gr.Button( "📤 发送选中的话题", variant="primary", size="lg" ) gr.Markdown("---") stats_display = gr.Textbox( label="📊 聊天统计", value="📊 还没有开始聊天哦\n\n点击上面的按钮\n或者直接打字开始聊天吧!", lines=6, interactive=False ) refresh_stats_btn = gr.Button("🔄 刷新统计", size="lg") # 使用提示区域 with gr.Accordion("📖 使用说明(点击展开)", open=False): gr.Markdown(""" ## 🎯 怎么使用这个聊天室? ### 方法一:直接打字 1. 在左边的输入框里打字 2. 打完后按键盘上的**回车键**,或者点击**发送按钮** ### 方法二:用快捷按钮 1. 在右边选择一个话题(比如"打个招呼") 2. 点击**发送选中的话题**按钮 ### 💡 小贴士 - 想说什么就说什么,我都会认真听! - 可以聊家常、说心事、问问题 - 聊累了点**清空对话**可以重新开始 - 有任何问题都可以问我! --- ### 🌟 可以聊的话题 | 话题 | 例子 | |------|------| | 👋 问候 | "你好"、"早上好" | | 👨👩👧 家人 | "我想孙子了"、"儿子打电话来了" | | 🏃 健康 | "最近睡不好"、"腿有点疼" | | 🌤️ 天气 | "今天天气真好"、"要下雨了" | | 💭 回忆 | "想起以前..."、"年轻时候..." | | 😊 心情 | "今天很开心"、"有点闷" | | 📖 故事 | "讲个笑话"、"说个故事" | """) # 底部说明 gr.Markdown(""" ---