#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""make_shotlist.py — 生成《九九八十一》可爱版 MV 分镜表。

输出：
  05-分镜脚本/shots.json                    —— 权威镜头表（含时间码/歌词/画面/素材/运镜）
  05-分镜脚本/九九八十一-分镜脚本-可爱版-v1.md —— 人读版分镜脚本
  prompts/分镜关键帧.json                    —— 每镜关键帧的出图提示词（即可用于 H3 的参考图）

时间码来源：faster-whisper large-v3 对本条翻唱音轨的逐句转写（00-音源/九九八十一-whisper.json），
已按歌词顺序逐句人工核对对齐；整曲 236.84s。
"""
import json, os
from applycute import CHARS, MONSTERS, SCENES, CUTE, CUTE_SCENE

ROOT = os.path.dirname(os.path.abspath(__file__))
os.chdir(ROOT)
OUT = "05-分镜脚本"
KF = "05-分镜脚本/关键帧/可爱版"
os.makedirs(OUT, exist_ok=True)
os.makedirs(KF, exist_ok=True)

TOTAL = 236.84

# (起始秒, 段落, 歌词, 画面, [角色素材], 场景素材, 运镜)
S = [
    # ===== 前奏 0:00–0:26.5 =====
    (0.00, "前奏", "", "水墨在宣纸上晕开，一朵祥云托起「九九八十一」五个书法大字；小悟空从画面右上翻着跟头跳进来，落在云头上。", ["人物-01-孙悟空-大圣装"], "场景-18-凌云渡", "云头缓推，字卡淡出"),
    (6.00, "前奏", "", "花果山水帘洞：白练般的小瀑布、桃花与石桥，几只小猴子在玩耍，小悟空从水帘里蹦出来。", ["人物-01-孙悟空-大圣装"], "场景-01-花果山水帘洞", "横移，跟随小悟空"),
    (12.00, "前奏", "", "云路之上：师徒四人一马排成小队走着，小八戒回头招手，小白龙马甩着尾巴。", ["群像-师徒四人西行", "人物-06-白龙马"], "场景-02-天宫瑶池", "远景跟移"),
    (17.50, "前奏", "", "圆滚滚的五指形状小石山，山脚贴着一张被风吹起的旧封帖，金光一闪。", [], "场景-03-五行山", "缓推至封帖特写"),
    (22.00, "前奏", "", "小悟空站在山顶举起金箍棒，白云飘过，他转身冲镜头笑。", ["人物-01-孙悟空-大圣装"], "场景-18-凌云渡", "仰拍，缓推"),
    # ===== 主歌 A1 =====
    (26.54, "主歌A1", "上路 巩州遇虎熊", "草丛里探出一只圆脸小虎妖，小悟空举棒挡在它前面，两人都瞪大眼睛。", ["妖怪-01-寅将军-虎精", "人物-01-孙悟空-大圣装"], "场景-06-黄风岭", "中景，轻微手持感"),
    (29.04, "主歌A1", "五百年前一场疯 腾霄又是孙悟空", "云海里小悟空翻一个大筋斗冲上云霄，金箍棒在手里转成一圈金光。", ["人物-01-孙悟空-大圣装"], "场景-02-天宫瑶池", "快速上摇＋跟拍"),
    (32.82, "主歌A1", "失马 鹰愁涧飞白龙", "清清的山涧里，小白龙马从水中跃出，水花变成亮晶晶的小水珠。", ["人物-06-白龙马"], "场景-04-鹰愁涧", "慢动作，水花特写"),
    (35.12, "主歌A1", "沙河阻断路难通 福陵山中收天蓬", "黄澄澄的大河边，小八戒站在小木筏上冲岸上招手，小木筏晃呀晃。", ["人物-04-猪八戒"], "场景-05-流沙河", "横向摇镜"),
    (39.20, "主歌A1", "岭上 前行逆黄风", "小黄鼠妖鼓起腮帮子吹出一朵打着卷的小旋风，师徒四人顶着风往前走。", ["妖怪-03-黄风怪-黄毛貂鼠"], "场景-06-黄风岭", "逆风推进"),
    (41.24, "主歌A1", "七星不照波月洞 千年白骨化阴风", "夜里的小洞口挂着弯月亮，白白圆圆的小骨仙提着小灯笼探出头，好奇地眨眼。", ["妖怪-04-白骨夫人"], "场景-08-平顶山莲花洞", "缓推，月光侧照"),
    (45.64, "主歌A1", "鱼篮 网通天一尾红", "碧绿的小河里，一条红红圆圆的小金鱼跳进小竹篮，溅起小水花。", ["妖怪-08-灵感大王-金鱼精"], "场景-05-流沙河", "俯拍，水波特写"),
    (48.06, "主歌A1", "紫金葫芦二道童 九尾老狐敢压龙", "两个小角童一起捧着一只小葫芦，旁边小九尾狐甩着九条蓬松尾巴笑。", ["妖怪-05-金角大王", "妖怪-06-银角大王", "妖怪-07-压龙大仙-九尾老狐"], "场景-08-平顶山莲花洞", "三人并排横移"),
    (52.10, "主歌A1", "白虹坠 雪浪击石碎", "白色水花撞在圆圆的白石头上，碎成一片小水珠与彩虹。", [], "场景-04-鹰愁涧", "高速摄影感，特写"),
    (54.14, "主歌A1", "思归 难归 堕回 轮回", "小沙僧蹲在河边看水面倒影，水里浮出几个小小的自己。", ["人物-05-沙悟净"], "场景-05-流沙河", "俯拍水面，叠化"),
    (57.52, "主歌A1", "月满一江水 前世莫追", "圆圆的月亮照在江面上，小木筏载着师徒缓缓漂过，月影跟着走。", ["群像-师徒四人西行"], "场景-05-流沙河", "大远景缓摇"),
    # ===== 副歌 B1 =====
    (61.06, "副歌B1", "福泽聚宝象 春风度不让洛阳", "小宫殿外春风吹过，花瓣漫天飞舞，殿前两只圆圆的小石象在打瞌睡。", [], "场景-09-宝象国宫殿", "上升镜头，花瓣前景"),
    (64.24, "副歌B1", "玉面狐折兰香 七绝崖上暗伏赤色大蟒", "小玉面狐捧着一枝小花轻轻闻；旁边柿子山谷里，小红蟒从柿子堆后探出脑袋。", ["妖怪-10-玉面狐狸", "妖怪-11-红鳞大蟒"], "场景-10-七绝山稀柿衕", "左右分屏式横移"),
    (69.04, "副歌B1", "过西梁 女儿国鸳鸯罗帐", "小女王在花园曲桥上招手，池里一对小鸳鸯并排游过，荷花开得正好。", ["妖怪-12-女儿国国王"], "场景-11-西梁女国宫苑", "缓推，水面倒影"),
    (70.66, "副歌B1", "与三道斗法相 火云扬 明枪易挡暗箭难防", "三个小道士妖怪排排站在小法坛上，香炉冒出可爱的小烟圈，天边挂起小彩虹。", ["妖怪-13-车迟国三道"], "场景-12-车迟国斗法台", "环绕运镜"),
    (74.20, "副歌B1", "十方魔 渴饮着我的脆弱", "一群小妖怪围成半圈，好奇又害羞地看着镜头，你推我我推你。", ["妖怪-01-寅将军-虎精", "妖怪-09-黄袍怪-奎木狼", "妖怪-16-牛魔王", "妖怪-18-黄狮精"], "场景-06-黄风岭", "缓慢横移，群像"),
    (77.10, "副歌B1", "凭你计法相迫 逐个击破要你识我本色", "小悟空把金箍棒转成风车，小妖怪们笑嘻嘻地四散让开，一个跟头翻过去。", ["人物-01-孙悟空-大圣装", "妖怪-05-金角大王"], "场景-12-车迟国斗法台", "快速甩镜，动感"),
    (79.98, "副歌B1", "万里恶 摧垮了我的沉默", "大风里小悟空叉腰站着，衣角猎猎，表情认真又可爱。", ["人物-02-孙悟空-行者装"], "场景-13-火焰山", "低角度仰拍，缓推"),
    (83.48, "副歌B1", "一肩担路坎坷 我不说 又何须旁人来嚼口舌", "小沙僧挑着扁担走在最前面，师徒排成一线走过山坡，夕阳把影子拉长。", ["群像-师徒四人西行", "人物-05-沙悟净"], "场景-05-流沙河", "侧向跟移，逆光"),
    # ===== 主歌 A2 =====
    (89.20, "主歌A2", "借扇 翠云访罗刹", "小铁扇公主举起大绿扇一扇，小悟空被吹得原地转圈，帽子都快飞了。", ["妖怪-15-铁扇公主-罗刹女", "人物-02-孙悟空-行者装"], "场景-13-火焰山", "横向摇镜＋旋转"),
    (91.56, "主歌A2", "碧波潭内结亲宴 招来九头的驸马", "水下小宫殿里摆着小宴席，小九头虫摆着九个小脑袋游进来，泡泡冒个不停。", ["妖怪-17-九头虫"], "场景-14-碧波潭水府", "水下漂移，气泡前景"),
    (95.64, "主歌A2", "雾隐 金斑豹伸利爪", "薄雾里一只小金斑豹从树后探出爪子，眼睛亮亮的，像在玩捉迷藏。", ["妖怪-28-金斑豹"], "场景-07-白虎岭枯骨林", "雾中缓推，前景枝叶"),
    (98.00, "主歌A2", "城北黄狮盗钉耙 白毛小鼠偷烛花", "小黄狮抱着小钉耙撒腿就跑，小白鼠端着一支小蜡烛跟在后面，两只都在偷笑。", ["妖怪-18-黄狮精", "妖怪-19-白毛老鼠精"], "场景-17-金平府金灯桥", "跟随横移，轻快"),
    (102.02, "主歌A2", "思乡 未敢听琵琶", "月光下小蝎子精抱着小琵琶轻轻弹，小悟空远远坐在墙头上听，托着腮。", ["妖怪-20-蝎子精-琵琶精", "人物-02-孙悟空-行者装"], "场景-11-西梁女国宫苑", "双人中景，月光"),
    (104.48, "主歌A2", "摄魂曲后三股叉 一朝命断美人画", "一幅画轴轻轻展开，画上的小美人眨了眨眼，随后化作一瓣桃花飘走。", ["妖怪-10-玉面狐狸"], "场景-16-木仙庵竹林", "画卷横移，叠化"),
    (108.48, "主歌A2", "六耳 幻形难辨真假", "两个一模一样的小悟空面对面站着，一起歪头、一起挠耳朵，谁也不服谁。", ["妖怪-21-六耳猕猴", "人物-02-孙悟空-行者装"], "场景-16-木仙庵竹林", "双人对称构图，缓推"),
    (110.88, "主歌A2", "太岁摇铃唤风沙 玉兔抛绣高台搭", "小金毛犼摇响小铃铛吹起一阵小风；旁边高台上小玉兔把红绣球往上一抛。", ["妖怪-22-赛太岁-金毛犼", "妖怪-23-玉兔精"], "场景-17-金平府金灯桥", "上下分镜式横移"),
    (114.92, "主歌A2", "红霓垂 九重紫云飞", "天上垂下一条弯弯的小彩虹，紫色的云朵一朵朵飘过，小飞鸟掠过。", [], "场景-02-天宫瑶池", "仰拍长镜，云动画"),
    (117.96, "主歌A2", "久归 未归 欲回 恨回", "小唐僧闭眼合掌，四周浮现四个小小的回忆画面：水帘、山顶、小桥、莲花。", ["人物-03-唐三藏"], "场景-03-五行山", "环绕，四面叠化"),
    (121.32, "主歌A2", "凡胎恰登对 天命难违", "小唐僧与小女王并肩站在廊下看云，中间隔着一朵小花，天光温柔。", ["人物-03-唐三藏", "妖怪-12-女儿国国王"], "场景-11-西梁女国宫苑", "中景，缓推"),
    # ===== 副歌 B2 =====
    (123.62, "副歌B2", "比丘走白鹿 十三娘情丝缠缚", "开满白花的小树林里，小白鹿与小狐女一前一后走着，彩色丝带在身后飘。", ["妖怪-24-白鹿精-比丘国国丈", "妖怪-10-玉面狐狸"], "场景-07-白虎岭枯骨林", "横移跟拍"),
    (127.04, "副歌B2", "乌袍君生百目 庙前拦路自称黄眉老祖", "小乌袍道士站在小寺庙门前，身上的小星星一只只眨亮，得意地叉腰。", ["妖怪-25-百眼魔君-乌袍君"], "场景-15-小雷音寺", "缓推，星光闪烁"),
    (131.00, "副歌B2", "将云拂 孤直公对谈诗赋", "竹林里小柏树精爷爷摊开小诗卷，摇头晃脑地念，竹叶沙沙作响。", ["妖怪-26-孤直公-柏树精"], "场景-16-木仙庵竹林", "中景，竹影前景"),
    (133.42, "副歌B2", "还未能抵天竺 金平府 钺斩红尘斧辟寒暑", "元宵灯会上，小犀牛大王举着小月牙斧摆姿势，满街小灯笼把他的甲照得发亮。", ["妖怪-27-辟寒大王-犀牛精"], "场景-17-金平府金灯桥", "低角度仰拍，灯光前景"),
    (137.00, "副歌B2", "众笔者 嘲笑着我的贪得", "灯下一圈小妖怪一起笑弯了腰，有的捂嘴有的扶额，都是善意的笑。", ["妖怪-05-金角大王", "妖怪-06-银角大王", "妖怪-09-黄袍怪-奎木狼"], "场景-17-金平府金灯桥", "环绕群像"),
    (139.88, "副歌B2", "藏美酒有甚者 谁却敢说自己放肆醉过", "小八戒抱着小酒坛打了个嗝，脸上两团红晕，小悟空在旁边笑他。", ["人物-04-猪八戒", "人物-02-孙悟空-行者装"], "场景-17-金平府金灯桥", "中景，轻微晃动"),
    (143.90, "副歌B2", "休怪我 这半生痴情煞多", "小悟空仰头看云，风吹起衣角与雉鸡翎，眼里有一点亮光。", ["人物-02-孙悟空-行者装"], "场景-18-凌云渡", "仰拍，缓推"),
    (146.32, "副歌B2", "活一遭风流客 慕娇娥 但愿抱拥世间真绝色", "花树下大家挤在一起合影：师徒四人、小女王、小玉兔、小狐女一起看镜头笑。", ["群像-师徒四人西行", "妖怪-12-女儿国国王", "妖怪-23-玉兔精", "妖怪-10-玉面狐狸"], "场景-11-西梁女国宫苑", "缓推全景，花瓣飘落"),
    # ===== 间奏（取经路蒙太奇）=====
    (150.58, "间奏", "（间奏）", "取经路上：师徒四人一马从花田走到竹林，四季在身后温柔变换。", ["群像-师徒四人西行"], "场景-16-木仙庵竹林", "长横移，季节叠化"),
    (158.00, "间奏", "（间奏）", "小妖怪们远远跟在后面看热闹，好奇地探头，不敢靠近又忍不住跟着。", ["妖怪-03-黄风怪-黄毛貂鼠", "妖怪-18-黄狮精", "妖怪-23-玉兔精"], "场景-06-黄风岭", "侧面跟移"),
    (165.00, "间奏", "（间奏）", "云海之上，一道小木桥通向远处的金顶，彩虹横跨，几只小仙鹤掠过。", [], "场景-18-凌云渡", "大远景缓推"),
    (171.50, "间奏", "（间奏）", "小悟空把金箍棒往肩上一扛，回头招手「跟上」，披风一甩走向云深处。", ["人物-02-孙悟空-行者装"], "场景-18-凌云渡", "背身跟移，逆光"),
    # ===== 尾声 =====
    (176.08, "尾声", "浮世千寻沫 冲荡了我的轮廓", "水花四溅中映出小悟空的笑脸，墨色在水中一圈圈化开。", ["人物-01-孙悟空-大圣装"], "场景-05-流沙河", "微距水花，叠化"),
    (180.16, "尾声", "纵身入尘埃里 雷雨大作我也放声而歌", "小雨里小悟空仰头哈哈大笑，雨点是亮晶晶的小水珠，地上开着小水花。", ["人物-02-孙悟空-行者装"], "场景-06-黄风岭", "中景，雨丝前景"),
    (184.94, "尾声", "方寸中 方寸却不能定夺", "特写：小悟空挠着头一脸困惑，眼睛转来转去。", ["人物-02-孙悟空-行者装"], "场景-16-木仙庵竹林", "特写，轻微推近"),
    (186.62, "尾声", "七十二般胆魄 这次我决意不闪躲", "小悟空握拳，身后「啪」地化出七十二个小小的自己，排成整齐的方阵。", ["人物-01-孙悟空-大圣装"], "场景-18-凌云渡", "快速拉远，方阵群像"),
    (190.00, "尾声", "世尊如来佛 诘问着我的执着", "小如来坐在小莲台上笑眯眯地看着小悟空，身后一圈温柔的金光。", ["人物-07-如来佛祖", "人物-02-孙悟空-行者装"], "场景-19-灵山雷音寺", "仰拍，光晕"),
    (193.04, "尾声", "当年我瑶池刻 闹得痛快并未想过太多", "云朵上的小桌案，小悟空抱着一堆小桃子吃得开心，桃核滚了一地。", ["人物-01-孙悟空-大圣装"], "场景-02-天宫瑶池", "中景，横移"),
    (197.02, "尾声", "状罪责 拿捏了我的业果", "小悟空低头看着手心里的小金箍，安静了一会儿。", ["人物-02-孙悟空-行者装"], "场景-03-五行山", "手部特写，缓推"),
    (199.46, "尾声", "可顽心不服错 不思过 齐天大圣地上行者", "小悟空抬起头笑，披风一甩，大步走出画面，阳光洒下来。", ["人物-01-孙悟空-大圣装"], "场景-18-凌云渡", "侧向跟移，逆光"),
    (204.28, "尾声", "那传说 忘却了我的寂寞 英雄名不堪得 何必较我混沌徒费口沫", "山水长卷展开：师徒走在长卷上，小妖怪们在后面挥手告别，卷轴缓缓合上。", ["群像-师徒四人西行", "妖怪-01-寅将军-虎精", "妖怪-14-红孩儿", "妖怪-23-玉兔精"], "场景-19-灵山雷音寺", "长卷横移"),
    (210.72, "尾声", "这人间 毕竟我真正走过 一途平九百波 九千错 凌云渡成正果但我", "云海独木桥上，师徒四人一马排成一串慢慢走过，一线天光落在对岸金顶。", ["群像-师徒四人西行"], "场景-18-凌云渡", "大远景缓推，云动画"),
    (215.88, "尾声", "有九九八十一种不舍", "小悟空在桥头停下，回头看了一眼，眼里有光，笑了。", ["人物-02-孙悟空-行者装"], "场景-18-凌云渡", "特写回望，浅景深"),
    # ===== 尾奏 =====
    (218.20, "尾奏", "", "灵山雷音寺前大合影：所有小伙伴都来了，撒花、放小烟花，一起朝镜头挥手。", ["群像-师徒四人西行", "妖怪-12-女儿国国王", "妖怪-23-玉兔精", "妖怪-04-白骨夫人"], "场景-19-灵山雷音寺", "缓缓拉远至全景"),
    (226.00, "尾奏", "", "水墨字卡升起：歌名《九九八十一》、原唱 乐正绫／洛天依、翻唱 咻咻满、作词 邪叫教主、作曲 乌龟Sui。", [], "场景-18-凌云渡", "字卡上移"),
    (233.00, "尾奏", "", "定格：金箍棒立在云头，旁边开着一朵小花，画面温柔淡出。", [], "场景-01-花果山水帘洞", "定格，渐隐"),
]

shots = []
for i, (start, sec, lyric, pic, cast, scene, cam) in enumerate(S, 1):
    end = S[i][0] if i < len(S) else TOTAL
    shots.append({
        "id": f"S{i:02d}", "index": i, "section": sec,
        "start": start, "end": round(end, 2), "dur": round(end - start, 2),
        "lyric": lyric, "picture": pic, "cast": cast, "scene": scene, "camera": cam,
        "keyframe": f"{KF}/S{i:02d}.png",
    })

with open(f"{OUT}/shots.json", "w", encoding="utf-8") as f:
    json.dump({"song": "九九八十一", "version": "可爱版 v1", "duration": TOTAL, "shots": shots}, f, ensure_ascii=False, indent=1)

# ---- 人读版分镜脚本 ----
def fmt(t):
    return f"{int(t)//60}:{t%60:04.1f}"

lines = ["# 《九九八十一》MV 分镜脚本 · 可爱版 v1", "",
         "- **音源**：咻咻满翻唱 [BV11W4y1k7kD] 4K60-HEVC 音轨（时长 236.84s）",
         "- **风格**：中国水墨动画 / Q 版萌化 / 明亮淡彩 / 童趣绘本（适合小朋友）",
         "- **时间码来源**：faster-whisper large-v3 逐句转写 + 人工核对对齐",
         f"- **镜头总数**：{len(shots)} 个，平均 {sum(s['dur'] for s in shots)/len(shots):.1f}s/镜",
         "- **素材**：`02-人物设定-可爱版/`、`03-妖怪设定-可爱版/`、`04-场景设定-可爱版/`",
         "", "## 一、段落结构", "",
         "| 段落 | 时间 | 时长 | 镜头 | 情绪 |", "|---|---|---|---|---|"]
secs = {}
for s in shots:
    secs.setdefault(s["section"], []).append(s)
mood = {"前奏": "好奇·启程", "主歌A1": "一路奇遇", "副歌B1": "热闹·齐上阵", "主歌A2": "妖怪们的日常",
        "副歌B2": "欢乐·大合唱", "间奏": "取经路上", "尾声": "温柔·成长", "尾奏": "团圆·告别"}
for k, v in secs.items():
    lines.append(f"| {k} | {fmt(v[0]['start'])}–{fmt(v[-1]['end'])} | {sum(x['dur'] for x in v):.0f}s | {v[0]['id']}–{v[-1]['id']}（{len(v)}） | {mood.get(k,'')} |")
lines += ["", "## 二、逐镜表", "",
          "| 镜号 | 时间码 | 时长 | 歌词 | 画面 | 素材 | 运镜 |", "|---|---|---|---|---|---|---|"]
for s in shots:
    cast = "、".join(x.split("-", 1)[1] if "-" in x else x for x in s["cast"])
    sc = s["scene"].split("-", 1)[1] if "-" in s["scene"] else s["scene"]
    asset = "＋".join([x for x in [cast, sc] if x])
    lines.append(f"| {s['id']} | {fmt(s['start'])}–{fmt(s['end'])} | {s['dur']:.1f}s | {s['lyric'] or '—'} | {s['picture']} | {asset or '—'} | {s['camera']} |")
lines += ["", "## 三、制作说明", "",
          "- 每镜先出一张**关键帧**（即梦 5.0，2K，16:9），再交给本机 H3 生成 5 秒动态镜头（实测 8 步、1344×768 约 **10.2 分钟/镜**）。",
          "- 全片 " + str(len(shots)) + " 镜，若逐镜生成约 **" + f"{len(shots)*10.2/60:.1f} 小时**（GPU 串行）。",
          "- 字幕：竖排/横排繁体书法体可选，逐句随唱浮现；片头片尾用书法字卡。",
          "- 全部可爱版素材已萌化处理，无獠牙、白骨、骷髅、鬼火、血等元素。"]

with open(f"{OUT}/九九八十一-分镜脚本-可爱版-v1.md", "w", encoding="utf-8") as f:
    f.write("\n".join(lines) + "\n")

# ---- 关键帧提示词 ----
kfs = []
for s in shots:
    cast_desc = "".join(dict.fromkeys(
        (CHARS.get(c) or MONSTERS.get(c) or ("", ""))[0] for c in s["cast"]))
    scene_desc = SCENES.get(s["scene"], "")
    prompt = (f"{CUTE}画面内容：{s['picture']}"
              + (f"角色造型：{cast_desc}" if cast_desc else "")
              + (f"场景：{scene_desc}" if scene_desc else "")
              + f"镜头：{s['camera']}。宽幅电影级构图，16:9，画面干净、明亮、温馨，高细节。")
    kfs.append({"outdir": KF, "name": s["id"], "ratio": "16:9", "prompt": prompt,
                "shot": s["id"], "lyric": s["lyric"]})
with open("prompts/分镜关键帧-可爱版.json", "w", encoding="utf-8") as f:
    json.dump(kfs, f, ensure_ascii=False, indent=1)

print(f"镜头 {len(shots)} 个 → {OUT}/shots.json、{OUT}/九九八十一-分镜脚本-可爱版-v1.md、prompts/分镜关键帧-可爱版.json")
print("时长合计 %.1fs（曲长 %.1fs）" % (sum(s['dur'] for s in shots), TOTAL))
print("关键帧提示词平均 %d 字" % (sum(len(k['prompt']) for k in kfs) // len(kfs)))
