---
path: /studio/isis/text-to-speech
surface: studio
domain: isis
auth:
  signed-in + studio entitlement (AAA-gated — `text-to-speech` is in
  `AAA_ONLY_STUDIO_ROUTES`)
source: apps/oshun/web/src/app/studio/isis/text-to-speech/page.tsx
status: walked
last_walked:
  '2026-05-29 automated runtime walk (Playwright headless) — render, /v1 data
  (2xx), console/page-errors, expected content, screenshot verified; live
  screen-reader, touch, offline, and telemetry-delivery checks pending a manual
  AT pass. Evidence: WALKTHROUGH/results/runtime-sweep-2026-05-29.md; body
  re-derived 2026-06-03 from current source (lane-console architecture).
  2026-07-03 addendum: real-dev-infra Playwright coverage added in
  apps/oshun/web/e2e/studio-isis-text-to-speech.spec.ts. The spec verifies the
  Studio Isis boundary, localhost E2E lane, live BFF voice-cloning records,
  filters, route map, quick actions, touch targets, create workflow, every
  visible lifecycle transition through release, revoke, high-abuse auto-reject,
  invalid transition feedback, loading, service failure, malformed response,
  network failure, non-admin unauthorized, and anonymous redirect.'
---

# Isis Text-to-Speech

## Purpose

Admin §24.7 voice-clone governance console (a cloned voice profile is the input
a TTS voice runs on): it reads the live clone-workflow records from
`GET /v1/admin/isis/voice-cloning` and drives each through consent →
id-verification → samples → naturalness → watermark → abuse-risk → multi-party
signoff → registration → release (or revoke) via
`POST …/voice-cloning/workflows` + `…/:workflowId/transition`. The state machine
is the enforcer (high abuse-risk auto-rejects); it is admin-scoped and fails
closed.

## Entry points

- Sibling quick-action from `/studio/isis/live-preview`
- Studio index (`/studio`)
- Direct URL / bookmark (AAA entitlement required)

## Layout regions

`page.tsx` mounts `<ShellLayout active="studio">` (no breadcrumb panel) and
three panels: the workspace, the Route Map, and sibling quick-actions.

- **Header**: shell header
- **Workspace panel** (`data-isis-text-to-speech-workspace`):
  - `<h1>` (`WorkspaceHeading`) "Isis Text-to-Speech Workspace"
  - Summary paragraph (`data-isis-text-to-speech-summary`)
  - Workflow list (`data-tts-workflow-row=<workflowId>`, active
    `data-tts-workflow-row-active`); filter `data-tts-search`
  - Create-workflow form (`data-tts-create-form`)
  - Workflow detail (`data-tts-detail`) with the lifecycle action panel
    (`data-tts-action-panel`) offering only the transitions valid for the
    workflow's current state
- **Route Map panel** (`data-isis-text-to-speech-route-map`):
  `<h2>Route Map</h2>` over `STUDIO_ISIS_TEXT_TO_SPEECH_ROUTE_MAP` (5 entries)
- **Sibling quick-actions panel**: `/studio/isis/live-preview`, `/studio`

## States

- [x] **Loading** — `data-tts-loading`
- [x] **Unauthorized** — 401/403 admin-scope fail-closed;
      `data-tts-unauthorized`
- [x] **Error** — non-OK, malformed response, or network failure;
      `data-tts-error`
- [x] **Ready** — records present; list + detail + action panel render
- [x] **Result** — after a create or transition POST, `data-tts-action-result`
      (`data-tts-action-status`)

## Interactions

### Create-workflow form (`data-tts-create-form`)

- [x] **New workflow id** (`data-tts-create-workflow`, text input)
- [x] **Subject id** (`data-tts-create-subject`, text input)
- [x] **Create** (`data-tts-create-submit`) —
      `POST /v1/admin/isis/voice-cloning/workflows`

### Workflow action panel (`data-tts-action-panel`) — state-gated transitions

- [x] **Consent** (`data-tts-action-consent` → `data-tts-action-consent-submit`)
- [x] **Verify identity** (`data-tts-action-verify`, action `verify-identity`)
- [x] **Samples** (`data-tts-action-samples` → `data-tts-action-samples-submit`)
- [x] **Naturalness scores** (`data-tts-action-scores` →
      `data-tts-action-scores-submit`)
- [x] **Watermark** (`data-tts-action-watermark` →
      `data-tts-action-watermark-submit`)
- [x] **Abuse-risk** (`data-tts-action-abuse` → `data-tts-action-abuse-submit`)
- [x] **Signoff** (`data-tts-action-signoff` → `data-tts-action-signoff-submit`)
- [x] **Register** (`data-tts-action-register` →
      `data-tts-action-register-submit`)
- [x] **Revoke** (`data-tts-action-revoke`, action `revoke`)
- Each transition →
  `POST /v1/admin/isis/voice-cloning/workflows/:workflowId/transition`

### Route Map

- [x] **Route-map articles** ×5

### Sibling quick-actions

- [x] **Open Isis Live Preview workspace** → `/studio/isis/live-preview`
- [x] **Back to Studio workspace index** → `/studio`

## E2E coverage

- `apps/oshun/web/e2e/studio-isis-text-to-speech.spec.ts` runs against the real
  Next shell and local BFF, with browser voice-cloning requests forwarded into
  `/v1/admin/isis/voice-cloning`.
- It proves direct route hard-blocking (`x-studio-boundary: hard-block`) and the
  localhost-only `?__oshunStudioIsisLaneE2E=1` admin lane.
- It walks a unique workflow through create, consent, identity verification,
  samples, naturalness scores, watermark, low abuse-risk, all four signoff
  roles, profile registration/release, and exact POST body capture.
- It also covers pending-consent revoke, invalid consent payload feedback, high
  abuse-risk auto-reject, loading, 503, malformed response, aborted GET,
  non-admin 403, anonymous redirect, route-map articles, filters, quick actions,
  and 44px minimum touch targets for the main controls.

## Data & contracts

- **Reads**: `GET /v1/admin/isis/voice-cloning` (clone-workflow records)
- **Writes**:
  - `POST /v1/admin/isis/voice-cloning/workflows` (create a clone workflow)
  - `POST /v1/admin/isis/voice-cloning/workflows/:workflowId/transition` (drive
    the consent → … → release/revoke state machine)
- **Realtime**: none
- **Caching**: client fetch on mount, `cache: 'no-store'`,
  `buildBffAuthHeaders()`
- **Auth/role check**: admin-scoped, fail-closed (401/403); route gated on
  signed-in + studio entitlement (AAA segment)
- **Component sources**:
  - `apps/oshun/web/src/components/studio/StudioIsisTextToSpeechWorkspace.tsx`
  - `apps/oshun/web/src/components/studio/StudioIsisTextToSpeechRouteMap.ts`

## Cross-references

- Studio overview: [`../../studio-overview.md`](../../studio-overview.md)
- AAA gating: `libs/isis/entitlements/src/studio-boundary.ts`
- Sibling routes:
  - [`studio-isis-live-preview.md`](./studio-isis-live-preview.md)
  - [`studio-isis-text-to-audio.md`](./studio-isis-text-to-audio.md)
  - [`studio-isis-audio-generation.md`](./studio-isis-audio-generation.md)

## Open questions / known gaps

- [ ] No breadcrumb on this route — navigation is via sibling quick-actions
- [ ] This console governs the clone-workflow lifecycle, not the TTS synthesis
      itself; confirm where the registered voice profile feeds the synthesis
      path
