The tx command lets you transcribe audio and video files from Terminal, shell scripts and automation tools. It uses the same models and settings as the app and runs entirely on your Mac.
Set up tx
- Open TranscribeX at least once, so its settings and models exist. The command line reads them.
- Open Settings › Advanced and turn on Enable Command Line. This creates a link at
~/.local/bin/txpointing to the tool inside the app. - Make sure
~/.local/binis on your PATH. TranscribeX doesn’t change your shell settings. For zsh (the macOS default), run:
Then open a new Terminal window.echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc - Check it works:
tx models
The How to Use button next to the switch shows a short usage summary you can copy. To remove the command, turn off Enable Command Line.
Commands
| Command | What it does |
|---|---|
tx models | Prints your downloaded (and enabled cloud) models as JSON. |
tx transcribe <path> [flags] | Transcribes one file and prints the result as JSON. |
tx mcp | Starts the MCP server for AI assistants. See MCP server. |
tx help | Prints usage. --help and -h also work. |
tx models
Lists each available model with its id, name, type, volume (size), description and supported languages as [id, label] pairs. Use the id values with --model and --language.
{
"models" : [
{
"description" : "Latest multilingual model. Slow but highest accuracy. Supports 100+ languages.",
"id" : "large_v3",
"languages" : [["auto", "Auto Detect"], ["af", "Afrikaans"], ...],
"name" : "Large V3",
"type" : "whisper",
"volume" : "3.1 GB"
}
]
}
tx transcribe
tx transcribe <path> [--flag value ...]
Put the file path first. Every flag is optional.
| Flag | Values | Default | Notes |
|---|---|---|---|
--model | Model id or name | The app’s default model | From tx models, for example large_v3 or FluidAudio_v2. |
--language | Language id, or auto | The app’s default for that model | Must be supported by the model. Ids differ by model: Whisper uses en, Apple On-Device uses en-US. |
--should-diarize | true / false | false | Adds speaker labels. Needs Pro and a model with timestamps; otherwise it’s skipped. |
--export-format | text, markdown, json, csv, pdf, srt, vtt | text | Also accepts txt, plaintext, plain_text and md. pdf requires --export-file. |
--export-file | Path | None | Writes the transcript to this file (creating folders as needed) instead of returning it in the JSON. |
--display-mode | text, segments | text | text is one block; segments is one line per segment. Also accepts full, segment, segmented. |
--show-timestamp | true / false | true | Only applies with --display-mode segments. |
--show-millisecond | true / false | false | Applies with segments. Always on for srt and vtt. |
--should-persist-job | true / false | false | true keeps the job so it appears in the app’s library. By default the job is deleted when the command ends. |
--compute-units | neural, gpu, cpu, all | The app’s setting | Hardware for on-device Whisper and Parakeet models, for this run only. Try gpu if a model crashes while loading. |
--show-debug-log | true / false | false | Shows the app’s internal log output, for troubleshooting. |
True values are true, yes, y and 1; anything else is false. A flag with no value counts as true, but only if the next word starts with -- or is the end of the line. Writing tx transcribe --should-diarize file.mp3 would read file.mp3 as the flag’s value, so put the path first or give an explicit value.
Accepted files
- Audio:
mp3,wav,m4a,aac,flac,ogg,wma,aiff - Video:
mp4,mov,avi,mkv,flv,wmv,m4v,webm
Output
On success, tx transcribe prints a JSON object to standard output:
| Field | Meaning |
|---|---|
job_id | The job’s id. |
status | The job status (completed). |
title | The file name. |
model, model_name | The model id and display name that were used. |
language | The language id that was used. |
export_format, display_mode | The format and mode after normalizing aliases. |
compute_units | The compute setting in effect. |
job_persisted | Whether the job was kept in the app. |
content | The transcript text, when no --export-file is given. |
export_file | The path written, when --export-file is given. |
The transcript is always inside the JSON. Redirecting output with > file.srt gives you JSON, not an SRT file. Use --export-file to write the file itself.
Errors
On failure, tx prints {"error": "..."} to standard error and exits with code 1. Common messages:
Unknown model: ...: the id or name doesn’t match any model. Checktx models.Model is not downloaded: ...: download it in the app first.Model is not available for the current license: ...: it’s a Pro model. Activate Pro in the app, or use a free model. See Free vs Pro.Language '...' is not supported by model '...': pick a language id from that model’s list.No available transcription model...: download a model in the app.Source file must be an audio or video file: the extension isn’t in the list above.PDF export requires --export-file.TranscribeX store does not exist: ...: open the app once first.
What the command line doesn’t do
To keep scripts predictable, tx skips the app’s automatic extras: AI title and description, automatic summaries, auto-export and notifications. Your app settings aren’t changed.
Examples
Transcribe with the app’s default model and print the text:
tx transcribe ~/Desktop/audio.mp3
Save a Markdown transcript:
tx transcribe ~/Desktop/audio.mp3 --export-format markdown --export-file ~/Desktop/transcript.md
Subtitles with speakers, using Whisper Large V3 in English (Pro):
tx transcribe ~/Desktop/meeting.m4a --model large_v3 --language en --should-diarize true --export-format srt --export-file ~/Desktop/meeting.srt
A segmented PDF with timestamps:
tx transcribe ~/Desktop/interview.mov --export-format pdf --display-mode segments --export-file ~/Desktop/interview.pdf
Keep the job so you can edit it in the app:
tx transcribe ~/Desktop/call.mp4 --should-persist-job true
Get only the text, using jq (install it separately, for example with Homebrew):
tx transcribe ~/Desktop/audio.mp3 | jq -r .content
Script: subtitles for a whole folder
This zsh script writes an .srt file next to every audio and video file in a folder, and skips files that already have one. Save it as transcribe-folder.zsh and run zsh transcribe-folder.zsh ~/Recordings.
#!/bin/zsh
setopt null_glob extended_glob
dir="${1:-.}"
for f in "$dir"/*.(#i)(mp3|wav|m4a|aac|flac|ogg|wma|aiff|mp4|mov|avi|mkv|flv|wmv|m4v|webm); do
out="${f:r}.srt"
if [[ -e "$out" ]]; then
echo "Skipping $f (already has subtitles)"
continue
fi
echo "Transcribing $f"
if ! tx transcribe "$f" --export-format srt --export-file "$out" > /dev/null; then
echo "Failed: $f" >&2
fi
done
Files are transcribed one at a time. Errors are printed and the loop moves on to the next file. For watched folders inside the app, see bulk transcription.
Command line FAQ
Why does Terminal say “command not found: tx”?
~/.local/bin isn’t on your PATH. Add it with the command in Set up tx, then open a new Terminal window. You can also run ~/.local/bin/tx directly.
Does tx need the app to be running?
No. It needs the app to be installed and opened at least once, with the models you want already downloaded.
Can I use Pro models from the command line?
Yes, when Pro is active in the app. Otherwise only free models work.
More in Automation
All help articles · Still stuck? Email support@transcribex.io.