返回 Skill 列表
extension
分类: 其它需要 API Key

baiyin-cover-train-skill

当用户希望通过百音开放平台训练 AI 歌手模型、查询训练任务状态,或根据已有 taskId 返回最终训练结果时使用。

person作者: user_7b3c719ehubcommunity

前导检查(先执行)

_ROOT="$(git rev-parse --show-toplevel 2>/dev/null || pwd)"
[ -x "$_ROOT/skill/bin/baiyin-skill-update-check" ] && _UPD=$(bash "$_ROOT/skill/bin/baiyin-skill-update-check" "$_ROOT/skill/baiyin-cover-train-skill" 2>/dev/null || true)
[ -n "${_UPD:-}" ] && echo "$_UPD"

如果输出 UPGRADE_AVAILABLE <old> <new> <slug>

  • 读取 skill/baiyin-skills-upgrade/SKILL.md,执行其中的「内联升级流程」。
  • 如果宿主支持 AskUserQuestion,使用中文四选一:立即更新 / 以后自动更新 / 暂不更新 / 不再提醒
  • 如果宿主不支持 AskUserQuestion(例如 OpenClaw 当前会话),直接询问用户: 检测到百音技能 <slug> 有新版本(当前 v<old>,最新 v<new>)。请回复:1 立即更新 / 2 以后自动更新 / 3 暂不更新 / 4 不再提醒。

如果输出 JUST_UPGRADED <old> <new> <slug>

  • 告诉用户:百音技能 <slug> 已更新到 v<new>,继续处理你的请求。

如果输出 UP_TO_DATESNOOZEDCHECK_DISABLEDCHECK_FAILED

  • 不打断当前任务,直接继续。

AI 歌手训练

当用户希望通过百音开放平台创建 AI 歌手训练任务、查询训练进度,或获取最终训练结果时,使用这个 skill。

前置要求

  • BAIYIN_API_KEY

运行时配置

  • BASE_URL 固定使用 https://ai.hikoon.com
  • 只有 BAIYIN_API_KEY 缺失时,才向用户索要 API Key。

公网地址处理

  • 当歌手训练需要公网音频或图片 URL,而用户提供的是本地文件路径、聊天附件、网盘私链或其他不可直接访问的地址时,不要只提示“需要公网 URL”。
  • 直接指导用户先使用百音开放平台文件上传接口上传文件,拿到公网地址后再继续当前流程。
  • 上传接口:POST {BASE_URL}/api/open/v1/file/upload
  • 认证方式:Authorization: Bearer <API_KEY>Content-Type: multipart/form-data
  • 表单字段:file 必填,filename 选填,dir 选填
  • 成功后从返回的 data.url 取公网地址,填入 materialUrlavatar 等需要 URL 的字段
  • 不要求用户自行准备 OSS、CDN 或其他外部存储;优先提示百音开放平台上传能力

接口地址

  • 创建任务:POST {BASE_URL}/api/open/v1/cover/train
  • 查询任务:GET {BASE_URL}/api/open/v1/tasks/{taskId}

核心模式

根据用户表达判断当前模式。除非必要,不要要求用户自己选择技术字段名。

  • 创建模式
    • 用户要训练一个新的歌手模型
    • 需要提供可用的训练音频 URL
  • 状态模式
    • 用户要查询进度、状态,或是否训练完成
    • 需要当前会话里明确的 taskId,或者用户消息里直接提供的 taskId
  • 结果模式
    • 用户要查看训练结果、模型 ID、试听链接等
    • 和状态模式共用同一个任务查询接口
    • 可以在用户明确要求“继续查”“轮询等待”“等到出结果”为止时持续轮询

参数策略

只要已经能组成合法训练请求,就不要为了可选字段反复追问用户。

  • 从对话中提取已有字段:
    • name
    • materialUrl
    • description
    • avatar
    • tags
    • trainType
  • 用户没写时使用默认值:
    • trainType = 2
  • 只有在请求信息不足以组成可用训练任务时,才追问。

字段映射规则

  • name
    • 优先使用用户提供的歌手名或模型名。
    • 如果用户描述了音色身份但没有明确命名,可以推断一个简短可用的名称,不必因此阻塞任务。
  • materialUrl
    • 必须是可访问的公开音频 URL。
    • 不要虚构 URL。
  • description
    • 用户提供时直接带上。
    • 用户没提供就省略。
  • avatar
    • 只有用户提供了可用图片 URL 时才填写。
  • tags
    • 用户给出音色、风格、语言、性别、声线等提示时,整理成逗号分隔字符串。
  • trainType
    • 用户明确要求高质量、最好效果、精品训练时,用 1
    • 用户明确要求快速训练,或者没有指定训练类型时,用 2
    • 不要发送 12 之外的值。

请求体

创建训练任务时使用如下基础结构:

{
  "name": "<user name or inferred short name>",
  "materialUrl": "<public audio url>",
  "trainType": 2,
  "description": "<optional description>",
  "avatar": "<optional avatar url>",
  "tags": "<optional comma-separated tags>"
}

编码规则

  • 发送包含中文的 namedescriptiontags 时,必须确保请求体使用 UTF-8 编码。
  • 如果当前调用方式不能稳定发送 UTF-8 中文,优先改用明确指定 UTF-8 的请求方式。
  • 不要把 ??、乱码、替代字符当作有效模型名称。

任务查询结果

对于 cover_model 任务,查询接口会返回标准化状态,以及以下结果字段:

  • modelId
  • modelName
  • userTaskId
  • demoUrl
  • avatar
  • trainType

可能状态:

  • queued
  • processing
  • succeeded
  • failed

结果校验

  • 当任务进入 processingsucceeded 后,检查返回的 modelName 是否与原始请求明显一致。
  • 如果 modelName 为乱码、??、空值,或明显不是用户提交的名称,视为异常结果。
  • 异常结果不能作为最终交付返回给用户。
  • 出现名称异常时,要明确说明编码或写入异常,并建议重新创建任务或改用稳定编码方式重试。

对话行为

  • 如果用户说“训练这个声音”“做一个歌手模型”“克隆这个歌手”,并且已经给出可用音频 URL,就直接创建任务。
  • 如果用户说“查下这个训练任务”“完成了吗”“把结果给我”,且上下文指向明确,就复用当前会话最近一个训练 taskId
  • 如果没有明确 taskId,但用户要查状态或结果,就直接让用户提供 taskId
  • 只要请求已经足够创建训练任务,就不要追问 descriptionavatartags 这类可选字段。
  • 将 “high quality”“best quality”“premium training” 视为 trainType = 1
  • 将 “fast”“quick”“rapid training” 视为 trainType = 2

最少追问原则

只有在以下情况下才追问:

  • 请求里没有可用的训练音频 URL
  • 请求里没有足够信息推断出可用的模型名称
  • 用户要查询状态或结果,但当前上下文没有明确 taskId

不要为了确认以下内容单独追问:

  • optional description
  • optional avatar
  • optional tags
  • trainType when fast training is acceptable as the default

工作流程

  1. 先确认用户要的是歌手模型训练,不是 AI 翻唱。
  2. 判断当前是创建模式还是查询模式。
  3. 创建模式下,从用户请求中提取训练参数并补默认值。
  4. 调用创建训练任务接口。
  5. 返回 taskIdrequestId 和当前 status
  6. 用户后续查询状态或结果时,使用已有 taskId 调用任务查询接口。
  7. 如果用户明确要求持续等待结果,可以按固定间隔轮询同一个 taskId
  8. 轮询时,状态为 queuedprocessing 就继续等待;状态变成 succeededfailed 就停止。
  9. 轮询间隔默认 10 分钟,单次连续轮询默认最多 6 次;如果用户要求继续,再继续下一轮。
  10. 回复时优先返回状态。
  11. 任务成功后,返回 modelIddemoUrl 以及其他可用字段。
  12. 任务失败时,明确返回后端 error,不要假装模型已训练完成。

输出格式

  • 创建任务后,回复中应包含:
    • 简短确认
    • taskId
    • 当前 status
    • 有必要时补一句参数理解摘要
  • 轮询或查询时,保持回复简洁,先说状态。
  • 如果用户要求轮询等待,回复中应说明这是轮询结果,并在结束时明确说明是成功结束还是失败结束。
  • 任务成功时,输出顺序优先:
    • modelId
    • demoUrl
    • modelNameavataruserTaskIdtrainType

错误处理

  • 创建任务返回 400 时,说明请求参数不合法或不完整,并让用户修正音频 URL 或训练字段。
  • 创建任务返回 401 时,说明百音开放平台 API Key 无效或当前环境不可用。
  • 创建任务返回 402 时,说明账户余额不足。
  • 查询任务返回 404 时,说明任务不存在,并让用户提供正确的 taskId
  • 任务状态为 failed 时,有后端错误信息就直接返回。

示例

示例 1:

  • User: Train a singer model called Luna from this audio: https://example.com/luna.wav
  • 识别结果:
    • create mode
    • name = "Luna"
    • materialUrl = "https://example.com/luna.wav"
    • trainType = 2

示例 2:

  • User: Create a high quality singer training task for Neon Voice using https://example.com/neon.mp3
  • 识别结果:
    • create mode
    • name = "Neon Voice"
    • trainType = 1

示例 3:

  • User: Check the last singer training task
  • 识别结果:
    • status mode
    • reuse the most recent training taskId from the same conversation when available

示例 4:

  • User: Show me the result for task_abc123
  • 识别结果:
    • result mode
    • query GET /api/open/v1/tasks/task_abc123
    • return modelId and demoUrl when status is succeeded

回复规则

  • 在任务查询结果明确为 succeeded 之前,不要声称训练已经完成。
  • 最终结果以任务查询接口返回字段为准,不要猜。
  • 如果状态还是 queuedprocessing,就如实返回,不要虚构模型结果。
  • 即使成功结果里没有 demoUrl,也要返回已有的 modelId 和其他字段。
  • 最终交付给用户的模型名称必须可读且不含乱码。
  • 如果返回的 modelName 存在乱码或 ??,必须明确标记为异常结果,不能当作正常成功结果交付。
  • 用户只要求“查一次”时,不要擅自长时间轮询。