Skip to content
Batchwork
Esc
navigateopen⌘Jpreview
On this page

Transcription

Transcribe hosted audio through Groq, Mistral, and Together AI batch endpoints with Batchwork's text and timestamped-segment results.

Audio transcription batches are supported through Groq (whisper-large-v3), Mistral (Voxtral models), and Together AI (openai/whisper-large-v3). Batch audio endpoints accept hosted URLs, not file uploads: audio_url must point at audio the provider can fetch during processing, and the URL must stay reachable.

CLI

Use batchwork submit transcriptions to return after registration or batchwork run transcriptions for the complete lifecycle. JSON, JSONL, CSV, and text sources map to BatchTranscriptionRequest; each line of text input is one audio_url.

batchwork --json run transcriptions audio-urls.txt \
  --model groq/whisper-large-v3 \
  --language en \
  --timestamp-granularity segment

CSV columns are custom_id, required audio_url, and language. --language takes an ISO-639-1 code and --timestamp-granularity repeats for segment and word values.

Groq

from batchwork import BatchTranscriptionRequest, BatchTranscriptionDefaults, Batchwork

async with Batchwork() as client:
    job = await client.batch_transcriptions(
        model="groq/whisper-large-v3",
        requests=[
            BatchTranscriptionRequest(
                custom_id="call-1",
                audio_url="https://example.com/call-1.mp3",
                timestamp_granularities=["segment"],
            )
        ],
        defaults=BatchTranscriptionDefaults(language="en"),
    )
    await job.wait(timeout=3600)
    result = (await job.collect())[0]
    text, segments = result.text, result.segments

Groq bodies carry url and model. Requesting timestamp_granularities also sets response_format: "verbose_json".

Mistral

job = await client.batch_transcriptions(
    model="mistral/voxtral-mini-latest",
    requests=[
        BatchTranscriptionRequest(
            custom_id="call-1",
            audio_url="https://example.com/call-1.mp3",
        )
    ],
)

Mistral bodies carry file_url; model moves to the job-creation payload like other Mistral batches. Mistral does not receive response_format.

Together AI

job = await client.batch_transcriptions(
    model="together/openai/whisper-large-v3",
    requests=[
        BatchTranscriptionRequest(
            custom_id="call-1",
            audio_url="https://example.com/call-1.mp3",
            timestamp_granularities=["segment"],
        )
    ],
)

Together bodies carry file, and audio JSONL lines include Together’s required method: "FILE" marker. timestamp_granularities sets response_format: "verbose_json" like Groq.

Result shape

result.text      # str | None — the transcript
result.segments  # list[BatchTranscriptionSegment] | None

A BatchTranscriptionSegment contains text, start_second, and end_second. Segments are populated when timestamp_granularities was requested and the provider returned spans.

Unsupported providers

Anthropic, Azure, Google Gemini, OpenAI, and xAI transcription submissions fail locally.

See Translation, Provider overview, and Results.

Was this page helpful?