Spokenly CLI (Command Line)
Transcribe audio and video files, answer AI agent questions by voice, and manage word replacements with the spokenly command.
The spokenly CLI lets you transcribe audio and video files and manage your word replacements from your terminal. AI agents can also run it to ask you questions and get your spoken answers back as text. It connects to the Spokenly app running on your Mac. Transcriptions can be returned as plain text, SRT, VTT, Markdown, or JSON.
Install
Open Settings
Open Spokenly > General Settings, scroll to the bottom and click Install CLI.
Enter your password
macOS will ask for your password to create a symlink in /usr/local/bin/. This is a standard system directory for command-line tools. Spokenly does not gain any elevated privileges; the prompt is only for placing the shortcut there.
Use it in your terminal
Run spokenly transcribe <file> in any terminal. The installed executable is a small bash script that forwards your arguments to the locally running Spokenly app. The app then handles the request with your selected model.
Usage
spokenly transcribe <file...> [options]
spokenly ask <question...>
spokenly replacements <list|add|remove>ask and replacements are covered in their own sections below. spokenly --version prints the installed CLI version.
Voice Answers for AI Agents
spokenly ask shows you questions in Spokenly, records your spoken answers, and prints them to stdout. It is built for AI agents that can run shell commands but do not support MCP: the agent runs the command, you answer by speaking, and the transcribed answers go back to the agent.
spokenly ask <question...>Each question starts a recording session in Spokenly. Speak your answer and press Enter, or press Escape to skip it. Answering can take minutes, so the agent must run the command with a timeout of at least 10 minutes. If the process is killed earlier, the recording is canceled and the answer is lost.
spokenly ask "Deploy to production?" "Anything else to change?"Answers are printed as Q: / A: blocks:
Q: Deploy to production?
A: Yes, go ahead.
Q: Anything else to change?
A: No, that's all.To get an agent to use it, add an instruction like this to its config file, for example ~/.claude/CLAUDE.md for Claude Code:
ALWAYS ask questions by running `spokenly ask "<question>"` in the shell with a 10-minute timeout, never as plain text. I use Spokenly for voice input.If your tool supports MCP, use the MCP integration instead.
Agent Skill
Instead of writing your own instructions, install the ready-made skill (view SKILL.md). It tells the agent when to use spokenly ask, how to handle its responses, and how to transcribe files with spokenly transcribe.
Claude Code:
mkdir -p ~/.claude/skills/spokenly && curl -fsSL https://spokenly.app/docs/macos/cli/SKILL.md -o ~/.claude/skills/spokenly/SKILL.mdCodex:
mkdir -p ~/.codex/skills/spokenly && curl -fsSL https://spokenly.app/docs/macos/cli/SKILL.md -o ~/.codex/skills/spokenly/SKILL.mdTranscription
Options
| Flag | Description |
|---|---|
-f, --format <fmt> | Output format: text (default), srt, vtt, markdown, json |
-s, --speakers | Include speaker labels |
-c, --channels | Transcribe every channel of a multichannel file separately, one speaker per channel. Implies --speakers |
-n, --names <names> | Comma-separated speaker names. Requires --channels or --speakers |
Separate channels
If your recording keeps each participant on their own channel, for example a meeting recorder that captures the local microphone on one channel and the remote call audio on another, --channels transcribes every channel on its own and merges the results in time order. Each channel becomes its own speaker, so you never need diarization to tell participants apart.
spokenly transcribe meeting.wav --channelsLeft channel: Hi Bob, I pushed the new release notes to the shared folder this morning.
Right channel: Thanks Alice, I will review them right after the standup meeting today.Two-channel files are labeled Left channel and Right channel. Files with more channels are labeled Channel 1, Channel 2, and so on. Pass --names to use your own labels, given in channel order:
spokenly transcribe meeting.wav --channels --names Alice,BobAlice: Hi Bob, I pushed the new release notes to the shared folder this morning.
Bob: Thanks Alice, I will review them right after the standup meeting today.--names also works with --speakers, where the names are applied to the detected speakers in order of first appearance:
spokenly transcribe interview.mp3 --speakers --names Alice,BobIf every channel turns out to contain the same audio, which happens when a stereo file is just one source duplicated, Spokenly transcribes a single channel to avoid duplicated text and prints a note to stderr.
Examples
Transcribe a meeting recording:
spokenly transcribe meeting.mp3Transcribe with speaker labels in VTT format:
spokenly transcribe interview.mp3 --format vtt --speakersTranscribe a two-channel meeting recording with named participants:
spokenly transcribe meeting.wav --channels --names Alice,BobPipe output to clipboard:
spokenly transcribe meeting.mp3 | pbcopyTranscribe multiple files:
spokenly transcribe part1.mp3 part2.mp3 --format markdownGet JSON with segment timestamps for downstream tooling:
spokenly transcribe meeting.mp3 --format json | jq '.segments[].text'Model
The CLI uses the model selected in the Transcribe File section of the app. If you have a local model like NVIDIA Parakeet selected, transcription runs entirely on your Mac. Otherwise, the file is sent to the Spokenly server for online transcription.
JSON Output Schema
The --format json flag returns a pretty-printed JSON object with the model used and an array of timed segments. speakerId is only populated when --speakers or --channels is passed.
{
"modelId": {
"predefined": "parakeetTDT06V2"
},
"segments": [
{
"id": "B7A7C2F3-1E0D-4B6A-9F5C-8C2E5D1A3B4F",
"text": "Hello world.",
"start": 0.0,
"end": 1.42,
"speakerId": null
}
]
}Word Replacements
Manage your Word Replacements from the terminal. The app must be running.
spokenly replacements list
spokenly replacements add <original> <replacement> [--regex] [--timing before-ai|after-ai|both]
spokenly replacements remove <original>list prints the full list as JSON, in the same format the Word Replacements editor exports and imports, so you can pipe it to jq or save the output as a backup and import it back later.
add creates a replacement. Matching is case-insensitive, and a comma-separated original matches each listed variant. Pass --regex to treat the original as a regular expression, and --timing to control when the replacement runs relative to AI formatting (before-ai is the default).
remove deletes every replacement whose original text equals the given value, case-insensitively.
spokenly replacements add "air pods" "AirPods"
spokenly replacements add "cloud code, clod code" "Claude Code"
spokenly replacements remove "air pods"
spokenly replacements list | jq '.[].original'To pre-fill the add form from another app instead of scripting, use the word replacements deeplink.
Uninstall
Open Spokenly > General Settings and click Uninstall CLI. This removes the command from /usr/local/bin.