Zoom Meeting Transcripts
Public meetings · named speakers

Who said what in thousands of hours of public meetings

Transcripts of city councils, school boards and courts that met on Zoom and posted the recordings to YouTube. Every turn is attributed to a named person, read from the name Zoom prints on the active speaker's tile, and linked to the same person across all of a body's meetings.

–
collections
–
meetings
–
hours of speech
–
named speakers
–
speaker turns

How the transcripts were made

Audio alone can tell when a different person starts talking, but not who they are. In Zoom's gallery view, the active speaker's tile is outlined in green and labelled with their name. The pipeline reads that name once a second and aligns it with a Whisper transcript. It runs as four scripts, all in the pipeline repository.

ocr.py

Read the name tile

Find the highlighted tile in each sampled frame and read its name label with PaddleOCR.

video → raw names, 1 per second
transcribe.py

Transcribe the audio

Whisper large-v2 for the words, pyannote to group the speech into voices.

video → text + voice clusters
clean_ocr.py

Turn names into people

Strip titles, roles and OCR damage; link spellings of one person across every meeting of a body.

raw names → linked identities
merge.py

Attribute every turn

Name each stretch of speech from its voice and the tile on screen at that moment.

text + identities → transcript

Order: ocr.py and transcribe.py run independently on each video. clean_ocr.py runs once over a whole collection, because it links people across meetings. merge.py runs last. Method and measurements: METHOD.md.

What a transcript contains

One JSON file per meeting: a list of turns. Each turn keeps the cleaned, linked speaker and the name exactly as it was read off the screen, so the cleaning can be checked or redone.

// data/hidalgo_ccl_9/-OPax3iQV50.json
[
  {
    "start": 3375.36,
    "end": 3384.72,
    "speaker": "patriciaocanaolivarez",
    "speaker_name": "Judge Patricia O'Caña-Olivarez",
    "ocr_label": "Judge Patricia O'Ca..",
    "text": "Okay. So let's come back on April the 5th at 930. ..."
  },
  ...
]
FieldMeaning
start, endSeconds from the start of the YouTube video.
speakerThe linked identity: one key per person across all of a collection's meetings. Other means no name, or a room, device or organisation tile.
speaker_nameThat person's display name.
ocr_labelThe name as OCR read it during the turn, before any cleaning.
textWhat was said (Whisper large-v2).

Get the data

Everything the site shows is plain JSON in the site repository. Clone it, or fetch single files from this site.

# everything
# download the repository from https://anonymous.4open.science/r/zoom-meeting-transcripts-E8E1

# layout
data/collections.json            # every collection, with statistics
data/<collection>/meetings.json  # its meetings: id, date, title, length
data/<collection>/<video id>.json # one transcript
data/<collection>/registry.json  # who is who, and how names were linked
import json, pathlib

root = pathlib.Path("zoom-meeting-transcripts/data")
for c in json.loads((root / "collections.json").read_text()):
    for m in json.loads((root / c["slug"] / "meetings.json").read_text()):
        turns = json.loads((root / c["slug"] / f"{m['id']}.json").read_text())
        # the video: https://www.youtube.com/watch?v={m['id']}

registry.json lists every person in a collection with each spelling that was linked to them, the rule that linked it, and every link the pipeline refused. Three older collections (Waipa District Council, DC Court of Appeals, Albemarle County School Board) predate the raw-OCR record. They keep their original speaker labels, with speaker_name and ocr_label empty.

Collections

Each collection is one public body's meetings, from the period when it met on Zoom in gallery view.

CollectionTypeRegionMeetingsHoursDates
Loading…
Please read before use. These are recordings of public meetings that the bodies themselves published. Court collections name private parties, including criminal defendants; some hearings concern family law and children, and dates of birth and phone numbers are sometimes spoken aloud. Each collection's page lists what applies to it. Use the data for research, and do not use it to identify or contact private individuals. To request removal of a meeting, contact the authors (contact details are withheld during anonymous review).