Skill: twocode/gen-music (version 0.1.0)

--- name: gen-music description: Generate songs from prompts or lyrics through an ACE-Step-compatible API backend. Use when users want text-to-music, lyrics-to-song, fast prompt iteration, stable output files, or to generate music and then play the result on Clawatch. metadata: { "openclaw": { "emoji": "🎵", "requires": { "bins": ["python3"] }, }, } --- # ACE-Step Text To Music Use an ACE-Step-compatible API backend for prompt-to-song and lyrics-to-song requests. This skill does not install or bundle ACE-Step, model weights, or the API server. ## Prerequisite Before using this skill, make sure you already have access to an ACE-Step-compatible API backend. This can be a local server, usually at `http://127.0.0.1:8001`, or a remote compatible endpoint. If the backend is missing or stopped, this skill cannot generate music. ## Quick start ```bash python3 {baseDir}/scripts/generate.py --prompt "playful beach pop song about rising waves" python3 {baseDir}/scripts/generate.py --prompt "happy indie pop with bright guitars" --lyrics-file /path/to/lyrics.txt --duration 60 ``` Defaults are tuned for fast local iteration: - `batch_size=1` to avoid duplicate variants unless explicitly requested - `audio_format=mp3` - `sample_mode=text2music` - `thinking=false` unless the user asks for heavier LM-assisted generation - finished audio is copied into a stable output folder instead of leaving only temp API paths ## When to use - An ACE-Step-compatible API backend is already available, commonly a local server at `http://127.0.0.1:8001` but possibly a remote endpoint - The user wants text-to-music, lyrics-to-song, or quick style variations - The user wants a single command that submits, polls, and returns saved files - The user wants music generated locally and then played on Clawatch - The user already has access to a local or remote ACE-Step-compatible backend ## Run ```bash # Basic prompt python3 {baseDir}/scripts/generate.py --prompt "playful synth-pop song about sunrise waves" # With lyrics python3 {baseDir}/scripts/generate.py \ --prompt "cute upbeat summer beach song" \ --lyrics-file /path/to/lyrics.txt \ --duration 60 # Two variants python3 {baseDir}/scripts/generate.py \ --prompt "dreamy city-pop ocean groove" \ --duration 45 \ --batch-size 2 # Enable heavier LM planning only when needed python3 {baseDir}/scripts/generate.py \ --prompt "cinematic anthem about a storm becoming calm" \ --duration 60 \ --thinking ``` Useful flags: - `--duration 10..600` - `--lyrics` or `--lyrics-file` - `--batch-size 1..8` - `--thinking` - `--model acestep-v15-turbo` - `--out-dir /path/to/output` - `--base-url http://127.0.0.1:8001` for local backends - `--base-url https://your-remote-endpoint` for remote backends ## Clawatch playback If the user also wants the result played on Clawatch: 1. Run the generator and wait for the saved output file paths. 2. Pick the final `.mp3` path from the script output or `manifest.json`. 3. Call `clawatch_play_audio` with: - `imei`: the explicit watch IMEI - `filePath`: the saved local audio path - `title`: optional short label Do not pass ACE-Step temp URLs directly if the helper already copied a stable local file. Prefer the saved file path. ## Config The script accepts CLI flags first, then env vars, then OpenClaw skill config. Supported env vars: - `ACESTEP_API_BASE_URL` - `ACESTEP_API_KEY` - `ACESTEP_OUTPUT_DIR` Use `ACESTEP_API_BASE_URL` or the OpenClaw config entry to switch between local and remote ACE-Step-compatible backends. Optional OpenClaw config in `~/.openclaw/openclaw.json`: ```json5 { skills: { entries: { "gen-music": { baseUrl: "http://127.0.0.1:8001", apiKey: "", outputDir: "~/Projects/tmp/ace-step" } } } } ``` ## Notes - Check backend health first if needed: `curl http://127.0.0.1:8001/health` or the same path on your remote endpoint - If the API returns temp `/v1/audio?path=...` URLs, the helper copies those files into the chosen output directory and writes a `manifest.json` - Prefer `batch-size 1` for efficient prompt iteration; raise it only when the user explicitly wants variants


Security scan verdicts — ClawScan: suspicious | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (MEDIUM)