Skip to main content

Suggest chapter markers from a transcript

Free Intermediate

The chapter editor shows an “Auto-suggest chapters” button when the Transcription Service add-on is installed and switched on for the episode’s show. Clicking it POSTs to the auto-suggest REST endpoint, which defers to the benecaster_chapter_autosuggest filter. Anything that can produce HH:MM:SS + title pairs — an LLM, a Whisper wrapper, a manual import, or any segmentation source — can hook this filter. Suggestions pre-fill the editor; the podcaster must review and save manually. If the filter returns an empty array or every row has a malformed timestamp, the endpoint responds with 501 and the UI displays “No chapter suggestions were returned.”

Transcription Service answers this filter itself, at priority 10, with chapters cut from the episode’s transcript at pauses and speaker changes, and keeps rows an earlier callback returned: hook below 10 to offer yours first, or above 10 to replace its list.

Code

<?php
add_filter( 'benecaster_chapter_autosuggest', function ( array $chapters, int $episode_id, WP_Post $post ): array {
    // Return an empty array if you can't produce a suggestion for this episode
    // (missing transcript, upstream API down, etc.) — the endpoint will 501.
    $transcript = get_post_meta( $episode_id, '_my_transcript_text', true );
    if ( '' === $transcript ) {
        return $chapters;
    }

    // Do the real work: call your LLM / segmentation service / etc.
    $segments = my_segment_transcript( $transcript );

    return array_map(
        fn( array $s ): array => [
            'timestamp' => $s['hms'],           // 'HH:MM:SS' — malformed rows are dropped
            'title'     => $s['title'],         // sanitized on save
            // Optional fields:
            'url'       => $s['deep_link']  ?? null,
            'image_id'  => $s['image_id']   ?? null,
        ],
        $segments
    );
}, 10, 3 );

// Register your add-on slug so the React SPA renders the Auto-suggest button.
add_filter( 'benecaster_installed_addons', function ( array $slugs ): array {
    $slugs[] = 'benecaster-addon-transcription-service';
    return $slugs;
} );

View on GitHub →

Hooks Used

Need this built rather than just documented? See our services →