"Ye speak, and the wee gremlins in the machine scribble it down. That be the whole of it, savvy?"
parley be a voice-to-text dictation pipeline for them as would rather speak their piece than peck at the keys like a gull at a biscuit. Ye press a key, ye talk, ye press again, and parley hauls yer words up from the deep with whisper.cpp, tidies the punctuation, lets ye fix any barnacles in yer editor, and spits clean text out the other end.
It also carries a Claude Code skill, so /parley in any session lets ye dictate yer next message instead o' typin' it.
The name be no accident. Parley be the pirate's word for "to speak" (from the French parler), the truce-talk ye invoke when ye'd sooner use yer tongue than yer cutlass. So that's what this be: ye parley with the machine. Ye run parley, ye say yer piece, and the Code o' the Brethren says it must hear ye out.
parley, the shell pipeline: record (PipeWire) β transcribe (whisper.cpp) β spoken-punctuation cleanup β edit β print.lib/punctuation.sh, a pure filter that turns spoken punctuation into symbols ("exclamation point" becomes!, "ellipsis" becomes..., and so on). Testable on its lonesome.skill/parley.md, the Claude Code/parleyskill.
Two ways to transcribe, picked automatic:
- Local: if
whisper-cliand a model be aboard, parley runs on yer own iron (GPU if ye've got it). β No network, β no eavesdroppers. - Server: otherwise it POSTs the audio to a whisper-server ye point it at with
PARLEY_SERVER.
β οΈ PARLEY_SERVERmust include the/inferenceroute β the full endpoint, not just host:port. whisper.cpp'swhisper-serverserves transcription at/inference, and parley POSTs straight to the URL ye give it. Point it at the barehttp://host:9000andcurl -fgets a rejection from the server root, and ye'll see the maddeningly-vaguetranscription request β¦ failed.# β right β full route export PARLEY_SERVER=http://example.com:9000/inference # β wrong β no /inference, fails at the root export PARLEY_SERVER=http://example.com:9000Running a whisper-server on another box on yer tailnet (or LAN) and pointin' every other machine at it is the fastest way to a working parley β no local build, no model download. Just mind the route.
pw-record(PipeWire) for capturin' yer voice- an editor (
$EDITOR, elsevi) curl(only for server mode)- whisper.cpp: either
whisper-cliplus a model locally, or a whisper-server ye can reach
git clone https://github.com/BlueFenixProductions/parley.git
cd parley
./install.shThat drops parley on yer PATH, stows the punctuation lib, installs the /parley skill, and seeds ~/.config/parley from the examples (it'll never clobber config ye've already set, on me honor).
parley reads, in order, first to answer wins:
- environment variables (
PARLEY_*) ~/.config/parley/config(sourced shell)- built-in defaults
| Setting | What it steers | Default |
|---|---|---|
PARLEY_SERVER |
whisper-server endpoint (server mode) | (unset; local-only) |
PARLEY_MODEL |
local whisper.cpp model file | ~/whisper-models/ggml-medium.bin |
PARLEY_VOCAB |
proper-noun / jargon vocab file | ~/.config/parley/vocabulary.txt |
PARLEY_MIC |
PipeWire node-name substring to target a mic | (unset; default source) |
PARLEY_LANG |
transcription language | en |
PARLEY_EDITOR |
editor for the transcript | $EDITOR, else vi |
The vocabulary file be plain text, one term or comma-separated terms to a line, # for comments. Feed it yer crew's names and yer jargon so whisper spells 'em right instead o' guessin'.
$ parley
Press any key to start recording...
β ON AIR... (press any key to stop)
Transcribing...
# yer editor opens on the transcript; fix any barnacles, save & quit
# clean text prints to stdout
Speak yer punctuation out loud and parley sets it for ye: say "make it so period" and ye get make it so. Say "where be the rum question mark" and ye get where be the rum?
In Claude Code, type /parley, run parley in a terminal as it bids ye, and paste the transcript back as yer next message.
Every seaworthy vessel gets a shakedown, and β marks the spot where ours be buried. 'Tis the finest line ever bellowed across a deck, and it just so happens to drill the punctuation engine through !, the dread doubled !!, and the ... all at once:
"Let no joyful voice be heard! Let no man look to the sky with hope! And let this day be cursed by we who ready to wake... the Kraken!!"
Spoken aloud (punctuation and all), that be:
"Let no joyful voice be heard exclamation point Let no man look to the sky with hope exclamation point And let this day be cursed by we who ready to wake ellipsis the Kraken exclamation point exclamation point"
...and parley raises it back, properly punctuated, every time. 'Tis hella fun to say, and if she passes this, she'll pass anything. Run the suite:
./test/bats/bin/bats test/(Tests run on bats, vendored as a submodule. After cloning, fetch it with git submodule update --init --recursive.)
parley be naught but a friendly bosun atop better souls' work:
- The engine be whisper.cpp by Georgi Gerganov and the ggml authors (MIT). Not OpenAI's code.
- The model weights it loads be OpenAI's Whisper, converted to ggml format.
So "whisper" in these waters means the Whisper model lineage, naught more. No affiliation flown false.
MIT. πͺ Hoist it, fork it, sail it where ye please. See LICENSE.
A Blue Fenix Productions vessel. Fair winds and following seas. π¦π΄ββ οΈ