curatorbot / scripts /import_transcript_pdf.py
ignatius's picture
Real-data demo: intake queue, catalogue comparison, private interview data
c1d045b
Raw History Blame Contribute Delete
2.11 kB
"""Turn a released museum transcript (PDF) into a Q/A transcript CuratorBot can analyse.
python scripts/import_transcript_pdf.py private/RG-50.165.0093/transcript.pdf \
-o private/RG-50.165.0093/transcript.txt
Prints the speakers it found and which one it took to be the interviewer.
If it guessed wrong, rerun with --interviewer WH. Check the .txt before analysing:
speaker codes in unusual layouts (several interviewers, OCR slips) may need a
quick manual fix. Released transcripts have no timestamps, so the brief cites
turn numbers instead of times.
"""
from __future__ import annotations
import argparse
import json
import sys
from pathlib import Path
ROOT = Path(__file__).resolve().parent.parent
sys.path.insert(0, str(ROOT))
from curatorbot import transcript as tx # noqa: E402
from curatorbot.importers import front_matter_fields, parse_speaker_transcript, pdf_text # noqa: E402
def main() -> int:
p = argparse.ArgumentParser()
p.add_argument("source", help="Transcript PDF, or a .txt already extracted from one")
p.add_argument("-o", "--output", required=True, help="Q/A .txt to write (a .json with metadata is written beside it)")
p.add_argument("--interviewer", help="Speaker code of the interviewer, if the guess is wrong")
a = p.parse_args()
src = Path(a.source)
text = pdf_text(src) if src.suffix.lower() == ".pdf" else src.read_text(encoding="utf-8")
res = parse_speaker_transcript(text, interviewer=a.interviewer)
out = Path(a.output)
out.parent.mkdir(parents=True, exist_ok=True)
out.write_text(tx.to_qa_text(res["segments"]), encoding="utf-8")
meta = {"speakers": res["speakers"], "interviewer": res["interviewer"], **front_matter_fields(res["front_matter"])}
out.with_suffix(".json").write_text(json.dumps({"meta": meta, "segments": res["segments"]}, ensure_ascii=False, indent=1), encoding="utf-8")
print(f"{len(res['segments'])} turns. Speakers {res['speakers']}; interviewer taken as {res['interviewer']}.")
print(f"Front matter: {meta}")
return 0
if __name__ == "__main__":
raise SystemExit(main())