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 μμ (λΈλΌμ°μ )
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 μμ
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