vLLM/Recipes
OpenMOSS

OpenMOSS-Team/MOSS-Transcribe-Diarize

OpenMOSS's 0.9B end-to-end multi-speaker long-audio transcription model with timestamps and speaker labels, served through vLLM's OpenAI-compatible /v1/audio/transcriptions API.

0.9B end-to-end transcription with speaker labels and timestamps

dense0.9B0 ctxvLLM 0.27.0+multimodal
Guide

Overview

MOSS-Transcribe-Diarize is a 0.9B end-to-end speech-to-text model for long-form multi-speaker transcription. It uses a Whisper-style audio encoder and a Qwen3-style causal decoder to generate structured transcripts with text, timestamps, and speaker labels in a single pass.

Example output:

[0.11][S01] Good morning! [1.03]
[1.11][S02] Morning, let's start the meeting. [2.42]

Key capabilities:

  • End-to-end multi-speaker transcription without a separate ASR, diarization, or alignment pipeline.
  • Structured text output with speaker IDs and timestamps.
  • Long-audio transcription for meetings, interviews, podcasts, and customer support recordings.
  • Prompt-based hotwords for names, organizations, product names, project codes, and domain vocabulary.

Prerequisites

Install vLLM with audio dependencies.

uv venv
source .venv/bin/activate

uv pip install -U "vllm[audio]" --torch-backend auto

Launching with vLLM

vllm serve OpenMOSS-Team/MOSS-Transcribe-Diarize \
  --trust-remote-code \
  --served-model-name moss-mtd

The model uses custom Hugging Face processor code, so --trust-remote-code is required.

Client Usage

OpenAI Transcription API

from openai import OpenAI

client = OpenAI(base_url="http://localhost:8000/v1", api_key="EMPTY")

with open("meeting.wav", "rb") as audio_file:
    transcription = client.audio.transcriptions.create(
        model="moss-mtd",
        file=audio_file,
        response_format="diarized_json",
        temperature=0,
    )

print(transcription.text)

for segment in transcription.segments:
    print(
        f"[{segment.start:.2f} - {segment.end:.2f}] "
        f"{segment.speaker}: {segment.text}"
    )

cURL

curl http://localhost:8000/v1/audio/transcriptions \
  -F "model=moss-mtd" \
  -F "file=@meeting.wav" \
  -F "response_format=diarized_json" \
  -F "temperature=0"

Output Format

With response_format=diarized_json, vLLM returns an OpenAI-compatible response with structured speaker segments:

{
  "task": "transcribe",
  "duration": 5.1,
  "text": "Let's review the deployment plan. The vLLM server is already running.",
  "segments": [
    {
      "type": "transcript.text.segment",
      "id": "seg_0",
      "start": 0.41,
      "end": 2.8,
      "text": "Let's review the deployment plan.",
      "speaker": "S01"
    },
    {
      "type": "transcript.text.segment",
      "id": "seg_1",
      "start": 3.12,
      "end": 5.1,
      "text": "The vLLM server is already running.",
      "speaker": "S02"
    }
  ],
  "usage": {
    "type": "duration",
    "seconds": 6
  }
}

Speaker IDs such as S01, S02, and S03 are generated by the model and are intended to remain consistent within the audio.

Use response_format=json if you want the model's native timestamped transcript instead.

[0.41][S01] Let's review the deployment plan. [2.80]
[3.12][S02] The vLLM server is already running. [5.10]

References