> ## Documentation Index
> Fetch the complete documentation index at: https://docs.youka.io/llms.txt
> Use this file to discover all available pages before exploring further.

# 스템

> 기존 프로젝트에서 스템 분리 작업을 트리거합니다

스템은 원본 오디오에서 추출된 보컬 및 악기 트랙입니다. Youka는 프로젝트를 생성할 때 자동으로 스템을 분리하지만, 필요할 때마다 다른 모델로 분리를 다시 실행할 수 있습니다.

## `client.projects.separateStems(projectId, body, options?)`

프로젝트에 대해 새로운 스템 분리 작업을 시작합니다.

```ts theme={null}
const operation = await client.projects.separateStems("prj_abc123", {
  splitModel: "audioshakeai",
});

const { project } = await client.projects.wait(operation);
console.log(project.stems);
```

### Parameters

<ParamField path="projectId" type="string" required>
  다시 처리할 프로젝트입니다.
</ParamField>

<ParamField path="splitModel" type="SplitModel">
  스템 분리 모델입니다. 안내는 [Split model reference](/ko/desktop/split-model)를
  참고하세요.
</ParamField>

### Available models

| Value                                         | Description           |
| --------------------------------------------- | --------------------- |
| `mdx23c`                                      | 기본값. 품질과 속도의 균형.      |
| `audioshakeai`                                | 고품질 AudioShake 분리.    |
| `audioshake_vocals_lead`                      | 보컬 및 리드 보컬만.          |
| `musicai_instrumental_only`                   | 악기만 출력.               |
| `musicai_lead_backing_other`                  | 리드, 코러스 보컬, 기타 스템.    |
| `musicai_with_backing_vocals`                 | 코러스 트랙을 포함한 보컬.       |
| `musicai_without_backing_vocals`              | 리드 보컬만.               |
| `uvr_mdxnet_kara_2`                           | 노래방에 맞게 튜닝된 UVR 모델.   |
| `bs_roformer`                                 | BS-Roformer 모델.       |
| `mel_band_roformer_instrumental_becruily`     | Mel-band Roformer 악기. |
| `mel_band_roformer_instrumental_instv7_gabox` | 대체 Mel-band 악기.       |
| `demucs`                                      | Facebook Demucs.      |

## End-to-end example

```ts theme={null}
import { YoukaClient, YoukaTaskError } from "@youka/ko/sdk";

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

async function reRunStems(projectId: string) {
  const operation = await client.projects.separateStems(projectId, {
    splitModel: "audioshakeai",
  });

  try {
    const { project } = await client.projects.wait(operation);
    console.log("New stems:", project.stems);
  } catch (error) {
    if (error instanceof YoukaTaskError) {
      console.error("Stem separation failed:", error.code, error.message);
      throw error;
    }
    throw error;
  }
}
```

<Tip>
  저수준 task 접근이 명시적으로 필요할 때만 `client.tasks.get(taskId)` 또는
  `client.tasks.wait(taskId)`를 사용하세요. 대부분의 호출자는
  `client.projects.wait(operation)`을 사용하는 것이 좋습니다.
</Tip>

## `client.projects.downloadStem(projectId, selector, options?)`

다른 형식으로 변환하지 않고 스템 하나를 다운로드합니다. ID 또는 type으로
정확히 하나의 스템을 선택하세요:

```ts theme={null}
await client.projects.downloadStem(
  "prj_abc123",
  { type: "instrumental" },
  { output: "./stems" },
);

await client.projects.downloadStem(
  "prj_abc123",
  { stemId: "stm_abc123" },
  { output: "./stems/original.wav" },
);
```

지원되는 type은 `original`, `instrumental`, `vocals`, `backing_vocals`입니다.

## `client.projects.downloadStems(projectId, selector?, options?)`

여러 스템을 다운로드합니다. `types`를 전달하거나 `stemIds`를 전달하거나,
selector를 생략하면 사용 가능한 모든 스템을 다운로드합니다:

```ts theme={null}
await client.projects.downloadStems(
  "prj_abc123",
  { types: ["original", "instrumental", "vocals"] },
  { output: "./stems" },
);

await client.projects.downloadStems("prj_abc123", undefined, {
  output: "./stems",
});
```

여러 스템을 다운로드할 때는 출력 디렉터리를 사용하세요. SDK는 저장된 원본 스템
파일을 그대로 쓰며 트랜스코딩하지 않습니다.

## What's next

* [Lyrics sync](/ko/sdk/lyrics-sync) — 스템을 교체한 뒤 가사를 다시 동기화
* [Tasks](/ko/sdk/tasks) — operation 핸들 및 고급 task 폴링
* [Split model reference](/ko/desktop/split-model) — 적절한 모델 선택하기
