Skip to main content
Проекты — это ресурс верхнего уровня в Youka. Каждый проект содержит исходный файл, разделённые стемы, синхронизированные тексты, экспорты и настройки проекта.

Создание проекта

В большинстве случаев используйте client.projects.create() — он сам обрабатывает загрузки.
const operation = await client.projects.create({
  source: { type: "path", path: "./song.mp3" },
  lyricsSource: { type: "transcribe" },
});
// => ProjectOperation

Типы источников

Читает файл с диска.
source: {
  type: "path",
  path: "./song.mp3",
  contentType: "audio/mpeg", // optional, inferred if omitted
}

Другие поля

title
string
Название проекта. По умолчанию — имя исходного файла.
splitModel
SplitModel
Модель разделения на стемы. По умолчанию — mdx23c. См. справочник моделей Split.
presetId
string
Применить переиспользуемый пресет при создании.
lyricsSource
LyricsSource
Настройка синхронизации текста. См. ниже.

Источники текста

// 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() также принимает низкоуровневый источник inputFile, когда у вас уже есть загруженный inputFileId.
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?)

Оцените количество кредитов, необходимых для создания проекта, не создавая его.
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(...) принимает те же формы source, что и client.projects.create(...), включая URL maxVideoQuality. Если вы уже знаете длительность медиа и не хотите загружать файл только ради оценки, передайте низкоуровневую REST-форму:
const quote = await client.projects.quote({
  durationSeconds: 210,
  lyricsSource: null,
  splitModel: "mdx23c",
});

client.uploads.create(body, options?)

Выделите слот для загрузки и получите подписанный URL.
const upload = await client.uploads.create({
  filename: "song.mp3",
  contentType: "audio/mpeg",
  contentLength: 4_521_344,
});
// => { inputFileId, uploadUrl }

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

Загрузите байты файла на подписанный URL методом PUT.
await client.uploads.upload(upload.uploadUrl, fileBuffer, {
  contentType: "audio/mpeg",
  signal: abortController.signal,
});
body
FetchBody
required
Любое тело, совместимое с fetch: Blob, File, ArrayBuffer, Uint8Array, ReadableStream или string.
Выбрасывает YoukaRequestError с кодом UPLOAD_FAILED, если загрузка возвращает статус не из диапазона 2xx.

client.projects.get(projectId, options?)

Получите полное состояние проекта, включая стемы, текст и экспорты.
const project = await client.projects.get("prj_abc123");
console.log(project.title, project.stems, project.lyrics);

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

Частично обновите метаданные проекта.
const project = await client.projects.update("prj_abc123", {
  title: "Updated title",
  artists: ["Artist name"],
});
Передайте как минимум одно из: title или artists.

client.projects.list(options?)

Выведите список всех проектов, принадлежащих аутентифицированному аккаунту.
const projects = await client.projects.list();
projects.forEach((p) => console.log(p.id, p.title));
Возвращает массив элементов списка проектов (более компактная форма, чем getProject).

client.projects.delete(projectId, options?)

Удалите проект и все связанные с ним стемы, тексты и экспорты.
await client.projects.delete("prj_abc123", {
  idempotencyKey: "delete-prj_abc123",
});
Удаление необратимо. Используйте ключ идемпотентности, чтобы повторы были безопасны.

Что дальше

  • Stems — повторно запустить разделение на стемы
  • Lyrics sync — повторно синхронизировать текст
  • Exports — рендерить готовые видео
  • Tasks — ожидать операции проекта с помощью client.projects.wait