IC²S² 2026 Tutorial

Podcasts as Social Data

End-to-end pipelines for large-scale audio, text, and network analysis

Burlington, Vermont

Agenda

Start End Session Slides
Part 1
09:0009:20Introduction to podcastsPDF
09:2009:35Data sourcing and collectionPDF
09:3509:55Processing podcast dataPDF
09:5510:10Evaluating data qualityPDF
10:1010:20Annotating podcast dataPDF
10:2010:30Ethical and legal considerationsPDF
10:3010:45Coffee break
Part 2
10:4510:55The sporc packagePDF
10:5511:15Working with SPoRC for research
11:1511:40Guided exercises
11:4011:50Results sharing
11:5012:00Closing 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.

1Crawl & extractRSS discovery and parsing, conditional GET, link rot in 2020 feeds, names from fields versus from the text
2Audio → transcriptwhisperX, openSMILE, diarization into SPoRC turns; a cost/quality ladder and a gallery of controlled failures
3Load & navigate SPoRCThe sporc package, shard economics, three caveats, objects and frames over the same files
4Text & conversationUnits of observation; did talk about policing change around 25 May 2020, and do hosts and guests frame it differently
5Audio & acousticProsody, speaking rate, turn-taking, host–guest floor-holding
6NetworksShow–host–guest graphs, communities, guest circulation, and why the obvious version of this graph is wrong
7Annotation with PotatoLaunching the interfaces, labeling items, reading the labels back
8MultilingualMultilingual ASR and cross-lingual analysis in one vector space
Capstone templateA 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.

  1. Environment. Clone, make a venv, install requirements.txt.
  2. 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.
  3. 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.

textturnStance, topics, and in-vivo codebook coding
dialogue_sporcturn in contextWhat each turn is doing, and whether evidence attaches to the claim
dialogue_whisperASR segmentWho is speaking, and whether these segments work as turns at all
transcript_qualityASR segmentWhere the transcript diverges from the speech, and whether it matters
interactionthe overlapWho interrupts whom, and whether the interruption is real
tierstime intervalSeveral descriptions of the same seconds in one time base
audiodrawn segmentThe annotator draws the boundaries instead of inheriting them
episodeepisodeFormat, topic taxonomy, soft labels, confidence
comparepair or tupleWhich of two questions presses the guest harder
videoclipWhether 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 sporc objects 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