Audio generation skill — jingles, beds, voiceover, and sound effects. Routes music requests to Suno V5 / Udio / Lyria, speech to MiniMax TTS / FishAudio / ElevenLabs V3, and SFX to ElevenLabs SFX or AudioCraft. Output is one MP3/WAV file saved to the project folder.
Three sub-modes. The active project's audioKind decides which one
runs:
| audioKind | Models we route to | Plan focus |
|---|---|---|
| music | Suno V5 (default), Udio, Lyria 2 | genre + tempo + instrumentation |
| speech | MiniMax TTS (default), Fish, ElevenLabs V3 | script + voice + pacing |
| sfx | ElevenLabs SFX (default), AudioCraft | texture + impact + duration |
audio-jingle/
├── SKILL.md
└── example.html
audioKind, audioModel, audioDuration (seconds), and (for speech)
voice. Branch by known values and use them verbatim. Missing metadata is not
an instruction to ask: infer a safe default when possible, and emit a
clarifying form only when the missing answer would materially change the
requested output or prevent generation.
Important: voice is provider-specific. For minimax-tts, --voice
must be a valid MiniMax voice_id (for example male-qn-qingse), not
a natural-language description. If you only have a prose voice brief
("warm female narrator", "neutral Mandarin"), keep that in your plan
but omit --voice so the daemon's default voice id applies, or ask the
user to choose a specific id.
Music
Speech
voice_id, not prose in --voiceSFX
State the plan in 2-3 sentences before dispatching.
Use the format the upstream model prefers. Bind audioDuration to the
API parameter directly; never put "make it 30 seconds" in prose.
Use the unified dispatcher — do not call provider APIs by hand:
"$OD_NODE_BIN" "$OD_BIN" media generate \
--project "$OD_PROJECT_ID" \
--surface audio \
--audio-kind "<music|speech|sfx>" \
--model "<audioModel from metadata>" \
--duration <audioDuration seconds> \
[--voice "<provider voice id (speech only)>"] \
--output "<short-slug>-<duration>s.mp3" \
--prompt "<assembled prompt from Step 2 — for speech, the literal script>"
The command prints one line of JSON: {"file": {"name": "...", ...}}.
The bytes land in the project; the FileViewer renders the audio
transport controls automatically.
Reply with: plan summary, the filename returned by the dispatcher, and one sentence on what to try if the user wants a variation (e.g. "swap tempo from 92 to 108 BPM" rather than "make it different").
--voice. Use a real
MiniMax voice_id (for example male-qn-qingse) or omit the flag
and let the daemon's default voice apply.Copy a source-pinned command for your client. You run it yourself.
Destination: .claude/skills/audio-jingle · pinned to the source commit
git clone https://github.com/nexu-io/open-design.git
cd open-design
git checkout d488b1aa87917daee40d7c61efd7decbb28b5455
mkdir -p ".claude/skills/audio-jingle"
cp -r "design-templates/audio-jingle" ".claude/skills/audio-jingle"Review the source before running. This copies files into your project; it is not a one-click install and does not verify runtime safety.
Scanner static-checks@0.1.0 · commit d488b1aa8791. Static checks cannot prove runtime safety – review the source and the exact diff before installing. How checks work.
No static rules matched. This is not a safety guarantee.