AI专属睡前故事生成器,核心功能,输入孩子姓名,年龄,爱好自动生成个性化睡前故事,并支持语音朗读,应用场景,家长陪伴孩子入睡。

AI专属睡前故事生成器

下面是一个完整的AI专属睡前故事生成器程序,它可以根据孩子的姓名、年龄和爱好生成个性化的睡前故事,并支持语音朗读功能。

import random
import pygame
import time
from gtts import gTTS
import os
import tkinter as tk
from tkinter import ttk, messagebox
from PIL import Image, ImageTk
import threading

class BedtimeStoryGenerator:
    def __init__(self):
        # 故事元素数据库
        self.story_elements = {
            "characters": [
                "勇敢的小探险家", "好奇的发明家", "善良的魔法师", "聪明的自然观察家", 
                "有梦想的太空旅行者", "热爱海洋的生物学家", "森林守护者", "动物朋友的好伙伴"
            ],
            "settings": [
                "神秘的魔法森林", "遥远的彩虹星球", "月光下的海底世界", "云端之上的天空之城",
                "会移动的糖果岛", "时间流转的古树屋", "星星编织的梦境花园", "四季如画的童话山谷"
            ],
            "objects": [
                "会说话的星星地图", "彩虹色的魔法画笔", "能实现愿望的音乐盒", 
                "记忆水晶球", "梦想种子", "友谊手环", "智慧之书", "勇气徽章"
            ],
            "challenges": [
                "解开古老谜题", "帮助迷路的小精灵回家", "修复破碎的彩虹桥", 
                "寻找失落的阳光宝石", "唤醒沉睡的梦境花朵", "调解森林动物的小争执",
                "收集散落的快乐音符", "建造通往云端的阶梯"
            ],
            "friends": [
                "会飞的兔子", "聪明的猫头鹰博士", "害羞的独角兽", "活泼的海豚",
                "忠诚的机械狗", "幽默的松鼠", "优雅的天鹅公主", "调皮的小精灵"
            ],
            "lessons": [
                "善良是最强大的魔法", "每个梦想都值得被尊重", "友谊让旅程不再孤单", 
                "好奇心是探索世界的钥匙", "勇气不是不害怕而是继续前进", 
                "分享让快乐加倍", "耐心等待会有美好收获", "感恩让心灵充满阳光"
            ]
        }
        
        # 不同年龄段的故事复杂度
        self.age_complexity = {
            3: {"min_length": 80, "max_length": 120, "vocab_level": "simple"},
            4: {"min_length": 100, "max_length": 150, "vocab_level": "simple"},
            5: {"min_length": 120, "max_length": 180, "vocab_level": "medium"},
            6: {"min_length": 150, "max_length": 220, "vocab_level": "medium"},
            7: {"min_length": 180, "max_length": 260, "vocab_level": "advanced"},
            8: {"min_length": 200, "max_length": 300, "vocab_level": "advanced"}
        }
        
        # 爱好映射表
        self.hobby_mapping = {
            "恐龙": ["远古丛林", "化石挖掘", "雷龙", "翼龙", "三角龙", "恐龙博物馆"],
            "太空": ["银河系", "火箭飞船", "宇航员", "外星朋友", "行星探索", "星座"],
            "海洋": ["珊瑚礁", "潜水艇", "海豚", "发光水母", "沉船宝藏", "海洋保护"],
            "动物": ["非洲草原", "动物王国", "大象", "长颈鹿", "狮子", "动物救助"],
            "机器人": ["未来城市", "编程指令", "机械臂", "人工智能", "科技博物馆", "创新实验室"],
            "绘画": ["色彩王国", "魔法画笔", "画廊展览", "艺术比赛", "创意工作坊", "调色板"],
            "音乐": ["旋律森林", "乐器交响", "音符精灵", "音乐会", "作曲灵感", "节奏游戏"],
            "运动": ["冠军之路", "团队配合", "体能挑战", "运动精神", "奖杯梦想", "健康生活"]
        }
        
        # 初始化pygame用于音频播放
        pygame.mixer.init()
        
    def generate_story(self, name, age, hobbies):
        """生成个性化睡前故事"""
        if age not in self.age_complexity:
            age = 5  # 默认年龄
        
        complexity = self.age_complexity[age]
        min_len, max_len = complexity["min_length"], complexity["max_length"]
        
        # 选择故事元素
        character = random.choice(self.story_elements["characters"])
        setting = random.choice(self.story_elements["settings"])
        obj = random.choice(self.story_elements["objects"])
        challenge = random.choice(self.story_elements["challenges"])
        friend = random.choice(self.story_elements["friends"])
        lesson = random.choice(self.story_elements["lessons"])
        
        # 整合爱好元素
        hobby_elements = []
        for hobby in hobbies.split(','):
            hobby = hobby.strip()
            if hobby in self.hobby_mapping:
                hobby_elements.extend(random.sample(self.hobby_mapping[hobby], 2))
        
        # 如果没有有效爱好,添加通用元素
        if not hobby_elements:
            hobby_elements = ["奇妙冒险", "快乐时光", "成长体验"]
        
        # 构建故事
        story_parts = [
            f"在{setting}里,住着一位名叫{name}的{character}。",
            f"{name}今年{age}岁,他/她特别喜欢{'、'.join(hobbies.split(',')[:2])}。",
            f"一天,{name}发现了一个神奇的{obj},它能指引{name}去完成一次特别的旅程。",
            f"这次旅程的任务是{challenge}。",
            f"在路上,{name}遇到了新朋友——一只可爱的{friend}。",
            f"他们一起穿越了{'和'.join(hobby_elements[:2])},经历了许多有趣的冒险。",
            f"在旅程中,{name}学会了{hobby_elements[2]},还发现了{hobby_elements[3]}的秘密。",
            f"最终,{name}成功完成了任务,明白了{lesson}的重要道理。",
            f"带着满满的收获和新朋友{friend}的祝福,{name}甜甜地进入了梦乡。"
        ]
        
        # 组合故事并确保长度合适
        story = "".join(story_parts)
        current_length = len(story)
        
        # 如果故事太短,添加额外内容
        while current_length < min_len:
            extra_part = f"\n在梦中,{name}又回到了{setting},继续探索{hobby_elements[0]}的奥秘。"
            story += extra_part
            current_length = len(story)
            
        # 如果故事太长,适当截断
        if current_length > max_len:
            story = story[:max_len] + "..."
            
        return story
    
    def text_to_speech(self, text, lang='zh-CN'):
        """将文本转换为语音并播放"""
        try:
            # 生成临时音频文件
            tts = gTTS(text=text, lang=lang, slow=False)
            filename = f"story_{int(time.time())}.mp3"
            tts.save(filename)
            
            # 播放音频
            pygame.mixer.music.load(filename)
            pygame.mixer.music.play()
            
            # 等待播放完成
            while pygame.mixer.music.get_busy():
                time.sleep(0.1)
                
            # 删除临时文件
            os.remove(filename)
            return True
        except Exception as e:
            print(f"语音合成错误: {e}")
            return False

class StoryApp:
    def __init__(self, root):
        self.root = root
        self.root.title("AI专属睡前故事生成器")
        self.root.geometry("800x600")
        self.root.configure(bg="#f0f8ff")
        
        # 创建故事生成器实例
        self.generator = BedtimeStoryGenerator()
        
        # 设置应用图标
        try:
            self.root.iconbitmap("story_icon.ico")
        except:
            pass
        
        # 创建UI
        self.create_widgets()
        
    def create_widgets(self):
        # 标题
        title_frame = tk.Frame(self.root, bg="#4b86b4", height=80)
        title_frame.pack(fill="x", padx=10, pady=10)
        
        title_label = tk.Label(title_frame, text="✨ AI专属睡前故事生成器 ✨", 
                             font=("Arial", 24, "bold"), fg="white", bg="#4b86b4")
        title_label.pack(pady=20)
        
        # 输入区域
        input_frame = tk.LabelFrame(self.root, text="孩子信息", font=("Arial", 12), 
                                  bg="#f0f8ff", padx=10, pady=10)
        input_frame.pack(fill="x", padx=20, pady=10)
        
        # 姓名输入
        tk.Label(input_frame, text="孩子姓名:", bg="#f0f8ff", font=("Arial", 11)).grid(row=0, column=0, sticky="w", padx=5, pady=5)
        self.name_entry = tk.Entry(input_frame, font=("Arial", 11), width=30)
        self.name_entry.grid(row=0, column=1, padx=5, pady=5)
        self.name_entry.insert(0, "小明")
        
        # 年龄输入
        tk.Label(input_frame, text="孩子年龄:", bg="#f0f8ff", font=("Arial", 11)).grid(row=1, column=0, sticky="w", padx=5, pady=5)
        self.age_var = tk.StringVar()
        age_combo = ttk.Combobox(input_frame, textvariable=self.age_var, 
                               values=["3", "4", "5", "6", "7", "8"], 
                               state="readonly", width=27, font=("Arial", 11))
        age_combo.grid(row=1, column=1, padx=5, pady=5)
        age_combo.current(2)  # 默认选择5岁
        
        # 爱好输入
        tk.Label(input_frame, text="孩子爱好 (用逗号分隔):", bg="#f0f8ff", font=("Arial", 11)).grid(row=2, column=0, sticky="w", padx=5, pady=5)
        self.hobby_entry = tk.Entry(input_frame, font=("Arial", 11), width=30)
        self.hobby_entry.grid(row=2, column=1, padx=5, pady=5)
        self.hobby_entry.insert(0, "恐龙, 绘画")
        
        # 按钮区域
        button_frame = tk.Frame(self.root, bg="#f0f8ff")
        button_frame.pack(pady=15)
        
        self.generate_btn = tk.Button(button_frame, text="生成故事", command=self.generate_story, 
                                    bg="#63a375", fg="white", font=("Arial", 12, "bold"), 
                                    padx=15, pady=8, relief="flat")
        self.generate_btn.pack(side="left", padx=10)
        
        self.speak_btn = tk.Button(button_frame, text="朗读故事", command=self.speak_story, 
                                 bg="#5d8aa8", fg="white", font=("Arial", 12, "bold"), 
                                 padx=15, pady=8, relief="flat", state="disabled")
        self.speak_btn.pack(side="left", padx=10)
        
        self.stop_btn = tk.Button(button_frame, text="停止朗读", command=self.stop_speaking, 
                                bg="#c94c4c", fg="white", font=("Arial", 12, "bold"), 
                                padx=15, pady=8, relief="flat", state="disabled")
        self.stop_btn.pack(side="left", padx=10)
        
        # 故事显示区域
        story_frame = tk.LabelFrame(self.root, text="生成的故事", font=("Arial", 12), 
                                  bg="#f0f8ff", padx=10, pady=10)
        story_frame.pack(fill="both", expand=True, padx=20, pady=10)
        
        self.story_text = tk.Text(story_frame, wrap="word", font=("Arial", 12), 
                                padx=10, pady=10, bg="white", fg="#333333")
        self.story_text.pack(fill="both", expand=True)
        self.story_text.config(state="disabled")
        
        # 状态栏
        self.status_var = tk.StringVar()
        self.status_var.set("就绪")
        status_bar = tk.Label(self.root, textvariable=self.status_var, bd=1, relief="sunken", 
                            anchor="w", bg="#e0e0e0", font=("Arial", 10))
        status_bar.pack(side="bottom", fill="x")
        
        # 添加装饰图片
        try:
            img = Image.open("decoration.png")  # 请替换为实际图片路径
            img = img.resize((100, 100), Image.LANCZOS)
            self.logo_img = ImageTk.PhotoImage(img)
            logo_label = tk.Label(self.root, image=self.logo_img, bg="#f0f8ff")
            logo_label.place(x=650, y=500)
        except:
            pass
    
    def generate_story(self):
        """生成故事并更新UI"""
        name = self.name_entry.get().strip()
        age = self.age_var.get()
        hobbies = self.hobby_entry.get().strip()
        
        if not name:
            messagebox.showerror("输入错误", "请输入孩子的姓名")
            return
            
        if not age:
            messagebox.showerror("输入错误", "请选择孩子的年龄")
            return
            
        if not hobbies:
            hobbies = "阅读, 探索"
        
        self.status_var.set("正在生成故事...")
        self.root.update()
        
        # 在新线程中生成故事以避免界面冻结
        threading.Thread(target=self._generate_story_thread, args=(name, int(age), hobbies)).start()
    
    def _generate_story_thread(self, name, age, hobbies):
        """在后台线程中生成故事"""
        try:
            story = self.generator.generate_story(name, age, hobbies)
            
            # 更新UI
            self.root.after(0, self._update_story_display, story)
            self.root.after(0, lambda: self.speak_btn.config(state="normal"))
            self.status_var.set("故事生成成功!点击'朗读故事'按钮收听")
        except Exception as e:
            self.root.after(0, lambda: messagebox.showerror("生成错误", f"生成故事时出错: {str(e)}"))
            self.status_var.set("故事生成失败")
    
    def _update_story_display(self, story):
        """更新故事显示区域"""
        self.story_text.config(state="normal")
        self.story_text.delete(1.0, "end")
        self.story_text.insert("end", story)
        self.story_text.config(state="disabled")
    
    def speak_story(self):
        """朗读故事"""
        story = self.story_text.get(1.0, "end").strip()
        if not story:
            return
            
        self.status_var.set("正在朗读故事...")
        self.speak_btn.config(state="disabled")
        self.stop_btn.config(state="normal")
        self.generate_btn.config(state="disabled")
        
        # 在新线程中朗读故事
        threading.Thread(target=self._speak_story_thread, args=(story,)).start()
    
    def _speak_story_thread(self, story):
        """在后台线程中朗读故事"""
        try:
            success = self.generator.text_to_speech(story)
            if success:
                self.root.after(0, lambda: self.status_var.set("朗读完成"))
            else:
                self.root.after(0, lambda: messagebox.showerror("朗读错误", "无法生成语音"))
                self.root.after(0, lambda: self.status_var.set("朗读失败"))
        except Exception as e:
            self.root.after(0, lambda: messagebox.showerror("朗读错误", f"朗读故事时出错: {str(e)}"))
            self.root.after(0, lambda: self.status_var.set("朗读失败"))
        finally:
            self.root.after(0, lambda: self.speak_btn.config(state="normal"))
            self.root.after(0, lambda: self.stop_btn.config(state="disabled"))
            self.root.after(0, lambda: self.generate_btn.config(state="normal"))
    
    def stop_speaking(self):
        """停止朗读"""
        pygame.mixer.music.stop()
        self.status_var.set("已停止朗读")
        self.speak_btn.config(state="normal")
        self.stop_btn.config(state="disabled")
        self.generate_btn.config(state="normal")

if __name__ == "__main__":
    root = tk.Tk()
    app = StoryApp(root)
    root.mainloop()

程序功能说明

这个AI专属睡前故事生成器具有以下核心功能:

  1. 个性化故事生成

    • 输入孩子的姓名、年龄和爱好

    • 基于创业与创新管理课程中的创新思维,结合儿童心理学原理

    • 生成独特且富有教育意义的睡前故事

  2. 语音朗读功能

    • 使用Google Text-to-Speech(gTTS)技术

    • 支持中文语音合成

    • 可随时停止朗读

  3. 用户友好界面

    • 直观的图形用户界面(GUI)

    • 响应式设计,适合家长操作

    • 状态提示和操作反馈

  4. 故事元素数据库

    • 包含丰富的角色、场景、物品和挑战元素

    • 针对不同年龄段的复杂度调整

    • 爱好映射系统将孩子兴趣融入故事

使用说明

  1. 在输入框中填写:

    • 孩子姓名(如"小明")

    • 孩子年龄(从下拉菜单选择3-8岁)

    • 孩子爱好(用逗号分隔,如"恐龙, 绘画")

  2. 点击"生成故事"按钮创建个性化故事

  3. 故事生成后:

    • 可在文本框中查看完整故事

    • 点击"朗读故事"按钮收听语音版

    • 点击"停止朗读"可随时中断

  4. 可以修改信息重新生成故事

技术特点

  • 使用面向对象编程方法设计

  • 多线程处理避免界面卡顿

  • 响应式UI设计

  • 错误处理和用户反馈机制

  • 模块化代码结构便于扩展

运行要求

运行此程序需要安装以下Python库:

pip install pygame gtts pillow

注意:语音功能需要互联网连接(gTTS使用Google服务),如需离线使用,可替换为其他TTS引擎。

这个程序将创业与创新管理中的创新思维应用于儿童教育领域,通过个性化故事激发孩子的想象力和学习兴趣,同时为家长提供便捷的睡前陪伴工具。

我是编程小白,请大家多多指教,谢谢!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值