Nodes/Comfyui-MOSS-Transcribe-Diarize-T8/MOSS 转写与说话人分离 · T8star-Aix
ComfyUI Node

MOSS 转写与说话人分离 · T8star-Aix

Transcribe + speaker IDs in one pass

By T8mars·Created 25 days ago·Updated about 21 hours ago· 5
MOSS 转写与说话人分离 · T8star-Aix
  • model
  • audio
  • prompt
  • 原音频透传
  • 模型原始文本
  • 结构化 JSON
  • SRT 字幕
  • ASS 字幕
  • MOSS_TRANSCRIPT
max_new_tokens0
silence_policywarn
preflight_backendwebrtc
vad_aggressiveness2
retry_policyinvalid_format

Most "transcribe audio" nodes in ComfyUI are Whisper wrappers. You get words, you get timestamps, and then you're on your own figuring out who said what. T8_MOSS_TranscribeDiarize is the node that doesn't stop there. It runs the OpenMOSS MOSS-Transcribe-Diarize model - a ~0.9B model that does speech-to-text and speaker diarization in a single generative pass, locally, offline, no API key. The output is a transcript where each segment carries a speaker label ([S01], [S02], …) and sentence-level start/end timestamps.

That's the whole pitch, and it's a genuinely useful one if you've ever transcribed a podcast or meeting and then spent an hour matching lines to people by hand. The tradeoff to know up front: timestamps are sentence/segment-level, not word-level, and speaker IDs are anonymous relative labels - S01 means "first voice the model heard," not "Alice." Fine for subtitles and search, not fine for legal-grade attribution.

How it works

Feed it a standard ComfyUI AUDIO wire (from a VHS load, a video decode, whatever). It downmixes and resamples to 16kHz internally, then runs a WebRTC VAD preflight before the model even loads - it checks whether there's actual speech in there and warns you if the input looks like silence. Then it prefers whole-clip inference in a single pass so speaker numbering stays consistent across the whole file. It reports native ComfyUI progress and honors queue interrupts.

The inputs that matter

  • model - the handle from T8_MOSS_ModelLoader. No loader, no run.
  • audio - standard AUDIO. It'll take a video's audio track directly.
  • max_new_tokens - 0 means auto, and auto estimates from audio duration. If the run hits the cap, the diagnostics explicitly flag possible truncation. Leave it at 0 unless you have a reason.
  • prompt - optional; wire in T8_MOSS_PromptHotwords to control format, hotwords, and language. Skip it and you get the default strict format, which is fine to start.
  • silence_policy - warn (default: continue, flag it), reject (refuse before loading the model), or ignore. If you know your clip has real speech but the VAD is skittish, warn keeps you moving while still telling you.
  • retry_policy - the safety net. invalid_format (default) re-runs once with a stricter prompt if the output is malformed or missing speaker tags; quality_failure also retries on quality failures; never if you want it fast and loud. It's one retry, not a retry loop - you're not paying for this twice on every run.

Outputs: audio passthrough, the model's raw text, structured JSON, ready-to-use SRT and ASS strings, and a typed MOSS_TRANSCRIPT you can chain into validation, the quality gate, and subtitle export.

Installing it

cd ComfyUI/custom_nodes
git clone https://github.com/T8mars/Comfyui-MOSS-Transcribe-Diarize-T8.git comfyui-MOSS-Transcribe-Diarize-T8
cd comfyui-MOSS-Transcribe-Diarize-T8
pip install -r requirements.txt
python scripts/check_transformers.py      # enforces Transformers >= 5.5.0, < 6
python scripts/download_models.py --comfyui-root ..\..

Then restart and load the example workflow from example_workflows/ui/01_basic_transcribe.json - it already covers hotwords, strict retry, and subtitle styling. The model (~1.8GB) lands in ComfyUI/models/moss_transcribe_diarize/.

Where people get burned

  • The GPU baseline is real. The pack's official target is NVIDIA with 12GB+ VRAM. A 5-minute clip ran ~4.5GB peak on the author's 24GB card; 8–10GB cards are only a short-audio compatibility tier. If you're on a 8GB card, keep clips short or move to T8_MOSS_SmartLongAudio and accept the speed.
  • "It transcribed but there are no speaker tags." That's the retry path telling you the first pass came back malformed. Check the diagnostics rather than the raw text - the pack's whole design is to surface these instead of hiding them.
  • Expecting word-level timestamps. It won't give them. Segment-level is the design, not a bug. If you genuinely need word-level, this isn't the node for you.
  • Transformers too old. Below 5.5.0 the loader refuses; run scripts/check_transformers.py and repair with the requirements-transformers-v5.txt file (5.15.1) if your other nodes allow it.
CategoryT8star-Aix/Audio/MOSS Transcribe Diarize

Inputs (8)

NameTypeDefaultDescription
modelT8_MOSS_TRANSCRIBE_MODEL
audioAUDIO
max_new_tokensINT00–65536自动模式依据音频时长估算;达到上限会在诊断中明确提示可能截断。
silence_policyCOMBOwarnwarn 继续并给出诊断;reject 在载入模型前拒绝;ignore 仅记录检测结果。
preflight_backendCOMBOwebrtcwebrtc 检测真实语音帧;energy 仅按能量判断,兼容旧环境。
vad_aggressivenessINT20–3
retry_policyCOMBOinvalid_format格式无效或缺失说话人标签时,可用更严格提示自动重试一次。
promptoptT8_MOSS_PROMPT

Outputs (6)

NameTypeDescription
原音频透传AUDIO
模型原始文本STRING
结构化 JSONSTRING
SRT 字幕STRING
ASS 字幕STRING
MOSS_TRANSCRIPTT8_MOSS_TRANSCRIPT