Skip to content
Showcase/SPoRC Podcast Speaker-Role and Turn Annotation
intermediateaudio

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)
1:42Classify this audio:HappySadAngryNeutralSubmit

Configuration Fileconfig.yaml

This Potato config reproduces the annotation task. Save it as config.yaml and run potato start config.yaml to try it.

yaml
# 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

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 items

Get This Design

View on GitHub

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)

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

radiolikerttext

Domain

PodcastsSpeechMedia Studies

Use Cases

Speaker Role LabelingDiarization ValidationCorpus Construction

Tags

podcastspeaker-diarizationspeaker-roleaudio-dialogueturn-annotationSPoRC

Found an issue or want to improve this design?

Open an Issue