Dictate a prompt instead of typing it. In the TUI press ctrl+space (or run
/voice): the footer shows a red recording indicator with the elapsed time.
Press ctrl+space again, or just stop talking for two seconds, and the
transcript is inserted into the prompt for you to review and edit; it is never
sent on its own. esc discards the recording. (On macOS,
ctrl+space may be bound to "Select the previous input source" in System
Settings → Keyboard → Keyboard Shortcuts; turn that off or use /voice.)
Recording uses ffmpeg (AVFoundation on macOS, PulseAudio or ALSA on Linux,
DirectShow on Windows), or sox's rec; install one (brew install ffmpeg).
Your terminal needs microphone access (macOS asks the first time). Recordings
are 16 kHz mono WAV temp files, readable only by you and deleted as soon as
they are transcribed.
Transcription is local by default: whisper.cpp
(brew install whisper-cpp, which provides whisper-cli) with a model in
~/.chanto/voice/:
mkdir -p ~/.chanto/voice
curl -L -o ~/.chanto/voice/ggml-base.en.bin \
https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-base.en.binOpenAI's Python whisper command works too (whisper_bin = "whisper";
whisper_model is then a model name such as base).
Audio is sent to a hosted service only if you configure one: any
OpenAI-compatible /audio/transcriptions endpoint, with the credentials Chanto
already uses for that provider (chanto login, or its key variable):
[voice]
backend = "auto" # auto: whisper.cpp if installed, else the hosted endpoint below (if set)
# local | hosted | off
provider = "groq" # or "openai", or a [providers.<name>] entry
# base_url = "https://api.example.com/v1" # any OpenAI-compatible server
# api_key = "..."
# model = "whisper-large-v3-turbo" # default: whisper-1 (OpenAI), whisper-large-v3-turbo (Groq)
language = "en" # default: detected
# whisper_bin = "/opt/homebrew/bin/whisper-cli"
# whisper_model = "~/.chanto/voice/ggml-small.en.bin"
# device = ":1" # ffmpeg input (macOS ":default", Linux "default", Windows: the DirectShow name)
silence_secs = 2.0 # stop after this much silence following speech; 0 = only on the key
max_secs = 120[voice] is read only from your own config (and trusted projects): a
repository can't redirect your audio. The server's GET /voice reports whether
dictation is available and POST /voice/transcribe (bearer token; the body is
the audio, any format ffmpeg reads) returns {"text": ...}.