--- name: satzfunk-voice-render description: "Guide and verify source-locked voice readings through the existing Satzfunk adapter or native FCIS Swift Spoken Edition Kit, including British Vergil, consented own-voice and multilingual narration requests from writers or teachers, language-learning audio, and accessible Linotype playback. Check real provider availability before offering voice cloning or accent guarantees; preserve source fidelity, private permissions and bounded spend. Use for voice auditions, exact-text long-form correction, and source-owned audio verification. Execution requires an authorized connected host." --- # Satzfunk Voice Render — current source-owned workflow **Authority:** `Fountain-Coach/Satzfunk` owns its Realtime API adapter and source-owned private media; `Fountain-Coach/midi2-gpu-fabric` owns its native Swift FCIS Spoken Edition Kit and corrections. Resolve the actual selected renderer and its provider contract before executing. `Fountain-Coach/.github` owns this reusable agent Skill. Linotype owns book pagination and source-bound playback. No Skill creates a new runtime capability or grants publication rights. **Required upstream OpenAPI dependency:** Read [FCIS Official OpenAPI dependency](../../../docs/FCIS-Official-OpenAPI-Dependency.md) for the selected owner/provider route. **For the Satzfunk Realtime adapter**, before any new paid request check the source-owned Satzfunk `contracts/openai/realtime.lock.json` (immutable official OpenAI OpenAPI 3.1 revision and SHA-256), its unmodified 67-schema Realtime projection, `npm run contract:check`, and the actual outbound/inbound event validation in `src/openai-realtime-contract.mjs`. Use `node scripts/check-official-openapi.mjs --source ` for explicit upstream drift reviews. See source-owner [successful Realtime example](https://github.com/Fountain-Coach/Satzfunk/blob/main/docs/ai/2026-11-01-official-openapi-realtime-contract.md), preserving its distinction between genuine 34.2-second transport success and the rejected American female literary voice. Never replace the official schema with hand-written event JSON or treat a documented upstream compatibility exception as generic schema waiver. ## Select the actually owning rendition path Do not make the original short Satzfunk Node Realtime audition a universal prerequisite for a complete spoken book. Resolve the manuscript's active source revision, current narrator/voice identity, existing accepted source-bound recording, selected provider route, the **actual** owning Swift Kit or Satzfunk adapter, and its latest declared API contract. A successful Realtime transport audition, a separate Swift voice implementation, and an admitted literary edition are distinct outcomes. Check provider support and exact documented API schemas for **the selected** renderer rather than assuming two adapters can exchange event formats or models. For a full-chapter recording, or when independent transcripts disagree with the manuscript, read [long-form source-verified recording and automatic repair](references/long-form-source-fidelity.md). The writer's desired outcome is a checked reading, not a manual clip-repair task; do the comparison and bounded correction using the owner's existing instrument. Neither a short audition, an old model, a fabricated SDK call nor an incompatible browser voice is an acceptable shortcut. ## Multilingual writer and teacher requests — check capability first For requests such as “read my essay in my own voice using native British English” or “make accessible bilingual listening exercises for my pupils”, load [multilingual writer and teacher voice editions](references/multilingual-writer-teacher.md). Guide the writer/teacher conversationally through source, authorized speaker reference, language/accent, learner audience, provider/cost decision and accessible delivery. **This is a guidance path in the existing Skill, not a claim that cloning or a new provider is installed.** Preserve existing owner-native Swift interfaces `SpokenEditionAudioProvider` and `SpokenEditionIndependentTranscriber`, Reframe admission and source identity, and the existing Linotype/Satzfunk player. The current Reframe OpenAI host route is bound to original Vergil and `openai-key`: do not teach a cloned speaker, self-hosted model or local ASR as executable until the owning runtime implements and witnesses it. Never substitute a model-generated transcript for independent waveform verification, confuse alignment with word accuracy, or infer native British pronunciation from metadata. For teachers, distinguish consented educator voice from collecting pupils' voices. ## First choose the supported model and the approved literary voice Consult [OpenAI's current deprecation schedule](https://developers.openai.com/api/docs/deprecations) before any paid recording. As of 1 November 2026, `gpt-4o-mini-tts`, `tts-1` and `tts-1-hd` are **deprecated** for January 6, 2027 shutdown; **do not generate new voice takes using `/audio/speech`**. OpenAI recommends `gpt-realtime-2.1-mini` via the Realtime API. This is an endpoint and event-protocol change, not a model-ID flag. For British Vergil, read the canonical [literary voice specification](../linotype-estate-template/references/vergil-voice.md) **before** rendering. Vergil's character is independent of model and preset. Use an authored original audition passage, consistent natural British English and restrained literary direction. An existing preset (currently `marin`) is an **unaccepted candidate** even when the model transcript matches source text. If the accent/performance does not sound like Vergil, reject the result; do not present it as an edition. ## Short Realtime audition profile — use only for its declared Satzfunk adapter 1. Inspect the current Satzfunk source, `AGENTS.md`, existing phase in `PLANS.md`, the written manuscript, voice directions and digest; use only an approved source revision. Read [the native host contract](references/host-contract.md). 2. On the connected authorized Mac, run the **owner-native** command `node scripts/vergil-realtime-audition.mjs plan` in the current Satzfunk Git checkout. It plans exactly one current-model short audition without calling the API. Do not use the obsolete bundled `record.mjs`, an improvised HTTP request or a copied token. 3. If the plan is source-exact and authorized, run `node scripts/vergil-realtime-audition.mjs render` **once**. The source-owned Node process retrieves the previously declared Keychain credential internally, writes an exclusive attempt receipt before the paid Realtime call, then saves a private PCM16 WAV and the model-generated text-evidence digest. No shell-secret interpolation, external microphone, voice cloning or automatic retry. 4. Run `node scripts/vergil-realtime-audition.mjs verify`. Check the source revision, output audio hash, PCM duration, completed response, terminal receipt and generated transcript comparison. A model-generated transcript is **not an independent transcript of the audible waveform**, and none of these measurements certifies accent, pacing or the literary character. 5. Prepare a separately hashed MP3 derivative **only for authorized owner-WLAN listening**. Keep the WAV master private in Satzfunk. The established staging inspector rejects unadmitted WAV files; do not weaken that rule. Validate an immutable candidate and preserved predecessor before activation; keep the unapproved audition separate from the Linotype reader. **No autoplay, separate transcript, public promotion or synthetic-voice impersonation.** 6. Report source, model, direction, audio and derivative SHA-256s; exact tests and host readback; artistically accepted/unaccepted status; staging and public state independently. Only a heard and author-approved full exact-text edition may be admitted into Linotype using SatzfunkPlayer. ## Fail closed An unavailable model, Keychain, provider response, actual host, source digest or prior attempt is a precise blocker—not permission to silently switch to an obsolete model, browser TTS, a different voice or a fabricated file. An attempted paid render is never retried with the same identity. Preserve old FCIS `gpt-4o-mini-tts` recordings and receipts as historical evidence; their existence does not authorize continued deprecated generation or establish Vergil acceptance. **Verified short-Realtime example (not a full edition):** 1 November 2026: one 554-character original Vergil sample with `gpt-realtime-2.1-mini`/`marin`, 34.2-second private WAV, normalized model-generated transcript matching source. Artist's accent/performance judgement outstanding; rejected Cedar v111 removed from the active reader; private v112 offers only a listening derivative, not an approved book edition.