ai_member_xiaoyan/scripts/rewrite_p4_all.py

1106 lines
52 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.

#!/usr/bin/env python3
"""
P4 短对话选择题批量改写脚本
将 3 人对话改为 2 人对话,重写题目
"""
import json, subprocess, os, sys, time
APP_TOKEN = "CMHSbUUjka3TrUsaxxEc297ongf"
TABLE_ID = "tblVmeDtBDKsAEfz"
BASE_DIR = os.path.expanduser("~/.openclaw/workspace-xiaoyan")
OPERATE_SCRIPT = os.path.join(BASE_DIR, "skills/lark_bitable_operate_as_bot/scripts/operate_bitable.sh")
def run_operate(action, *args):
"""Run the operate_bitable.sh script"""
cmd = ["bash", OPERATE_SCRIPT, action, APP_TOKEN, TABLE_ID] + list(args)
result = subprocess.run(cmd, capture_output=True, text=True)
return json.loads(result.stdout)
def get_records():
"""Get all records"""
result = run_operate("list_records", "50")
return result.get("data", {}).get("items", [])
def update_record(record_id, fields_json_str):
"""Update a record"""
result = run_operate("update_record", record_id, fields_json_str)
return result
def safe_json(s):
"""Safely dump JSON"""
return json.dumps(s, ensure_ascii=False)
def make_qs(question_desc, audio_file, question_text, options, answer_idx, ability_list, explanation_cn):
"""Create a question set item"""
return {
"questionDesc": question_desc,
"questionAudio": audio_file,
"question": question_text,
"options": options,
"answer": [answer_idx],
"ability": ability_list,
"explanation": explanation_cn
}
def make_block(qsid, questions):
"""Create a first/second block"""
return {
"category": "listening",
"type": "listening_choiceShort",
"questionSetID": qsid,
"questionSet": questions
}
def make_q1_text(questions):
"""Generate 题目1 text from question list"""
lines = []
for i, q in enumerate(questions, 1):
lines.append(f"{i}.")
lines.append(f"【描述】{q['questionDesc']}")
lines.append(f"【听力文本】")
if 'dialogue' in q:
lines.append(q['dialogue'])
lines.append(f"【题目】")
lines.append(q['question'])
for j, opt in enumerate(q['options']):
marker = "(正确)" if j == q['answer'][0] else ""
lines.append(f"{chr(65+j)}. {opt}{marker}")
lines.append("")
return "\n".join(lines)
# ============================================================
# 021301 - 邻居话题 (neighbour/beard/actor/brave)
# first: 5 Qs | second: 5 Qs
# ============================================================
QSID_021301_FIRST = [
make_qs(
"You will hear two people talking about their neighbours.",
"021301-00.mp3",
"Whose neighbour has a real beard?",
["Ben's neighbour", "Lucy's neighbour", "Daisy's neighbour"],
0,
["显性事实理解|关键词识别"],
"Ben说'My neighbour has a long, real beard'明确提到他的邻居有真胡子Daisy未出现在对话中是干扰项。"
),
make_qs(
"You will hear two people describing someone they know.",
"021301-01.mp3",
"What does Ben say about the actor?",
["He has a fake beard", "He looks different at home", "He does his own stunts"],
2,
["听力细节理解"],
"Ben说'He does his own stunts. He is a real professional.'说明这位演员自己做特技动作。选项C为正确答案。"
),
make_qs(
"You will hear two people talking about someone in their area.",
"021301-02.mp3",
"Whose neighbour has a beard that changes how he looks?",
["Lucy's neighbour", "Johnny's neighbour", "Daisy's neighbour"],
1,
["显性事实理解|关键词识别"],
"Johnny说'My neighbour has a long, real beard. It makes him look quite different.'胡子改变了他的样子。Daisy不在对话中是干扰项。"
),
make_qs(
"You will hear two people sharing stories.",
"021301-03.mp3",
"What does Lucy say about her neighbour?",
["He is kind and helpful", "He looks different at home", "He was brave like a hero"],
2,
["听力细节理解"],
"Lucy说'My neighbour did something brave last week. He was like a hero.'她的邻居做了勇敢的事。选项C为正确答案。"
),
make_qs(
"You will hear two people giving their opinions.",
"021301-04.mp3",
"What does Lucy think about beards for actors?",
["A real beard looks more authentic", "A fake beard is better on stage", "Beards are not important for actors"],
0,
["听力细节理解"],
"Lucy说'I think a real beard suits an actor if the role needs it. It looks more authentic.',她认为真胡子让演员看起来更真实。"
),
]
# Dialogues for 021301 first
QSID_021301_FIRST_DIALOGUES = [
"""Ben: Hi, Lucy. My neighbour is an actor. He has a long, real beard.
Lucy: That's interesting, Ben. My neighbour is very brave. He once helped a child in our street.""",
"""Ben: I know a brave actor. He does his own stunts. He is a real professional.
Lucy: Wow, Ben. My neighbour is an actor too. But he looks very different at home, without his costume.""",
"""Johnny: There's a new neighbour on our street. He's an actor and seems very brave.
Lucy: My neighbour has a long, real beard. It makes him look quite different, Johnny.""",
"""Lucy: My neighbour did something brave last week. He was like a hero.
Johnny: That's amazing, Lucy. The actor in that play had a fake beard, but my neighbour's beard is real.""",
"""Lucy: I think a real beard suits an actor if the role needs it. It looks more authentic.
Johnny: That's a good point, Lucy. A brave person and a good neighbour can be very different things.""",
]
for i, d in enumerate(QSID_021301_FIRST_DIALOGUES):
QSID_021301_FIRST[i]["dialogue"] = d
QSID_021301_FIRST_BLOCK = make_block("021301", QSID_021301_FIRST)
QSID_021301_SECOND = [
make_qs(
"You will hear two people talking about what they did yesterday.",
"021301-05.mp3",
"What did Ben do yesterday?",
["Tidied his room", "Looked for his keys", "Fixed a bike"],
0,
["显性事实理解|关键词识别"],
"Ben说'I needed to tidy my room. It took a long time.',他昨天整理了房间。"
),
make_qs(
"You will hear two people talking about their weekend plans.",
"021301-06.mp3",
"Whose plan is to go to the library?",
["Otis's plan", "Daisy's plan", "Ben's plan"],
1,
["显性事实理解|关键词识别"],
"Daisy说'I want to find a new book to read. I'll go to the library.'她的计划是去图书馆找书。Otis提到了等cousin但Daisy提到了library。"
),
make_qs(
"You will hear two people talking about a problem they had.",
"021301-07.mp3",
"What does Johnny say was his problem?",
["He didn't have the right instruction", "He lost his phone", "He waited a long time for a bus"],
0,
["听力细节理解"],
"Johnny说'I tried to cut some paper, but I didn't have the right instruction. It was messy.',他没有正确的操作说明。"
),
make_qs(
"You will hear two people talking about what they are doing now.",
"021301-08.mp3",
"What is Lucy doing at the moment?",
["Fixing a shelf", "Helping her brother look for glasses", "Tidying papers"],
1,
["听力细节理解"],
"Lucy说'I'm helping my brother look for his glasses. They are missing.',她正在帮弟弟找眼镜。"
),
make_qs(
"You will hear two people giving advice.",
"021301-09.mp3",
"What advice does Lucy give?",
["Always read the instruction first", "Book the hotel early online", "Ask someone for help if you're lost"],
2,
["听力细节理解"],
"Lucy说'If you can't find your way, don't wait. Ask someone for help.',她建议迷路时主动问路。"
),
]
QSID_021301_SECOND_DIALOGUES = [
"""Ben: Hi, Lucy. Yesterday I needed to tidy my room. It took a long time.
Lucy: Oh, Ben. I had to look for my keys. I couldn't find them anywhere for a while.""",
"""Daisy: My plan is to wait for my cousin to arrive. He's coming by train.
Ben: That sounds nice, Daisy. I want to find a new book to read. I'll go to the library.""",
"""Johnny: I tried to cut some paper, but I didn't have the right instruction. It was messy.
Lucy: That's too bad, Johnny. I was looking for my phone to call for help, but I couldn't find it.""",
"""Lucy: I'm helping my brother look for his glasses. They are missing.
Ben: Good luck, Lucy. I'm trying to fix this shelf. I hope I can do it.""",
"""Lucy: If you can't find your way, don't wait. Ask someone for help.
Johnny: That's good advice, Lucy. When you plan a trip, remember to look for the hotel online early.""",
]
for i, d in enumerate(QSID_021301_SECOND_DIALOGUES):
QSID_021301_SECOND[i]["dialogue"] = d
QSID_021301_SECOND_BLOCK = make_block("021301", QSID_021301_SECOND)
# ============================================================
# 021401 - 日常话题 (newspaper/plan/backpack/repair/seat)
# first: 5 Qs | second: 5 Qs
# ============================================================
QSID_021401_FIRST = [
make_qs(
"You will hear two people talking about their morning routine.",
"021401-00.mp3",
"What does Ben talk about doing in the morning?",
["Reading the newspaper", "Making a daily plan", "Fixing something"],
0,
["显性事实理解|关键词识别"],
"Ben说'I always read the newspaper at breakfast.'他每天早上看报纸而Daisy说的是修背包。"
),
make_qs(
"You will hear two people talking about a recent trip.",
"021401-01.mp3",
"Whose seat needed fixing on the bus?",
["Otis's seat", "Smith's seat", "Johnny's seat"],
2,
["显性事实理解|关键词识别"],
"Johnny说'I had to repair a broken seat on the bus!'他在公交车上修了座位。Otis和Smith提到了其他事情。"
),
make_qs(
"You will hear two people describing what they are carrying.",
"021401-02.mp3",
"What does Lucy need to do with her bag?",
["Read it on the train", "Repair the zip", "Find a quiet seat for it"],
1,
["显性事实理解|关键词识别"],
"Lucy说'I need to repair this old backpack. The zip is broken.',她的背包拉链坏了需要修理。"
),
make_qs(
"You will hear two people talking about their weekend.",
"021401-03.mp3",
"What does Ben plan to do this weekend?",
["Buy a new backpack for hiking", "Read the newspaper at home", "Fix the garden seat"],
2,
["听力细节理解"],
"Ben说'I'm going to repair the garden seat.'他打算修理花园椅子。选项C为正确答案。"
),
make_qs(
"You will hear two people in a waiting room.",
"021401-04.mp3",
"What delayed Lucy this morning?",
["She forgot her newspaper", "Her backpack strap broke", "She couldn't find a seat"],
1,
["听力细节理解"],
"Lucy说'my backpack strap broke and I had to repair it.',背包带断了所以迟到了。"
),
]
QSID_021401_FIRST_DIALOGUES = [
"""Ben: Hi, Lucy. I always read the newspaper at breakfast. It's a good way to start the day.
Lucy: That's nice, Ben. I plan my day while I eat. I write a list of things to do.""",
"""Johnny: My plan was to relax on the trip, but I had to repair a broken seat on the bus!
Otis: Oh no, Johnny! I bought a new backpack for the trip. My old one was too small.""",
"""Lucy: I need to repair this old backpack. The zip is broken.
Ben: Oh dear, Lucy. My plan is to find a quiet seat and finish my book.""",
"""Ben: I'm going to repair the garden seat this weekend. It's been wobbly for weeks.
Lucy: Good idea, Ben. My plan is to stay home and read the Sunday newspaper.""",
"""Lucy: Sorry I'm late. My backpack strap broke and I had to repair it.
Ben: No worries, Lucy. I wish I had a newspaper to read while waiting. This is so boring.""",
]
for i, d in enumerate(QSID_021401_FIRST_DIALOGUES):
QSID_021401_FIRST[i]["dialogue"] = d
QSID_021401_FIRST_BLOCK = make_block("021401", QSID_021401_FIRST)
QSID_021401_SECOND = [
make_qs(
"You will hear two people talking about what they did yesterday.",
"021401-05.mp3",
"Whose plan was to prepare for next week's trip?",
["Ben's plan to prepare for next week's trip", "Skylar's plan to fix the backpack", "Lucy's plan to read in the park"],
0,
["显性事实理解|关键词识别"],
"Ben说'I had to plan my trip for next week.'他在为下周旅行做准备。选项A为正确答案。"
),
make_qs(
"You will hear two people talking about things they need.",
"021401-06.mp3",
"What does Lucy say she needs to do?",
["Repair a broken seat", "Buy a new backpack for school", "Plan a weekend visit"],
0,
["听力细节理解"],
"Lucy说'I should repair this seat.'她需要修椅子。选项A为正确答案。"
),
make_qs(
"You will hear two people talking about where they are.",
"021401-07.mp3",
"Where is Ben most likely?",
["At a bus stop", "In a repair shop", "At home or in a park"],
2,
["听力细节理解"],
"Ben说'I've put my backpack on this seat and I'm looking for my plan.',他在公园或家里的座位上整理计划。"
),
make_qs(
"You will hear two people talking about their problems.",
"021401-08.mp3",
"What problem does Ben describe?",
["He can't read the newspaper without glasses", "He forgot his backpack with the map", "His newspaper got wet on the seat"],
1,
["听力细节理解"],
"Ben说'My plan failed because I forgot my backpack with the map.'他忘了带装地图的背包。选项B为正确答案。"
),
make_qs(
"You will hear two people giving advice.",
"021401-09.mp3",
"What does Ben advise about backpacks?",
["Always plan your day first", "Don't put heavy books in a cheap backpack", "Use a newspaper to sit on a dirty seat"],
1,
["听力细节理解"],
"Ben说'Don't put heavy books in a cheap backpack; it might break.',他建议不要把重书放进便宜的背包。"
),
]
QSID_021401_SECOND_DIALOGUES = [
"""Ben: Hi, Lucy. I had to plan my trip for next week. I looked at a map and wrote a list.
Lucy: That sounds organised, Ben. I tried to repair my old backpack. It had a hole, but I fixed it.""",
"""Lucy: I should repair this seat. It's broken and uncomfortable.
Ben: Oh, Lucy. I need a new backpack for school. My old one is too small.""",
"""Ben: I've put my backpack on this seat and I'm looking for my plan.
Lucy: That looks relaxing, Ben. I'm sitting on a comfortable seat over here, planning my holiday.""",
"""Ben: My plan failed because I forgot my backpack with the map.
Lucy: That's bad luck, Ben. I can't read the newspaper. I need to repair my glasses first.""",
"""Ben: Don't put heavy books in a cheap backpack; it might break.
Lucy: That's good advice, Ben. You should also always plan your day. It helps a lot.""",
]
for i, d in enumerate(QSID_021401_SECOND_DIALOGUES):
QSID_021401_SECOND[i]["dialogue"] = d
QSID_021401_SECOND_BLOCK = make_block("021401", QSID_021401_SECOND)
# ============================================================
# 021501 - 访客话题 (visitor/clever/serious/mad/sorry/welcome/laugh)
# first: 5 Qs | second: 5 Qs
# ============================================================
QSID_021501_FIRST = [
make_qs(
"You will hear two people talking about a recent visitor.",
"021501-00.mp3",
"Which speaker felt annoyed at first?",
["Ben", "Lucy", "Daisy"],
1,
["显性事实理解|关键词识别"],
"Lucy说'I was a bit mad at first because my visitor arrived late, but in the end, I was happy to welcome him.'她起初生气但后来很开心。Daisy不在对话中是干扰项。"
),
make_qs(
"You will hear two people talking about inviting someone.",
"021501-01.mp3",
"What does Ben say about inviting more guests?",
["He wants to invite his cousin", "He feels sorry about the party", "He can't invite any more because the house is full"],
2,
["听力细节理解"],
"Ben说'I'm sorry, but we can't invite any more guests. The house is full.'房子满了无法邀请更多客人。选项C为正确答案。"
),
make_qs(
"You will hear two people describing a guest.",
"021501-02.mp3",
"Whose guest seemed serious at first but later became friendly?",
["Smith's guest changed from serious to friendly", "Lucy's guest told clever stories", "Ben's guest was serious and quiet"],
0,
["显性事实理解|关键词识别"],
"对话中Smith说'The visitor seemed very serious at first, but later he was very friendly.'是Smith的客人性格变化。选项A为正确答案。"
),
make_qs(
"You will hear two people talking about a party.",
"021501-03.mp3",
"What did Ben forget to do for his party?",
["He forgot to prepare enough food", "He forgot to invite one friend", "He forgot to welcome a guest"],
1,
["听力细节理解"],
"Ben说'I was mad because I forgot to invite one friend. I said sorry to her later.'他忘邀请一位朋友。选项B为正确答案。"
),
make_qs(
"You will hear two people talking about their feelings.",
"021501-04.mp3",
"What does Lucy say about making up with a friend?",
["She feels sorry for a serious-looking guest", "She thinks it's clever to welcome all visitors", "She's not mad anymore after saying sorry"],
2,
["听力细节理解"],
"Lucy说'I'm not mad anymore. I said sorry, and now my friend is welcome to visit.'道歉后两人和好了。选项C为正确答案。"
),
]
QSID_021501_FIRST_DIALOGUES = [
"""Ben: Hi, Lucy. We had a visitor last week. He was clever, but he was also quite serious.
Lucy: Oh, Ben. My guest made me laugh a lot. I'm sorry he had to leave so soon.""",
"""Ben: I'm sorry, but we can't invite any more guests. The house is full.
Lucy: That's okay, Ben. I want to invite my cousin. He's very clever and always makes us laugh.""",
"""Smith: The visitor seemed very serious at first, but later he was very friendly.
Lucy: That's nice, Smith. Our guest was so clever. He told funny stories that made everyone laugh.""",
"""Ben: I was mad because I forgot to invite one friend. I said sorry to her later.
Lucy: Oh dear, Ben. Every guest was welcome at my party. It was great to hear them all laugh together.""",
"""Lucy: I'm not mad anymore. I said sorry, and now my friend is welcome to visit.
Ben: That's good, Lucy. I feel sorry for our guest. He looked serious and didn't laugh much.""",
]
for i, d in enumerate(QSID_021501_FIRST_DIALOGUES):
QSID_021501_FIRST[i]["dialogue"] = d
QSID_021501_FIRST_BLOCK = make_block("021501", QSID_021501_FIRST)
QSID_021501_SECOND = [
make_qs(
"You will hear two people talking about something they did at school.",
"021501-05.mp3",
"Who will try to be more careful next time?",
["Ben", "Lucy", "Skylar"],
0,
["显性事实理解|关键词识别"],
"Ben说'I'll be more careful next time.'他说下次会更仔细。Skylar不在对话中是干扰项。"
),
make_qs(
"You will hear two people talking about learning something new.",
"021501-06.mp3",
"Whose book had a printing error?",
["Daisy's book", "Otis's book", "Ben's book"],
1,
["显性事实理解|关键词识别"],
"Otis说'I noticed a mistake in the book. The reason was a printing error.'Ben在对话中提到了学画Otis发现了印刷错误。"
),
make_qs(
"You will hear two people talking about their plans.",
"021501-07.mp3",
"What does Ben want to do in the future?",
["Write a story because he loves reading", "Work with new technology", "Read instructions more carefully"],
0,
["听力细节理解"],
"Ben说'I want to write a story. The reason is I love reading.'他的计划是写故事。选项A为正确答案。"
),
make_qs(
"You will hear two people giving advice.",
"021501-08.mp3",
"What does Lucy say about copying?",
["Always read the instruction before starting", "Be careful with new technology", "If you copy someone's work, you won't learn"],
2,
["听力细节理解"],
"Lucy说'If you copy someone's work, you won't learn.'抄袭不能帮助学习。选项C为正确答案。"
),
make_qs(
"You will hear two people talking about a problem they solved.",
"021501-09.mp3",
"How did Ben find his mistake?",
["He copied the text carefully again", "He used a computer program", "He asked the teacher for clear instruction"],
1,
["听力细节理解"],
"Ben说'I used a computer program to work out a difficult sum. The technology found my mistake.'他用电脑程序发现了错误。选项B为正确答案。"
),
]
QSID_021501_SECOND_DIALOGUES = [
"""Ben: Hi, Lucy. I made a mistake in my maths homework. I didn't read the instruction carefully. I'll be more careful next time.
Lucy: I understand, Ben. I didn't notice the reason for the new classroom rule. I just copied it from the board. I should ask the teacher in the future.""",
"""Otis: I noticed a mistake in the book. The reason was a printing error. I'll tell the teacher about it in the future.
Ben: Good catch, Otis. I followed the instruction carefully to use the new app. I didn't want to make a mistake. It worked out well!""",
"""Ben: I want to write a story. The reason is I love reading. I'll copy the style of my favourite author, but I won't make the same mistake he did.
Lucy: That's a great plan, Ben. My plan for the future is to work with new technology. I need to be careful and study hard to make it work out.""",
"""Lucy: If you copy someone's work, you won't learn. The reason is you need to work out problems yourself to understand.
Ben: That's so true, Lucy. Always read the instruction before you start. That's the best way to avoid a mistake.""",
"""Ben: I used a computer program to work out a difficult sum. The technology found my mistake. I was more careful after that.
Lucy: That's clever, Ben. I had to copy a long text. I did it carefully to avoid any mistake. It took time, but it worked out in the end.""",
]
for i, d in enumerate(QSID_021501_SECOND_DIALOGUES):
QSID_021501_SECOND[i]["dialogue"] = d
QSID_021501_SECOND_BLOCK = make_block("021501", QSID_021501_SECOND)
# ============================================================
# 021601 - 体验话题 (strange/quiet/noisy/heavy/fresh/drop)
# first: 5 Qs | second: empty
# ============================================================
QSID_021601_FIRST = [
make_qs(
"You will hear two people talking about their morning.",
"021601-00.mp3",
"Who had a strange experience this morning?",
["Ben", "Lucy", "Skylar"],
0,
["显性事实理解|关键词识别"],
"Ben说'I had a very strange morning. I saw a cat wearing a hat!'他的早晨非常奇怪。Skylar不在对话中是干扰项。"
),
make_qs(
"You will hear two people talking about a place they visited.",
"021601-01.mp3",
"What does Lucy say about the library?",
["It was very crowded", "It is quiet and she can read there", "It was too noisy with traffic"],
1,
["听力细节理解"],
"Lucy说'I love our local library. It's quiet and I can read there.',图书馆安静适合读书。"
),
make_qs(
"You will hear two people talking about something that happened.",
"021601-02.mp3",
"Whose box fell and made a mess?",
["Johnny's box", "Ben's box", "Lucy's box"],
0,
["显性事实理解|关键词识别"],
"Johnny说'I was carrying a box and I let it drop. What a mess!'他的盒子掉了弄得很乱。Ben提到了noiseLucy提到了bread。"
),
make_qs(
"You will hear two people describing how they feel.",
"021601-03.mp3",
"What is Lucy complaining about?",
["A suitcase that is too heavy", "Streets that are too crowded", "A room that is too noisy"],
2,
["听力细节理解"],
"Lucy说'I can't study here. This room is too noisy.',她嫌房间太吵无法学习。"
),
make_qs(
"You will hear two people talking about their shopping.",
"021601-04.mp3",
"What warning does Ben give at the market?",
["Don't buy strange fruit", "Be careful with the eggs, don't drop them", "Buy fresh vegetables instead"],
1,
["听力细节理解"],
"Ben说'Be careful with that bag! Don't drop the eggs.',他在警告不要把鸡蛋掉了。"
),
]
QSID_021601_FIRST_DIALOGUES = [
"""Ben: Hi, Lucy. I had a very strange morning. I saw a cat wearing a hat!
Lucy: Wow, Ben! I went to the market early. The air was so fresh and nice.""",
"""Lucy: I love our local library. It's quiet and I can read there.
Ben: That sounds lovely, Lucy. I went to the new park. It was very crowded with people.""",
"""Johnny: I was carrying a box and I let it drop. What a mess!
Ben: Oh no, Johnny! I heard a very strange noise last night. It was like a whistle.""",
"""Lucy: I can't study here. This room is too noisy.
Ben: I know what you mean, Lucy. This suitcase is too heavy for me to lift.""",
"""Ben: Be careful with that bag! Don't drop the eggs.
Lucy: Thanks, Ben. I bought some strange fruit. I've never seen it before.""",
]
for i, d in enumerate(QSID_021601_FIRST_DIALOGUES):
QSID_021601_FIRST[i]["dialogue"] = d
QSID_021601_FIRST_BLOCK = make_block("021601", QSID_021601_FIRST)
# ============================================================
# 021701 - 周末话题 (basketball/bookcase/draw/machine/invention)
# first: 5 Qs | second: empty
# ============================================================
QSID_021701_FIRST = [
make_qs(
"You will hear two people talking about what they did last weekend.",
"021701-00.mp3",
"Who played basketball last weekend?",
["Ben", "Lucy", "Skylar"],
0,
["显性事实理解|关键词识别"],
"Ben说'Last weekend, I played basketball twice with my friends.'他上周打了篮球。Skylar不在对话中是干扰项。"
),
make_qs(
"You will hear two people talking about their hobbies.",
"021701-01.mp3",
"Whose hobby needs a bigger bookcase?",
["Daisy's hobby", "Smith's hobby", "Johnny's hobby"],
1,
["显性事实理解|关键词识别"],
"Smith说'I enjoy reading. I have so many books that I need a bigger bookcase.'他书太多需要更大的书架。Johnny不在对话中是干扰项。"
),
make_qs(
"You will hear two people talking about things they saw.",
"021701-02.mp3",
"What did Ben read about that was from long ago?",
["A clever machine that can draw", "A basketball game on TV", "A great invention from many years ago"],
2,
["听力细节理解"],
"Ben说'I read about a great invention in a book. Someone made it many years ago.'他读到一项古老的发明。选项C为正确答案。"
),
make_qs(
"You will hear two people talking about what they made or did.",
"021701-03.mp3",
"What did Lucy make for her room?",
["A small bookcase", "A funny drawing of a machine", "A basketball drawing"],
0,
["听力细节理解"],
"Lucy说'I made a small bookcase for my room. It was hard work!',她为自己房间做了个小书架。"
),
make_qs(
"You will hear two people talking about their plans.",
"021701-04.mp3",
"What does Ben want to learn to draw?",
["A famous person from long ago", "A basketball", "An old machine"],
1,
["听力细节理解"],
"Ben说'I want to learn how to draw a basketball. It seems difficult.',他想学画篮球。"
),
]
QSID_021701_FIRST_DIALOGUES = [
"""Ben: Hi, Lucy. Last weekend, I played basketball twice with my friends. It was so much fun.
Lucy: That sounds great, Ben. I went to the library and read some interesting books. I also helped my dad build a new bookcase.""",
"""Smith: My hobby is drawing. I like to draw pictures of people and places.
Ben: That's nice, Smith. I enjoy reading. I have so many books that I need a bigger bookcase.""",
"""Ben: I read about a great invention in a book. Someone made it many years ago.
Lucy: That's interesting, Ben. I saw a very clever machine yesterday. It can draw pictures by itself!""",
"""Lucy: I made a small bookcase for my room. It was hard work!
Ben: Well done, Lucy. I drew a picture of a funny machine. My teacher liked it.""",
"""Ben: I want to learn how to draw a basketball. It seems difficult.
Lucy: That's a fun goal, Ben. I plan to read a book about a famous person from long ago.""",
]
for i, d in enumerate(QSID_021701_FIRST_DIALOGUES):
QSID_021701_FIRST[i]["dialogue"] = d
QSID_021701_FIRST_BLOCK = make_block("021701", QSID_021701_FIRST)
# ============================================================
# 021801 - 出行话题 (battery/shop/theatre/show/midday/bright/corner/climb)
# first: 5 Qs | second: 5 Qs
# ============================================================
QSID_021801_FIRST = [
make_qs(
"You will hear two people talking about what they did in the morning.",
"021801-00.mp3",
"Whose toy car needed a new battery?",
["Ben's toy car", "Lucy's toy car", "Daisy's toy car"],
0,
["显性事实理解|关键词识别"],
"Ben说'I needed a new battery for my toy car. I went to the shop at midday to buy one.'他的玩具车需要新电池。Daisy不在对话中是干扰项。"
),
make_qs(
"You will hear two people talking about their weekend activities.",
"021801-01.mp3",
"What did Ben and his friend do at the theatre?",
["Watched a special play", "Climbed a tall tree", "Fixed a phone"],
0,
["听力细节理解"],
"Ben说'We went to the theatre. It was a special play and very interesting.',他们去剧院看了一场特别的戏剧。"
),
make_qs(
"You will hear two people describing a place they visited.",
"021801-02.mp3",
"What does Lucy mention about the place she visited?",
["It was very bright at midday", "It had a quiet corner to sit and read", "The old tower was closed"],
1,
["听力细节理解"],
"Lucy说'I liked the quiet corner best. It was a special place to sit and read.',她最喜欢安静的角落。"
),
make_qs(
"You will hear two people talking about something that happened.",
"021801-03.mp3",
"What did Lucy's torch help them do?",
["Meet a friend at the library", "See in the dark", "Climb a hill in the rain"],
1,
["听力细节理解"],
"Lucy说'The special battery in my torch made it very bright. It helped us see in the dark.',手电筒帮他们在黑暗中看清。"
),
make_qs(
"You will hear two people talking about different problems.",
"021801-04.mp3",
"What problem did Ben have?",
["He lost his keys in the kitchen", "He was late for a film at the theatre", "His watch stopped because the battery was old"],
2,
["听力细节理解"],
"Ben说'My watch stopped because the battery was old. I bought a new one after lunch.'他的手表没电了。选项C为正确答案。"
),
]
QSID_021801_FIRST_DIALOGUES = [
"""Ben: Hi, Lucy. I needed a new battery for my toy car. I went to the shop at midday to buy one.
Lucy: Oh, Ben. I arrived at the theatre early to get a good seat for the special show.""",
"""Ben: We went to the theatre. It was a special play and very interesting.
Lucy: That sounds fun, Ben. I helped my brother climb a tall tree in the park. It was exciting!""",
"""Lucy: I liked the quiet corner best. It was a special place to sit and read.
Ben: That's nice, Lucy. I arrived just before midday. The room was very bright because of the big windows.""",
"""Lucy: The special battery in my torch made it very bright. It helped us see in the dark.
Ben: That's useful, Lucy. I was sitting in the corner of the library when my friend arrived. We studied together.""",
"""Ben: My watch stopped because the battery was old. I bought a new one after lunch.
Lucy: That's annoying, Ben. I couldn't find my keys. They were in the bright corner of the kitchen, under a newspaper.""",
]
for i, d in enumerate(QSID_021801_FIRST_DIALOGUES):
QSID_021801_FIRST[i]["dialogue"] = d
QSID_021801_FIRST_BLOCK = make_block("021801", QSID_021801_FIRST)
QSID_021801_SECOND = [
make_qs(
"You will hear two people talking about a surprise party.",
"021801-05.mp3",
"Who felt very excited about the party?",
["Lucy", "Ben", "Daisy"],
0,
["显性事实理解|关键词识别"],
"Lucy说'I was so excited about the party! I thought everyone would forget, but they all came.'她非常兴奋。Daisy不在对话中是干扰项。"
),
make_qs(
"You will hear two people talking about a school play.",
"021801-06.mp3",
"What did Ben feel during the play?",
["He felt nervous", "His heart was racing with excitement", "He forgot one of his lines"],
1,
["听力细节理解"],
"Ben说'I felt my heart racing when I was on stage. It was exciting!',他在舞台上心跳加速非常激动。"
),
make_qs(
"You will hear two people talking about their weekend.",
"021801-07.mp3",
"Why was Lucy's Sunday brilliant?",
["She finally got to rest", "She visited her grandma", "The weather was brilliant"],
1,
["听力细节理解"],
"Lucy说'I was excited to visit my grandma. I felt my heart was full of joy.',她周日去看了奶奶很开心。"
),
make_qs(
"You will hear two people talking about a football match.",
"021801-08.mp3",
"Why did Ben think the game was brilliant?",
["His team scored the first goal", "His team played well all game", "The result was better than expected"],
0,
["听力细节理解"],
"Ben说'It was a brilliant game! I felt so excited when we scored the first goal.',球队进了第一个球让他很兴奋。"
),
make_qs(
"You will hear two people talking about a test.",
"021801-09.mp3",
"Who felt positive after the test?",
["Johnny", "Ben", "Lucy"],
2,
["显性事实理解|关键词识别"],
"Lucy说'I felt excited after the test because I think it went brilliantly.'她考后感觉很积极。Johnny感到nervousLucy感到excited。"
),
]
QSID_021801_SECOND_DIALOGUES = [
"""Lucy: I was so excited about the party! I thought everyone would forget, but they all came.
Ben: That's wonderful, Lucy. I suppose it was a brilliant idea. I felt my heart beating fast when I saw the cake.""",
"""Ben: I felt my heart racing when I was on stage. It was exciting!
Lucy: I know the feeling, Ben. I suppose the play was brilliant. My friend said I was good, but I felt a bit nervous.""",
"""Lucy: I was excited to visit my grandma. I felt my heart was full of joy.
Ben: That's so sweet, Lucy. I felt tired on Saturday. I suppose I forgot to rest. But Sunday was brilliant!""",
"""Ben: It was a brilliant game! I felt so excited when we scored the first goal.
Lucy: Lucky you, Ben. I felt disappointed because our team lost. I suppose we forgot how to play well.""",
"""Lucy: I felt excited after the test because I think it went brilliantly.
Ben: That's great, Lucy. I felt my heart beat quickly before the test. I was so nervous!""",
]
for i, d in enumerate(QSID_021801_SECOND_DIALOGUES):
QSID_021801_SECOND[i]["dialogue"] = d
QSID_021801_SECOND_BLOCK = make_block("021801", QSID_021801_SECOND)
# ============================================================
# 022101 - 活动话题 (race/factory/skate/port/noise/ship)
# first: 5 Qs | second: empty
# ============================================================
QSID_022101_FIRST = [
make_qs(
"You will hear two people talking about their weekend.",
"022101-00.mp3",
"Who went to watch a boat race at the port?",
["Ben", "Lucy", "Daisy"],
0,
["显性事实理解|关键词识别"],
"Ben说'I went to watch a boat race at the port. It was exciting!'他去港口看了赛船。Daisy不在对话中是干扰项。"
),
make_qs(
"You will hear two people talking about sounds they heard.",
"022101-01.mp3",
"Where did the noise Lucy heard come from?",
["At the port, from boats", "Near the factory", "At home, a ball hit the window"],
2,
["听力细节理解"],
"Lucy说'I heard a loud noise when a ball hit the window.'球撞到窗户发出噪音。选项C为正确答案。"
),
make_qs(
"You will hear two people talking about things they saw.",
"022101-02.mp3",
"What did Ben see at the factory?",
["A big ship going through the port", "Workers making things inside", "Children having a race on skates"],
1,
["听力细节理解"],
"Ben说'I saw workers making things inside the factory.',他在工厂看到了工人在制造东西。"
),
make_qs(
"You will hear two people talking about problems they had.",
"022101-03.mp3",
"What kept Lucy awake last night?",
["She fell down while skating", "The noise from the port", "She got lost in the factory"],
1,
["听力细节理解"],
"Lucy说'The noise from the port kept me awake last night.',港口的噪音让她睡不着。"
),
make_qs(
"You will hear two people talking about their favourite activities.",
"022101-04.mp3",
"What does Ben enjoy doing most?",
["Watching boat races", "Skating fast", "Visiting the port to see boats"],
0,
["听力细节理解"],
"Ben说'I love watching boat races. They are the best!',他最喜欢看船赛。"
),
]
QSID_022101_FIRST_DIALOGUES = [
"""Ben: Hi, Lucy. I went to watch a boat race at the port. It was exciting!
Lucy: That sounds fun, Ben. I visited a factory with my class. It was noisy but interesting.""",
"""Lucy: I heard a loud noise when a ball hit the window.
Ben: Oh dear, Lucy. The sound of boats at the port was very loud this morning.""",
"""Ben: I saw workers making things inside the factory.
Lucy: That's interesting, Ben. I saw a big ship go through the port. It was huge!""",
"""Lucy: The noise from the port kept me awake last night.
Ben: That's too bad, Lucy. My skate hit a stone and I fell down.""",
"""Ben: I love watching boat races. They are the best!
Lucy: I can see why, Ben. I enjoy skating fast. It feels like flying.""",
]
for i, d in enumerate(QSID_022101_FIRST_DIALOGUES):
QSID_022101_FIRST[i]["dialogue"] = d
QSID_022101_FIRST_BLOCK = make_block("022101", QSID_022101_FIRST)
# ============================================================
# 032501 - 工作话题 (journalist/partner/internet/capital/invitation/company)
# first: 5 Qs | second: empty
# ============================================================
QSID_032501_FIRST = [
make_qs(
"You will hear two people talking about their new jobs.",
"032501-00.mp3",
"Who works with a partner as a journalist?",
["Skylar's job online", "Lucy's job at a big company", "Ben's job as a journalist with a partner"],
2,
["显性事实理解|关键词识别"],
"Ben说'My partner and I write stories for a newspaper.'他和搭档一起工作。选项C为正确答案。"
),
make_qs(
"You will hear two people talking about their plans for the weekend.",
"032501-01.mp3",
"Whose friend sent an invitation to visit the capital?",
["Otis's friend", "Lucy's friend", "Daisy's friend"],
0,
["显性事实理解|关键词识别"],
"Otis说'I'm going to the capital to visit a museum. I got an invitation from a friend who lives there.'他的朋友邀请他去首都。Daisy不在对话中。"
),
make_qs(
"You will hear two people talking about what they like.",
"032501-02.mp3",
"What does Ben say about his job?",
["He finds history very interesting", "He works as a journalist with different people", "He uses the internet to talk to his partner"],
1,
["听力细节理解"],
"Ben说'My job is interesting because I'm a journalist. I don't have a fixed partner; I work with different people.',他的记者工作有趣因为可以和不同的人合作。"
),
make_qs(
"You will hear two people talking about their work.",
"032501-03.mp3",
"Who does all their work online from home?",
["Skylar", "Lucy", "Daisy"],
0,
["显性事实理解|关键词识别"],
"Skylar说'I work alone at home. I don't have a partner. All my research is done on the internet.'他所有工作都在网上完成。Daisy不在对话中。"
),
make_qs(
"You will hear two people talking about recent events.",
"032501-04.mp3",
"What did Ben read on the internet?",
["About interesting places in the capital", "An interesting story by a famous journalist", "A surprising invitation to be a journalist's partner"],
1,
["听力细节理解"],
"Ben说'I read an interesting story by a famous journalist on the internet yesterday.',他在网上读到一位名记者写的有趣故事。"
),
]
QSID_032501_FIRST_DIALOGUES = [
"""Ben: Hi, Lucy. I started working as a journalist last month. My partner and I write stories for a newspaper. It's very interesting.
Lucy: That's exciting, Ben. I got an invitation to work for a big company in the capital. I'm excited to move there.""",
"""Otis: I'm going to the capital to visit a museum. I got an invitation from a friend who lives there.
Lucy: How nice, Otis. My weekend will be boring. I have to work with my partner on a project using the internet.""",
"""Ben: My job is interesting because I'm a journalist. I don't have a fixed partner; I work with different people.
Lucy: That's great, Ben. I think history is very interesting. I read a lot about different capitals on the internet.""",
"""Skylar: I work alone at home. I don't have a partner. All my research is done on the internet.
Lucy: That sounds peaceful, Skylar. I work as a journalist in the capital. Sometimes it's interesting, sometimes it's not.""",
"""Ben: I read an interesting story by a famous journalist on the internet yesterday.
Lucy: Oh really, Ben? My partner and I visited the capital. We saw many interesting places.""",
]
for i, d in enumerate(QSID_032501_FIRST_DIALOGUES):
QSID_032501_FIRST[i]["dialogue"] = d
QSID_032501_FIRST_BLOCK = make_block("032501", QSID_032501_FIRST)
# ============================================================
# 032901 - 日常话题 (shower/exercise/hobby/boss/offer/easy/soft drink)
# first: 5 Qs | second: empty
# ============================================================
QSID_032901_FIRST = [
make_qs(
"You will hear two people talking about their morning routines.",
"032901-00.mp3",
"Who does exercise in the morning?",
["Ben", "Lucy", "Skylar"],
0,
["显性事实理解|关键词识别"],
"Ben说'I always take a quick shower in the morning. Then I do some exercise, like running, before breakfast.'他早上会锻炼。Skylar不在对话中是干扰项。"
),
make_qs(
"You will hear two people talking about their jobs.",
"032901-01.mp3",
"Whose job is also their hobby?",
["Otis's job", "Daisy's job", "Ben's job"],
2,
["显性事实理解|关键词识别"],
"Ben说'My hobby is my job! I teach people how to exercise correctly. It's fun to share my passion.'他的爱好成为了工作。Daisy在café工作Ben教人锻炼。"
),
make_qs(
"You will hear two people talking about what they like to do after work.",
"032901-02.mp3",
"What does Lucy prefer to do after work?",
["Take a long, hot shower and read", "Meet friends for a run", "Watch TV because it's easy"],
0,
["听力细节理解"],
"Lucy说'After work, I love to relax. A long, hot shower is the best. Then I might read a book.',她下班后喜欢淋浴和看书。"
),
make_qs(
"You will hear two people talking about helping others.",
"032901-03.mp3",
"How does Ben help customers at his café job?",
["He drives friends home after the photography club", "He offers tired customers a free soft drink", "He cooks for his family"],
1,
["听力细节理解"],
"Ben说'if a customer looks tired, I sometimes offer them a free soft drink. My boss says it's a good idea.'他在café工作时会送疲惫的客人免费饮料。"
),
make_qs(
"You will hear two people talking about their plans for the weekend.",
"032901-04.mp3",
"Who has to work on Saturday because their boss asked?",
["Smith", "Johnny", "Lucy"],
1,
["显性事实理解|关键词识别"],
"Johnny说'My boss asked me to work on Saturday. It won't be easy, but I said yes.'老板要求他周六工作。Lucy打算休息。"
),
]
QSID_032901_FIRST_DIALOGUES = [
"""Ben: Hi, Lucy. I always take a quick shower in the morning. Then I do some exercise, like running, before breakfast.
Lucy: That's healthy, Ben. My morning is easy. I just have a soft drink and check my emails. My boss is always the first to write.""",
"""Ben: My hobby is my job! I teach people how to exercise correctly. It's fun to share my passion.
Lucy: That's great, Ben. My boss is very kind. He often offers to help me with difficult tasks, which makes my work much easier.""",
"""Lucy: After work, I love to relax. A long, hot shower is the best. Then I might read a book.
Ben: That sounds nice, Lucy. I usually meet friends. We often go for a run for exercise. Sometimes we just have a soft drink and chat.""",
"""Ben: At the café, if a customer looks tired, I sometimes offer them a free soft drink. My boss says it's a good idea.
Lucy: That's so kind, Ben. I always offer to drive my friends home after our photography club. It's no problem for me.""",
"""Johnny: My boss asked me to work on Saturday. It won't be easy, but I said yes. I hope he offers to pay extra.
Lucy: Oh dear, Johnny. I need to do some exercise, so I'll probably go to the gym. But first, a nice shower!""",
]
for i, d in enumerate(QSID_032901_FIRST_DIALOGUES):
QSID_032901_FIRST[i]["dialogue"] = d
QSID_032901_FIRST_BLOCK = make_block("032901", QSID_032901_FIRST)
# ============================================================
# Record ID -> data mapping
# ============================================================
RECORD_DATA = {
"021301": {
"record_id": "recvjufKJO8d0O",
"first_block": QSID_021301_FIRST_BLOCK,
"second_block": QSID_021301_SECOND_BLOCK,
"first_qs_list": QSID_021301_FIRST,
"second_qs_list": QSID_021301_SECOND,
},
"021401": {
"record_id": "recvjufM763ijb",
"first_block": QSID_021401_FIRST_BLOCK,
"second_block": QSID_021401_SECOND_BLOCK,
"first_qs_list": QSID_021401_FIRST,
"second_qs_list": QSID_021401_SECOND,
},
"021501": {
"record_id": "recvjufM76lEsW",
"first_block": QSID_021501_FIRST_BLOCK,
"second_block": QSID_021501_SECOND_BLOCK,
"first_qs_list": QSID_021501_FIRST,
"second_qs_list": QSID_021501_SECOND,
},
"021601": {
"record_id": "recvjufM76hNv5",
"first_block": QSID_021601_FIRST_BLOCK,
"second_block": {},
"first_qs_list": QSID_021601_FIRST,
"second_qs_list": [],
},
"021701": {
"record_id": "recvjufM76eMKs",
"first_block": QSID_021701_FIRST_BLOCK,
"second_block": {},
"first_qs_list": QSID_021701_FIRST,
"second_qs_list": [],
},
"021801": {
"record_id": "recvjufM76lRHQ",
"first_block": QSID_021801_FIRST_BLOCK,
"second_block": QSID_021801_SECOND_BLOCK,
"first_qs_list": QSID_021801_FIRST,
"second_qs_list": QSID_021801_SECOND,
},
"022101": {
"record_id": "recvjufM76o6of",
"first_block": QSID_022101_FIRST_BLOCK,
"second_block": {},
"first_qs_list": QSID_022101_FIRST,
"second_qs_list": [],
},
"032501": {
"record_id": "recvjufM76k4dx",
"first_block": QSID_032501_FIRST_BLOCK,
"second_block": {},
"first_qs_list": QSID_032501_FIRST,
"second_qs_list": [],
},
"032901": {
"record_id": "recvjufM76frUP",
"first_block": QSID_032901_FIRST_BLOCK,
"second_block": {},
"first_qs_list": QSID_032901_FIRST,
"second_qs_list": [],
},
}
def main():
mode = sys.argv[1] if len(sys.argv) > 1 else "dry"
for qsid, data in RECORD_DATA.items():
record_id = data["record_id"]
first_block = data["first_block"]
second_block = data["second_block"]
first_qs = data["first_qs_list"]
second_qs = data["second_qs_list"]
# Build jsonData
json_data = {"first": first_block, "second": second_block}
# Build 题目1 text
q1_text = make_q1_text(first_qs)
q2_text = make_q1_text(second_qs) if second_qs else ""
# Remove dialogue key from question set for jsonData
for q in first_block["questionSet"]:
q.pop("dialogue", None)
if second_block and isinstance(second_block, dict) and "questionSet" in second_block:
for q in second_block["questionSet"]:
q.pop("dialogue", None)
fields = {
"jsonData": json.dumps(json_data, ensure_ascii=False),
"题目1": q1_text,
"题目2": q2_text,
}
fields_json = json.dumps(fields, ensure_ascii=False)
print(f"\n{'='*60}")
print(f"QSID: {qsid} | Record: {record_id}")
print(f"First questions: {len(first_qs)}")
print(f"Second questions: {len(second_qs)}")
# Verify answer distribution
answers_first = [q["answer"][0] for q in first_qs]
a_counts = {0: answers_first.count(0), 1: answers_first.count(1), 2: answers_first.count(2)}
print(f"First answer distribution: A={a_counts[0]}, B={a_counts[1]}, C={a_counts[2]}")
if max(a_counts.values()) > 2:
print(f" ⚠️ WARNING: answer not evenly distributed!")
if second_qs:
answers_second = [q["answer"][0] for q in second_qs]
s_counts = {0: answers_second.count(0), 1: answers_second.count(1), 2: answers_second.count(2)}
print(f"Second answer distribution: A={s_counts[0]}, B={s_counts[1]}, C={s_counts[2]}")
if max(s_counts.values()) > 2:
print(f" ⚠️ WARNING: answer not evenly distributed!")
if mode == "write":
result = update_record(record_id, fields_json)
code = result.get("code", -1)
if code == 0:
print(f" ✅ Write SUCCESS")
else:
print(f" ❌ Write FAILED: {result.get('msg', 'unknown')}")
elif mode == "dry":
print(f" DRY RUN - would write {len(fields_json)} bytes")
# Save to file for inspection
fname = f"/tmp/p4_rewrite_{qsid}.json"
with open(fname, 'w') as f:
json.dump(json_data, f, ensure_ascii=False, indent=2)
print(f" Saved to {fname}")
print(f"\n{'='*60}")
print("All done!")
if __name__ == "__main__":
main()