crumcast_studio
Macht aus einer Debian-Node (crumbdesktop) eine offline-first Audio-Produktions-Station
für crumcast — die Waldgeschichten
im Mond. Kein Cloud-API, nur Debian-Standard-Repos + eine lokale Python-venv.
Was sie installiert
| Zweck | Tool | Paket |
|---|---|---|
| Mix / Effekte / Encode | ffmpeg, sox | ffmpeg sox libsox-fmt-all |
| MIDI → Audio | fluidsynth (+ vorhandene GM-SoundFont) | fluidsynth |
| Musik-Engine (NRT-Render) | supercollider | supercollider |
| Node-Taktgeber → MIDI/VJ | node | nodejs npm |
| Stimme (TTS, Flüster-Mode) | piper-tts | via venv |
| MIDI-Dateien aus Bridge-Events | mido, python-rtmidi | via venv |
Die venv liegt in ~sysop/workspace/crumcast/venv — Python-Pakete
(soundfile, mido, pyFluidSynth, supercollider, sounddevice, soundcard)
landen nie global. TTS (Stimme) steht noch aus — piper-tts ist der
geplante offline-Weg, bewusst in crumcast_pip_tts geparkt.
Die Pipeline, die sie bedient
crumcast_engine.py ─► episode_XX.md + cue_sheet.json
│
├─► Piper (TTS) ─► render/voice/*.wav
├─► SuperCollider NRT ─► render/music/*.wav
└─► crumbmidi_bridge.py ─► events.jsonl ─► FluidSynth ─► render/music/*.wav
│
▼
SoX/FFmpeg (Ducking, Hiss, LPF, loudnorm) ─► render/master/episode_XX.opus
Anwenden — ansible-pull (der Weg für crumbdesktop)
crumbdesktop ist kein SSH-Key-Ziel (passwort-only, #kodex), darum läuft die
Rolle auf der Node selbst:
# auf crumbdesktop, als sysop:
ansible-pull -U <repo-url> -i "localhost," crumcast-studio.yml \
--connection local --ask-become-pass
# vorher trocken:
ansible-pull -U <repo-url> -i "localhost," crumcast-studio.yml \
--connection local --check --diff
Wird crumbdesktop je ein Key-Ziel, geht auch Push: -e target=crumbdesktop.
Anpassen
Alles in defaults/main.yml, überschreibbar in
host_vars/crumbdesktop.yml:
crumcast_soundfont— Pfad zur.sf2(Default: die schon vorhandenedefault-GM.sf2)crumcast_piper_voices— dt. Stimm-Downloads (leer im Default; Bugsy/Eule gezielt im nächsten Schritt)crumcast_apt_packages/crumcast_pip_packages— die Werkzeugliste