从远处看,每个人都显得格外善良。——李璐璐
 
这个项目
https://github.com/gcui-art/suno-api/ 
可以用 API 调用 suno.ai  的音乐生成 AI,并且可以轻松集成到 GPTs 等 agent 中
文档:
https://suno.gcui.art/ 
1 2 git clone https://github.com/gcui-art/suno-api.git
或者,你也可以使用 Docker Compose 
1 docker compose build && docker compose up
如果部署到了 Vercel,请在 Vercel 后台,添加环境变量 SUNO_COOKIE,值为第一步获取的 cookie。 
如果在本地运行,请在 .env 文件中添加: 
 
1 SUNO_COOKIE=<your-cookie>
如果部署到了 Vercel:
请在 Vercel 后台,点击 Deploy,等待部署成功。 
访问 https://<vercel分配的域名>/api/get_limit API 进行测试 
 
 
如果在本地运行:
请运行 npm run dev 
访问 http://localhost:3000/api/get_limit API 进行测试 
 
 
如果返回以下结果: 
 
1 2 {   "credits_left" :  0 ,   "period" :  "string" ,   "monthly_limit" :  0 ,   "monthly_usage" :  0 } 
则已经正常运行。
你可以在 suno.gcui.art 查看详细的 API 文档,并在线测试。
Suno API 目前主要实现了以下 API:
1 - `/api/generate`: 创建音乐- `/v1/chat/completions`: 创建音乐 - 用OpenAI API 兼容的格式调用 generate API- `/api/custom_generate`: 创建音乐(自定义模式,支持设置歌词、音乐风格、设置标题等)- `/api/generate_lyrics`: 根据Prompt创建歌词- `/api/get`: 根据id获取音乐信息。获取多个请用","分隔,不传ids则返回所有音乐- `/api/get_limit`: 获取配额信息
详细文档请查看演示站点: suno.gcui.art/docs 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 import  timeimport  requests'http://localhost:3000' def  custom_generate_audio (payload ):    url = f"{base_url} /api/custom_generate" 'Content-Type' : 'application/json' })    return  response.json()def  generate_audio_by_prompt (payload ):    url = f"{base_url} /api/generate" 'Content-Type' : 'application/json' })    return  response.json()def  get_audio_information (audio_ids ):    url = f"{base_url} /api/get?ids={audio_ids} " return  response.json()def  get_quota_information ():    url = f"{base_url} /api/get_limit" return  response.json()if  __name__ == '__main__' :    data = generate_audio_by_prompt({        "prompt" : "A popular heavy metal song about war, sung by a deep-voiced male singer, slowly and melodiously. The lyrics depict the sorrow of people after the war." ,        "make_instrumental" : False ,        "wait_audio" : False f"{data[0 ]['id' ]} ,{data[1 ]['id' ]} " print (f"ids: {ids} " )    for  _ in  range (60 ):        data = get_audio_information(ids)        if  data[0 ]["status" ] == 'streaming' :            print (f"{data[0 ]['id' ]}  ==> {data[0 ]['audio_url' ]} " )            print (f"{data[1 ]['id' ]}  ==> {data[1 ]['audio_url' ]} " )            break 5 )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 const  axios = require ("axios" );const  baseUrl = "http://localhost:3000" ;async  function  customGenerateAudio (payload ) {const  url = `${baseUrl} /api/custom_generate` ;const  response = await  axios.post (url, payload, {headers : { "Content-Type" : "application/json"  },return  response.data ;async  function  generateAudioByPrompt (payload ) {const  url = `${baseUrl} /api/generate` ;const  response = await  axios.post (url, payload, {headers : { "Content-Type" : "application/json"  },return  response.data ;async  function  getAudioInformation (audioIds ) {const  url = `${baseUrl} /api/get?ids=${audioIds} ` ;const  response = await  axios.get (url);return  response.data ;async  function  getQuotaInformation (const  url = `${baseUrl} /api/get_limit` ;const  response = await  axios.get (url);return  response.data ;async  function  main (const  data = await  generateAudioByPrompt ({prompt :      "A popular heavy metal song about war, sung by a deep-voiced male singer, slowly and melodiously. The lyrics depict the sorrow of people after the war." ,make_instrumental : false ,wait_audio : false ,const  ids = `${data[0 ].id} ,${data[1 ].id} ` ;console .log (`ids: ${ids} ` );for  (let  i = 0 ; i < 60 ; i++) {const  data = await  getAudioInformation (ids);if  (data[0 ].status  === "streaming" ) {console .log (`${data[0 ].id}  ==> ${data[0 ].audio_url} ` );console .log (`${data[1 ].id}  ==> ${data[1 ].audio_url} ` );break ;await  new  Promise ((resolve ) =>  setTimeout (resolve, 5000 ));main ();