一、功能简介
注意:说明:
注意:关于已支持生成音乐模型的详细信息,请通过 创建 AIGC 生音频任务 中的 ModelName、ModelVersion 参数进行查看。
二、计费说明
通过媒体处理产品调用 AI 音乐生成功能,支持生成歌曲或纯音乐,计费单位为每首。各类型计费规则的完整说明可参考 按量计费 文档。
三、1. 开通服务
1. 登录 腾讯云媒体处理控制台,按照引导开通 MPS 服务。
2. 获取 API 密钥:前往 API 密钥管理 获取 SecretId 和 SecretKey。
3. (可选)如需将生成结果存到 COS,还需开通对象存储 (COS) 并创建存储桶,授权 MPS_QcsRole 角色。可参考 账号授权相关 文档。
四、2. 安装依赖
本指南的代码示例使用 axios 作为 HTTP 客户端,但它不是必须的。你可以根据项目情况选择以下任一方式发送 HTTP 请求。
| 方案 | 是否需要安装 | 适用场景 |
| axios(这篇示例默认) | npm install axios | 已有项目在用 axios,或偏好其 API 风格。 |
| Node.js 原生 fetch | 无需安装(Node.js ≥ 18 内置) | 零依赖、现代项目推荐。 |
| Node.js 原生 https | 无需安装 | 兼容老版本 Node.js(< 18)。 |
如果你选择 axios:
npm install axios
如果你选择原生 fetch(Node.js ≥ 18,零依赖),将代码中的 axios.post(…) 替换为:
// 替换 axios.post 调用// 原: const resp = await axios.post(`https://${MPS_HOST}`, payload, { headers });// return resp.data;// 改为:const resp = await fetch(`https://${MPS_HOST}`, { method: 'POST', headers: headers, body: JSON.stringify(payload)});return await resp.json();
注意:说明:
注意:Node.js 内置的 crypto 模块即可完成签名,无需额外安装。签名部分无外部依赖。
五、3. 密钥配置
{ "tencentCloud": { "secretId": "你的 SecretId", "secretKey": "你的 SecretKey", "region": "ap-guangzhou" }}
注意:安全提醒:密钥绝对不要硬编码到代码中或提交到 Git,建议使用环境变量或独立的配置文件(加入 .gitignore)。
六、API 概览
| 接口 | Action | 功能 | 请求频率限制 |
| 创建 AIGC 生成音频任务 | CreateAigcAudioTask | 根据 Prompt + 歌词生成音乐 | 20 次/秒 |
| 查询 AIGC 生成音频任务 | DescribeAigcAudioTask | 轮询音频生成进度和结果。 | 20 次/秒 |
注意:说明:
注意:通用信息:
七、签名机制 (TC3-HMAC-SHA256)
腾讯云 API 3.0 使用 TC3-HMAC-SHA256 签名认证。签名过程如下:
1. 构建规范请求 (CanonicalRequest):拼接请求方法、URI、QueryString、Headers、Payload Hash。
2. 构建待签字符串 (StringToSign):拼接算法、时间戳、CredentialScope、CanonicalRequest Hash。
3. 计算签名 (Signature):用 SecretKey 逐级 HMAC 派生签名密钥,再对 StringToSign 签名。
4. 构建 Authorization Header:组装最终的认证头。
详见 腾讯云 API 签名文档。
八、注意事项
1. 生成结果仅存储 12 小时
音频的 URL 只有12小时有效期,务必在生成后及时下载或转存到自己的 COS/服务器。
2. 频率限制
·音频创建:20次/秒
·音频查询:20次/秒
建议实现并发控制和请求队列,避免触发限流。
3. Prompt 长度限制
音频 Prompt:最好不要超过2000字符。
4. COS 存储
使用 StoreCosParam 可将结果直接存到指定 COS 桶,需要:
·开通 COS 服务。
·创建存储桶。
·授权 MPS_QcsRole 角色访问该桶。
九、1. 签名工具 (tencent-sign.js)
/** * 腾讯云 API 签名工具 (TC3-HMAC-SHA256) */const crypto = require('crypto');function sha256(message) { return crypto.createHash('sha256').update(message).digest('hex');}function hmac256(key, message) { return crypto.createHmac('sha256', key).update(message).digest();}/** * 生成腾讯云 API V3 签名 * @param {string} secretId – 腾讯云 SecretId * @param {string} secretKey – 腾讯云 SecretKey * @param {string} service – 服务名,如 'mps' * @param {string} action – 接口名,如 'CreateAigcAudioTask' * @param {string} payload – 请求体 JSON 字符串 * @param {string} region – 地域,如 'ap-guangzhou' * @param {string} [version] – API 版本号,默认 '2019-06-12' * @returns {{ headers: object }} – 包含完整签名的请求头 */function signRequest(secretId, secretKey, service, action, payload, region, version) { const timestamp = Math.floor(Date.now() / 1000); const date = new Date(timestamp * 1000).toISOString().split('T')[0]; // ===== 步骤1: 拼接规范请求串 ===== const httpRequestMethod = 'POST'; const canonicalUri = '/'; const canonicalQueryString = ''; const contentType = 'application/json'; const canonicalHeaders = `content-type:${contentType}\\n` + `host:${service}.tencentcloudapi.com\\n` + `x-tc-action:${action.toLowerCase()}\\n`; const signedHeaders = 'content-type;host;x-tc-action'; const hashedRequestPayload = sha256(payload); const canonicalRequest = `${httpRequestMethod}\\n${canonicalUri}\\n${canonicalQueryString}\\n` + `${canonicalHeaders}\\n${signedHeaders}\\n${hashedRequestPayload}`; // ===== 步骤2: 拼接待签名字符串 ===== const algorithm = 'TC3-HMAC-SHA256'; const credentialScope = `${date}/${service}/tc3_request`; const hashedCanonicalRequest = sha256(canonicalRequest); const stringToSign = `${algorithm}\\n${timestamp}\\n${credentialScope}\\n${hashedCanonicalRequest}`; // ===== 步骤3: 计算签名 ===== const secretDate = hmac256(`TC3${secretKey}`, date); const secretService = hmac256(secretDate, service); const secretSigning = hmac256(secretService, 'tc3_request'); const signature = crypto.createHmac('sha256', secretSigning) .update(stringToSign).digest('hex'); // ===== 步骤4: 拼接 Authorization ===== const authorization = `${algorithm} Credential=${secretId}/${credentialScope}, ` + `SignedHeaders=${signedHeaders}, Signature=${signature}`; return { headers: { 'Authorization': authorization, 'Content-Type': contentType, 'Host': `${service}.tencentcloudapi.com`, 'X-TC-Action': action, 'X-TC-Timestamp': String(timestamp), 'X-TC-Version': version || '2019-06-12', 'X-TC-Region': region || '' } };}module.exports = { signRequest };
十、2. MPS API 封装 (mps-api.js)
const axios = require('axios');const { signRequest } = require('./tencent-sign');const MPS_HOST = 'mps.tencentcloudapi.com';const SERVICE = 'mps';/** * 通用 MPS API 调用函数 */async function callMpsApi(action, params, config) { const payload = JSON.stringify(params); const { headers } = signRequest( config.tencentCloud.secretId, config.tencentCloud.secretKey, SERVICE, action, payload, config.tencentCloud.region ); const resp = await axios.post(`https://${MPS_HOST}`, payload, { headers }); return resp.data;}// =============================================// 音频生成// =============================================/** * 创建 AIGC 生音频任务 * @param {string} prompt – 音乐风格 / 演唱要求描述 * @param {string} lyrics – 歌词文本(\\n 换行,\\n\\n 分段) * @param {object} options – 可选项 */async function createMusicTask(prompt, lyrics, options = {}) { const config = options._config; // 传入配置对象 const params = { ModelName: options.modelName || 'MinimaxMusic', ModelVersion: options.modelVersion || '2.6', SceneType: 'music', // 音乐生成固定为 music Prompt: prompt }; // 输出格式(可选,默认由模型决定) if (options.outputAudioFormat) { params.OutputAudioFormat = options.outputAudioFormat; } // 歌词通过 AdditionalParameters 传入(注意:是 JSON 字符串) if (lyrics) { params.AdditionalParameters = JSON.stringify({ lyrics }); } // 参考音频(可选,仅部分场景) if (options.referenceAudioUrl) { params.AudioInfos = [{ Type: 'Url', Url: options.referenceAudioUrl }]; } // COS 存储(可选) if (options.storeCos) { params.StoreCosParam = options.storeCos; } const result = await callMpsApi('CreateAigcAudioTask', params, config); return result;}/** * 查询 AIGC 生音频任务 * @param {string} taskId – 创建任务时返回的 TaskId * @param {object} config – 配置对象 */async function describeMusicTask(taskId, config) { const params = { TaskId: taskId }; const result = await callMpsApi('DescribeAigcAudioTask', params, config); return result;}module.exports = { callMpsApi, createMusicTask, describeMusicTask};
十一、生成音乐(完整流程)
const { signRequest } = require('./tencent-sign');const axios = require('axios');const MPS_HOST = 'mps.tencentcloudapi.com';// === 配置 ===const config = { tencentCloud: { secretId: '你的 SecretId', secretKey: '你的 SecretKey', region: 'ap-guangzhou' }};// === 通用调用函数 ===async function callMpsApi(action, params) { const payload = JSON.stringify(params); const { headers } = signRequest( config.tencentCloud.secretId, config.tencentCloud.secretKey, 'mps', action, payload, config.tencentCloud.region ); const resp = await axios.post(`https://${MPS_HOST}`, payload, { headers }); return resp.data;}// === 主流程 ===async function generateMusic() { // 第 1 步:创建音乐生成任务 console.log(' 正在创建音乐生成任务…'); const createResult = await callMpsApi('CreateAigcAudioTask', { ModelName: 'MinimaxMusic', ModelVersion: '2.6', SceneType: 'music', Prompt: '这是一个寒冷的冬天,需要女声来唱', // 风格 / 演唱要求 OutputAudioFormat: 'mp3', // 歌词通过 AdditionalParameters 的 lyrics 字段传入(JSON 字符串) AdditionalParameters: JSON.stringify({ lyrics: [ '风吹过空荡的街', '天空灰得像沉默的夜', '呼出的白雾慢慢盘旋', '落在肩头的是冰冷季节', '', // 空行分隔段落(主歌 / 副歌) '这是一个寒冷的冬天', '树枝在风里轻轻哽咽' ].join('\\n') }) }); const taskId = createResult.Response.TaskId; console.log(`✅ 任务创建成功, TaskId: ${taskId}`); // 第 2 步:轮询查询结果 let status = 'WAIT'; let audioInfos = []; let errorMessage = ''; while (status === 'WAIT' || status === 'RUN') { // 等待 5 秒 await new Promise(resolve => setTimeout(resolve, 5000)); const queryResult = await callMpsApi('DescribeAigcAudioTask', { TaskId: taskId }); status = queryResult.Response.Status; console.log(`⏳ 任务状态: ${status}`); if (status === 'DONE') { // 生成成功,取出音频信息 audioInfos = queryResult.Response.AudioInfos; } else if (status === 'FAIL') { // 生成失败,取出错误信息 errorMessage = queryResult.Response.Message; } } // 第 3 步:取出并展示音频结果 if (status === 'DONE') { console.log(' 音乐生成成功!'); } else { console.error('❌ 生成失败:', errorMessage); } return audioInfos;}generateMusic().catch(console.error);
十二、配置文件参考
以下是一个完整的配置示例,涵盖音频生成的所有可配置项:
{ "tencentCloud": { "secretId": "你的 SecretId", "secretKey": "你的 SecretKey", "region": "ap-guangzhou" }, "cosOutput": { "bucket": "your-bucket-name-1234567890", "region": "ap-guangzhou", "outputDir": "/aigc-music-output/" }, "mps": { "musicGeneration": { "enabled": true, "modelName": "MinimaxMusic", "modelVersion": "2.6", "outputAudioFormat": "mp3" } }, "concurrency": { "maxMusicTasks": 1, "pollIntervalMs": 5000 }}
十三、附录:HTTP 原始请求示例
如果你使用其他语言(Python / Go / Java 等),可以参考以下 HTTP 原始请求格式:
十四、创建音频生成任务
POST / HTTP/1.1Host: mps.tencentcloudapi.comContent-Type: application/jsonX-TC-Action: CreateAigcAudioTask<公共请求参数>{ "ModelName": "Tme", "ModelVersion": "1.0", "SceneType": "music", "Prompt": "生成一段音乐", "VideoInfos": [ { "VideoUrl": "https://l***-******-tts-131140***2.c***ap-*ua****ou.myqcloud.com/251006278_1513228070381297256.mp4" } ], "AudioInfos": [ { "AudioUrl": "https://li**-q*******ts-1311402212*cos*ap-guangzh****yqcloud.com/25*******_1513228070381297256.wav" } ], "OutputAudioFormat": "wav", "ExtraParameters": { "ResourceId": "438910555_1" }, "AdditionalParameters": "{\\"sequential_image_generation\\":\\"auto\\"}", "Operator": "admin"}
十五、查询任务
POST / HTTP/1.1Host: mps.tencentcloudapi.comContent-Type: application/jsonX-TC-Action: DescribeAigcAudioTask<公共请求参数>{ "TaskId": "24000145-******d**-cb46b8040b684b539bbd46****e*e2fd"}