Skip to main content

dcssvox

Hands-free voice control and narration for Dungeon Crawl Stone Soup, built for playing on a phone under Termux with headphones and a mic.

You say what to do; it reads back what happened. No keyboard, no screen-staring.

you:  "explore"
it:   "You encounter a bat."
you:  "attack east"
it:   "You hit the bat. Health 17 of 19."

Why it works

DCSS is turn-based and lives in a terminal, which makes it close to the ideal target for voice: nothing has a reaction window, and both the screen and the input are trivially machine-accessible. dcssvox runs crawl inside tmux and drives it from outside — keystrokes in via send-keys, the rendered screen out via capture-pane. crawl itself is never patched.

Three design rules, all aimed at someone whose hands are busy:

  • Never stuck. There is no keyboard to bail out with, so every modal state is recognised and has a spoken way out. recover() walks crawl back to normal play without needing to classify the state correctly.
  • Never surprised. Irreversible actions (quaff, drop, read, take off) are read back and wait for "yes" before a key is sent.
  • Never guessing. Item and spell names are matched against the letters crawl just printed on screen, not a hand-maintained table. If nothing matches convincingly it says so instead of pressing something.

Speech priority comes from crawl's own message channels: dcssvox pins each of the 30 channels to a colour in its generated rc, so the SGR code on a message row is an exact, language-independent priority signal. "An endoplasm is nearby!" is urgent; "The endoplasm barely misses you." is not read at all.

Install (Termux)

pkg install crawl tmux git cmake clang make
python -m pip install dcssvox
dcssvox doctor          # tells you what's missing

Character creation is done by voice too — just say the species, background and weapon ("minotaur", "berserker", "mace"). A character name is supplied for you, because crawl's name prompt is free text and has no voice path.

For speech output also install the Termux:API app (from F-Droid) plus pkg install termux-api. For voice input:

dcssvox setup           # builds whisper.cpp + fetches tiny.en (one time)
dcssvox play

Watch the game on screen any time with tmux attach -t dcssvox.

Without a mic

dcssvox type runs the exact same loop with typed input — useful for testing the command vocabulary, and it works on any Linux box.

Vocabulary

Say Does
explore / keep going auto-explore until something happens
north, go east, southwest move one square
run north travel in a direction
attack / fight / kill it autofight the nearest enemy — no direction needed
fire / shoot autofire your quivered action at the nearest enemy
attack east attack in a specific direction
rest / wait long rest / pass one turn
downstairs / travel to the stairs descend / auto-travel
what's around names, direction and distance of everything in view
status / where am i health, magic, statuses, location
inventory read what you're carrying
quaff curing / read blinking / wield mace menu actions by name
cast magic dart cast, aim and fire in one command
cast magic dart at the orc aim at a named target
stop / cancel interrupt, back out of anything
again repeat the last thing said
yes / no answer crawl's own questions
strength / intelligence / … answer a level-up prompt by name
what should I do situation summary (needs --llm)
skills / spells / learn a spell open the screen and read the options aloud
abilities / my god / character same, for those screens

Anything outside the vocabulary is dropped in silence rather than guessed at — with an always-on mic that refusal is the whole safety model.

Nothing fails quietly

The rule that shapes most of this: a command that silently does nothing is a dead end when you cannot look at the screen. So every command that should take a turn is checked, and when it doesn't, dcssvox says why and what to do instead:

"can't rest, kobold northeast. say attack northeast, or go southwest"
"too hurt to autofight, health 9 of 27. say rest"
"nothing left to explore. say downstairs to go deeper"
"no stairs found yet. say explore first"
"blocked going southeast"

The direction matters more than it looks. Below half health crawl refuses to autofight, and with a monster visible it refuses to rest — so both commands you know are declined at once, and "attack a direction" is useless advice unless something tells you which. dcssvox works the bearing out from the monster list and the map.

Questions that block the game are read aloud with their options, including crawl's level-up prompt, and answered by name:

crawl: Increase (S)trength, (I)ntelligence, or (D)exterity?
you:   "strength"

Optional: the Claude tier

If you already have Claude Code installed, this costs nothing extra — it runs on your existing subscription:

dcssvox play --llm          # uses the `claude` CLI if present

Otherwise it can use the API, which is billed separately:

pip install 'dcssvox[llm]'
export ANTHROPIC_API_KEY=...
dcssvox play --llm

dcssvox doctor reports which backend it found.

Everything ordinary still runs on the local grammar — offline, instant, free. Claude (Haiku 4.5) is consulted in exactly three places:

  • Long item and spell names. "Borgnjor's Vile Clutch" is what a recogniser mangles and what token matching handles badly. Only fires when local matching is weak or torn.
  • Phrases outside the vocabulary. "get me out of here", "chug a heal". With no keyboard, an unparsed command is a dead end, so this is a safety net more than a convenience.
  • "what should I do" — two sentences on your situation.

It is grounded and cannot invent: the letter enum is built from the letters crawl just printed, the command enum is built from the local grammar, and its answer is re-parsed by that same grammar before anything is pressed. Every failure — no key, timeout, network drop — falls back to the local grammar rather than wedging the game. Irreversible actions are still confirmed aloud whether you said them or Claude inferred them.

Status

Alpha. The deterministic loop is verified end-to-end against crawl 0.34.1. The whisper.cpp listener and Termux TTS are written but not yet exercised on a real device.

License

MIT

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

dcssvox-0.10.1.tar.gz (54.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

dcssvox-0.10.1-py3-none-any.whl (46.5 kB view details)

Uploaded Python 3

File details

Details for the file dcssvox-0.10.1.tar.gz.

File metadata

  • Download URL: dcssvox-0.10.1.tar.gz
  • Upload date:
  • Size: 54.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.14.6

File hashes

Hashes for dcssvox-0.10.1.tar.gz
Algorithm Hash digest
SHA256 8791f14197a9ee2c645e8799508185a103c45a732ee781e61ec52baeb4add74c
MD5 8144a91d2f62f88e2418a9d25dfe365c
BLAKE2b-256 e0094110a494ec9eacffebdcb5737528315159aa2e692e72d2f5f24b3dcb9dc1

See more details on using hashes here.

File details

Details for the file dcssvox-0.10.1-py3-none-any.whl.

File metadata

  • Download URL: dcssvox-0.10.1-py3-none-any.whl
  • Upload date:
  • Size: 46.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.14.6

File hashes

Hashes for dcssvox-0.10.1-py3-none-any.whl
Algorithm Hash digest
SHA256 3333a3b7fc29d3c20a4666698ea78eca98ec4c9abf2c20b634fc0ebddf2cdf1e
MD5 095fcf58087a590f6575b66183a4dcb7
BLAKE2b-256 8b86515be0ba3e8cddb58fd52c46bcad4eb2d001908f744991486c2b3c33ce46

See more details on using hashes here.

Release history Release notifications | RSS feed

0.12.1

2 files

0.12.0

2 files

0.11.1

2 files

0.11.0

2 files

0.10.6

2 files

0.10.5

2 files

0.10.4

2 files

0.10.3

2 files

0.10.2

2 files

This release

0.10.1 This release

2 files

0.10.0

2 files

0.9.3

2 files

0.9.2

2 files

0.9.1

2 files

0.9.0

2 files

0.8.3

2 files

0.8.2

2 files

0.8.1

2 files

0.8.0

2 files

0.7.1

2 files

0.7.0

2 files

0.6.0

2 files

0.5.0

2 files

0.4.0

2 files

0.3.1

2 files

0.3.0

2 files

0.2.1

2 files

0.2.0

2 files

0.1.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page