1600 中考词汇音频播放
每个单词读两遍,按 PDF 的 22 天分组。音频文件在 audio 文件夹内。
{''.join(rows)}
"""
(out_dir / "index.html").write_text(document, encoding="utf-8")
def main() -> None:
parser = argparse.ArgumentParser()
parser.add_argument("--pdf", required=True, help="Source PDF path")
parser.add_argument("--out", default="vocab_audio_output", help="Output directory")
parser.add_argument("--days", type=int, default=22, help="Number of day pages to extract")
args = parser.parse_args()
pdf_path = Path(args.pdf)
out_dir = Path(args.out)
out_dir.mkdir(parents=True, exist_ok=True)
days = []
with pdfplumber.open(str(pdf_path)) as pdf:
for index in range(args.days):
entries = extract_page_entries(pdf.pages[index], index + 1)
days.append(
{
"day": index + 1,
"label": DAY_LABELS[index] if index < len(DAY_LABELS) else str(index + 1),
"count": len(entries),
"entries": entries,
}
)
data = {"source_pdf": str(pdf_path), "days": days}
(out_dir / "vocab_days.json").write_text(
json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8"
)
with (out_dir / "vocab_terms.csv").open("w", encoding="utf-8-sig", newline="") as file:
writer = csv.DictWriter(
file, fieldnames=["day", "position", "source_number", "term", "spoken"]
)
writer.writeheader()
for day in days:
for entry in day["entries"]:
writer.writerow(
{
"day": entry["day"],
"position": entry["position"],
"source_number": entry["source_number"],
"term": entry["term"],
"spoken": entry["spoken"],
}
)
summary = "\n".join(
f"Day {day['day']:02d}: {day['count']} words" for day in days
)
(out_dir / "summary.txt").write_text(summary + "\n", encoding="utf-8")
write_player(out_dir, days)
print(summary)
print(f"Total: {sum(day['count'] for day in days)} words")
print(f"Wrote: {out_dir.resolve()}")
if __name__ == "__main__":
main()