Spaces:
Sleeping
Sleeping
| # Frontend Integration Guide β λ¨μΌ μ€νν Analyze API (v1) | |
| `POST /analyze` λ₯Ό νΈμΆν΄ **ν μ€ μ€μ ** μ 보 μ¬μ§(1μ₯ λλ μ¬λ¬ μ₯)μ 보λ΄κ³ , **λ³ν©λ λ¨μΌ λ©λ‘λ JSON**μ λ°λλ€. μ΄μ λ€μ€ μ€ννΒ·ν©μ°½ μ€νκ³Ό **νΈνλμ§ μλλ€**(νλ κ΅¬μ‘°κ° λ¨μνλ¨). | |
| μμΈ κ³μ½: **`docs/analyze-api-spec.md`** (SSOT). | |
| --- | |
| ## 1) ν μ€ μμ½ | |
| | νλͺ© | λ΄μ© | | |
| |------|------| | |
| | μ λ ₯ μ΄λ―Έμ§ | **ν μ₯λΉ staff ν μ€**λ§ μλ€κ³ κ°μ | | |
| | Clef / μ‘°ν | μ΄λ―Έμ§μ μμ μ μμ β **`score_context` λ‘ νμ μ λ¬** | | |
| | νμ | μ΅λ 2μ±λΆ; μλ΅ λ©λ‘λλ **νμ μ΅κ³ μ**λ§ | | |
| | μ¬λ¬ μ₯ | **μ λ‘λ μμ = μ 보 μ§ν μμ**; μλ²λ μ₯λ³ λΆμ ν **`melody.events` νλλ‘ λ³ν©** | | |
| | μ¬μ ν΅μ¬ | `timeline` + `melody.events` + (νμμ©) `score_context` | | |
| --- | |
| ## 2) μμ² λ§λ€κΈ° | |
| ### 2.1 `multipart/form-data` | |
| - **`score_context` (νμ):** JSON **λ¬Έμμ΄** ν λ©μ΄λ¦¬. | |
| - μ΅μ: `{ "clef": "treble", "key_signature": { "fifths": 0 } }` | |
| - μ ν: `time_signature`, `tempo_bpm_reference`, `divisions` (κΈ°λ³Έ `4/4`, `null`, `4`) | |
| - **`files`:** κ°μ νλλͺ μΌλ‘ μ¬λ¬ λ² λΆμ΄κ±°λ, λ¨μΌ `file` μ¬μ©. | |
| - **`options`:** JSON λ¬Έμμ΄. λ³΄ν΅ `{ "return_debug": false, "quantization": "1/8" }`. | |
| ### 2.2 `fetch` μμ (λΈλΌμ°μ ) | |
| ```javascript | |
| const scoreContext = { | |
| clef: "treble", | |
| key_signature: { fifths: -1 }, | |
| time_signature: "4/4", | |
| tempo_bpm_reference: 72, | |
| divisions: 4, | |
| }; | |
| const form = new FormData(); | |
| form.append("score_context", JSON.stringify(scoreContext)); | |
| form.append("options", JSON.stringify({ return_debug: false, quantization: "1/8" })); | |
| for (const file of fileListFromInput) { | |
| form.append("files", file, file.name); | |
| } | |
| const res = await fetch("/analyze", { method: "POST", body: form }); | |
| const data = await res.json(); | |
| if (!res.ok) throw new Error(JSON.stringify(data)); | |
| ``` | |
| ### 2.3 `curl` μμ | |
| ```bash | |
| curl -X POST http://localhost:8000/analyze \ | |
| -F 'score_context={"clef":"treble","key_signature":{"fifths":-1},"time_signature":"4/4","divisions":4}' \ | |
| -F 'options={"return_debug":false,"quantization":"1/8"}' \ | |
| -F "files=@sample_imgs/sample_oneline_0.png" \ | |
| -F "files=@sample_imgs/sample_oneline_chord.png" | |
| ``` | |
| --- | |
| ## 3) μλ΅ μ½κΈ° | |
| ### 3.1 μ΅μ ꡬλ νλ | |
| - **`melody.events`:** μ¬μΒ·νΈμ§μ 본체. μκ° μ. | |
| - **`timeline.divisions`:** `duration_div` / `onset_div` μ μ²λ(ν 4λΆμν = `divisions`). | |
| - **`timeline.time_signature`:** λ§λ κΈΈμ΄ ν΄μΒ·UIμ©. | |
| - **`score_context`:** μ‘°νΒ·clef νμ(μλ² μμ½; ν΄λΌμ΄μΈνΈκ° λ³΄λΈ κ°μ΄ μ λ΅). | |
| ### 3.2 μ΄λ²€νΈ νμ | |
| - **`note`:** `step`, `octave`, `alter`, `duration_div`, `onset_div` νμ. `pitch_midi` κ° μμΌλ©΄ μ¬μμ μ¬μ© κ°λ₯. | |
| - **`rest`:** `duration_div`, `onset_div` λ§μΌλ‘ μΆ©λΆ. | |
| **μκ° κ³μ°:** | |
| - μ λ μκ°(μ΄)μ μλ²κ° κ°μ νμ§ μλλ€. | |
| - `beat = onset_div / divisions` λ‘ λ§λ λ΄ μμΉλ₯Ό κ³μ°ν μ μλ€. | |
| ### 3.3 μ¬λ¬ μ₯ μ΄λ―Έμ§ UI μ°λ | |
| - **`segment_map`:** κ° μλ³Έ μ΄λ―Έμ§κ° `melody.events` μ μ΄λ μΈλ±μ€ ꡬκ°μ ν΄λΉνλμ§. | |
| - **`events[].segment_order` / `bbox`:** νΉμ μμ μλ³Έ ν¬λ‘ μμ νμ΄λΌμ΄νΈν λ μ¬μ©(μμ μ μμ). | |
| ### 3.4 `warnings` | |
| - μΉλͺ μ μ΄μ§ μμλ **νμ§ μ ν**λ₯Ό λνλΌ μ μλ€. | |
| - UIμμλ ν μ€νΈ/λ°°μ§λ‘ λ ΈμΆνκ³ , μ¬μ©μμκ² βμλ μΈμμ΄ λΆμμ ν μ μμβμ μλ΄νλ μ©λλ₯Ό κΆμ₯. | |
| --- | |
| ## 4) μ€λ₯ μ²λ¦¬ | |
| | μ½λ | νλ‘ νΈ μ‘μ μμ | | |
| |------|------------------| | |
| | `400` | `score_context` / `options` / νμΌ νλ κ²μ¦ | | |
| | `413` | μ λ‘λ μ ν΄λΌμ΄μΈνΈμμ μ©λ μ¬μ μ°¨λ¨ | | |
| | `415` | νμ₯μ νν° | | |
| | `422` | βμ΄ μ¬μ§μ ν μ€ μ λ³΄λ‘ μΈμλμ§ μμμ΅λλ€β + μ¬μ΄¬μ μλ΄ | | |
| --- | |
| ## 5) λ§μ΄κ·Έλ μ΄μ λ©λͺ¨ (κΈ°μ‘΄ νλ‘ νΈ λλΉ) | |
| - **`detection.staffs[].voices[]`** ꡬ쑰 **μ κ±°** β **`melody` λ¨μΌ λΈλ‘**μΌλ‘ ν΅ν©. | |
| - **`score_type_estimate`**, **`is_accompaniment`**, **`include_accompaniment`** μ΅μ : v1 μ€ν μμ. | |
| - Clef/key λ λ μ΄μ βμλ² μΆμ βμ΄ μλλΌ **ν΄λΌμ΄μΈνΈκ° `score_context` λ‘ μ 곡**ν΄μΌ ν¨. | |
| --- | |
| ## 6) μ°Έκ³ νμΌ | |
| - `docs/analyze-api-spec.md` β νλΒ·μλ―ΈΒ·κ²½κ³ μ½λ μ 체 | |
| - `docs/analyze-response-format-examples.json` β λ³΅λΆ κ°λ₯ν μμ JSON | |