transcribe: flip parakeet to default; harden install; add install-models
Switch the default transcription backend from whisper to parakeet on
supported hosts (darwin/arm64, linux/x86_64). Whisper remains selectable
as the documented rollback path; its code, deps (faster-whisper), UI
fieldset, registry entry, and tests are unchanged.
- observe/transcribe/main.py: DEFAULT_BACKEND = "parakeet"; module
docstring reframed; CLI --backend help now reports parakeet as default.
- observe/transcribe/__init__.py + parakeet.py: docstrings reflect
parakeet-as-default and call out that the upstream Silero VAD
(observe/vad.py) is the sole silence gate.
- tests/fixtures/journal/config/journal.json + apps/settings/tests/
conftest.py: default fixture config flipped; parakeet sub-block
(model_version/device/timeout_sec) added.
- tests/test_transcribe_noise_upgrade.py: new parametrized regression
exercising the parakeet-default upgrade path (noisy + revai token →
revai; noisy + no token → parakeet; not-noisy → parakeet).
- Makefile install:: swallow on platform prep replaced with hard exit 1
on darwin/arm64 and linux/x86_64; unsupported hosts get a loud named
error. PARAKEET_NEMO_EXTRA variable added so the negative-path proof
can be reproduced with `make install PARAKEET_NEMO_EXTRA=does-not-exist`.
- Makefile install-models + scripts/install_parakeet_model.py: new
idempotent model-fetch step invoked at the tail of install. Sentinel
JSON at ~/.cache/huggingface/hub/.solstone-install-complete (linux) or
~/Library/Application Support/solstone/parakeet/models/.install-complete
(darwin). Fast path skips torch/NeMo imports when sentinel is present
and cache resolves. Partial-cache quarantine on verification failure;
legible HF-429 and ENOSPC error messages. v3 only.
- apps/settings/workspace.html: new parakeet-settings fieldset (model_
version/device/timeout_sec plus a read-only platform-runtime label);
JS default fallback flipped from 'whisper' to 'parakeet'; switch
handler + field-change POST handler mirror the whisper pattern.
- apps/settings/routes.py: new runtime_label field on /api/transcribe,
computed by a lazy-torch-import helper — returns "macOS CoreML helper",
"Linux NeMo (CUDA fp16)", "Linux NeMo (CPU fp32)", or "unsupported".
- apps/settings/tests/test_call.py: new set-backend parakeet test
mirroring the gemini/whisper pattern.
- talent/journal/references/config.md + INSTALL.md: parakeet described
as default; whisper documented as rollback path.
- tests/baselines: transcribe.json and config.json carry the expected
default-backend + parakeet-block + runtime_label deltas. graph.json,
search.json, and day-results.json carry pre-existing time-based
recency drift (0.1-point score shifts) surfaced by the baseline
regen — NOT caused by this change.
Notes:
- The --cpu flag stays whisper-only and is now a no-op unless the user
also passes --backend whisper.
- Mac negative-path proof (parakeet-helper build failure exits install
non-zero) is deferred to a Mac runner; Linux arm was verified on this
host's x86_64 worktree.
- runtime_label baseline is currently "unsupported" because the sandbox
env doesn't sync parakeet-nemo; dev hosts with the extra installed
will see "Linux NeMo (CUDA fp16)" or similar. Potential follow-up to
mock this for baseline determinism.
- Out of scope (flagged for follow-up): surfacing transcribe.parakeet.
precision in the settings UI; carrying fluidaudio_version /
helper_hardware into transcript metadata.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>