# 자막 추가

> 동영상의 음성을 텍스트로 변환해 깔끔한 정적 자막이나 단어별 애니메이션 스타일 5가지 중 하나로 입히고, 글꼴, 외곽선, 위치, 줄당 단어 수를 정하세요.

Source: https://nodaro.ai/ko/docs/nodes/video/add-captions

**자막 추가** 노드는 동영상에 자막을 넣습니다. 동영상 속 음성을 텍스트로 변환하거나 연결한 녹취록을 받아, 단어를 화면에 입힙니다. 깔끔한 정적 자막을 보여 줄 수도 있고, 말을 단어별로 따라가는 애니메이션 스타일 5가지 중 하나를 쓸 수도 있습니다. 글꼴, 외곽선, 위치, 줄마다 들어가는 단어 수도 정할 수 있습니다.

- Found in: Video › Titles, Graphics & Captions
- Output: video
- API type: `add-captions`

## 사용 시기
- 토킹 헤드 동영상이나 내레이션 동영상에 자막을 넣고 싶을 때.
- TikTok, Reels, Shorts용 단어별 애니메이션 자막을 원할 때.
- 음성이 있는 모든 동영상에 접근성 자막을 넣고 싶을 때.
- 뮤직비디오에 가라오케 스타일 가사를 넣고 싶을 때.

## 빠른 시작
### 노드 추가
캔버스에서 Tab을 누르고 **동영상 › 타이틀, 그래픽 및 자막 › 자막 추가**를 선택하세요.

### 동영상 연결
음성이 또렷한 동영상을 **동영상** 입력에 연결하세요. 노드가 음성을 직접 텍스트로 변환합니다. 이미 있는 녹취록을 쓰려면 그 녹취록도 **녹취록** 입력에 연결하세요.

### 스타일과 룩 선택
설정 패널을 열고 **TikTok 스타일 단어(키네틱)** 같은 **스타일**을 고른 다음 **룩**을 고르세요. 패널의 미리보기에 결과가 표시됩니다. **TikTok 볼드** 같은 기본 제공 프리셋에서 시작할 수도 있습니다.

### 실행
**실행**을 클릭하세요. 자막을 입힌 동영상이 노드에 나타납니다.

Workflow: 동영상의 오디오를 단어 타이밍과 함께 텍스트로 변환하고, 게시하기 전에 자막 추가가 단어를 TikTok 스타일 자막으로 입힙니다.

- 동영상 업로드 → 오디오 추출 (동영상)
- 오디오 추출 → 음성 텍스트 변환 (오디오)
- 동영상 업로드 → 자막 추가 (동영상)
- 음성 텍스트 변환 → 자막 추가 (녹취록)
- 자막 추가 → TikTok 게시물

## 입력
| 입력 | 받는 것 | 하는 일 |
| --- | --- | --- |
| **동영상** | 동영상 노드 | 자막을 넣을 동영상입니다. 필수입니다. |
| **녹취록** | [음성 텍스트 변환](https://nodaro.ai/docs/nodes/audio/transcribe), [EDL 적용](https://nodaro.ai/docs/nodes/video/apply-edl), [텍스트로 대화 만들기](https://nodaro.ai/docs/nodes/audio/text-to-dialogue), 화자 뷰, 카메라 전환의 녹취록 | 선택 사항입니다. 단어와 그 타이밍입니다. 연결하지 않으면 노드가 동영상의 음성을 텍스트로 변환합니다. |
| **캡션 플랜** | 타이밍이 정해진 캡션 플랜 | 선택 사항입니다. 이미 타이밍이 정해진 자막과 첫 줄입니다. [캡션 플랜 입력](#caption-plan-input)을 참조하세요. |

출력인 **동영상**은 자막을 입힌 동영상입니다.

## 설정
| 설정 | 기능 |
| --- | --- |
| **스타일** | 자막이 나타나는 방식입니다. 기본값은 <strong>자막(정적)</strong>입니다. 나머지 다섯 스타일은 애니메이션 스타일입니다. [자막 스타일](#caption-styles)을 참고하세요. |
| **룩** | 글꼴, 외곽선, 대소문자, 말하는 단어 색상을 묶은 프리셋으로, **외곽선(TikTok)** 또는 **클린**입니다. **자막** 스타일에는 기본값인 <strong>없음(기본)</strong>도 있습니다. 아래 컨트롤은 룩의 개별 요소를 덮어씁니다. [룩](#looks)을 참고하세요. |
| **위치** | **아래**(기본값), **위**, **가운데**입니다. [위치](#position)를 참고하세요. |
| **세로 위치** | 0~100% 슬라이더로, 자막 블록 중심의 높이입니다. 설정하면 **위치**를 덮어씁니다. **자동**을 누르면 배치가 다시 **위치**를 따릅니다. |
| **글꼴 크기** | 12~200픽셀입니다. 기본값은 32입니다. 애니메이션 스타일로 바꾸면 32로 둔 글꼴 크기가 64로 바뀌며, 되돌리면 다시 32가 됩니다. |
| **색상** | 텍스트 색상입니다. 기본값은 흰색(`#FFFFFF`)입니다. |
| **글꼴** | **자동(룩 기준)** 또는 Montserrat, Inter, Anton, Bebas Neue, Oswald, Poppins 등 24가지 글꼴 중 하나입니다. |
| **글꼴 두께** | **자동(룩 기본값)**, 또는 **100 가장 가늘게**부터 **900 가장 굵게**까지의 두께입니다. 글꼴에 그 두께가 없으면 가장 가까운 두께를 씁니다. |
| **줄당 최대 단어 수** | 1~20입니다. 비워 두면 프레임 너비가 허용하는 만큼 단어를 채웁니다. 항상 한 단어를 보여 주는 **워드 팝**에서는 숨겨집니다. [줄당 최대 단어 수](#max-words-per-line)를 참고하세요. |
| **모두 대문자** | 자막을 대문자로 보여 줍니다. |
| **외곽선 색상** | 텍스트 둘레 외곽선의 색상입니다. **자동** 버튼을 누르면 색상이 다시 룩을 따릅니다. |
| **외곽선 두께** | 0~40픽셀입니다. 비워 두면 룩을 따르고, `0`이면 외곽선이 없습니다. |
| **말하는 단어 색상** | 애니메이션 스타일 전용입니다. 지금 말하고 있는 단어의 색상입니다. **자동**이면 룩을 따릅니다. |
| **애니메이션** | 애니메이션 스타일 전용입니다. 기본값은 켜짐입니다. 끄면 단어별 움직임이 멈춥니다. [애니메이션](#animate)을 참고하세요. |
| **단어 단위 자막** | 애니메이션 스타일 전용입니다. 기본값은 켜짐으로, 단어마다 자막 하나를 만듭니다. 끄면 연결한 녹취록의 단어를 줄 단위로 묶습니다. |

![TikTok 스타일 단어 스타일, 외곽선 룩, 실시간 자막 미리보기, 위치와 글꼴 크기 설정이 보이는 자막 추가 설정 패널.](https://nodaro.ai/docs-media/screens/en/nodes/add-captions/settings.light.webp)

### 글꼴
**글꼴** 목록에는 24가지 글꼴이 있습니다.

| 종류 | 글꼴 |
| --- | --- |
| 산세리프 | Inter, Roboto, Open Sans, Montserrat, Poppins, Raleway, Nunito, Lato, Rubik, Heebo, Cairo, Tajawal |
| 세리프 | Playfair Display, Merriweather, Lora, EB Garamond |
| 좁은 디스플레이 | Bebas Neue, Oswald, Anton |
| 손글씨 | Dancing Script, Pacifico, Caveat |
| 고정폭 | Roboto Mono, Fira Code |

Rubik, Heebo, Cairo, Tajawal은 히브리어와 아랍어를 지원합니다. 히브리어와 아랍어 자막은 오른쪽에서 왼쪽으로 표시됩니다. 방향은 자막 대부분의 언어를 따르므로, 히브리어 클립 앞부분에 라틴 문자로 된 브랜드 이름이 있어도 줄의 방향이 뒤집히지 않습니다.

## 자막 스타일
| 스타일 | 보이는 모습 |
| --- | --- |
| **자막(정적)** | 표준 자막입니다. 텍스트로 변환한 음성은 구문 단위 줄로 한 번에 한 줄씩 화면에 유지됩니다. |
| **단어 하이라이트(키네틱)** | 한 번에 한 줄씩 나오며, 말하는 단어가 강조됩니다. |
| **가라오케(키네틱)** | 한 번에 한 줄씩 나오며, 말하는 대로 단어별로 채워집니다. |
| **TikTok 스타일 단어(키네틱)** | 1~4단어로 된 페이지가 톡 튀어나옵니다. 페이지는 문장 끝이나 쉼을 넘어 이어지지 않습니다. |
| **워드 팝(키네틱)** | 한 번에 한 단어씩 튕기듯 나타납니다. 각 단어는 다음 단어가 시작될 때까지 남아 있습니다. |
| **바운스(키네틱)** | 한 번에 한 줄씩 나오며, 말하는 단어마다 통통 튑니다. |

앱에서는 애니메이션 스타일 다섯 가지를 키네틱 스타일이라고 부릅니다.

## 룩
룩은 여러 시각적 선택을 하나로 묶으므로, 설정 하나만으로 잘 읽히는 자막을 만들 수 있습니다.

| 룩 | 렌더링 결과 |
| --- | --- |
| **외곽선(TikTok)** | Montserrat Black(두께 900) 대문자, 두꺼운 검은 외곽선 위의 흰색 텍스트, 노란색 말하는 단어입니다. 애니메이션 스타일의 기본값입니다. |
| **클린** | 외곽선도 대문자 변환도 없는 Inter입니다. |
| **없음(기본)** | **자막** 스타일 전용이며 그 기본값입니다. 외곽선도 대문자 변환도 없는 무난한 Inter 자막입니다. |

- **컨트롤은 룩의 개별 요소를 덮어씁니다.** <strong>외곽선(TikTok)</strong>에서 **말하는 단어 색상**만 바꾸면 글꼴, 대문자, 외곽선은 그대로 유지됩니다.
- **말하는 단어 색상은 세 스타일에서 보입니다.** **TikTok 스타일 단어**, **가라오케**, **단어 하이라이트**만 한 번에 한 단어를 표시합니다. **자막**과 **워드 팝**은 룩의 글꼴, 외곽선, 대소문자를 한 가지 색상으로 씁니다.
- **글꼴 크기는 룩의 글꼴에 따라 달라집니다.** Montserrat Black 대문자는 대소문자가 섞인 Inter보다 글자당 약 30% 넓습니다. 그래서 같은 **글꼴 크기**라도 <strong>외곽선(TikTok)</strong>에서는 한 줄에 들어가는 단어가 적습니다. **클린**, Bebas Neue, Anton, Oswald 같은 좁은 글꼴, 또는 더 작은 크기를 고르세요.
- **외곽선은 텍스트와 함께 커집니다.** 룩이 외곽선을 그리면 두께는 글꼴 크기의 10%를 반올림한 값이며, 최소 2픽셀입니다. 그 절반은 글자 바깥에 있으므로, 눈에 보이는 테두리는 글꼴 크기의 약 5%입니다. 크기 64에서는 6픽셀 외곽선, 크기 32에서는 3픽셀 외곽선입니다. 두께를 직접 정하려면 **외곽선 두께**를 설정하고, 없애려면 `0`으로 설정하세요.

## 자막을 줄로 묶는 방식
**단어 하이라이트**, **가라오케**, **바운스**, 그리고 음성을 텍스트로 변환한 **자막** 스타일은 한 번에 한 줄씩 보여 줍니다. 한 번에 한 단어도 아니고, 녹취록 전체를 한 블록으로 보여 주는 것도 아닙니다.

- 한 줄에는 고른 글꼴 크기와 글꼴로 프레임 너비의 약 85%에 들어가는 만큼 단어가 들어갑니다.
- `.`, `!`, `?`, `…`로 표시되는 문장 끝이나, 두 단어 사이에 0.5초 이상 쉼이 있으면 줄이 일찍 끝납니다.
- 한 줄에 들어가지 않는 긴 구문은 균형 잡힌 여러 줄로 나뉘므로, 마지막 단어가 혼자 남지 않습니다. 예를 들어 `STUDIO.`만 혼자 남는 대신 `OK SO I BUILT` / `A WORLD IN` / `NODARO STUDIO.`로 나뉩니다.
- 한 줄은 마지막 단어가 끝난 뒤 최대 1.5초 동안 화면에 남으며, 다음 줄이 시작되는 순간 다음 줄로 바뀝니다. 줄 안의 쉼이나 줄 사이의 짧은 쉼 때문에 빈 프레임이 생기지 않습니다. 1.5초보다 긴 침묵이 있으면 자막이 사라집니다.
- 줄은 단독 대시로 시작하거나 끝나지 않습니다. `Nodaro — every model`처럼 양쪽에 공백이 있는 대시는 흔히 별도의 단어로 타이밍이 잡힙니다. 줄바꿈이 그 대시 바로 앞이나 바로 뒤에 오면 대시는 줄에서 빠지고, 단어의 타이밍은 그대로 유지됩니다. 줄 안의 대시는 그대로 남습니다. 같은 규칙이 **TikTok 스타일 단어** 페이지, **워드 팝** 단어, **줄당 최대 단어 수**로 줄바꿈한 텍스트 블록에도 적용됩니다. **워드 팝**에서는 단독 대시 앞의 단어가 대신 화면에 남습니다.
- 줄 안에서는 강조, 채우기, 튀기 같은 효과가 단어에서 단어로 옮겨 갑니다. 쉼이 있는 동안에는 마지막으로 말한 단어가 활성 상태로 남습니다. 자막 줄에는 단어별 효과가 없습니다.

줄을 그리지 않는 두 스타일도 같은 규칙을 따릅니다.

- **워드 팝**은 각 단어를 다음 단어가 시작될 때까지 화면에 두며, 단어가 끝난 뒤 최대 1.5초까지 유지합니다.
- **TikTok 스타일 단어**는 페이지가 문장 끝이나 0.5초 이상의 쉼을 넘어 이어지지 않습니다. 각 페이지는 다음 페이지가 시작될 때까지 남으며, 마지막 단어가 끝난 뒤 최대 1.5초까지 유지됩니다.

## 줄당 최대 단어 수
**줄당 최대 단어 수**는 한 줄, 또는 **TikTok 스타일 단어**의 한 페이지에 들어가는 단어 수의 상한을 정합니다. 위의 규칙 위에 적용되므로, 줄은 여전히 프레임 너비의 85%, 문장 끝, 쉼에서 끝납니다. 상한은 줄을 짧게 만들 수만 있습니다. 짧고 힘 있는 자막에는 1이나 2를 쓰고, 너비를 채우려면 비워 두세요.

| 스타일 | 효과 |
| --- | --- |
| **단어 하이라이트**, **가라오케**, **바운스** | 어떤 줄도 설정한 단어 수보다 많은 단어를 담지 않습니다. |
| **TikTok 스타일 단어** | 어떤 페이지도 설정한 단어 수보다 많은 단어를 담지 않습니다. |
| **자막** | 어떤 구문 줄도 설정한 단어 수보다 많은 단어를 담지 않습니다. |
| **워드 팝** | 효과가 없습니다. 이 스타일은 항상 한 단어를 보여 줍니다. |

예를 들어 상한이 없으면 **단어 하이라이트**는 `OK SO I BUILT`, `A WORLD IN`, `NODARO STUDIO.` 줄을 보여 줍니다. **줄당 최대 단어 수**를 2로 설정하면 `OK SO`, `I BUILT`, `A WORLD` 같은 식으로 보여 주며, 각 줄은 다음 줄이 시작될 때까지 유지됩니다. 단어 수가 홀수인 구문은 한 단어짜리 줄로 끝납니다.

상한은 자막 항목이 아니라 단어를 셉니다. 상한보다 단어가 많은 구문 단위 자막은 더 짧은 부분으로 나뉘며, 그 시간은 각 부분의 텍스트 길이에 따라 나눠집니다.

## 애니메이션
**애니메이션**은 애니메이션 스타일의 단어별 움직임을 켜고 끕니다. 끄면 움직임은 멈추지만 줄 묶기, 줄 유지, 말하는 단어 색상은 그대로입니다.

| 스타일 | 멈추는 움직임 |
| --- | --- |
| **단어 하이라이트** | 활성 단어의 크기 변화 |
| **가라오케** | 점점 채워지는 효과 |
| **TikTok 스타일 단어** | 페이지가 튕기듯 나타나는 효과 |
| **워드 팝** | 단어가 튕기듯 나타나는 효과. 단어는 바로 나타나며, 여전히 다음 단어가 나올 때까지 남아 있습니다. |
| **바운스** | 각 단어의 튀는 효과 |

색상 변화까지 없는 완전한 정적 자막을 원하면 **말하는 단어 색상**도 **색상**과 같은 값으로 설정하세요.

## 위치
모든 위치는 자막 블록을 프레임 가장자리에 가장 가까운 쪽 가장자리를 기준으로 고정하므로, 줄이 늘어난 자막은 안쪽으로 커지며 잘리지 않습니다. 배치는 모든 스타일에서 같습니다.

| 설정 | 블록의 위치 |
| --- | --- |
| **위** | 블록의 위쪽 가장자리가 프레임 높이의 12%에 있습니다. 추가 줄은 아래로 늘어납니다. |
| **아래**(기본값) | 블록의 아래쪽 가장자리가 프레임 아래에서 18% 위에 있어, TikTok과 Reels의 버튼을 피합니다. 추가 줄은 위로 늘어납니다. |
| **가운데** | 블록의 중심이 프레임 높이의 50%에 있습니다. |
| **세로 위치** | 블록의 중심이 위에서부터 잰, 내가 설정한 비율에 있습니다. **위치**를 덮어씁니다. |

**세로 위치**는 가장자리가 아니라 중심을 정합니다. 85%이면 블록의 중심이 높이의 85%에 있고, 아래쪽은 그보다 더 내려갑니다. 높이 1,920픽셀 프레임에서 83.5%이면 중심이 약 1,603픽셀에 놓입니다. 65% 정도면 얼굴 아래, 앱의 아래쪽 버튼 위에 자리합니다.

## 단어를 가져오는 곳
편집기에서 자막 추가는 두 가지 방법 중 하나로 단어를 가져옵니다.

- **동영상을 텍스트로 변환합니다.** **녹취록**에 아무것도 연결하지 않으면 노드가 **Incredibly Fast Whisper**로 동영상의 음성을 텍스트로 변환합니다. 음성이 또렷한지 확인하세요.
- **연결한 녹취록을 읽습니다.** 녹취록을 **녹취록** 입력에 연결하세요. EDL 적용은 모든 단어를 컷에 맞춰 옮기므로, 자막이 다시 편집한 동영상에 맞춰지며 크로스페이드 구간에서도 오차가 약 80밀리초 이내입니다.

### 녹취록에 연결되는 출력
다음 출력은 녹취록을 담고 있어 **녹취록** 입력에 연결됩니다.

- [음성 텍스트 변환](https://nodaro.ai/docs/nodes/audio/transcribe)과 [EDL 적용](https://nodaro.ai/docs/nodes/video/apply-edl)의 **JSON** 출력.
- 화자 뷰와 카메라 전환의 **녹취록** 출력.
- [텍스트로 대화 만들기](https://nodaro.ai/docs/nodes/audio/text-to-dialogue)의 **JSON** 출력. 모든 대화 모델이 단어 타이밍을 반환하고 각 대사의 보이스를 화자로 삼으므로, 대화를 다시 텍스트로 변환하지 않고 자막을 넣을 수 있습니다.

편집 목록은 녹취록이 아닙니다. 편집기는 [편집 계획](https://nodaro.ai/docs/nodes/video/edit-plan)이나 카메라 전환의 편집 목록, 또는 화자 뷰의 **JSON** 출력에서 오는 연결을 거부하고 그 이유를 알려 줍니다. MCP, API 또는 Copilot으로 작성한 워크플로는 그런 연결을 버리고 그 이유를 보고합니다. 반대 방향도 거부됩니다. 녹취록은 EDL 적용이나 카메라 전환에 있는 편집 목록 입력에 연결할 수 없습니다.

### 녹취록에는 단어 타이밍이 필요합니다
연결한 녹취록에는 단어마다 타이밍이 있어야 합니다. 단어가 없는 녹취록은 크레딧이 예약되기 전에 거부됩니다.

음성 텍스트 변환의 **Whisper** 엔진은 단어 타이밍이 아니라 구문을 반환합니다. Whisper를 쓰는 음성 텍스트 변환 노드가 직접, 또는 EDL 적용이나 화자 뷰를 거쳐 이 노드에 값을 보내면, 워크플로는 무엇이든 실행되거나 청구되기 전에 멈춥니다. 메시지에 그 음성 텍스트 변환 노드의 이름이 나옵니다. 그 노드를 **Incredibly Fast Whisper**나 **ElevenLabs STT**처럼 단어 타이밍이 있는 엔진으로 바꾸세요. 하위 워크플로 안의 연결도 같은 검사를 받습니다. 하위 워크플로의 경계를 넘는 연결만은 음성 텍스트 변환이 실행된 뒤 이 노드에서 거부됩니다.

### 단어 단위 자막
녹취록을 연결하고 애니메이션 스타일을 고르면, **단어 단위 자막**이 녹취록의 단어를 자막으로 바꾸는 방식을 정합니다.

- **켜짐**(기본값)이면 단어마다 자막 하나를 만들며, 단어별 스타일에는 이것이 필요합니다.
- **꺼짐**이면 먼저 단어를 줄로 묶습니다. 줄은 화자가 바뀌거나, 문장이 끝나거나, 침묵이 있거나, 최대 단어 수에 이르면 끝납니다. 더 차분하게 한 줄씩 나오는 자막에 쓰세요.

**줄당 최대 단어 수**는 어느 쪽이든 적용됩니다.

## 캡션 플랜 입력
**캡션 플랜** 입력은 이미 타이밍이 정해진 자막을 받습니다. 첫 줄, 첫 줄이 끝나는 시간, 동영상 나머지 부분의 타이밍이 정해진 단어입니다. 플랜이 연결되어 있으면:

- **첫 줄은 훅 플레이트 룩을 씁니다.** 동영상의 나머지 부분은 이 노드의 자체 자막 스타일을 씁니다. 나머지 부분의 스타일을 바꾸려면 노드에 자막 프리셋을 적용하세요. 첫 줄은 훅 플레이트 룩을 유지합니다.
- **히브리어 플랜은 Rubik 글꼴을 씁니다.** 언어가 히브리어(`language: "he"`)인 플랜은 첫 줄과 나머지 부분 모두에 Rubik을 설정합니다. 히브리어 줄 안의 라틴 문자 브랜드 이름도 같은 글꼴로 그려지며, 쓰인 그대로의 글자를 유지합니다.
- **플랜이 노드의 다른 단어를 대신합니다.** 노드의 자체 텍스트, 세그먼트, 연결된 녹취록은 쓰이지 않습니다.
- **가격은 애니메이션 가격입니다.** 플랜은 항상 애니메이션 렌더링을 쓰므로 55크레딧이 듭니다.
- **빈 플랜은 동영상을 그대로 통과시킵니다.** 플랜에 자막을 넣을 내용이 없으면, 노드는 동영상을 바꾸지 않고 비용 없이 출력합니다.

## 음성 텍스트 변환 엔진
| 엔진 | 단어 타이밍 | 선택할 수 있는 곳 |
| --- | --- | --- |
| [Incredibly Fast Whisper](https://nodaro.ai/docs/models/audio/incredibly-fast-whisper) | 있음 | 모든 곳의 기본값 |
| [ElevenLabs STT](https://nodaro.ai/docs/models/audio/elevenlabs-stt) | 있음 | API, MCP, SDK, CLI |
| [Whisper](https://nodaro.ai/docs/models/audio/whisper) | 없음, 구문만 | API, MCP, SDK, CLI |

엔진은 자막 추가의 가격을 바꾸지 않습니다. 애니메이션 스타일에는 단어 타이밍이 필요하므로 Incredibly Fast Whisper나 ElevenLabs STT가 필요합니다. **자막** 스타일은 구문 타이밍만 있으면 되므로 모든 엔진에서 작동합니다.

## 결과의 프레임 레이트
애니메이션 자막 렌더링은 원본 동영상의 프레임 레이트를 유지합니다. 프레임 레이트는 23.976이면 24, 29.97이면 30처럼 정수로 반올림되며, 15~60fps 사이로 유지됩니다. 다음 세 경우에는 대신 30fps로 렌더링합니다.

- 원본 프레임 레이트를 읽을 수 없을 때.
- 원본이 가변 프레임 레이트일 때.
- 클립이 렌더링 프레임 한도인 108,000프레임보다 길 때. 60fps라면 30분보다 긴 클립입니다.

일반 정적 자막은 항상 원본 프레임 레이트를 유지합니다.

## 기본 제공 프리셋
자막 추가에는 **자막 스타일** 폴더에 프리셋 7개가 들어 있습니다. 각 프리셋은 스타일, 위치, 글꼴 크기, 색상을 정하고, 동영상을 텍스트로 변환합니다.

| 프리셋 | 스타일 | 위치 | 글꼴 크기 | 색상 |
| --- | --- | --- | --- | --- |
| **깔끔한 자막** | 자막 | 아래 | 32 | 흰색 |
| **TikTok 볼드** | TikTok 스타일 단어 | 가운데 | 72 | 흰색 |
| **노래방 스타일 하이라이트** | 가라오케 | 아래 | 56 | 흰색 |
| **워드 팝** | 워드 팝 | 가운데 | 64 | 노란색(`#FFE600`) |
| **통통 튀는 자막** | 바운스 | 아래 | 64 | 흰색 |
| **단어 하이라이트** | 단어 하이라이트 | 아래 | 48 | 청록색(`#00E5FF`) |
| **상단 배너** | 자막 | 위 | 36 | 흰색 |

프리셋을 적용하고 저장하고 공유하는 방법은 [프리셋](https://nodaro.ai/docs/concepts/presets)을 참고하세요.

## 크레딧
자막 추가에는 두 가지 가격이 있습니다.

| 렌더링 | 크레딧 |
| --- | --- |
| 내가 정한 고정 텍스트로, 스타일 컨트롤을 하나도 설정하지 않은 일반 정적 자막 | 33 |
| 그 밖의 모든 경우: 모든 애니메이션 스타일, 음성을 텍스트로 변환하거나 녹취록을 받은 자막, 스타일 컨트롤을 설정한 자막, 세그먼트별 자막, 캡션 플랜 | 55 |

설정 패널에는 텍스트 필드가 없으므로, 편집기에서 설정한 노드는 항상 음성이나 녹취록으로 자막을 만들며 실행할 때마다 55크레딧이 듭니다. 33크레딧짜리 자막은 API, MCP, SDK, CLI로 보낸 고정 텍스트입니다. 음성 텍스트 변환 엔진과 스타일 컨트롤은 애니메이션 스타일의 가격을 바꾸지 않습니다.

## 팁
- **콘텐츠에 맞는 스타일을 고르세요.** 전문적인 콘텐츠에는 **자막**을, SNS에는 **단어 하이라이트**나 **TikTok 스타일 단어**를 쓰세요.
- **플랫폼의 버튼을 신경 쓰세요.** 기본값인 **아래** 위치는 이미 TikTok과 Reels의 버튼을 피합니다. 세로형 SNS 동영상에는 **가운데**도 잘 맞습니다.
- **텍스트를 읽기 쉽게 하세요.** 어두운 화면에는 흰색 텍스트가 가장 잘 읽힙니다. 밝은 화면에는 색이 있는 텍스트를 쓰세요.
- **먼저 단어를 바로잡으세요.** 가장 정확한 자막을 원하면 [음성 텍스트 변환](https://nodaro.ai/docs/nodes/audio/transcribe)으로 텍스트를 만들고, 텍스트를 고친 다음, [강제 정렬](https://nodaro.ai/docs/nodes/audio/forced-alignment)로 타이밍을 맞추세요.
- **자막은 마지막에.** 자막 추가를 [동영상 오버레이](https://nodaro.ai/docs/nodes/video/video-overlay) 뒤에 두면 로고와 카드가 자막 아래에 놓입니다.

## 문제 해결
**워크플로가 실행 전에 멈추고 음성 텍스트 변환 노드의 이름이 나옵니다.** 그 음성 텍스트 변환 노드가 단어 타이밍을 반환하지 않는 Whisper 엔진을 씁니다. Incredibly Fast Whisper나 ElevenLabs STT로 바꾸세요.

**한 줄에 들어가는 단어가 예상보다 적습니다.** **외곽선(TikTok)** 룩은 넓은 글꼴을 씁니다. **클린**, Bebas Neue 같은 좁은 글꼴, 또는 더 작은 **글꼴 크기**를 고르세요.

**자막이 프레임 가장자리에서 잘립니다.** 가장자리에 가까운 **세로 위치** 대신 이름이 있는 **위치**를 쓰세요. 이름이 있는 위치는 블록의 가장자리를 고정하므로 추가 줄이 안쪽으로 늘어납니다.

## API와 MCP에서 사용
코드와 AI 어시스턴트는 편집기보다 더 많은 일을 할 수 있습니다. `POST /v1/add-captions`, `add_captions` MCP 도구, SDK의 `client.media.addCaptions(...)`, [CLI](https://nodaro.ai/docs/developers/cli)는 모두 설정 패널과 같은 컨트롤에 더해 다음을 받습니다.

- **내 텍스트.** **자막** 스타일에서는 `text`가 동영상 전체에 고정 블록 하나로 입혀지며, 음성 텍스트 변환 결과로 덮어쓰이지 않습니다. 텍스트 안의 줄바꿈은 새 줄을 강제합니다. 애니메이션 스타일에서 `text`는 대체용일 뿐입니다. 음성 텍스트 변환이 단어를 찾지 못할 때 쓰이며, 동영상 전체에 고르게 배분됩니다.
- **내 단어 타이밍.** `captions`는 자막 항목의 목록이며, 각 항목에 `text`, `startMs`, `endMs`가 있습니다. 애니메이션 스타일에는 단어마다 항목 하나를 주세요.
- **음성 텍스트 변환 엔진.** `transcribe_provider`로 `incredibly-fast-whisper`(기본값), `elevenlabs-stt`, `whisper` 중 하나를 고릅니다. Whisper를 쓰면서 다른 단어 소스가 없는 애니메이션 스타일은 크레딧이 예약되기 전에 거부됩니다. 음성 텍스트 변환을 끄려면 `auto_transcribe`를 `false`로 설정하세요. 단어 소스가 하나도 없는 요청은 거부됩니다.
- **시간 구간마다 다른 처리.** `segments`는 같은 동영상의 시간 구간마다 다른 스타일과 룩을 호출 한 번으로 적용합니다. [세그먼트별 자막](#per-segment-captions)을 참고하세요.

요청에 단어 소스가 여러 개 있으면 노드는 `captions`, 녹취록, **자막** 스타일의 `text`, 음성 텍스트 변환 순서로 처음 것을 씁니다.

필드 이름은 사용하는 곳마다 다릅니다. REST 본문과 SDK는 `maxWordsPerLine`을, MCP 도구는 `max_words_per_line`을, CLI는 `--max-words-per-line`을 씁니다.

### 세그먼트별 자막
각 세그먼트에는 밀리초 단위의 시작과 끝이 있으며, 다른 세그먼트와 겹치면 안 되고, 각자의 스타일과 룩 컨트롤을 설정할 수 있습니다. 자체 단어가 없는 세그먼트는 공유 자막이나 음성 텍스트 변환 결과를 자기 시간 구간으로 잘라 씁니다. 자막 시간은 세그먼트 시작이 아니라 항상 동영상 시작부터 잽니다. 세그먼트별 자막은 항상 애니메이션 렌더링을 쓰므로 55크레딧이 듭니다.

예를 들어 다음 `add_captions` MCP 도구 인수는 3초 동안 위쪽에 외곽선이 있는 큰 구문을 보여 준 뒤, 아래쪽에 한 번에 한 단어씩 보여 줍니다.

```json
{
"video_url": "https://example.com/clip.mp4",
"look": "outline",
"segments": [
{ "start_ms": 0, "end_ms": 3000, "style": "subtitle", "position": "top", "font_size": 96, "text": "Same face, every shot. No re-prompting." },
{ "start_ms": 3000, "end_ms": 20000, "style": "word-pop", "position": "bottom", "font_size": 48 }
]
}
```

- **경계에 걸친 단어.** 단어 하나는 그 시작이 들어 있는 세그먼트에 속하므로 두 번 나타나지 않습니다. 경계를 넘는 구문은 경계에서 나뉘며, 각 부분은 자기 세그먼트의 스타일로 표시됩니다. 250밀리초보다 짧은 부분은 버려지지만, 그러면 구문 전체가 사라지는 경우는 예외입니다.
- **세그먼트가 물려받는 것.** 색상, 배경 색상, 위치, 세로 위치, **애니메이션**, **줄당 최대 단어 수**는 세그먼트가 직접 설정하지 않으면 최상위 값을 따릅니다. 자체 위치를 설정한 세그먼트는 최상위 세로 위치를 물려받지 않습니다. 글꼴, 두께, 외곽선, 말하는 단어 색상, 대문자 같은 룩 컨트롤은 자체 `look`이 없는 세그먼트만 물려받습니다. 룩을 지정한 세그먼트는 그 프리셋에서 새로 시작합니다.

## 자주 묻는 질문

### TikTok, Reels, Shorts에는 어떤 자막 스타일을 써야 하나요?

TikTok 스타일 단어나 단어 하이라이트에 외곽선(TikTok) 룩을 쓰세요. 검은 외곽선이 있는 굵은 대문자 단어와 노란색으로 표시되는 말하는 단어가 나옵니다. 짧고 힘 있는 자막을 원하면 줄당 최대 단어 수를 1이나 2로 설정하세요.

### 자막 추가에는 크레딧이 얼마나 드나요?

자막 렌더링 한 번에 55크레딧이 듭니다. 유일한 예외는 API, MCP, SDK, CLI로 보낸 고정 텍스트의 일반 정적 자막으로, 33크레딧이 듭니다. 음성 텍스트 변환 엔진은 가격을 바꾸지 않습니다.

### 외곽선 룩에서는 왜 한 줄에 들어가는 단어가 적나요?

외곽선 룩은 Montserrat Black 대문자를 쓰며, 클린 룩의 Inter보다 글자당 약 30% 넓습니다. 클린 룩, Bebas Neue, Anton, Oswald 같은 좁은 글꼴, 또는 더 작은 글꼴 크기를 고르세요.

### 동영상을 자른 뒤에도 자막이 맞을 수 있나요?

네. EDL 적용 렌더링의 녹취록을 녹취록 입력에 연결하세요. EDL 적용은 모든 단어를 컷에 맞춰 옮기므로, 자막이 새 타임라인을 따르며 크로스페이드 구간에서도 오차가 약 80밀리초 이내입니다.

### 자막 추가는 히브리어와 아랍어에도 쓸 수 있나요?

네. Rubik, Heebo, Cairo, Tajawal 글꼴이 히브리어와 아랍어를 지원하며, 자막이 오른쪽에서 왼쪽으로 표시됩니다. 방향은 자막 대부분의 언어를 따르므로, 라틴 문자로 된 브랜드 이름이 줄의 방향을 뒤집지 않습니다.
