|
|
há 1 mês atrás | |
|---|---|---|
| docs | há 1 mês atrás | |
| scripts | há 1 mês atrás | |
| src | há 1 mês atrás | |
| tests | há 1 mês atrás | |
| .gitignore | há 1 mês atrás | |
| .python-version | há 1 mês atrás | |
| AGENTS.md | há 1 mês atrás | |
| LICENSE.md | há 1 mês atrás | |
| README.md | há 1 mês atrás | |
| config.example.toml | há 1 mês atrás | |
| pyproject.toml | há 1 mês atrás | |
| uv.lock | há 1 mês atrás |
An always-on speech-to-text daemon that listens to a PulseAudio/PipeWire source, detects voice activity, and transcribes utterances to Spanish/English text, with a separate voice-assistant layer for commands and chat on top.
stt-assistant process (modes, commands, chat, tools, audit)Audio Source (PulseAudio)
↓
ParecCapture / SoundDeviceCapture
↓
Pre-roll Ring Buffer (VAD lookback)
↓
WebRTC-VAD (voice activity detection)
↓
FrameSegmenter (utterance boundaries)
↓
Queue (segment_queue)
↓
Faster-Whisper (transcription)
↓
TranscriptSink (stdout + transcripts/YYYY-MM-DD.jsonl) + EventPublisher
↓ publish-only UNIX socket ($XDG_RUNTIME_DIR/stt-daemon.sock)
stt-assistant (subscribes; owns modes, command buffer, chat, LLM, tools)
↓ control socket ($XDG_RUNTIME_DIR/stt-assistant.sock)
stt-tui (viewer) / stt-ctl (hotkeys) audit/YYYY-MM-DD.jsonl ←┘
The daemon never accepts input: it only transcribes and publishes. Everything stateful lives in the assistant, a separate process (see docs/ASSISTANT.md).
PulseAudio or PipeWire-Pulse: pactl, parec command-line tools
apt-get install pulseaudio-utils or apt-get install pipewire pipewire-pulsednf install pulseaudio-utilssounddevice backend is recommended on macOS)FFmpeg (optional, used by Faster-Whisper for format conversion)
apt-get install ffmpegClone the repo and install with uv:
# From the repo root (wherever you cloned it)
cd /path/to/STT-TTS
# Sync dependencies (installs into .venv)
uv sync
# (Optional) If you want to use the sounddevice backend (requires portaudio):
uv sync --extra portaudio
Copy the example config and edit as needed:
cp config.example.toml config.toml
Then launch the whole system with one command:
uv run stt-daemon up --with-tui
That supervises the daemon, the assistant, and the TUI together; quitting the TUI stops everything cleanly. The manual flow is the same three steps without the supervisor:
uv run stt-daemon setup # create the virtual sink (interactive picker)
uv run stt-daemon run # start listening and transcribing
uv run stt-daemon clear --yes # tear down the sink when done
See docs/CLI.md for every subcommand and docs/CONFIGURATION.md for the config reference.
stt-daemon subcommands and common overrides.pywhispercpp GPU backend from source.Run the full suite with no audio hardware or live LLM required:
uv run pytest -v
See docs/DEVELOPMENT.md for what the tests cover.
This project is ISC-licensed. See LICENSE.md.
Made with ❤️ for Efren. Questions? Open an issue or reach out.