Skip to main content
Projects là tài nguyên cấp cao nhất trong Youka. Mỗi project sở hữu tệp nguồn, các stem đã tách, lời bài hát đã đồng bộ, các bản xuất, và cài đặt project.

Tạo một project

Trong hầu hết trường hợp, hãy dùng client.projects.create() — hàm này sẽ tự xử lý việc tải lên cho bạn.
const operation = await client.projects.create({
  source: { type: "path", path: "./song.mp3" },
  lyricsSource: { type: "transcribe" },
});
// => ProjectOperation

Các loại source

Đọc một tệp từ ổ đĩa.
source: {
  type: "path",
  path: "./song.mp3",
  contentType: "audio/mpeg", // optional, inferred if omitted
}

Các trường khác

title
string
Tiêu đề project. Mặc định là tên tệp nguồn.
splitModel
SplitModel
Mô hình tách stem. Mặc định là mdx23c. Xem tài liệu tham chiếu Split model reference.
presetId
string
Áp dụng một preset có thể tái sử dụng tại thời điểm tạo.
lyricsSource
LyricsSource
Cấu hình đồng bộ lời bài hát. Xem bên dưới.

Các nguồn lyrics

// Transcribe lyrics from the audio
lyricsSource: {
  type: "transcribe",
  syncModel: "audioshake-transcription", // optional
  language: "en",                        // optional
}

// Align exact lyrics to the audio
lyricsSource: {
  type: "align",
  lyrics: "First line\nSecond line\n...",
  syncModel: "audioshake-alignment",
}

client.projects.create(input, options?)

client.projects.create() cũng chấp nhận source inputFile cấp thấp khi bạn đã có inputFileId được tải lên.
const upload = await client.uploads.create({
  filename: "song.mp3",
  contentType: "audio/mpeg",
  contentLength: buffer.byteLength,
});

await client.uploads.upload(upload.uploadUrl, buffer, {
  contentType: "audio/mpeg",
});

const operation = await client.projects.create({
  source: {
    type: "inputFile",
    inputFileId: upload.inputFileId,
    filename: "song.mp3",
  },
  title: "My Song",
});

client.projects.quote(input, options?)

Báo giá số credits cần để tạo một project mà không tạo project đó.
const quote = await client.projects.quote({
  source: { type: "path", path: "./song.mp3" },
  lyricsSource: { type: "transcribe", language: "en" },
  splitModel: "mdx23c",
});

console.log(quote.creditsRequired, quote.sufficientBalance);
client.projects.quote(...) chấp nhận cùng các dạng source như client.projects.create(...), bao gồm URL maxVideoQuality. Nếu bạn đã biết thời lượng media và không muốn tải tệp lên chỉ để báo giá, hãy truyền dạng REST cấp thấp:
const quote = await client.projects.quote({
  durationSeconds: 210,
  lyricsSource: null,
  splitModel: "mdx23c",
});

client.uploads.create(body, options?)

Cấp phát một slot tải lên và nhận một URL đã ký.
const upload = await client.uploads.create({
  filename: "song.mp3",
  contentType: "audio/mpeg",
  contentLength: 4_521_344,
});
// => { inputFileId, uploadUrl }

client.uploads.upload(uploadUrl, body, options?)

PUT các byte của tệp lên URL đã ký.
await client.uploads.upload(upload.uploadUrl, fileBuffer, {
  contentType: "audio/mpeg",
  signal: abortController.signal,
});
body
FetchBody
required
Bất kỳ body tương thích với fetch: Blob, File, ArrayBuffer, Uint8Array, ReadableStream, hoặc string.
Ném YoukaRequestError với mã UPLOAD_FAILED nếu thao tác tải lên trả về trạng thái không thuộc 2xx.

client.projects.get(projectId, options?)

Lấy trạng thái đầy đủ của project, bao gồm stems, lyrics, và exports.
const project = await client.projects.get("prj_abc123");
console.log(project.title, project.stems, project.lyrics);

client.projects.update(projectId, body, options?)

Patch metadata của project.
const project = await client.projects.update("prj_abc123", {
  title: "Updated title",
  artists: ["Artist name"],
});
Hãy truyền ít nhất một trong title hoặc artists.

client.projects.list(options?)

Liệt kê mọi project thuộc về tài khoản đã xác thực.
const projects = await client.projects.list();
projects.forEach((p) => console.log(p.id, p.title));
Trả về một mảng các project list item (một dạng gọn hơn so với getProject).

client.projects.delete(projectId, options?)

Xóa một project và tất cả stems, lyrics, và exports liên quan.
await client.projects.delete("prj_abc123", {
  idempotencyKey: "delete-prj_abc123",
});
Việc xóa là vĩnh viễn. Hãy kết hợp với một idempotency key để việc thử lại được an toàn.

Tiếp theo

  • Stems — chạy lại tách stem
  • Lyrics sync — đồng bộ lại lyrics
  • Exports — render video hoàn chỉnh
  • Tasks — chờ các thao tác project với client.projects.wait