the path · 17
TTS self — the last named showcase debt.
run itnika try 17-tts-self
17-tts-self.nika.yamlsource
# SPDX-License-Identifier: Apache-2.0# yaml-language-server: $schema=https://nika.sh/spec/v1/workflow.schema.json## 17 · TTS self — the last named showcase debt.## `nika:tts_generate` is the audio graduate (stdlib §Audio). The mock# provider writes a REAL deterministic WAV, zero network, zero keys —# the same honesty as `nika:image_generate` `provider: mock` (og-images).# Audio bytes never ride outputs: path + sha256 + duration_ms do.## Demonstrates ·# - `invoke: { tool: nika:tts_generate, args: { provider: mock } }`# - `permits.fs.write` covering a DIRECTORY-writing builtin (`**`)# - const-fixture assert on the mock contract (provider + wav)# - flip ONE line to `local` / `openai` / `elevenlabs` for paid audio## Run · nika try 17-tts-self# (offline · mock WAV · zero keys)nika: tts-selfmodel: mock/echopermits: tools: ["nika:tts_generate", "nika:assert"] fs: write: ["out/speech/**"]tasks: speak: invoke: tool: nika:tts_generate args: provider: mock text: "hello" output_dir: out/speech metadata: { page_slug: "hello" } compiled: with: shot: ${{ tasks.speak.output }} invoke: tool: nika:assert args: condition: ${{ with.shot.provider == "mock" && with.shot.audio.format == "wav" }} message: "mock TTS must land a real WAV (bytes stay on disk)"outputs: audio: ${{ tasks.speak.output.audio }} manifest: ${{ tasks.speak.output.manifest_path }}nika-spec@332f5232d · sha256 f85a87e3ac57e03d…