简体中文
几分钟内开始使用 Suno API 生成高质量的AI音乐、歌词和音频处理
https://api.sunoapi.org
Authorization: Bearer YOUR_API_KEY
curl -X POST "https://api.sunoapi.org/api/v1/generate" \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "prompt": "一首宁静的原声吉他旋律配柔和人声,民谣风格", "customMode": false, "instrumental": false, "model": "V3_5", "callBackUrl": "https://your-server.com/callback" }'
curl -X GET "https://api.sunoapi.org/api/v1/generate/record-info?taskId=YOUR_TASK_ID" \ -H "Authorization: Bearer YOUR_API_KEY"
{ "code": 200, "msg": "success", "data": { "taskId": "suno_task_abc123" } }
{ "code": 200, "msg": "success", "data": { "taskId": "suno_task_abc123", "status": "SUCCESS", "response": { "data": [ { "id": "audio_123", "audio_url": "https://example.com/generated-music.mp3", "title": "生成的歌曲", "tags": "民谣, 原声", "duration": 180.5 } ] } } }
{ "prompt": "一首充满活力的电子舞曲,带有合成器主音", "customMode": true, "style": "电子舞曲", "title": "数字梦境", "instrumental": false, "model": "V4_5" }
{ "prompt": "一首关于克服挑战和找到内在力量的歌曲", "callBackUrl": "https://your-server.com/lyrics-callback" }
{ "audioId": "existing_audio_123", "defaultParamFlag": true, "prompt": "继续添加吉他独奏", "continueAt": 120, "model": "V3_5" }
{ "uploadUrl": "https://example.com/original-audio.mp3", "customMode": true, "style": "爵士", "title": "爵士版本", "prompt": "转换为流畅的爵士风格" }
V3_5
V4
V4_5
true
style
title
false
class SunoAPI { constructor(apiKey) { this.apiKey = apiKey; this.baseUrl = 'https://api.sunoapi.org/api/v1'; } async generateMusic(options) { const response = await fetch(`${this.baseUrl}/generate`, { method: 'POST', headers: { 'Authorization': `Bearer ${this.apiKey}`, 'Content-Type': 'application/json' }, body: JSON.stringify(options) }); const result = await response.json(); if (result.code !== 200) { throw new Error(`生成失败: ${result.msg}`); } return result.data.taskId; } async generateLyrics(prompt) { const response = await fetch(`${this.baseUrl}/lyrics`, { method: 'POST', headers: { 'Authorization': `Bearer ${this.apiKey}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ prompt, callBackUrl: 'https://your-server.com/lyrics-callback' }) }); const result = await response.json(); return result.data.taskId; } async waitForCompletion(taskId, maxWaitTime = 600000) { // 最长等待10分钟 const startTime = Date.now(); while (Date.now() - startTime < maxWaitTime) { const status = await this.getTaskStatus(taskId); if (status.status === 'SUCCESS') { return status.response; } else if (status.status === 'FAILED') { throw new Error(`生成失败: ${status.errorMessage}`); } // 等待30秒后再次检查 await new Promise(resolve => setTimeout(resolve, 30000)); } throw new Error('生成超时'); } async getTaskStatus(taskId) { const response = await fetch(`${this.baseUrl}/generate/record-info?taskId=${taskId}`, { headers: { 'Authorization': `Bearer ${this.apiKey}` } }); const result = await response.json(); return result.data; } async extendMusic(audioId, options) { const response = await fetch(`${this.baseUrl}/generate/extend`, { method: 'POST', headers: { 'Authorization': `Bearer ${this.apiKey}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ audioId, ...options }) }); const result = await response.json(); return result.data.taskId; } async separateVocals(taskId, audioId) { const response = await fetch(`${this.baseUrl}/vocal-removal/generate`, { method: 'POST', headers: { 'Authorization': `Bearer ${this.apiKey}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ taskId, audioId, callBackUrl: 'https://your-server.com/vocal-callback' }) }); const result = await response.json(); return result.data.taskId; } async getRemainingCredits() { const response = await fetch(`${this.baseUrl}/get-credits`, { headers: { 'Authorization': `Bearer ${this.apiKey}` } }); const result = await response.json(); return result.data.credits; } } // 使用示例 async function main() { const api = new SunoAPI('YOUR_API_KEY'); try { // 检查剩余积分 const credits = await api.getRemainingCredits(); console.log(`剩余积分: ${credits}`); // 首先生成歌词 console.log('正在生成歌词...'); const lyricsTaskId = await api.generateLyrics( '一首关于冒险和发现的歌曲,振奋人心且鼓舞人心' ); const lyricsResult = await api.waitForCompletion(lyricsTaskId); console.log('歌词已生成:', lyricsResult.lyricsData[0].text); // 使用自定义参数生成音乐 console.log('正在生成音乐...'); const musicTaskId = await api.generateMusic({ prompt: lyricsResult.lyricsData[0].text, customMode: true, style: '民谣流行', title: '冒险之歌', instrumental: false, model: 'V4_5', callBackUrl: 'https://your-server.com/music-callback' }); // 等待完成 const musicResult = await api.waitForCompletion(musicTaskId); console.log('音乐生成成功!'); musicResult.data.forEach((track, index) => { console.log(`音轨 ${index + 1}:`); console.log(` 标题: ${track.title}`); console.log(` 时长: ${track.duration}秒`); console.log(` 音频URL: ${track.audio_url}`); }); // 扩展第一个音轨 const originalTrack = musicResult.data[0]; console.log('正在扩展音乐...'); const extendTaskId = await api.extendMusic(originalTrack.id, { defaultParamFlag: true, prompt: '继续添加美妙的器乐尾奏', continueAt: originalTrack.duration - 30, // 从结束前30秒开始扩展 model: 'V4_5' }); const extendedResult = await api.waitForCompletion(extendTaskId); console.log('扩展版本已创建:', extendedResult.data[0].audio_url); // 分离人声 console.log('正在分离人声...'); const separationTaskId = await api.separateVocals(musicTaskId, originalTrack.id); const separationResult = await api.waitForCompletion(separationTaskId); console.log('人声分离完成:'); console.log(` 伴奏: ${separationResult.vocal_removal_info.instrumental_url}`); console.log(` 纯人声: ${separationResult.vocal_removal_info.vocal_url}`); } catch (error) { console.error('错误:', error.message); } } main();
const extendTaskId = await api.generateMusic({ uploadUrl: 'https://example.com/my-song.mp3', defaultParamFlag: true, prompt: '添加摇滚吉他独奏部分', continueAt: 60, model: 'V4_5' });
const wavTaskId = await api.convertToWav({ taskId: 'original_task_id', audioId: 'audio_123', callBackUrl: 'https://your-server.com/wav-callback' });
const videoTaskId = await api.createMusicVideo({ taskId: 'music_task_id', audioId: 'audio_123', author: '艺术家姓名', domainName: 'your-brand.com', callBackUrl: 'https://your-server.com/video-callback' });
// 您的回调端点 app.post('/music-callback', (req, res) => { const { code, data } = req.body; if (code === 200) { console.log('音乐准备就绪:', data.data); data.data.forEach(track => { console.log(`标题: ${track.title}`); console.log(`音频: ${track.audio_url}`); }); } else { console.log('生成失败:', req.body.msg); } res.status(200).json({ status: 'received' }); });
提示词优化
模型选择
性能优化
错误处理