SkillHub

songmaker

v1.0.0

Generate a complete song from a text description — AI writes lyrics then composes music. Use when users want to create a song, turn a description into audio, or generate background music. Triggers on "帮我写一首关于夏天的流行歌曲", "用这段歌词生成一首摇滚歌曲", "生成一首纯音乐背景曲", "AI 作词作曲", "作曲", "写歌", "给我生成一首歌".

Sourced from ClawHub, Authored by scikkk

Installation

Please help me install the skill `songmaker` from SkillHub official store. npx skills add scikkk/songmaker

SenseAudio Songmaker

Two-step song creation: generate lyrics → compose music. If the user already has lyrics, skip to Step 2.

Workflow

用户描述 → [Step 1] 生成歌词 → 用户确认/修改 → [Step 2] 生成歌曲 → 返回链接
                                ↑ 用户自带歌词时跳过 Step 1

Step 1: Generate Lyrics

Skip this step if the user provides their own lyrics.

LYRICS_RESP=$(curl -s -X POST "https://api.senseaudio.cn/v1/song/lyrics/create" 
  -H "Authorization: Bearer $SENSEAUDIO_API_KEY" 
  -H "Content-Type: application/json" 
  -d "{"prompt": "<USER_PROMPT>", "provider": "sensesong"}")

TASK_ID=$(echo $LYRICS_RESP | jq -r '.task_id // empty')

If task_id is present, poll until done:

while true; do
  POLL=$(curl -s "https://api.senseaudio.cn/v1/song/lyrics/pending/$TASK_ID" 
    -H "Authorization: Bearer $SENSEAUDIO_API_KEY")
  STATUS=$(echo $POLL | jq -r '.status')
  { [ "$STATUS" = "SUCCESS" ] || [ "$STATUS" = "FAILED" ]; } && break
  sleep 3
done
LYRICS=$(echo $POLL | jq -r '.response.data[0].text')

If no task_id (sync response), read directly:

LYRICS=$(echo $LYRICS_RESP | jq -r '.data[0].text')

Show the lyrics to the user and ask for confirmation or edits before proceeding.

Lyrics Format

The API uses structured section tags separated by ;:

[intro-medium] ; [verse] 第一段歌词内容 ; [chorus] 副歌内容 ; [bridge] 桥段 ; [outro-short]

Common tags: [intro-short] [intro-medium] [verse] [chorus] [bridge] [outro-short] [outro-medium] [inst-short]

If the user provides plain lyrics without tags, wrap them: [verse] <lyrics> ; [chorus] <chorus>


Step 2: Generate Song

Build the request body from user preferences:

User says Parameter
男声 / 男歌手 "vocal_gender": "m"
女声 / 女歌手 "vocal_gender": "f"
纯音乐 / 无人声 "instrumental": true (omit lyrics)
风格描述(摇滚/流行/古风…) "style": "<描述>"
不要某种风格 "negative_tags": "<描述>"
SONG_RESP=$(curl -s -X POST "https://api.senseaudio.cn/v1/song/music/create" 
  -H "Authorization: Bearer $SENSEAUDIO_API_KEY" 
  -H "Content-Type: application/json" 
  -d "{
    "model": "sensesong",
    "lyrics": "<LYRICS>",
    "title": "<TITLE>",
    "vocal_gender": "<f|m>",
    "style": "<STYLE>"
  }")

SONG_TASK=$(echo $SONG_RESP | jq -r '.task_id')

Song generation always returns a task_id. Poll until done (may take 30–120s):

while true; do
  POLL=$(curl -s "https://api.senseaudio.cn/v1/song/music/pending/$SONG_TASK" 
    -H "Authorization: Bearer $SENSEAUDIO_API_KEY")
  STATUS=$(echo $POLL | jq -r '.status')
  { [ "$STATUS" = "SUCCESS" ] || [ "$STATUS" = "FAILED" ]; } && break
  echo "生成中... ($STATUS)"
  sleep 5
done

Output

On SUCCESS, extract and display:

echo $POLL | jq -r '.response.data[0] | "标题:(.title)n时长:(.duration) 秒n音频:(.audio_url)n封面:(.cover_url)"'

Example output:

标题:夏日物语
时长:187 秒
音频:https://cdn.senseaudio.cn/songs/xxx.mp3
封面:https://cdn.senseaudio.cn/covers/xxx.jpg

On FAILED, report the status and suggest retrying with a different style or simpler lyrics.