@youka/sdk

中文文档
0.3.0发布于 2026/11/03UNLICENSEDTypeScriptES Module

Official Node.js SDK for the Youka API.

原始使用文档
文档目录10 节
  1. Install
  2. API key
  3. Create a karaoke video
  4. Transcribe lyrics automatically
  5. Use ElevenLabs Scribe
  6. Use a hosted media URL
  7. Handle errors
  8. Docs
  9. Model discovery and lyric videos
  10. Correct timings and reuse versions

@youka/sdk

Official Node.js SDK for the Youka API.

Use this package to create karaoke videos from Node.js: upload audio or video, sync or transcribe lyrics, create a karaoke project, render the final video, and download the MP4.

Install

npm install @youka/sdk

API key

Create an API key at online.youka.io/account under API keys.

Keep the key outside your source code:

export YOUKA_API_KEY="yk_..."

Create a karaoke video

import { AlignmentModel, YoukaClient } from "@youka/sdk";

const client = new YoukaClient({
  apiKey: process.env.YOUKA_API_KEY!,
});

const operation = await client.projects.create({
  source: {
    type: "path",
    path: "./song.mp3",
  },
  lyricsSource: {
    type: "align",
    lyrics: "Line one\nLine two\nLine three",
  },
  title: "Artist - Song",
});

const { project } = await client.projects.wait(operation);

const exportOperation = await client.exports.create(project.id, {
  resolution: "1080p",
  quality: "high",
});

const finalized = await client.exports.wait(exportOperation);

await client.exports.download(finalized, {
  output: "./karaoke.mp4",
});

Transcribe lyrics automatically

Use transcription when you do not already have lyrics text:

const operation = await client.projects.create({
  source: { type: "path", path: "./song.mp3" },
  lyricsSource: { type: "transcribe" },
  title: "Artist - Song",
});

When syncModel is omitted, Youka uses ElevenLabs Scribe. ElevenLabs transcription is available to every user; AudioShake, MusicAI, and Whisper transcription require premium access.

Use ElevenLabs Scribe

Choose ElevenLabs Scribe for word-timed transcription without supplied lyrics:

import { AlignmentModel } from "@youka/sdk";

const operation = await client.projects.create({
  source: { type: "path", path: "./song.mp3" },
  lyricsSource: {
    type: "transcribe",
    syncModel: AlignmentModel.ElevenLabsTranscription,
  },
  title: "Artist - Song",
});

If you already have lyrics, pass them as optional transcription guidance:

const operation = await client.projects.create({
  source: { type: "path", path: "./song.mp3" },
  lyricsSource: {
    type: "transcribe",
    syncModel: AlignmentModel.ElevenLabsTranscription,
    lyrics: "Line one\nLine two\nLine three",
  },
  title: "Artist - Song",
});

Scribe always returns its own word text and timing. Supplied lyrics improve vocabulary recognition; they do not force the output to match the supplied text.

Use a hosted media URL

You can also create a karaoke video from a hosted media URL:

const operation = await client.projects.create({
  source: {
    type: "url",
    url: "https://example.com/song.mp4",
  },
  lyricsSource: {
    type: "align",
    lyrics: "Line one\nLine two",
  },
});

URL helpers automatically ensure the local download binaries on first use. Supported hosted sites depend on yt-dlp: https://github.com/yt-dlp/yt-dlp/blob/master/supportedsites.md

Handle errors

import { YoukaRequestError, YoukaTaskError } from "@youka/sdk";

try {
  const operation = await client.projects.create({
    source: { type: "path", path: "./song.mp3" },
    lyricsSource: { type: "transcribe" },
  });

  await client.projects.wait(operation);
} catch (error) {
  if (error instanceof YoukaRequestError) {
    console.error(error.code, error.status, error.message);
  } else if (error instanceof YoukaTaskError) {
    console.error(error.code, error.status, error.message);
  } else {
    throw error;
  }
}

Docs

Model discovery and lyric videos

Use await client.capabilities.get() to discover supported models, workflows, input requirements, language policies, and account eligibility. Every supported model is represented; isolated-vocal models are restricted to compatible workflows. Quotes and creation enforce the same rules.

const operation = await client.projects.create({
  kind: "lyric-video",
  source: { type: "path", path: "./reference.wav" },
  title: "Lyric overlay",
  lyricsSource: {
    type: "transcribe",
    syncModel: AlignmentModel.ElevenLabsTranscription,
    lyrics: "Optional recognition hints",
    languageHintMode: "auto",
  },
});
const { project } = await client.projects.wait(operation);

Lyric videos skip separation and reject splitModel. Omitted kind preserves karaoke behavior. Use lyricsSource: { type: "align", lyrics: "...", syncModel } for supplied-text alignment or lyricsSource: null to skip lyric processing. projects.quote() accepts the same source/workflow configuration.

Correct timings and reuse versions

const list = await client.projects.alignments.list(project.id);
const current = await client.projects.alignments.get(
  project.id,
  list.alignments[0]!.id,
);
const corrected = structuredClone(current.alignment);
corrected.items[0]!.start = 1.25;
corrected.items[0]!.end = 1.75;
await client.projects.alignments.update(project.id, current.id, {
  alignment: corrected,
  expectedRevision: current.revision,
  select: true,
  expectedSelectionRevision: current.selectionRevision,
});
const versions = await client.projects.versions.list(project.id);
const versionId = versions[0]!.id;
const settings = await client.projects.getSettings(project.id, { versionId });
await client.projects.updateSettings(project.id, {
  versionId,
  settings: settings.settings,
});
const fresh = await client.projects.get(project.id);
await client.exports.create(project.id, {
  target: "local",
  versionId,
  transparent: true,
  stemVolumes: Object.fromEntries(fresh.stems.map((stem) => [stem.id, 0])),
  outputPath: "./overlay.mov",
});

Timing replacement uses complete, absolute decimal-second timings. Preserve IDs, indexes, singer, and translation metadata. Invalid ranges are rejected and stale revisions return conflicts; refetch and reconcile before retrying. Selection alone uses projects.alignments.select(projectId, alignmentId, { expectedRevision, expectedSelectionRevision }). Neither operation starts an AI task.

Local transparent exports use ProRes 4444. Muting stems means silent output; it does not promise removal of the audio stream. Local export starts no paid render or realignment job and retains existing feature eligibility. Line anticipation is layout-dependent; it is not a fixed per-line reveal guarantee.

These methods require the matching server endpoints to be deployed before the new SDK version is published. See the repository's capability-parity guide for rollout and acceptance requirements.

版本与发布记录

@youka/sdk 共发布 14 个版本,首次发布于 2026/04/12;过去 12 个月发布了 14 个版本。

版本发布日期距今
0.3.0latest2026/11/03今天
0.2.02026/09/221 个月前
0.1.112026/04/236 个月前
0.1.102026/04/236 个月前
0.1.92026/04/176 个月前
0.1.82026/04/176 个月前

关于 @youka/sdk 的常见问题

@youka/sdk 是什么?

优卡API的官方Node.js SDK。

如何安装 @youka/sdk?

在项目目录运行 npm install @youka/sdk,或使用 pnpm add / yarn add / bun add。

@youka/sdk 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@youka/sdk 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@youka/sdk 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=24。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@youka/sdk 可以商用吗?

@youka/sdk 使用 UNLICENSED 许可。作者声明为 UNLICENSED,即不授予公开使用许可(与公共领域的 Unlicense 不同)。使用前需获得作者授权。以上为概括,不构成法律意见,请以许可原文为准。

@youka/sdk 还在维护吗?

最新版本 0.3.0 发布于 2026/11/03(今天);至今共发布 14 个版本,其中过去 12 个月发布了 14 个;首次发布于 2026/04/12。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。