Agenda
| Start | End | Session | Slides |
|---|---|---|---|
| Part 1 | |||
| 09:00 | 09:20 | Introduction to podcasts | |
| 09:20 | 09:35 | Data sourcing and collection | |
| 09:35 | 09:55 | Processing podcast data | |
| 09:55 | 10:10 | Evaluating data quality | |
| 10:10 | 10:20 | Annotating podcast data | |
| 10:20 | 10:30 | Ethical and legal considerations | |
| 10:30 | 10:45 | Coffee break | |
| Part 2 | |||
| 10:45 | 10:55 | The sporc package | |
| 10:55 | 11:15 | Working with SPoRC for research | — |
| 11:15 | 11:40 | Guided exercises | — |
| 11:40 | 11:50 | Results sharing | — |
| 11:50 | 12:00 | Closing and future directions | — |
Seven decks, 32 MB together and 30 MB of that the introduction. Part 2 is hands-on from 10:55 and has no deck; it runs from the notebooks below.
Notebooks
Committed with their output, so each one is readable in the browser before you install anything.
| 1 | Crawl & extract | RSS discovery and parsing, conditional GET, link rot in 2020 feeds, names from fields versus from the text |
| 2 | Audio → transcript | whisperX, openSMILE, diarization into SPoRC turns; a cost/quality ladder and a gallery of controlled failures |
| 3 | Load & navigate SPoRC | The sporc package, shard economics, three caveats, objects and frames over the same files |
| 4 | Text & conversation | Units of observation; did talk about policing change around 25 May 2020, and do hosts and guests frame it differently |
| 5 | Audio & acoustic | Prosody, speaking rate, turn-taking, host–guest floor-holding |
| 6 | Networks | Show–host–guest graphs, communities, guest circulation, and why the obvious version of this graph is wrong |
| 7 | Annotation with Potato | Launching the interfaces, labeling items, reading the labels back |
| 8 | Multilingual | Multilingual ASR and cross-lingual analysis in one vector space |
| — | Capstone template | A skeleton for your own question, including transcribing an episode you pick |
Setup
Python 3.10 or newer and about 1 GB of disk. No GPU, and no ffmpeg unless you
go on to process audio of your own.
- Environment. Clone, make a venv, install
requirements.txt. - Hugging Face access. Accept the terms at
huggingface.co/datasets/blitt/SPoRC,
then
huggingface-cli login. Access is granted by a person, one request at a time. - Nothing else. Modules 1, 2 and 3 download the genre slice the first time you run one of them and skip the download after that: 527 MB, being ~230 MB of corpus-wide metadata that arrives once plus 297 MB for the news slice. Acoustic features are a further 137 MB and only module 5 needs them.
# from the repository root
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt
python -m spacy download en_core_web_sm
huggingface-cli login
cd notebooks && jupyter lab
To take the download before the session rather than during it:
python scripts/fetch_genre.py --genre news from the repository root. It is
resumable and prints the cost first — the same code the notebooks call.
Only if you want to make podcast data of your own — transcribing and
diarizing raw audio, which is module 2's live sections, module 8 and the capstone — install
requirements-audio.txt instead and put ffmpeg on your path. The data
pack ships SPoRC's own diarization and the slices ship precomputed acoustics, so nothing in the
session needs a speech model. The gated
pyannote models are
needed only if you diarize your own audio.
Start Jupyter inside notebooks/; paths are relative to it, so the
repository root fails on the first data cell. Full instructions and troubleshooting in
INSTALL.md.
Annotation designs
Ten runnable Potato designs over real episodes, meant to be taken and edited. The unit is the design decision: an episode label covers an hour of audio, a turn label covers eight seconds, and choosing the cheap unit for a turn-level question fails quietly.
| text | turn | Stance, topics, and in-vivo codebook coding |
| dialogue_sporc | turn in context | What each turn is doing, and whether evidence attaches to the claim |
| dialogue_whisper | ASR segment | Who is speaking, and whether these segments work as turns at all |
| transcript_quality | ASR segment | Where the transcript diverges from the speech, and whether it matters |
| interaction | the overlap | Who interrupts whom, and whether the interruption is real |
| tiers | time interval | Several descriptions of the same seconds in one time base |
| audio | drawn segment | The annotator draws the boundaries instead of inheriting them |
| episode | episode | Format, topic taxonomy, soft labels, confidence |
| compare | pair or tuple | Which of two questions presses the guest harder |
| video | clip | Whether the picture carries anything the audio does not |
Configs ship in the repo; data is generated on your machine, so no gated transcript text or copyrighted audio is redistributed. Details in the annotation README.
Background
Podcasting produces something social scientists rarely get: hours of unscripted conversation from identifiable people, recorded on a schedule over years. Speakers explain themselves at length, argue, revise, and turn up on each other's shows. That structure lets you ask about framing, influence, and how ideas move between communities. It also brings a problem short-form text does not have: the data is audio, and someone has to turn it into something countable.
A corpus you build here uses the same schema as the released Structured Podcast Research Corpus, so one piece of analysis code runs against both your data and its 1.1 million episodes. Copyright, consent, and who is missing from the corpus come up in each module, at the point where they would change a decision.
What you will be able to do
- Crawl RSS feeds, survive link rot, and collect the video track of shows that also publish to YouTube
- Run ASR and diarization, then judge the output: where word error comes from, what diarization reliably gets wrong, how much a GPU buys you
- Convert raw audio into SPoRC-compatible records
- Read the corpus as
sporcobjects and as DataFrames, and know which to reach for - Measure framing across shows, speaking time, prosody, turn-taking, and who holds the floor
- Design an annotation task for spoken discourse, and spot when the unit you picked is wrong
- Weigh copyright, platform terms, consent, and representativeness as collection decisions rather than as a limitations paragraph
Links
- Tutorial repositoryNotebooks, the pipeline package, annotation designs, setup
- SPoRC corpus228,099 podcasts, 1,124,058 episodes, May–June 2020. Gated
- sporc packageLoad, search, and iterate the corpus
- PotatoThe annotation tool behind the interfaces
- SPoRC paperLitterer, Jurgens & Card, “Mapping the Podcast Ecosystem with the Structured Podcast Research Corpus,” ACL 2025
- IC²S² 202612th International Conference on Computational Social Science