Files
calesthioandHanzo Dev 7ffb943132 Initial release — OpenMontage: the first open-source agentic video production system
11 production pipelines, 47 tools, 124 agent skills.
Supports cloud APIs (fal.ai, OpenAI, ElevenLabs, Suno, HeyGen, Runway) and
free local providers (diffusers, Piper TTS, WAN 2.1, Hunyuan, CogVideo).

Co-authored-by: Hanzo Dev <[email protected]>
2026-03-29 08:25:17 -07:00

6.8 KiB

Transcription Options

Request Parameters

Parameter Type Required Description
file file Yes Audio or video file to transcribe
model_id string Yes scribe_v2 (or legacy scribe_v1) for batch transcription
language_code string No Language hint (ISO 639-1 or ISO 639-3, e.g., en or eng)
timestamps_granularity string No none, word, or character (default: word)
diarize boolean No Enable speaker diarization (default: false; up to 32 speakers)
num_speakers integer No Maximum speakers to detect (up to 32 for batch)
diarization_threshold number No Tune diarization sensitivity (default: ~0.22; only when diarize=true and num_speakers is not set)
keyterms array No Terms to bias transcription (up to 100 terms; each ≤50 chars, ≤5 words)
tag_audio_events boolean No Detect non-speech sounds like laughter, applause (default: true)
entity_detection string or array No Detect entities (e.g., pii, phi, pci, offensive_language)
no_verbatim boolean No If true, removes filler words, false starts, and non-speech sounds (supported with scribe_v2)
use_multi_channel boolean No Split multichannel audio into separate transcripts (default: false; max 5 channels, max 1 hour)
cloud_storage_url string No HTTPS URL to transcribe instead of uploading a file (max 2GB)
webhook boolean No Process async and send result to webhook (default: false)
webhook_id string No Target specific webhook (only when webhook=true)
webhook_metadata string or object No Custom metadata included in webhook responses (max 16KB)
temperature double No Output randomness (0.0-2.0); defaults vary by model
seed integer No Deterministic output (0-2147483647); same seed = same result
additional_formats array No Export transcript as docx, html, pdf, srt, txt, or segmented_json
file_format string No pcm_s16le_16 (for lower latency) or other (default)
enable_logging boolean No Set false for zero retention mode (enterprise only; default: true)

Python Example

from elevenlabs import ElevenLabs

client = ElevenLabs()

with open("audio.mp3", "rb") as audio_file:
    result = client.speech_to_text.convert(
        file=audio_file,
        model_id="scribe_v2",
        language_code="eng",
        timestamps_granularity="word",
        diarize=True,
        keyterms=["ElevenLabs", "Scribe"]
    )

JavaScript Example

import { ElevenLabsClient } from "@elevenlabs/elevenlabs-js";
import { createReadStream } from "fs";

const client = new ElevenLabsClient();

const result = await client.speechToText.convert({
  file: createReadStream("audio.mp3"),
  modelId: "scribe_v2",
  languageCode: "eng",
  timestampsGranularity: "word",
  diarize: true,
  keyterms: ["ElevenLabs", "Scribe"],
});

cURL Example

curl -X POST "https://api.elevenlabs.io/v1/speech-to-text" \
  -H "xi-api-key: $ELEVENLABS_API_KEY" \
  -F "[email protected]" \
  -F "model_id=scribe_v2" \
  -F "language_code=eng" \
  -F "timestamps_granularity=word" \
  -F "diarize=true"

Response Structure

{
  "text": "The complete transcribed text from the audio file.",
  "language_code": "eng",
  "language_probability": 0.98,
  "words": [
    {
      "text": "The",
      "start": 0.0,
      "end": 0.15,
      "type": "word",
      "speaker_id": "speaker_0"
    },
    {
      "text": " ",
      "start": 0.15,
      "end": 0.16,
      "type": "spacing",
      "speaker_id": "speaker_0"
    }
  ]
}

Response Fields

Field Type Description
text string Full transcription text
language_code string Detected language (ISO 639-1 or ISO 639-3)
language_probability float Confidence in detection (0-1)
words array Word-level timestamps (if requested)
words[].text string The transcribed word or spacing
words[].start float Start time in seconds
words[].end float End time in seconds
words[].type string word, spacing, or audio_event
words[].speaker_id string Speaker identifier (if diarization enabled)
transcription_id string Unique identifier for this transcription
additional_formats array Exported transcript formats (if requested)
entities array Detected entities with text, type, and character offsets (if entity_detection enabled)

Supported Languages (90+)

Common languages (ISO 639-3 codes):

Code Language Code Language
eng English jpn Japanese
spa Spanish kor Korean
fra French zho Mandarin
deu German ara Arabic
ita Italian hin Hindi
por Portuguese tur Turkish
nld Dutch swe Swedish
pol Polish dan Danish
rus Russian fin Finnish

Full list: Afrikaans, Amharic, Armenian, Azerbaijani, Belarusian, Bengali, Bosnian, Bulgarian, Burmese, Cantonese, Catalan, Cebuano, Croatian, Czech, Estonian, Filipino, Georgian, Greek, Gujarati, Hausa, Hebrew, Hungarian, Icelandic, Indonesian, Irish, Javanese, Kannada, Kazakh, Khmer, Kyrgyz, Lao, Latvian, Lithuanian, Luxembourgish, Macedonian, Malay, Malayalam, Maltese, Māori, Marathi, Mongolian, Nepali, Norwegian, Odia, Pashto, Persian, Punjabi, Romanian, Serbian, Shona, Sindhi, Slovak, Slovenian, Somali, Swahili, Tamil, Tajik, Telugu, Thai, Ukrainian, Urdu, Uzbek, Vietnamese, Welsh, Wolof, Xhosa, Yoruba, Zulu.

Format Requirements

Audio: MP3, WAV, M4A, FLAC, OGG, WebM, AAC, AIFF, Opus Video: MP4, AVI, MKV, MOV, WMV, FLV, WebM, MPEG, 3GPP

Limits:

  • Maximum file size: 3GB (file upload) or 2GB (cloud storage URL)
  • Maximum duration: 10 hours (standard) or 1 hour (multichannel mode)

Use Cases

Subtitle Generation with Speakers

result = client.speech_to_text.convert(
    file=audio_file,
    model_id="scribe_v2",
    timestamps_granularity="word",
    diarize=True
)

# Generate SRT with speaker labels
for i, word in enumerate(result.words, 1):
    if word.type == "word":
        print(f"[{word.speaker_id}] {word.text} ({word.start:.2f}s)")

Meeting Transcription with Custom Terms

with open("meeting.mp3", "rb") as f:
    result = client.speech_to_text.convert(
        file=f,
        model_id="scribe_v2",
        diarize=True,
        keyterms=["Q4 forecast", "revenue target", "ACME Corp"]
    )

# Group by speaker
current_speaker = None
for word in result.words:
    if word.type == "word":
        if word.speaker_id != current_speaker:
            current_speaker = word.speaker_id
            print(f"\n[{current_speaker}]:", end=" ")
        print(word.text, end="")