# 오디오 동기화

> 한 대화를 담은 녹음 2~6개가 서로 얼마나 어긋나는지 소리로 측정해, 오프셋을 입력하지 않고 멀티캠 편집을 맞추세요. 시계 드리프트도 알려 줍니다.

Source: https://nodaro.ai/ko/docs/nodes/audio/audio-sync

**오디오 동기화** 노드는 한 대화를 담은 녹음 2~6개의 시계가 서로 얼마나 어긋나는지 소리로 측정합니다. 팟캐스트는 게스트마다 카메라 한 대, 와이드 샷, 메인 마이크처럼 여러 번 동시에 녹음되는 경우가 많고, 각 녹음은 저마다 다른 시점에 시작됩니다. 오디오 동기화는 모든 녹음을 듣고, 각 녹음이 기준 녹음 하나와 비교해 얼마나 밀려 있는지 알려 줍니다. 그러면 누구도 오프셋을 입력하지 않고 멀티캠 편집을 맞출 수 있습니다.

노드는 AI 모델이나 공급자 키 없이 로컬에서 실행되므로 모든 에디션에서 작동합니다.

- Found in: Audio › Analyze
- API type: `audio-sync`

## 사용 시기
- 편집을 계획하기 전에, 게스트마다 카메라 한 대와 메인 마이크로 녹화한 멀티캠 팟캐스트를 정렬합니다.
- 테이블 위 녹음기처럼 따로 둔 오디오 녹음기의 오프셋을 카메라 소리와 비교해 찾습니다.
- 긴 세션 동안 두 녹음기가 서로 어긋나는지 확인합니다.

## 빠른 시작
### 노드 추가
캔버스에서 Tab을 누르고 **오디오 › 분석 › 오디오 동기화**를 선택하세요.

### 모든 녹음 연결
오디오나 동영상 녹음 2~6개를 **소스** 입력 하나에 연결하세요. 메인 마이크를 먼저 연결하면 그 녹음이 기준 녹음이 됩니다.

### 기준 녹음 확인
설정 패널을 여세요. **녹음**을 드래그해 순서를 바꾸거나 **기준 녹음**에서 하나를 고르세요.

### 실행
노드에서 **실행**을 클릭하세요. 오프셋이 **오프셋** 출력에 데이터로 나타납니다.

Workflow: 마이크 하나와 카메라 두 대를 소스에 연결하고, 카메라마다 마이크와 비교한 오프셋을 측정합니다.

- 오디오 업로드 → 오디오 동기화 (소스)
- 동영상 업로드 → 오디오 동기화 (소스)
- 동영상 업로드 → 오디오 동기화 (소스)

## 입력과 출력
| 입력 | 연결할 수 있는 노드 | 설명 |
| --- | --- | --- |
| **소스** | 오디오 노드와 동영상 노드, 2~6개 | 정렬할 녹음입니다. 동영상이면 노드는 사운드 트랙을 씁니다. |

각 녹음은 그 녹음을 보낸 노드로 구분합니다. 그 노드의 id가 결과에서 녹음의 `sourceId`가 되며, 편집 계획이 같은 녹음에 붙이는 id도 이것입니다.

출력인 **오프셋**은 오디오가 아닌 데이터입니다. 이 출력으로 멀티캠 편집을 맞추는 [편집 계획](https://nodaro.ai/docs/nodes/video/edit-plan)의 **오프셋(오디오 동기화)** 입력이나, [필드 추출](https://nodaro.ai/docs/nodes/automate/extract-field)처럼 데이터를 읽는 다른 노드에 연결하세요.

## 설정
| 설정 | 설명 |
| --- | --- |
| **녹음** | 연결한 녹음을 순서대로 보여 줍니다. 드래그해 순서를 바꾸세요. 첫 번째 녹음이 기본 기준 녹음이며, 결과는 이 순서대로 오프셋을 나열합니다. |
| **기준 녹음** | 모든 오프셋을 측정하는 기준이 되는 녹음입니다. <strong>첫 번째 녹음(기본값)</strong>이나 연결한 녹음 중 하나를 고르세요. 고른 녹음의 연결이 나중에 끊기면 노드는 다시 첫 번째 녹음을 씁니다. |

## 측정 방식
노드는 각 녹음을 기준 녹음과 세 단계로 비교합니다.

1. **대략 맞추기.** 두 녹음 전체의 음량을 비교합니다. 마이크보다 몇 분 먼저 시작한 카메라처럼 아무리 멀리 밀려 있어도 어긋남을 찾습니다.
2. **정밀 맞추기.** 첫 번째 답 주위의 파형을 비교하며, 두 녹음이 공유하는 구간에서 10초 길이의 창을 최대 3개 씁니다. 주파수마다 위상으로 가중치를 두므로, 에코가 있는 방 건너편의 카메라도 에코가 아니라 직접음으로 시간을 맞춥니다. 깨끗한 녹음은 약 1밀리초 안으로 맞고, 에코가 있는 녹음은 보통 몇 밀리초 안으로 맞습니다.
3. **드리프트.** 서로 다른 녹음기의 시계는 조금씩 다른 속도로 흐르며, 흔히 100만분의 20~100 정도입니다. 노드는 창들의 오프셋에 직선을 맞추며, 그 직선의 기울기가 드리프트입니다. 드리프트는 100만분의 200까지 측정합니다.

시간은 각 파일 자체의 시계, 즉 편집할 때 쓰는 시계로 읽습니다. 소리가 화면보다 늦게 시작하는 동영상은 그 간격을 그대로 둔 채 측정합니다.

## 결과 읽기
**오프셋** 출력은 다음과 같습니다.

```json
{
"version": 1,
"reference": "mic",
"offsets": [
{ "sourceId": "mic", "offsetMs": 0, "confidence": 1, "driftMsPerHour": 0 },
{ "sourceId": "camA", "offsetMs": 7500, "confidence": 0.94, "driftMsPerHour": 1.2 },
{ "sourceId": "camB", "offsetMs": -40000, "confidence": 0.91, "driftMsPerHour": null }
],
"notes": []
}
```

| 필드 | 의미 |
| --- | --- |
| `reference` | 모든 오프셋을 측정하는 기준 녹음입니다. 자기 오프셋은 항상 `0`입니다. |
| `offsetMs` | 기준 녹음의 시계에서 그 녹음이 놓이는 위치로, 정수 밀리초 단위입니다. |
| `confidence` | 0~1입니다. 노드가 오프셋을 얼마나 확신하는지 나타냅니다. |
| `driftMsPerHour` | 기준 녹음과 비교해 측정한 드리프트로, 시간당 밀리초 단위입니다. 공유 구간이 너무 짧아 드리프트를 잴 수 없으면 `null`입니다. |
| `notes` | 이해하기 쉬운 말로 쓴 경고입니다. |

### 오프셋 규칙
**기준 시간 = 녹음 시간 + 오프셋.** 편집 결정 목록과 같은 부호 규칙입니다. 기준 녹음이 메인 녹음이면 각 오프셋은 그 녹음이 편집에서 갖는 값과 정확히 같습니다.

- 마이크보다 7.5초 늦게 시작한 카메라의 오프셋은 `+7500`입니다. 카메라의 0초가 마이크의 7.5초입니다.
- 마이크보다 40초 먼저 시작한 카메라의 오프셋은 `-40000`입니다.

### 신뢰도
- 공유 구간이 6분 이상이면 노드는 창 3개를 측정합니다. 창들이 1밀리초 안에서 일치하면 에코가 있는 방 건너편의 카메라라도 오프셋을 믿을 수 있으며, 신뢰도는 0.6 이상입니다. 일치가 뚜렷하면 신뢰도가 1까지 올라갑니다. 창들이 5ms 이상 어긋나면 0점입니다.
- 공유 구간이 더 짧으면 창이 하나뿐이므로, 그 일치와 전체 정렬이 모두 뚜렷해야 합니다.
- 신뢰도가 낮은 것은 실패가 아니라 결과입니다. 마이크가 꺼져 있던 카메라는 정렬할 소리가 없지만, 실행은 그대로 완료됩니다.

### 메모
| 메모 | 나타나는 경우 |
| --- | --- |
| 약한 일치 | 신뢰도가 0.5 미만입니다. 그 오프셋을 귀로 확인하세요. |
| 뚜렷한 일치 없음 | 신뢰도가 0.2 미만입니다. 오프셋은 추정값입니다. |
| 드리프트 | 공유 구간 동안의 드리프트가 30fps에서 한 프레임인 33ms를 넘습니다. 메모에는 전체 드리프트와 양 끝의 최대 오차가 나오며, 최대 오차는 전체 드리프트의 절반입니다. |
| 공유된 소리 없음 | 녹음이 기준 녹음과 공유하는 구간이 없습니다. 신뢰도는 0입니다. |
| 오디오 트랙 없음 | 화면만 담긴 카메라 파일처럼 녹음에 소리가 없습니다. 신뢰도 0인 행을 받으며, 나머지 녹음은 그대로 정렬됩니다. |

## 크레딧
오디오 동기화는 **기준 녹음에 맞춰 정렬하는 녹음 하나마다 11크레딧**이 듭니다. 기준 녹음 자체는 어떤 녹음에도 맞춰 정렬하지 않으므로 비용이 들지 않습니다. 녹음 길이는 가격에 영향을 주지 않습니다.

| 녹음 | 크레딧 |
| --- | --- |
| 2 | 11 |
| 3 | 22 |
| 4 | 33 |
| 5 | 44 |
| 6 | 55 |

캔버스에서는 **소스**에 연결한 녹음 수에 따라 가격이 정해집니다. 워크플로의 연결 없이 계산한 예상 가격은 너무 적게 잡지 않도록 녹음 6개의 가격인 55크레딧으로 표시됩니다. 셀프 호스팅한 Community Edition과 Business 에디션은 크레딧을 쓰지 않습니다.

## 예시
**마이크 하나와 카메라 한 대.** 카메라가 마이크보다 7.5초 늦게 시작했습니다. 결과는 기준 녹음인 `mic`가 `0`, `cam`이 `+7500`입니다. 실행에는 11크레딧이 듭니다.

**마이크 하나와 카메라 세 대.** 카메라 A는 마이크보다 7.5초 늦게, 카메라 B는 40초 먼저, 44.1kHz로 녹음하는 카메라 C는 3.25초 늦게 시작했습니다. 결과는 `mic`가 `0`, `camA`가 `+7500`, `camB`가 `-40000`, `camC`가 `+3250`입니다. 실행에는 33크레딧이 듭니다.

**녹음 6개, 카메라 A가 기준 녹음.** 같은 오프셋을 카메라 A의 시계로 측정합니다. 모든 값이 카메라 A 자체의 오프셋만큼 이동하며, `camA`는 `0`입니다. 실행에는 55크레딧이 듭니다.

**드리프트.** 시계가 100만분의 100만큼 다른 두 녹음기는 1시간에 360ms씩 어긋납니다. 40분의 공유 구간에서는 240ms로, 33ms 기준을 훨씬 넘습니다. `driftMsPerHour`의 크기는 약 360이며, 부호는 녹음이 어느 쪽으로 밀리는지 나타냅니다. 메모는 양 끝이 최대 120ms 어긋난다고 경고합니다. 보정은 하지 않습니다.

## 제한
- **실행 1회에 녹음 2~6개.** 더 적거나 많으면 실행이 시작되기 전에 거부되며, 크레딧을 잡아 두지 않습니다.
- **공유된 소리.** 녹음끼리 2초 이상의 소리를 공유해야 합니다. 공유된 소리가 없는 녹음은 메모와 신뢰도 0을 받습니다.
- **기준 녹음에는 소리가 있어야 합니다.** 기준 녹음은 모든 측정의 기준이 되는 시계입니다. 기준 녹음에 사운드 트랙이 없으면 그 녹음을 지목하는 메시지와 함께 실행이 실패합니다. 소리가 없는 다른 녹음은 신뢰도 0인 자기 행만 받습니다.
- **드리프트는 보정하지 않고 알려만 줍니다.**
- **긴 파일.** 처음 실행할 때 녹음을 전부 가져옵니다. 파일은 최대 64GB이며, 다운로드는 최대 1시간까지 걸릴 수 있습니다. 크기를 아는 파일은 2MB/s(16Mbit/s)로 받았을 때 걸리는 시간 안에 도착해야 하며, 그 시간은 최소 2분, 최대 1시간입니다. 처음 2분이 지나면 다운로드가 약 2Mbit/s 이상의 속도로 계속 들어와야 합니다. 1분 내내 그보다 느리면 가져오기를 중단합니다. 이후 실행에서는 준비해 둔 오디오를 다시 씁니다.

## 팁
- **메인 마이크를 기준 녹음으로 삼으세요.** 먼저 연결하거나 **기준 녹음**에서 고르세요. 그러면 숫자를 읽기 쉽습니다. 오프셋이 편집에 들어가는 값과 정확히 같습니다.
- **신뢰도가 낮으면 귀로 확인하세요.** 보통 음소거된 카메라나 시끄러운 방의 먼 와이드 샷처럼 녹음에 대화가 거의 들리지 않았다는 뜻입니다.
- **긴 에피소드에서는 드리프트 메모를 읽으세요.** 드리프트가 한 프레임을 넘으면 시작이 맞아도 에피소드가 진행될수록 립싱크가 어긋납니다.
- **편집을 맞추세요.** **오프셋** 출력을 [편집 계획](https://nodaro.ai/docs/nodes/video/edit-plan)의 **오프셋(오디오 동기화)** 입력에 연결하고, 같은 녹음을 편집 계획의 **소스**에도 연결하세요. 편집 계획은 각 오프셋을 그 녹음이 속한 마스터의 시계로 옮기므로, 여기서는 어떤 녹음이든 기준 녹음이 될 수 있습니다. 편집 계획은 쓰는 녹음이 측정되지 않았거나 약하게 일치했으면 비용을 청구하기 전에 멈춥니다. [멀티캠 녹음](https://nodaro.ai/docs/nodes/video/edit-plan#multicam-recordings)을 참고하세요.
- **Multicam Cut 템플릿으로 시작하세요.** 템플릿 마켓플레이스의 **Multicam Cut** 템플릿은 마스터 오디오를 기준으로 이렇게 연결되어 있습니다. 이어서 카메라 전환을 거쳐 [EDL 적용](https://nodaro.ai/docs/nodes/video/apply-edl)으로 가서 컷을 렌더링합니다.

## API에서 사용
`POST /v1/audio-sync`는 고유한 `id`와 `url`을 담은 객체 2~6개의 목록인 `sources`와, 그 id 중 하나여야 하는 선택 항목 `reference`를 받습니다. id가 중복되거나 `reference`가 id 중 하나가 아니면 해당 값을 지목하는 `400 validation_error`로 거부됩니다. 완료된 실행의 `output_data.json`이 위의 결과입니다. SDK 메서드는 `client.edit.audioSync`, CLI 명령은 `nodaro edit audio-sync`, MCP 도구는 `audio_sync`입니다. [보이스 및 미디어](https://nodaro.ai/docs/developers/api/voice-and-media)를 참고하세요.

## 자주 묻는 질문

### 오디오 동기화는 녹음을 몇 개까지 정렬할 수 있나요?

실행 1회에 녹음 2~6개를 정렬하며, 오디오와 동영상을 자유롭게 섞을 수 있습니다. 동영상이면 노드는 사운드 트랙을 듣습니다.

### 양수 오프셋은 무슨 뜻인가요?

녹음이 기준 녹음보다 늦게 시작했다는 뜻입니다. 오프셋이 +7500이면 그 녹음의 0초가 기준 녹음의 7.5초입니다. 규칙은 기준 시간 = 녹음 시간 + 오프셋입니다.

### 오디오 동기화가 시계 드리프트를 보정하나요?

아니요. 드리프트를 측정하고 동영상 한 프레임보다 크면 메모로 경고하지만, 녹음을 바꾸지는 않습니다. 오프셋은 공유 구간의 가운데에서 측정하므로, 양 끝에서 생기는 최대 오차가 절반으로 줄어듭니다.

### 오디오 동기화는 몇 크레딧이 드나요?

기준 녹음에 맞춰 정렬하는 녹음 하나마다 11크레딧이 들며, 기준 녹음을 뺀 모든 녹음이 여기에 해당합니다. 녹음 2개는 11크레딧, 6개는 55크레딧입니다. 녹음 길이는 가격에 영향을 주지 않습니다.

### 카메라 하나가 소리를 녹음하지 않았다면 어떻게 되나요?

그 녹음은 신뢰도 0과 메모를 받고, 나머지 녹음은 그대로 정렬됩니다. 모든 오프셋을 기준 녹음의 시계로 측정하므로, 소리가 꼭 있어야 하는 것은 기준 녹음뿐입니다.
