ai_member_xiaobian/scripts/generate_script_excel.py
2026-04-22 08:10:01 +08:00

206 lines
16 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import pandas as pd
from openpyxl import Workbook
from openpyxl.styles import Font, Alignment, Border, Side
# 创建工作簿
wb = Workbook()
# 第一个sheet完整剧本
ws1 = wb.active
ws1.title = "完整剧本"
# 剧本表头
headers = ["类型", "剧情描述", "名字", "台词"]
ws1.append(headers)
for col in range(1, 5):
ws1.cell(row=1, column=col).font = Font(bold=True)
ws1.cell(row=1, column=col).alignment = Alignment(horizontal="center")
# 所有剧本内容
script_content = [
# 开场
["TL", "【场景】沙漠镇郊外\n【角色】User、Ben\n【音效】风吹沙子的沙沙声 + 远处的鸟鸣", "", ""],
["", "User和Ben趴在沙坡后面举着玩具望远镜东张西望假装在执行秘密特工任务", "Ben", "Shhh! We are spies!"],
["", "Ben做出嘘的手势指着远处假装发现了目标", "Ben", "I see something over there!"],
["", "User刚要回答远处突然传来轰隆隆的引擎轰鸣声越来越近", "", ""],
["", "两辆色彩鲜艳的摩托车嗖地从他们面前的沙漠公路上飞过,车后面拖着两个像降落伞一样大的麻布袋,漂移的时候卷起漫天黄沙", "Ben", "Oh! Motorbikes!"],
["图片互动-多选", "【教研图】漫天黄沙中间冲出2台摩托车背景只有黄沙", "", ""],
["", "两个穿着橙色制服的人戴着头盔,嚣张地大笑着,摩托车上还挂着\"速猴运输\"的旗子,他们把车停在了不远处的镇入口", "", ""],
["", "Ben放下望远镜皱着眉头碰了碰User的胳膊", "Ben", "I've never seen those people in our town before."],
["", "User点点头也觉得这两个人很可疑", "User", "They look really weird."],
["对话互动", "User询问这些陌生来客的身份包含知识点people", "User", "Who are those people?"],
["", "Ben挠挠头也不知道答案", "Ben", "I don't know."],
["", "User想了想做出决定", "User", "Let's tell Tom!"],
["TL", "User拿出手上的儿童智能手表拨通了镇长Tom的电话", "", ""],
["", "User向Tom报告刚才看到的情况简单完整句", "User", "Tom! We see strange people on motorbikes."],
["", "电话那头传来Tom的声音", "Tom", "Good job! I'm coming right now!"],
["", "Ben看到那两个人已经开始往镇里走了急得跳了起来", "Ben", "Hurry! They are going into the town!"],
["", "Ben拉着User的手就要往前跑", "Ben", "We can't wait! Let's stop them first!"],
["", "两个人一起朝着镇入口的方向跑去", "", ""],
# 第二段 可疑来客
["", "", "", ""],
["TL", "【场景】沙漠镇入口\n【角色】User、Ben、Jay胖速猴没头脑&乐呵呵、Lin瘦速猴鬼主意多&总不高兴)\n【音效】摩托车怠速的轰鸣声", "", ""],
["", "User和Ben冲到镇入口张开胳膊拦住了正要往里走的两个穿橙色制服的人", "User", "Stop!"],
["", "两人猛地刹车停下,先后摘下头盔:\n👉 胖的那个是Jay圆脸上满是汗摘掉头盔后头发乱蓬蓬的还乐呵呵地挠头\n👉 瘦的那个是Lin脸拉得很长皱着眉头一脸不高兴", "", ""],
["", "Jay歪头看着两个小孩语气傻乎乎的", "Jay", "Hey, kids! What's wrong?"],
["对话互动", "User挺直腰板严肃地盘问他们的身份包含知识点people", "User", "Who are you people?"],
["", "Jay立刻骄傲地拍了拍胸口的\"速猴运输\"徽章", "Jay", "We are Speedy Monkey Express."],
["", "Jay挺了挺胸脯一脸得意", "Jay", "We are the best in the universe!"],
["", "Lin不耐烦地推了Jay一把翻了个白眼", "Lin", "We are busy. Let us go."],
["", "Ben上前一步伸手要求检查凭证完成`show`知识点前置输入)", "Ben", "Show us your pass!"],
["", "Lin皱着眉头摆手更不耐烦了", "Lin", "We have no pass. We have to deliver packages quickly!"],
["", "User摇摇头严肃地说明理由", "User", "We keep the town safe. We can't let dangerous things in."],
["", "User指着袋子严肃地提出要求包含知识点show、句型`...show sb...`", "User", "You must show me what is in the bag!"],
["图片互动-单选", "【教研图】两个摩托车旁边分别放着大袋子、头盔、矿泉水,选出哪个是要检查的大袋子", "", ""],
["", "Jay慌了连忙摆手往后躲解释不能打开的原因", "Jay", "No no no! The bag is too heavy, it will break if we open it here!"],
["", "Lin赶紧上前一步挡住袋子脸拉得更长了", "Lin", "Yes! We can't show you."],
["", "User和Ben对视一眼觉得这两个人更可疑了", "", ""],
# 第三段 速猴对决
["", "", "", ""],
["TL", "User故意撇撇嘴用激将法看着两个人", "User", "Your motorbikes look not cool at all."],
["", "这句话瞬间戳中了两个速猴的痛处,两个人瞬间都急了,争先恐后地凑到自己的摩托车旁边", "", ""],
["", "Jay第一个冲上去重重拍了拍自己那辆红色摩托车的车把一脸不服", "Jay", "What? My motorbike is super cool!"],
["", "Jay伸手拍了拍摩托车的发动机轰了一下油门发出巨大的轰鸣声", "Jay", "Look! I will show you how fast it is!"],
["", "Jay又指了指摩托车后面的货架拍得咚咚响", "Jay", "I will show you how heavy it can carry!"],
["", "Jay得意地按了一下车把上的喇叭发出\"滴滴\"的响亮声音", "Jay", "I will show you how loud the horn is!"],
["对话互动", "User看得眼睛都直了兴奋地要求Jay展示更多包含知识点show、motorbike句型`...show sb...`", "User", "Wow! Show me more of your motorbike!"],
["", "Jay更得意了哈哈大笑着转了转车把又轰了一下油门", "Jay", "Hahaha! See? It's the best motorbike ever!"],
["", "Lin翻了个大白眼一把把Jay扒拉到旁边靠在自己那辆蓝色摩托车上", "Lin", "Pfft! His motorbike is terrible."],
["", "Lin伸手拧了拧油门摩托车发出低沉有力的声音", "Lin", "Let me show you my motorbike. It climbs hills super well!"],
["", "Lin踢了踢摩托车的宽轮胎一脸骄傲", "Lin", "Let me show you how steady it is on sand!"],
["", "Lin指了指车把上的手刹", "Lin", "Let me show you how good the brake is!"],
["对话互动", "User也觉得Lin的摩托很酷转头要求Lin展示更多包含知识点show、motorbike句型`...show sb...`", "User", "Cool! Show me more of your motorbike too!"],
["", "Lin嘴角难得上扬了一下又很快拉回臭脸", "Lin", "Hmph. Of course."],
["", "Jay不乐意了推了Lin一把两个人差点打起来", "Jay", "My motorbike is better!"],
["", "Lin也推了回去脸更臭了", "Lin", "No! My motorbike is better!"],
["图片互动-单选", "【教研图】左边红色摩托车、右边蓝色摩托车选出你觉得更酷的motorbike", "", ""],
["", "Jay蹦得老高脸都涨红了", "Jay", "I'm faster than you! I'm the boss!"],
["", "Lin叉着腰冷笑一声", "Lin", "You are fat and slow! I'm the real boss!"],
["", "两个人越吵越凶脸贴脸几乎要打起来Ben赶紧站出来劝架", "Ben", "Stop fighting!"],
["", "Ben眼珠一转想出了个好主意", "Ben", "Why don't you have a race? The winner is the boss!"],
["", "Jay和Lin同时眼睛亮了对视一眼", "Jay & Lin", "Deal!"],
["", "两个人同时冲到自己的摩托车旁边,解开系着大袋子的绳子,把两个巨大的麻布袋拽了下来", "", ""],
["", "Jay把自己的袋子塞到Ben怀里大大咧咧地摆手", "Jay", "You hold this for me!"],
["", "Lin也把自己的袋子塞到User怀里不耐烦地催促", "Lin", "You hold this! Don't drop it!"],
["对话互动", "User接过沉甸甸的袋子感觉还挺沉点点头答应包含知识点hold、句型`...can hold...`", "User", "Okay! I can hold it!"],
["", "Jay和Lin同时跳上自己的摩托车戴上头盔轰着油门准备出发", "", ""],
["", "Ben站在路中间举起手准备发号施令", "Ben", "Ready? Go!"],
["", "两辆摩托车\"\"地一下冲了出去,卷起漫天黄沙,两个人还边开边喊", "Jay", "I will win!"],
["", "Lin咬着牙猛拧油门", "Lin", "No! I will win!"],
# 第四段 抓不住啦
["", "", "", ""],
["TL", "两辆摩托车\"\"地一下冲出去没了影User和Ben站在路边各自怀里抱着巨大的麻布袋风吹得黄沙打在脸上", "", ""],
["", "User一开始还站得稳稳的拍了拍袋子一脸自信", "User", "Don't worry! I can hold it!"],
["", "Ben抱了两分钟就觉得胳膊酸了眼珠一转想出个\"好主意\"", "Ben", "Let's put the bags on the rock and rest!"],
["", "两个人小心翼翼地把袋子往路边的大石头上靠结果Ben没放稳他的袋子一下子滑了下来撞到User的袋子", "", ""],
["", "两个袋子的重量瞬间全都压到了User的胳膊上User的脚开始在沙子上打滑身体不受控制地往后仰脸都憋红了", "", ""],
["对话互动", "User实在撑不住了大声喊出来包含知识点hold、句型`...can't hold...`", "User", "Help! I can't hold it!"],
["", "Ben想去抓袋子结果抓了个空两个人被巨大的重量拖着往斜坡下面滑鞋底和沙子摩擦得都冒起了白烟", "", ""],
["图片互动-单选", "【教研图】User和Ben被袋子拖着滑、速猴在开车、远处有皮卡过来选出现在发生了什么事选项hold不住袋子、摩托车比赛、和速猴聊天", "", ""],
["", "远处正在比赛的速猴兄弟从后视镜看到了这一幕,吓得脸都白了,赶紧猛踩刹车调头", "", ""],
["", "两个人骑着摩托车疯一样地冲回来,跳下车就扑过去抓袋子", "Jay", "Grab the bag!"],
["", "Lin也抓住袋子的另一边使劲往回拽", "Lin", "Catch it tight!"],
["", "可是袋子太重了,四个人一起使劲还是拉不住,还是一点点往斜坡下面滑", "", ""],
["", "就在这时候,远处传来\"滴滴\"的汽车喇叭声一辆黄色小皮卡开了过来是镇长Tom他接到User的电话后就一直往这边赶刚好赶到", "", ""],
["", "Tom跳下车一边跑过来一边喊", "Tom", "I'm here!"],
["", "Tom拿出随身带的小刀看准绳子的位置", "", ""],
["", "Tom手起刀落\"\"地一下切断了两根绑袋子的粗绳子", "Tom", "Got it!"],
["", "\"砰!\"的一声巨响,两个巨大的麻布袋同时裂开,山一样的包裹滚了出来,把四个人和两辆摩托车都埋了小半截", "", ""],
["", "Jay从零食堆里探出头脸上沾着薯片渣哭丧着脸", "Jay", "Oh no! All the packages!"],
["", "Lin从玩具堆里钻出来头发上挂着个毛绒兔子脸臭得像结了冰", "Lin", "..."],
["", "User和Ben凑过去看发现里面全是寄给沙漠镇居民的包裹有小朋友的玩具、奶奶的老花镜、商店的零食...", "", ""],
["TL", "这时候Tom走了过来蹲下来看着大家询问刚才发生了什么事", "Tom", "What happened?"],
["核心互动-阅读理解", "向Tom描述刚才发生的事情必须包含motorbike、people、hold、show四个单词 + `show sb...`/`can/can't hold...`两个句型)\n示例回答Two people on motorbikes came. They didn't show us the bag. We hold the bags but we can't hold them!", "User", ""],
# 尾声
["", "", "", ""],
["TL", "Tom听完大家的描述忍不住笑了伸手把Jay从包裹堆里拉出来", "Tom", "It's okay. Everyone makes mistakes."],
["", "Jay坐在地上看着散落一地的包裹扁扁嘴快哭了", "Jay", "All the packages are messy. We will be late!"],
["", "就在这时一个圆滚滚的大包裹从包裹堆上滚下来刚好砸到Ben的脑袋上", "", ""],
["", "Ben\"\"了一声,晃了晃脑袋,眼睛转了两圈,\"扑通\"一声坐到地上,脑袋上还顶了个大包,晕乎乎地冒星星", "", ""],
["", "User赶紧去扶Ben", "User", "Are you okay?"],
["", "Ben揉着脑袋晕乎乎地摆手", "Ben", "Ouch... I feel dizzy. I can't walk..."],
["", "Lin蹲在旁边捡包裹脸还是臭臭的但也没说话", "", ""],
["", "User看了看晕乎乎的Ben又看了看满地的包裹主动拍胸脯说", "User", "Don't worry! I can help you deliver all the packages alone!"],
["", "Jay一下子不哭了眼睛亮了起来蹦得老高", "Jay", "Really? You are super cool! Thank you!"],
["", "Lin也难得地露出了一点笑容很快又收了回去递了一个小包裹给User", "Lin", "Here. Send this to grandma Lily first."],
["", "Tom也笑着点点头先把晕乎乎的Ben扶到皮卡上坐着休息然后拿出两个小推车递给User和速猴兄弟", "Tom", "I will look after Ben. Let's work together!"],
["TL", "User和速猴兄弟把包裹分类装好推上小推车一起开开心心地往镇里走去速猴的摩托车跟在后面一路说说笑笑沙漠镇的太阳暖暖的洒在大家身上", "", ""],
["", "(剧终)", "", ""]
]
# 写入剧本内容
for row in script_content:
ws1.append(row)
# 设置列宽
ws1.column_dimensions['A'].width = 20
ws1.column_dimensions['B'].width = 80
ws1.column_dimensions['C'].width = 15
ws1.column_dimensions['D'].width = 60
# 设置对齐方式
thin_border = Border(left=Side(style='thin'),
right=Side(style='thin'),
top=Side(style='thin'),
bottom=Side(style='thin'))
for row in ws1.iter_rows(min_row=1, max_row=len(script_content)+1, min_col=1, max_col=4):
for cell in row:
cell.alignment = Alignment(wrap_text=True, vertical="top")
cell.border = thin_border
# 第二个sheet知识点统计
ws2 = wb.create_sheet(title="知识点统计")
ws2.append(["知识点", "输入次数", "输出次数", "是否符合要求"])
for col in range(1, 5):
ws2.cell(row=1, column=col).font = Font(bold=True)
ws2.cell(row=1, column=col).alignment = Alignment(horizontal="center")
stats = [
["motorbiken. 摩托车)", 4, 3, "✅ 符合输入≥2输出2-3"],
["peoplen. 人)", 3, 3, "✅ 符合输入≥2输出2-3"],
["holdv. 抓住)", 4, 3, "✅ 符合输入≥2输出2-3"],
["showv. 显示)", 5, 3, "✅ 符合输入≥2输出2-3"],
["句型:...show sb...", 6, 3, "✅ 符合"],
["句型:...can/can't hold...", 3, 3, "✅ 符合"]
]
for row in stats:
ws2.append(row)
# 设置列宽
ws2.column_dimensions['A'].width = 30
ws2.column_dimensions['B'].width = 15
ws2.column_dimensions['C'].width = 15
ws2.column_dimensions['D'].width = 35
# 第三个sheet自检清单
ws3 = wb.create_sheet(title="自检清单")
ws3.append(["检查项", "是否符合要求"])
for col in range(1, 3):
ws3.cell(row=1, column=col).font = Font(bold=True)
ws3.cell(row=1, column=col).alignment = Alignment(horizontal="center")
checklist = [
["故事围绕孩子日常生活中的\"小危机\"展开,无宏大叙事", "✅ 是"],
["剧情由孩子主导解决问题,成年人仅作为辅助角色", "✅ 是"],
["4个单词/词组+2个句型全部满足\"先输入后输出\"要求,词性、释义准确", "✅ 是"],
["核心互动自然融入剧情高潮包含至少3个知识点", "✅ 是"],
["语言句式简单符合Pre-A1/A1级别英语水平", "✅ 是"],
["符合所有通用撰写规范要求", "✅ 是"]
]
for row in checklist:
ws3.append(row)
# 设置列宽
ws3.column_dimensions['A'].width = 80
ws3.column_dimensions['B'].width = 15
# 保存文件
output_path = "/root/.openclaw/workspace-xiaobian/output/速猴运输互动英语剧本.xlsx"
wb.save(output_path)
print(f"✅ 剧本Excel文件已成功生成保存路径{output_path}")