Files
Frametop--frametop/pyproject.toml
T
DeeJanuzandClaude Opus 5.5 b3275e7843 Voice: frame-voice becomes Frametop Voice, installed with Frametop
voice/ft-voiced (was frame_voice.py) runs in Frametop's container as
frametop-voice.service. It keeps the mic, the wake word and live text,
and hands the keyboard side to the input relay:
- push-to-talk keys are key combinations (dictate, dictate_hold); the
  relay sends "toggle|start|stop" to @frametop_voice, taken only from
  this user
- text goes to the relay as "type TEXT" (ASCII, in pieces of 2000
  bytes), so it lands where typing goes; the relay holds it back while
  a modifier is held
- controller buttons are read from vrserver's web socket with
  input/vrws.py, in a thread, so the websockets package goes
No own uinput keyboard, fd store, evdev, or controller service any more.
whisper-server runs only while the wake word is on, started and stopped
by ft-voiced. Voice commands and hooks run on the host through
distrobox-host-exec (env passed through env(1)); their FRAME_VOICE_*
variables keep frame-voice's names.

Settings: ~/.config/frametop-voice.json (voice_settings.py, standard
library), wake word off by default, "advanced" for the old config.toml
tunables. voice/run.sh install carries frame-voice's settings over once
(its keys become key combinations) and turns the standalone units off.

Install: install.sh step 8/11 asks (yes by default; --no-voice through
get.sh, install-release.sh and a FrameDrop checkbox). voice/build.sh
builds whisper-server (whisper.cpp d09f61a, Vulkan, static) and
build/venv; voice/models.sh fetches the 322 MB of models into
~/.local/share/frametop/voice by fixed URL and sha256. The image gets
glslc, spirv-headers-devel and pipewire-utils, uv.lock a voice group (sherpa-onnx with its
core pinned: uv dropped it), CI smoke whisper-server and the venv.
uninstall.sh asks about the models; update-check and report.sh know the
service (report.sh leaves out the lines with what was said).

Tests: voice/test (settings, carrying over, typing through a stand-in
relay, push-to-talk, controller buttons from a stand-in web socket) in
just test.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 09:18:14 -06:00

43 lines
1.4 KiB
TOML

[project]
name = "frametop"
version = "0.1.0"
description = "Desktops in VR on the Steam Frame"
readme = "README.md"
requires-python = ">=3.12"
# Frametop's Python dependencies, locked in uv.lock. The Frame's runtime apps
# (input settings uses Kirigami) still come from the container's dnf packages;
# these groups cover everything uv can pin: dev tooling and the hand tracker's
# NumPy/OpenCV stack (Fedora's python3-opencv pulls in over a gigabyte).
[dependency-groups]
dev = [
"pytest>=8",
"ruff>=0.14",
"pyflakes>=3.4",
]
# type checking is dev tooling outside the image: the image installs the
# default groups (dev for CI's pytest/ruff, tracker for the hand tracker,
# voice for Frametop Voice) but not this one
types = [
"mypy>=1.19",
]
tracker = [
"numpy>=2.2",
"opencv-python-headless>=4.11",
"huggingface_hub>=0.34",
]
# Frametop Voice (voice/ft-voiced): Moonshine, the wake word spotter and Silero VAD run
# through sherpa-onnx; sentencepiece spells out wake phrases (voice/requirements.txt has the
# same versions, for the dev container). sherpa-onnx's wheels need sherpa-onnx-core of the
# same version (onnxruntime and its C++ side), but don't all say so, and uv locks without it:
# both are named here, at one version.
voice = [
"numpy>=2.2",
"sentencepiece>=0.2.2",
"sherpa-onnx==1.13.8",
"sherpa-onnx-core==1.13.8",
]
[tool.uv]
package = false