---
title: "Voices only: isolate each take's voices (costs credits)"
method: POST
path: "/v1/storyboards/{id}/voices"
tags: ["Storyboards"]
---

# Voices only: isolate each take's voices (costs credits)

`POST /v1/storyboards/{id}/voices`

## Request

- Base URL: `https://nanostudiopro.com/api`
- URL: `https://nanostudiopro.com/api/v1/storyboards/{id}/voices`
- Auth: HTTP bearer

Seedance clips carry their own music and effects almost all the time, so the film's score ducked under them stays down for the whole film. Voices only sends each take's soundtrack to ElevenLabs audio isolation and keeps the voices as the take's voice track (`voicePath`, with `speech`: where it speaks, in clip seconds). The player then plays the voices at the `voices` level and the clip's full sound under them at `filmTexture` (the levels: `mix` on `GET /v1/storyboards/{id}`, set with the mutation `{op: "setMix", patch: {film, filmTexture, voices, music, ambience, effects, voiceOver}}`, each 0-1.5, null back to the default), and the music, place beds and effects dip about 10 dB under speech only (the lines and the voice tracks' spans), never under the clips' own sound. `{op: "setVoicesOnly", target, takeId, on: false}` plays a take's full sound again, free (the track is kept). Without `take_ids`: every take in use (segments and ending shots; a waiting loop keeps its own sound) that has no voice track yet. **Costs credits**: `audio_isolate_10s` per 10 s of audio (see `/v1/pricing`). Quote first with `dry_run: true`: `credits` is the most it costs, per take in `takes`; `available: false` comes with a `reason` (nothing to do, a run going, or the price not set yet). Without `dry_run` it answers `202 { task_id }`: poll `GET /v1/tasks/{id}`. Each take is charged after its track is on the storyboard, never more than quoted, through your token so its daily cap applies. Paid tier only (`402 audio_requires_purchase` on trial credits). A storyboard whose owner approves agent spending answers `403` except for the quote.

## Request body

- object
  - `take_ids` string[]
  - `dry_run` boolean

## Response `200`

The quote (dry_run)

- object
  - `dry_run` boolean
  - `available` boolean
  - `reason` string
  - `credits` integer, nullable: The most it can cost.
  - `per_10s` integer
  - `takes` object[]
    - `take_id` string
    - `target` object
    - `seconds` number
    - `credits` integer
  - `skipped` object[]
    - `take_id` string
    - `reason` string
  - `running_task_id` string, nullable

## Other responses

- `202`: The run started
- `400`: Every take in use already has its voices, or no clip is made yet
- `401`: Missing or invalid token
- `402`: Insufficient credits
- `403`: The owner approves an agent's spending on this storyboard
- `409`: Voices only is already running for this film
- `429`: Rate limit exceeded
- `503`: Voices only is not available yet: its price has not been set.

---

[API](https://skmtc.dev/nanostudiopro/apis/nano-studio-pro-api.md) · [All operations](https://skmtc.dev/nanostudiopro/apis/nano-studio-pro-api/llms.txt) · [OpenAPI document](https://skmtc.dev/nanostudiopro/apis/nano-studio-pro-api/revisions/b454211e598e?raw)
