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.