Generate Audio (Popcraft)
popcraft_generate_audioSTOP FIRST if the ask is a VOICEOVER, narration, an ad read, an audiobook or podcast segment, character lines, or a multi-line script — or if a generated voice came back sounding robotic, flat or rushed: call popcraft_get_workflow_instructions { workflow: "voiceover" } and follow it instead of calling this tool directly. It owns the voice lock, the words-per-second budget and the ElevenLabs v3 performance tags ([laughs], [whispers], [sighs]) that are the ONLY emotion control on this path — a one-shot prompt sounds like TTS. One short line, a sound effect or a music bed belongs here — call it directly, no workflow needed. Generate audio with Popcraft — voices, sound effects, and music — from a text prompt: speech (kind:"tts", default), sound effects (kind:"sfx"), or music/BGM (kind:"music"). kind:"tts" REQUIRES voice_id (from popcraft_list_voices) — there is no default voice and a call without it is rejected — EXCEPT on model:"seed-audio", where omitting voice_id means AUTO voice (the engine casts a fitting voice from the text) and voice_description designs one in natural language ("低沉沙哑的中年男声", "warm young female voice, brisk"). seed-audio's voice is NOT deterministic across calls — for any multi-take script pin a voice_id or use model:"seed-tts" (native zh/Asian-language preset voices, provider:"seed" in popcraft_list_voices, directed via free-text instruction — not spoken, not billed). Seed voices only work on seed models and ElevenLabs voices only on ElevenLabs models. ElevenLabs TTS adds three delivery controls: speech_rate (0.5–2.0, default 1; it also shortens the billed length, since speech is charged per second), emotion (one of neutral, happy, sad, angry, excited, calm, nervous, frustrated, whispers, cheerful — applies to the whole take), and stability (0–1, default 0.5: LOW makes the voice expressive and obedient to inline v3 tags like [laughs] or [whispers], HIGH makes it consistent but largely deaf to them — lower it when tags are not landing). All three are TTS-only and are reported back under adjustments as ignored if sent with another kind. For kind:"sfx" or kind:"music", pass duration (seconds) to control length; omitted, the model default length is used (fixed-length song models — suno-chirp-v5, lyria-3-clip, lyria-3-pro — ignore duration). Those three are also billed FLAT per generation, not per second: lyria-3-clip is 8 credits for a ~30s clip and lyria-3-pro 16 for a song up to ~3min, so they are far cheaper for a music bed than their catalog rate suggests at a glance. Music/BGM picks: lyria-3-clip (Google Lyria 3, ~30s clip, instrumental or vocal — the default choice for a bed) or lyria-3-pro (full song up to ~3min, pro tier); music-v1 bills per second and is the cheap option for a short loop. Full songs with real vocals: model:"suno-chirp-v5" + kind:"music" — describe the song in prompt, or pass lyrics (with [Verse]/[Chorus] markers) to have it sing YOUR words, steered by tags (e.g. "synthwave, energetic, female vocals"), plus optional title and instrumental. Suno renders TWO takes per generation from the same render (no extra cost); both are kept by default so the user can listen to both — pass keep_all_takes:false to keep only the primary take, and clip_index (0 or 1) to choose which take is primary. Pick model via popcraft_models_explore (type:"audio") if unsure. Set get_cost:true to preview the exact credit cost WITHOUT submitting. If a result carries recovery_tool, call that tool immediately; do not explain or ask first. On success, an interactive result card is shown to the user and refreshes itself automatically until the job finishes — do NOT poll or re-check status in a loop. Call popcraft_job_display at most once, and only if this client did not render a result card or the user asks about the job again later. The result includes project — the Popcraft project the output was filed into; when the user did not pass project_id/project_name, mention it briefly (e.g. "saved to ") so they know where it landed. Never tell the user how long the job will take or quote any estimate of generation time — the result card shows progress.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | "tts" = text-to-speech (default), "sfx" = sound effect, "music" = background music | |
| tags | No | kind:"music" (Suno): comma-separated style tags (genre, mood, vocal type), e.g. "lofi, chill, no drums" — the strongest steering lever when `lyrics` is set | |
| model | Yes | Popcraft model id, e.g. an ElevenLabs voice/music/sfx model or suno-chirp-v5 for full songs — list via popcraft_models_explore (type:"audio") | |
| title | No | kind:"music" (Suno): song title | |
| lyrics | No | kind:"music" (Suno): full lyric sheet with [Verse]/[Chorus] section markers — the model sings exactly these words (custom-lyrics mode) | |
| prompt | Yes | Text to speak (kind:"tts"), or a description of the sound/music to generate (kind:"sfx"/"music"). With `lyrics` set, this is ignored by the song model — a short style description is fine. | |
| emotion | No | kind:"tts" only: delivery emotion, default "neutral". Applies to the WHOLE take — for a shift mid-line, use an inline ElevenLabs v3 tag ([laughs], [whispers], [sighs]) instead. | |
| duration | No | Length in seconds for kind:"sfx"/"music" — omit to use the model default length. Ignored for kind:"tts" (length falls out of the script) and by fixed-length song models (suno-chirp-v5, lyria-3-*). | |
| get_cost | No | true = return the exact credit cost WITHOUT submitting | |
| voice_id | No | REQUIRED for kind:"tts" (optional in this schema only because sfx/music do not take it): the voice to speak with, from popcraft_list_voices. There is no usable default — a TTS call without it is rejected. Exception: model:"seed-audio", where omitting it opts into auto/described voice. Use the SAME id for every take of one script. | |
| stability | No | kind:"tts" only: 0..1, default 0.5. LOW = expressive and obedient to inline performance tags; HIGH = consistent and largely ignores them. Lower it when [laughs]/[whispers] are not landing; raise it when a long script drifts in tone between takes. | |
| clip_index | No | kind:"music" (Suno): which of the two rendered takes is the primary output — 0 (default) or 1 | |
| project_id | No | File the result into this Popcraft project (id from popcraft_projects). Omit to use the user's current/last-used project (or a default). Errors if you don't own it. | |
| instruction | No | model:"seed-tts" only — one free-text sentence of voice direction (accent/dialect, emotion, pace, persona), e.g. "用四川话说,像给同事讲教程,语速适中". Not spoken and not billed. Keep a constant persona clause across takes of one script. Ignored on other models. | |
| speech_rate | No | kind:"tts" only: speaking speed, 0.5 (half) to 2.0 (double), default 1. Prefer rewriting the script to fit a target length — this is for a deliberate delivery choice, not for cramming words in. Also shortens the billed length, since TTS is charged per second of speech. | |
| instrumental | No | kind:"music": music with no vocals (for Suno this applies in description mode only — with `lyrics` set, it is ignored) | |
| project_name | No | File the result into the project with this title, creating it if it doesn't exist. Ignored when project_id is set. | |
| keep_all_takes | No | kind:"music" (Suno): also deliver the other rendered take as a second result (default true — both takes come from the same render at no extra cost). Pass false to keep only the primary take. | |
| voice_description | No | model:"seed-audio" only — describe the voice to design in natural language ("低沉沙哑的中年男声" / "energetic young female voice"). Omit BOTH this and voice_id for pure auto voice. Ignored on other models. |