Проекты — это ресурс верхнего уровня в 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
}
Blob, File, ArrayBuffer или Uint8Array в памяти.source: {
type: "bytes",
data: fileBuffer,
filename: "song.mp3",
contentType: "audio/mpeg", // optional
}
Удалённый URL по HTTP или HTTPS.Поддерживаемые хостинги зависят от yt-dlp. См. список поддерживаемых URL.source: {
type: "url",
url: "https://example.com/song.mp4",
maxVideoQuality: "1080p", // optional: "720p", "1080p", "4k", or "best"
}
maxVideoQuality задаёт максимальное качество скачиваемого видео для URL
источников. По умолчанию — 1080p. SDK использует лучшее доступное качество
в пределах этого лимита и откатывается к лучшему доступному формату, если платформа
не предоставляет поток с ограничением по качеству. Используйте best, чтобы снять ограничение.В Node.js и Bun SDK при первом использовании автоматически обеспечивает наличие необходимых
бинарников зависимостей для URL (ffmpeg, ffprobe, yt-dlp). Эквивалент в CLI —
youka deps ensure --for url.
Другие поля
Название проекта. По умолчанию — имя исходного файла.
Применить переиспользуемый пресет при создании.
Настройка синхронизации текста. См. ниже.
Источники текста
// 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() также принимает низкоуровневый источник 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",
});
Оцените количество кредитов, необходимых для создания проекта, не создавая его.
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,
});
Любое тело, совместимое с 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