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专属睡前故事生成器具有以下核心功能:
-
个性化故事生成:
-
输入孩子的姓名、年龄和爱好
-
基于创业与创新管理课程中的创新思维,结合儿童心理学原理
-
生成独特且富有教育意义的睡前故事
-
-
语音朗读功能:
-
使用Google Text-to-Speech(gTTS)技术
-
支持中文语音合成
-
可随时停止朗读
-
-
用户友好界面:
-
直观的图形用户界面(GUI)
-
响应式设计,适合家长操作
-
状态提示和操作反馈
-
-
故事元素数据库:
-
包含丰富的角色、场景、物品和挑战元素
-
针对不同年龄段的复杂度调整
-
爱好映射系统将孩子兴趣融入故事
-
使用说明
-
在输入框中填写:
-
孩子姓名(如"小明")
-
孩子年龄(从下拉菜单选择3-8岁)
-
孩子爱好(用逗号分隔,如"恐龙, 绘画")
-
-
点击"生成故事"按钮创建个性化故事
-
故事生成后:
-
可在文本框中查看完整故事
-
点击"朗读故事"按钮收听语音版
-
点击"停止朗读"可随时中断
-
-
可以修改信息重新生成故事
技术特点
-
使用面向对象编程方法设计
-
多线程处理避免界面卡顿
-
响应式UI设计
-
错误处理和用户反馈机制
-
模块化代码结构便于扩展
运行要求
运行此程序需要安装以下Python库:
pip install pygame gtts pillow
注意:语音功能需要互联网连接(gTTS使用Google服务),如需离线使用,可替换为其他TTS引擎。
这个程序将创业与创新管理中的创新思维应用于儿童教育领域,通过个性化故事激发孩子的想象力和学习兴趣,同时为家长提供便捷的睡前陪伴工具。
我是编程小白,请大家多多指教,谢谢!
1953

被折叠的 条评论
为什么被折叠?



