SPoRC Podcast Speaker-Role and Turn Annotation
Speaker-role labeling and diarization validation for podcast episodes, based on the Structured Podcast Research Corpus (SPoRC). Annotators read diarized speaker turns as chat bubbles synced to the episode audio, label each turn's speaker as Host, Guest, or Neither following the paper's Prolific validation protocol, flag incorrect turn boundaries, rate overall diarization quality, and record the hosts' names.
About this dataset
SPoRC (the Structured Podcast Research Corpus) is a dataset of over 1.1 million English-language podcast episode transcripts collected from public RSS feeds, with audio features and diarized speaker turns for a 370K-episode subset and inferred speaker roles for all episodes. The accompanying ACL 2025 paper by Litterer, Jurgens, and Card uses it for a foundational study of the podcast ecosystem's content, structure, and responsiveness.
A key piece of the corpus is knowing who is speaking and in what capacity. The authors validated their speaker-role inference with a Prolific annotation study: 2,000 extracted speaker-entity names were each judged by three annotators as Host, Guest, or Neither (people mentioned but not appearing in the episode), reaching Krippendorff's alpha of 0.77 on the first round, with final labels aggregated via MACE.
This showcase task adapts that protocol to Potato's audio_dialogue display. The diarized transcript renders as colored speaker bubbles synced to the episode audio; each turn has a play button that plays just that turn. Annotators make the Host/Guest/Neither judgment per turn while listening, and can assign speakers to undiarized turns directly in the transcript.
Because SPoRC's turns come from automatic transcription and diarization, the task also asks annotators to validate each turn's boundary (correct, starts or ends mid-utterance, or merges two speakers) and to rate the episode-level diarization quality, producing exactly the kind of human check the paper ran on its pipeline output.
SPoRC turn rows in both their JSONL and parquet forms ingest directly into the audio_dialogue display, so this config can be pointed at real exported SPoRC episodes after accepting the dataset's terms on Hugging Face.
- Released
- 2024 (arXiv:2411.07892); ACL 2025
- Episode transcripts
- 1.1M+ (English, May-June 2020 RSS feeds)
- Audio features + speaker turns
- 370K episodes
- Role-validation study
- 2,000 speaker entities, 3 judgments each
- Agreement
- Krippendorff's alpha = 0.77 (round 1)
- Aggregated labels
- 858 Hosts / 639 Guests / 503 Neither (MACE)
Configuration Fileconfig.yaml
This Potato config reproduces the annotation task. Save it as config.yaml and run potato start config.yaml to try it.
# SPoRC Podcast Speaker-Role and Turn Annotation
# Based on: Benjamin Litterer, David Jurgens, and Dallas Card. "Mapping the
# Podcast Ecosystem with the Structured Podcast Research Corpus." Proceedings
# of the 63rd Annual Meeting of the Association for Computational Linguistics
# (Volume 1: Long Papers), 2025, pp. 25132-25154. arXiv:2411.07892.
# Paper: https://aclanthology.org/2025.acl-long.1222/
# Dataset: https://huggingface.co/datasets/blitt/SPoRC
#
# Task: Diarized podcast speaker turns are rendered as chat bubbles synced to
# the episode audio (the audio_dialogue display). For each turn, the annotator
# labels the speaker's role in the episode -- Host, Guest, or Neither -- and
# validates the diarized turn boundary against the audio. Undiarized turns can
# be assigned to a speaker directly in the transcript view. The paper's Prolific
# validation study collected Host/Guest/Neither judgments for 2,000 extracted
# speaker-entity names (3 judgments each; Krippendorff's alpha = 0.77 in round
# 1) using textual context around each name. Deliberate simplification: the
# paper's protocol presented one target entity name at a time with podcast/
# episode descriptions and 150 words of transcript context; this showcase
# adaptation makes the same three-way role judgment per diarized turn while
# listening to the audio, and adds turn-boundary validation of the automatic
# diarization.
#
# Annotation instructions adapted from Section 2.4 and Appendix C of the paper;
# the paper does not publish the verbatim annotator guidelines.
annotation_task_name: "SPoRC Podcast Speaker-Role and Turn Annotation"
task_dir: "."
data_files:
- sample-data.json
item_properties:
id_key: "id"
text_key: "episode_title"
output_annotation_dir: "annotation_output/"
output_annotation_format: "json"
port: 8000
server_name: localhost
annotation_instructions: |
## Podcast Speaker Roles and Turn Boundaries
You will listen to a podcast episode while reading its diarized transcript.
Each speaker turn is shown as a bubble with a play button that plays just
that turn.
### 1. Speaker role (every turn)
For each turn, decide the role of the person speaking **in this episode**:
- **Host** -- a person who hosts or moderates the episode: they introduce the
show or guests, drive the conversation, ask most of the questions, or read
sponsor messages.
- **Guest** -- a person who appears and speaks in the episode but is not a
host: an interviewee, panelist, or invited expert.
- **Neither** -- the audio at this turn is not a host or guest speaking:
for example, a clip of a third person being quoted or played back, an
advertisement voiced by someone outside the conversation, or a speaker who
is only mentioned but not actually part of the episode.
Use the whole episode as context: the same person keeps the same role across
their turns. If a turn is marked "Unassigned", click the speaker name to
assign it to an existing speaker or add a new one.
### 2. Turn boundary (every turn)
Play the turn and check its automatic diarization boundary:
- **boundary-correct** -- the turn starts and ends where this speaker
actually starts and stops speaking.
- **starts-mid-utterance** -- the turn cuts in after the speaker has already
begun (or includes the tail of the previous speaker).
- **ends-mid-utterance** -- the turn cuts off before the speaker finishes
(or the next turn starts too early).
- **merges-speakers** -- the turn contains speech from more than one speaker.
### 3. Overall diarization quality
After annotating all turns, rate how well the automatic transcript-and-turn
segmentation reflects what you heard, from 1 (very poor) to 5 (excellent).
### 4. Host names
List the name(s) of the episode's host(s) as they are spoken or introduced,
separated by commas. Leave blank if no name is ever given.
annotation_schemes:
- annotation_type: radio
name: speaker_role
description: "What is this speaker's role in the episode?"
turn_level: true
turn_binding:
field: conversation
labels:
- name: "Host"
tooltip: "Hosts or moderates the episode: introduces the show or guests, drives the conversation, asks most of the questions"
key_value: "1"
- name: "Guest"
tooltip: "Appears and speaks in the episode but is not a host: interviewee, panelist, or invited expert"
key_value: "2"
- name: "Neither"
tooltip: "Not a host or guest: quoted/played-back third party, outside ad voice, or a person mentioned but not part of the episode"
key_value: "3"
- annotation_type: radio
name: turn_boundary
description: "Is this turn's diarized boundary correct against the audio?"
turn_level: true
turn_binding:
field: conversation
labels:
- name: "boundary-correct"
tooltip: "The turn starts and ends where this speaker actually starts and stops speaking"
key_value: "q"
- name: "starts-mid-utterance"
tooltip: "The turn cuts in after the speaker has already begun, or includes the tail of the previous speaker"
key_value: "w"
- name: "ends-mid-utterance"
tooltip: "The turn cuts off before the speaker finishes, or the next turn starts too early"
key_value: "e"
- name: "merges-speakers"
tooltip: "The turn contains speech from more than one speaker"
key_value: "r"
- annotation_type: likert
name: diarization_quality
description: "Overall, how well does the diarized transcript reflect the audio? (1 = very poor, 5 = excellent)"
size: 5
- annotation_type: text
name: host_names
description: "List the name(s) of the episode's host(s) as spoken or introduced, separated by commas. Leave blank if never named."
instance_display:
fields:
- key: conversation
type: audio_dialogue
label: "Episode transcript"
display_options:
audio_key: audio
turns_key: turns
speaker_key: speaker
text_key: text
scroll_height: 460px
show_timestamps: true
playback_rates: [1, 1.25, 1.5, 2]
speakers:
- {id: host, name: Host, color: "#7c3aed", side: left}
- {id: guest, name: Guest, color: "#059669", side: right}
allow_all_users: true
instances_per_annotator: 20
annotation_per_instance: 3
allow_skip: true
Sample Datasample-data.json
[
{
"id": "sporc_001",
"episode_title": "Ep. 42: The Science of Sleep with Dr. Priya Raman",
"podcast_title": "Brainwaves Weekly",
"conversation": {
"audio": "https://example.com/audio/sporc/brainwaves_ep42.mp3",
"turns": [
{
"turn_id": "t0",
"speaker": "host",
"start": 0,
"end": 14.2,
"text": "Welcome back to Brainwaves Weekly, I'm your host Marcus Chen. Today we're talking about why we sleep, and joining me is sleep researcher Dr. Priya Raman from the Center for Circadian Biology."
},
{
"turn_id": "t1",
"speaker": "guest",
"start": 14.2,
"end": 19.8,
"text": "Thanks for having me, Marcus. It's a topic I could talk about all night, which is ironic."
},
{
"turn_id": "t2",
"speaker": "host",
"start": 19.8,
"end": 27.5,
"text": "So let's start with the basics. What actually happens in the brain when we fall asleep?"
},
{
"turn_id": "t3",
"speaker": "guest",
"start": 27.5,
"end": 52.1,
"text": "So the first thing to understand is that sleep isn't one uniform state. You cycle through stages, and in deep slow-wave sleep your brain is doing something remarkable: it's flushing out metabolic waste through what we call the glymphatic system."
},
{
"turn_id": "t4",
"start": 52.1,
"end": 61,
"text": "This episode is brought to you by RestWell mattresses. Use code BRAINWAVES for twenty percent off your first order."
},
{
"turn_id": "t5",
"speaker": "host",
"start": 61,
"end": 68.4,
"text": "Okay, we're back. Priya, before the break you mentioned the glymphatic system. Walk us through that."
}
]
}
},
{
"id": "sporc_002",
"episode_title": "Small Towns, Big Stories: The Lighthouse Keeper of Port Alma",
"podcast_title": "Backroads",
"conversation": {
"audio": "https://example.com/audio/sporc/backroads_portalma.mp3",
"turns": [
{
"turn_id": "t0",
"speaker": "host",
"start": 0,
"end": 11.6,
"text": "This is Backroads, stories from the places the interstate forgot. I'm Dana Whitfield. This week: Port Alma, population three hundred and twelve."
},
{
"turn_id": "t1",
"speaker": "guest",
"start": 11.6,
"end": 24.9,
"text": "My grandfather kept that light for forty-one years. People ask me why I stayed, and honestly, somebody has to wind the clock."
},
{
"turn_id": "t2",
"speaker": "host",
"start": 24.9,
"end": 31.2,
"text": "That's Eleanor Voss. She's the last lighthouse keeper on this stretch of coast, and she's ready to retire."
},
{
"turn_id": "t3",
"speaker": "guest",
"start": 31.2,
"end": 47.8,
"text": "The Coast Guard automated everything in the eighties, but the town council voted to keep a keeper on. Tourists come for it. Kids do school reports on me, which is strange."
},
{
"turn_id": "t4",
"start": 47.8,
"end": 55.3,
"text": "The light must never go out. That's what my father told me, and his father told him."
},
{
"turn_id": "t5",
"speaker": "host",
"start": 55.3,
"end": 62,
"text": "That recording is from a 1963 interview with Eleanor's grandfather, preserved in the town archive."
}
]
}
}
]
// ... and 8 more itemsGet This Design
Clone or download from the repository
Quick start:
git clone https://github.com/davidjurgens/potato-showcase.git cd potato-showcase/audio/sporc-podcast-turn-annotation potato start config.yaml
Dataset & paper
Litterer et al., ACL 2025
Citation (BibTeX)
@inproceedings{litterer-etal-2025-mapping,
title = "Mapping the Podcast Ecosystem with the Structured Podcast Research Corpus",
author = "Litterer, Benjamin Roger and
Jurgens, David and
Card, Dallas",
booktitle = "Proceedings of the 63rd Annual Meeting of the Association for Computational Linguistics (Volume 1: Long Papers)",
month = jul,
year = "2025",
address = "Vienna, Austria",
publisher = "Association for Computational Linguistics",
url = "https://aclanthology.org/2025.acl-long.1222/",
doi = "10.18653/v1/2025.acl-long.1222",
pages = "25132--25154"
}Details
Annotation Types
Domain
Use Cases
Tags
Found an issue or want to improve this design?
Open an IssueRelated Designs
Audio Transcription Review
Review and correct automatic speech recognition transcriptions with waveform visualization.
Speech Intelligibility Rating
Rate speech intelligibility for pathological speech following TORGO database annotation protocols.
Clotho Audio Captioning
Audio captioning and quality assessment based on the Clotho dataset (Drossos et al., ICASSP 2020). Annotators write natural language captions for audio clips, rate caption accuracy on a Likert scale, and classify the audio environment.