omniseek_transcribe
Transcribe spoken content from any video, podcast, or audio URL into readable text. For long episodes, transcribe only the relevant chapter slice and add speaker labels when needed.
Instructions
Transcribe the SPOKEN content of a video / podcast / audio URL via local SenseVoice ASR (free, keyless, private, cached forever; chosen over Whisper after a real-audio benchmark — Whisper hallucinates on Chinese podcast intros). For the 干货-in-audio case where the substance is in the audio, not any text: bilibili videos (论文精读 / 方法论 / 读博 / 求职 talks), 小宇宙 podcasts, or any direct audio-file URL. (youtube already returns its captions via omniseek_read — no ASR needed; use that instead.)
THE LONG-EPISODE PATTERN: do NOT transcribe a 2-3h episode whole (30k+ chars nobody reads).
Pull the chapter timestamps from the episode's shownotes (小宇宙 episode pages list them; use
omniseek_search(query, sources=["xiaoyuzhou"], raw=True, full=True) / omniseek_read first), judge WHICH chapter matters, then transcribe just
that slice: start="1:02:30", duration="12:00". Accepts seconds ("3750") or MM:SS / HH:MM:SS.
Slices are also fast to start — on direct/enclosure audio only the slice region is downloaded.
The flat transcript covers [start, start+duration] of the source audio. Pass segments=True to
ALSO get a per-VAD-segment segments: [{start,end,text}] list (seconds) so a no-shownote episode
becomes navigable / time-citable (the flat transcript is unchanged; segments costs an extra VAD +
a batched re-transcribe pass, so request it only when you need the offsets).
Whole-item transcription remains right for short/dense items (a 10-min talk, a keynote clip); it is SLOW on first call for a long item, then cached forever. Reach for it deliberately on ONE item you've judged worth it, never as part of a broad sweep.
language: "" auto-detects; set "zh" / "en" to skip detection and sharpen accuracy when you already know the language.
diarize=True answers WHO said what (interviews / 对谈 / multi-host podcasts): segments become
[{start,end,text,speaker}] with per-turn speaker labels and speakers gives the distinct count.
It routes through a Chinese-focused diarization pipeline (Paraformer-zh + cam++ speaker clustering),
a SEPARATE and heavier pass than the flat SenseVoice path, so request it only when the speaker turns
matter, and expect zh accuracy (English audio is not its target). Cannot combine with plain segments
(diarize supersedes it). speaker values are cam++'s cluster indices (0,1,2,...).
speakers=N pins the diarization to N speakers (the KNOWN head-count: a 1-on-1 interview = 2, a solo talk = 1, a 3-host panel = 3). PASS IT whenever you know the count: cam++'s automatic estimate is unstable on short / noisy slices and will over- or under-split, so pinning N is what makes the turns track reality. Leave it 0 (auto) only when the count is genuinely unknown. Ignored unless diarize=True.
Returns: {url, transcript, chars, audio_seconds, asr_seconds, source, title, cached, start_seconds?, duration_seconds?, segments?, speakers?} — or {url, error, transcript:""} if no audio resolved.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | ||
| start | No | ||
| diarize | No | ||
| duration | No | ||
| language | No | ||
| segments | No | ||
| speakers | No |