# 音声同期

> 1 つの会話を収録した 2〜6 本の録音のずれを音から測定し、オフセットを入力しなくてもマルチカム編集をそろえられるようにします。時計のドリフトも報告します。

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

**音声同期**（Audio Sync）ノードは、1 つの会話を収録した 2〜6 本の録音について、それぞれの時計がどれだけずれているかを音から測定します。ポッドキャストは、ゲストごとのカメラ、ワイドショット、メインマイクのように、同時に何本も収録されることがよくあります。それぞれの収録は、別々のタイミングで開始されます。音声同期はそのすべてを聞き取り、1 本の基準の録音に対して、各録音がどれだけずれているかを報告します。これで、誰もオフセットを入力しなくても、マルチカム編集の素材がそろいます。

このノードは、AI モデルもプロバイダーのキーも使わずにローカルで動作するため、すべてのエディションで使えます。

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

## 使いどころ
- ゲストごとのカメラとメインマイクで収録したマルチカムのポッドキャストを、編集を計画する前にそろえます。
- テーブルに置いたレコーダーなど、別のオーディオレコーダーのオフセットを、カメラの音を基準にして求めます。
- 長時間の収録で、2 台のレコーダーの時計がずれていかないかを確認します。

## クイックスタート
### ノードを追加する
キャンバス上で Tab を押し、**オーディオ › 分析 › 音声同期**を選びます。

### すべての録音を接続する
オーディオまたは動画の録音を 2〜6 本、1 つの**ソース**入力に接続します。メインマイクを最初に接続すると、それが基準の録音になります。

### 基準を確認する
設定パネルを開きます。**録音**をドラッグして並べ替えるか、**基準**で録音を 1 つ選びます。

### 実行する
ノードの**実行**をクリックします。オフセットが、データとして**オフセット**出力に表示されます。

Workflow: マイクと 2 台のカメラをソース入力に接続し、各カメラのオフセットを、マイクを基準に測定します。

- オーディオアップロード → 音声同期 (ソース)
- 動画アップロード → 音声同期 (ソース)
- 動画アップロード → 音声同期 (ソース)

## 入力と出力
| 入力 | 接続できるノード | 説明 |
| --- | --- | --- |
| **ソース** | オーディオノードと動画ノード、2〜6 個 | そろえる録音です。動画の場合、ノードはそのサウンドトラックを使います。 |

各録音は、その録音を送るノードで識別されます。そのノードの ID が、結果の中で録音の `sourceId` になります。これは、編集プランが同じ録音に付ける ID と同じです。

出力の**オフセット**は、オーディオではなくデータです。[**フィールドを抽出**（Extract Field）](https://nodaro.ai/docs/nodes/automate/extract-field)など、データを読み取るノードに接続します。

## 設定
| 設定 | 説明 |
| --- | --- |
| **録音** | 接続された録音が、順番に並びます。ドラッグして並べ替えます。最初の録音がデフォルトの基準になり、結果にはこの順番でオフセットが並びます。 |
| **基準** | すべてのオフセットの測定の基準となる録音です。**最初の録音（既定）**か、接続されている任意の録音を選びます。選んだ録音が後で接続解除された場合、ノードは再び最初の録音を使います。 |

## 測定の仕組み
ノードは、3 つの段階で各録音を基準の録音と比較します。

1. **粗い比較**：2 つの録音全体のラウドネスを比較します。これにより、ずれがどれだけ大きくても見つけられます。マイクより何分も前に開始したカメラでも同じです。
2. **細かい比較**：最初の結果の周辺で、波形を比較します。比較には、両方の録音に共通する区間から取った、10 秒のウィンドウを最大 3 つ使います。各周波数は位相で重み付けされるため、響きのある部屋の向こう側にあるカメラでも、反響音ではなく直接音でタイミングが測られます。クリーンな録音では誤差は約 1 ミリ秒以内に収まり、反響のある録音でも通常は数ミリ秒以内です。
3. **ドリフト**：別々のレコーダーの時計は、わずかに異なる速さで進みます。その差は、一般的に 20〜100 ppm（100 万分の 20〜100）です。ノードは各ウィンドウのオフセットを直線に当てはめ、その直線の傾きをドリフトとします。測定できるドリフトは、最大 200 ppm です。

時間は、各ファイル自身の時計で読み取ります。これは、編集でカットの基準になる時計です。音が映像より後に始まる動画は、その差を含んだまま測定されます。

## 結果の読み方
**オフセット**出力は、次のような形式です。

```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` | 基準の録音に対して測定したドリフトで、1 時間あたりのミリ秒で表します。共通区間が短すぎてドリフトを測定できなかった場合は `null` です。 |
| `notes` | 平易な言葉で書かれた警告です。 |

### オフセットのルール
**基準の時間 = 録音の時間 + オフセット**です。これは、編集決定リストと同じ符号のルールです。メインの録音を基準にすると、各オフセットは、その録音を編集で使うときの値そのものになります。

- マイクより 7.5 秒後に開始したカメラのオフセットは `+7500` です。カメラの 0 秒目が、マイクの 7.5 秒目にあたります。
- マイクより 40 秒前に開始したカメラのオフセットは `-40000` です。

### 信頼度
- 共通区間が 6 分以上ある場合、ノードは 3 つのウィンドウで測定します。3 つの結果が 1 ミリ秒以内で一致すれば、オフセットは信頼でき、信頼度は 0.6 以上になります。響きのある部屋の向こう側にあるカメラでも同じです。はっきりと一致すれば、信頼度は 1 まで上がります。ウィンドウどうしの結果が 5 ミリ秒以上食い違う場合、信頼度は 0 になります。
- 共通区間がそれより短い場合、ウィンドウは 1 つだけです。そのため、そのウィンドウでの一致と、全体の位置合わせの両方が明確である必要があります。
- 信頼度が低いことは、失敗ではなく 1 つの結果です。マイクがオフだったカメラにはそろえるための音がありませんが、それでも実行は完了します。

### メモ
| メモ | 表示される条件 |
| --- | --- |
| 弱い一致 | 信頼度が 0.5 未満です。そのオフセットを耳で確認してください。 |
| 明確な一致なし | 信頼度が 0.2 未満です。オフセットは推測値です。 |
| ドリフト | 共通区間でのドリフトが、30 fps での 1 フレーム、つまり 33 ミリ秒を超えています。メモには、ドリフトの合計と、その半分にあたる両端での最大誤差が示されます。 |
| 共通の音なし | その録音には、基準の録音と共通する区間がありません。信頼度は 0 です。 |
| オーディオトラックなし | 映像だけのカメラのファイルなど、その録音には音がありません。その録音には信頼度 0 の行が作られ、ほかの録音は通常どおりそろえられます。 |

## クレジット
音声同期の料金は、**基準の録音にそろえる録音 1 本につき 10 クレジット**で、10 ×（録音の数 - 1）です。基準の録音そのものは何にもそろえないため、料金はかかりません。録音の長さによって料金は変わりません。

| 録音の数 | クレジット |
| --- | --- |
| 2 | 10 |
| 3 | 20 |
| 4 | 30 |
| 5 | 40 |
| 6 | 50 |

キャンバス上では、料金は**ソース**に接続された録音の数に応じて決まります。ワークフローの接続情報なしで見積もる場合は、低く見積もることがないように、録音 6 本分の料金である 50 クレジットを表示します。セルフホスティングの Community エディションと Business エディションでは、クレジットを使いません。

## 例
**マイクとカメラ 1 台**：カメラは、マイクより 7.5 秒後に開始しました。結果は、基準の `mic` が `0`、`cam` が `+7500` です。料金は 10 ×（2 - 1）= 10 クレジットです。

**マイクとカメラ 3 台**：カメラ A はマイクより 7.5 秒後、カメラ B は 40 秒前、44.1 kHz で録音するカメラ C は 3.25 秒後に開始しました。結果は、`mic` が `0`、`camA` が `+7500`、`camB` が `-40000`、`camC` が `+3250` です。料金は 30 クレジットです。

**カメラ A を基準にした 6 本の録音**：同じオフセットを、代わりにカメラ A の時計で測定します。すべての値がカメラ A 自身のオフセットの分だけずれ、`camA` は `0` になります。料金は 50 クレジットです。

**ドリフト**：時計が 100 ppm 異なる 2 台のレコーダーは、1 時間に 360 ミリ秒ずれていきます。40 分の共通区間では 240 ミリ秒になり、しきい値の 33 ミリ秒を大きく超えます。`driftMsPerHour` の大きさは約 360 で、その符号は、録音がどちらの方向にずれていくかを示します。メモで、両端のずれが最大 120 ミリ秒になることが警告されます。補正は何も行われません。

## 制限
- **1 回の実行につき 2〜6 本の録音**：これより少ないか多い場合、実行は開始前に拒否され、クレジットは確保されません。
- **共通の音**：録音どうしで、少なくとも 2 秒間の音を共有している必要があります。共通する音がない録音には、メモと信頼度 0 が付きます。
- **基準の録音には音が必要**：基準の録音は、すべての測定の基準となる時計です。基準の録音にサウンドトラックがない場合、実行は失敗し、その録音の名前を示すメッセージが表示されます。それ以外の録音に音がない場合は、その録音に信頼度 0 の行が作られるだけです。
- **ドリフトは報告されますが、補正はされません。**
- **長いファイル**：最初の実行では、録音全体を取得します。上限は 64 GB、長さ 1 時間までです。ダウンロードの速度は、約 2 Mbit/s 以上である必要があります。それより遅い状態が 1 分間続くと、取得は中止されます。2 回目以降の実行では、準備済みのオーディオを再利用します。

## ヒント
- **メインマイクを基準にする**：メインマイクを最初に接続するか、**基準**で選びます。そうすれば、オフセットをそのまま編集に使えます。編集では、メインマイクの時計がタイムラインになるためです。
- **信頼度が低いときは耳で確認する**：信頼度が低いのは、たいてい、その録音に会話がほとんど入っていないためです。たとえば、ミュートされたカメラや、騒がしい部屋で遠くから撮ったワイドショットです。
- **長いエピソードではドリフトのメモを読む**：1 フレームを超えるドリフトがあると、冒頭がそろっていても、エピソードが進むにつれて口の動きと音声がずれていきます。
- **オフセットを編集に入力する**：[**編集プラン**（Edit Plan）](https://nodaro.ai/docs/nodes/video/edit-plan)では、設定パネルで各ソースのオフセットを入力できます。

## API から
`POST /v1/audio-sync` は、`sources` と、任意の `reference` を受け付けます。`sources` は、一意の `id` と `url` を持つ 2〜6 個のオブジェクトのリストで、`reference` はその ID のいずれかである必要があります。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)を参照してください。

## Frequently asked questions

### 音声同期ノードでは、いくつの録音をそろえられますか？

1 回の実行につき 2〜6 本の録音をそろえられ、オーディオと動画を自由に組み合わせられます。動画の場合、ノードはそのサウンドトラックを聞き取ります。

### オフセットが正の値のときは、何を意味しますか？

その録音が、基準の録音より後に始まったことを意味します。オフセットが +7500 なら、その録音の 0 秒目は、基準の録音の 7.5 秒目にあたります。ルールは「基準の時間 = 録音の時間 + オフセット」です。

### 音声同期ノードは、時計のドリフトを補正しますか？

いいえ。ドリフトを測定し、動画の 1 フレームより大きい場合はメモで警告しますが、録音を変更することはありません。オフセットは共通区間の中央で測定されるため、両端での最大誤差は半分になります。

### 音声同期ノードには何クレジットかかりますか？

基準の録音にそろえる録音 1 本につき 10 クレジットで、10 ×（録音の数 - 1）になります。録音が 2 本なら 10 クレジット、6 本なら 50 クレジットです。録音の長さによって料金は変わりません。

### 音を録音していないカメラがあった場合は、どうなりますか？

その録音には信頼度 0 とメモが付きますが、ほかの録音は通常どおりそろえられます。音が必要なのは、基準の録音だけです。すべてのオフセットは、基準の録音の時計で測定されるためです。
