# Audio Sync

> Measure how far apart 2 to 6 recordings of one conversation are, from their sound, so a multicam edit lines up without typing offsets. Also reports clock drift.

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

The **Audio Sync** node measures how far apart the clocks of 2 to 6 recordings of one conversation are, from their sound. A podcast is often recorded several times over: one camera per guest, a wide shot and a main microphone, each started at its own moment. Audio Sync listens to all of them and reports how far each recording is shifted against one reference recording. A multicam edit then lines up without anyone typing offsets.

The node runs locally, with no AI model and no provider key, so it works on every edition.

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

## When to use it
- Line up a multicam podcast, with one camera per guest and a main microphone, before you plan the edit.
- Find the offset of a separate audio recorder, such as a recorder on the table, against the camera sound.
- Check whether two recorders drift apart over a long session.

## Quick start
### Add the node

Press Tab on the canvas and choose **Audio › Analyze › Audio Sync**.

### Wire every recording

Wire 2 to 6 recordings, audio or video, into the one **Sources** input. Wire the main microphone first, so that it becomes the reference.

### Check the reference

Open the settings panel. Reorder the **Recordings** by dragging them, or choose one under **Reference**.

### Run it

Click **Run** on the node. The offsets appear on the **Offsets** output as data.

Workflow: A microphone and two cameras are wired into Sources, and each camera's offset is measured against the microphone.

- Upload Audio → Audio Sync (sources)
- Upload Video → Audio Sync (sources)
- Upload Video → Audio Sync (sources)

## Input and output
| Input | Accepts | What it does |
| --- | --- | --- |
| **Sources** | Audio and video nodes, 2 to 6 | The recordings to line up. For a video, the node uses its sound track. |

Each recording is identified by the node it comes from. That node's id becomes the recording's `sourceId` in the result, and it is also the id an edit plan gives the same recording.

The output, **Offsets**, is data, not audio. Wire it into a node that reads data, such as [Extract Field](https://nodaro.ai/docs/nodes/automate/extract-field).

## Settings
| Setting | What it does |
| --- | --- |
| **Recordings** | The connected recordings, in order. Drag to reorder them. The first recording is the default reference, and the result lists the offsets in this order. |
| **Reference** | The recording that every offset is measured against. **First recording (default)**, or any connected recording. If the chosen recording is disconnected later, the node uses the first recording again. |

## How it measures

The node compares each recording with the reference in three passes:

1. **Coarse.** It compares the loudness of the two whole recordings. This finds the shift at any distance, even for a camera started minutes before the microphone.
2. **Fine.** It compares the waveforms around that first answer, on up to three 10-second windows of the stretch that both recordings share. Each frequency is weighed by its phase, so a camera across a room with echo is timed on the direct sound, not on the echo. Clean recordings land within about 1 millisecond, and recordings with echo usually within a few.
3. **Drift.** Separate recorders' clocks run at slightly different speeds, commonly 20 to 100 parts per million. The node fits the windows' offsets to a line, and the slope of that line is the drift. It measures drift up to 200 parts per million.

Times are read on each file's own clock, the clock that edits are cut on. A video whose sound starts after its picture is measured with that gap in place.

## Read the result

The **Offsets** output looks like this:

```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": []
}
```

| Field | What it means |
| --- | --- |
| `reference` | The recording that every offset is measured against. Its own offset is always `0`. |
| `offsetMs` | Where the recording sits on the reference's clock, in whole milliseconds. |
| `confidence` | From 0 to 1. How sure the node is of the offset. |
| `driftMsPerHour` | The measured drift against the reference, in milliseconds per hour. `null` when the shared stretch was too short to measure drift. |
| `notes` | Warnings in plain language. |

### The offset rule

**Reference time = recording time + offset.** This is the same sign rule an edit decision list uses. When the reference is your main recording, each offset is exactly the value that recording takes in the edit.

- A camera started 7.5 seconds after the microphone has an offset of `+7500`: its second 0 is the microphone's second 7.5.
- A camera started 40 seconds before the microphone has an offset of `-40000`.

### Confidence

- With a shared stretch of 6 minutes or more, the node measures three windows. When they agree within a millisecond, the offset is trusted, with a confidence of at least 0.6, even for a camera across a room with echo. A sharp match raises it to 1. Windows that disagree by 5 ms or more score 0.
- A shorter shared stretch has a single window, so both that match and the overall alignment must be clear.
- Low confidence is a result, not a failure. A camera whose microphone was off has nothing to align, and the run still completes.

### Notes

| Note | When it appears |
| --- | --- |
| A weak match | Confidence below 0.5. Check that offset by ear. |
| No clear match | Confidence below 0.2. The offset is a guess. |
| Drift | The drift over the shared stretch is more than one frame at 30 fps, which is 33 ms. The note gives the total drift and the worst error at the ends, which is half of it. |
| No shared sound | The recording shares no stretch with the reference. Its confidence is 0. |
| No audio track | The recording, for example a picture-only camera file, has no sound. It gets a row with confidence 0, and the other recordings are still aligned. |

## Credits
Audio Sync costs **10 credits for each recording aligned to the reference**: 10 × (recordings - 1). The reference itself is not aligned against anything, so it costs nothing. The length of the recordings does not change the price.

| Recordings | Credits |
| --- | --- |
| 2 | 10 |
| 3 | 20 |
| 4 | 30 |
| 5 | 40 |
| 6 | 50 |

On the canvas, the price follows the number of recordings wired into **Sources**. An estimate made without the workflow's connections quotes the 6-recording price, 50 credits, so that it never quotes too little. Self-hosted Community and Business editions use no credits.

## Examples

**A microphone and one camera.** The camera started 7.5 seconds after the microphone. The result is `mic` at `0`, the reference, and `cam` at `+7500`. The run costs 10 × (2 - 1) = 10 credits.

**A microphone and three cameras.** Camera A started 7.5 seconds after the microphone, camera B 40 seconds before it, and camera C, recording at 44.1 kHz, 3.25 seconds after it. The result is `mic` at `0`, `camA` at `+7500`, `camB` at `-40000` and `camC` at `+3250`. The run costs 30 credits.

**Six recordings, with camera A as the reference.** The same offsets are measured on camera A's clock instead. Every value shifts by camera A's own offset, and `camA` is at `0`. The run costs 50 credits.

**Drift.** Two recorders whose clocks differ by 100 parts per million move 360 ms apart per hour. Over a 40-minute shared stretch that is 240 ms, well over the 33 ms threshold. `driftMsPerHour` is about 360 in size, with a sign that says which way the recording slides. A note warns that the ends are off by up to 120 ms. Nothing is corrected.

## Limits
- **2 to 6 recordings per run.** With fewer or more, the run is refused before it starts, and no credits are held.
- **Shared sound.** Recordings must share at least 2 seconds of sound. A recording with none gets a note and a confidence of 0.
- **The reference needs sound.** It is the clock that everything is measured on. A reference without a sound track fails the run with a message that names it. Any other recording without sound only gets its own row with a confidence of 0.
- **Drift is reported, not corrected.**
- **Long files.** On its first run, a recording is fetched in full, up to 64 GB and up to one hour. The download must arrive at about 2 Mbit/s or faster. If it is slower than that for a whole minute, the fetch is abandoned. Later runs reuse the prepared audio.

## Tips
- **Make the main microphone the reference.** Wire it first or choose it under **Reference**. Its offsets then drop straight into the edit, where the main microphone's clock is the timeline.
- **Check low confidence by ear.** It usually means the recording barely heard the conversation, such as a muted camera or a distant wide shot in a loud room.
- **Read the drift notes on long episodes.** More than a frame of drift means the lip sync slides over the episode, even when the start lines up.
- **Enter the offsets in the edit.** [Edit Plan](https://nodaro.ai/docs/nodes/video/edit-plan) takes an offset for each of its sources in its settings panel.

## From the API
`POST /v1/audio-sync` takes `sources`, a list of 2 to 6 objects with a unique `id` and a `url`, and an optional `reference` that must be one of the ids. A repeated id, or a reference that is not one of the ids, is refused with a `400 validation_error` that names it. The finished run's `output_data.json` is the result above. The SDK method is `client.edit.audioSync`, the CLI command is `nodaro edit audio-sync`, and the MCP tool is `audio_sync`. See [Voice and media](https://nodaro.ai/docs/developers/api/voice-and-media).

## Frequently asked questions

### How many recordings can Audio Sync line up?

From 2 to 6 recordings per run, in any mix of audio and video. For a video, the node listens to its sound track.

### What does a positive offset mean?

The recording started after the reference. An offset of +7500 means that second 0 of the recording is second 7.5 of the reference. The rule is reference time = recording time + offset.

### Does Audio Sync correct clock drift?

No. It measures the drift and warns you in the notes when it is larger than one video frame, but it never changes the recordings. The offset is measured in the middle of the shared stretch, which halves the worst error at either end.

### How many credits does Audio Sync cost?

10 credits for each recording aligned to the reference, so 10 × (recordings - 1). Two recordings cost 10 credits and six cost 50. The length of the recordings does not change the price.

### What happens if one camera did not record sound?

That recording gets a confidence of 0 and a note, and the other recordings are still aligned. Only the reference must have sound, because every offset is measured on its clock.
