From 90cdad516beb50755fb732136bdd6466fe60bcf0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastjan=20Arti=C4=8D?= Date: Wed, 29 Apr 2026 13:36:34 +0000 Subject: [PATCH] Universal chorus selection: chorus mandatory, pre-chorus only natural extension MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit User feedback: 'REFREN je obvezen, pre-chorus opcijsko' + 'sistem mora biti stabilen za vse jezike, tudi španščino in romunščino'. Two changes: 1. Web search is now MANDATORY first step (was: optional fallback): - Even if Claude thinks it knows the song, must search lyrics first - Universal lyrics sources by language: SLO: besedila.com, lyricstranslate.com DE: songtexte.com HR/SR/BS: tekstovi.net ES: letras.com, musica.com RO: versuri.ro IT: angolotesti.it FR: paroles.net EN: genius.com, azlyrics.com Universal: lyricstranslate.com (any language) - Search strategy: artist+title first, then transcript snippet fallback - Without lyrics, Claude cannot reliably identify chorus boundaries 2. Simplified selection rules - chorus is THE priority: - Chorus (full first occurrence) = MANDATORY - Pre-chorus = ONLY if 1-2 verse lines tightly connected to chorus - In doubt: just take chorus alone (12-25s) - Outro fillers explicitly multi-language: SLO 'aj ja ja' / 'ej ej ej' EN 'yeah' / 'oh oh' ES 'ay ay ay' RO 'hei hei' JA 'la la la' - 12-35s total range (was 15-35s, now allows shorter chorus-only clips) This makes the system language-agnostic: works the same way for Slovenian narodno-zabavna, Spanish reggaeton, Romanian manele, German Schlager, etc. The lyrics lookup is what makes it stable across languages. --- scripts/analyze.py | 90 +++++++++++++++++++++++++++++----------------- 1 file changed, 58 insertions(+), 32 deletions(-) diff --git a/scripts/analyze.py b/scripts/analyze.py index 6c86fe2..2e491bf 100644 --- a/scripts/analyze.py +++ b/scripts/analyze.py @@ -769,17 +769,35 @@ def _build_analysis_prompt(transcript, video_duration, target_duration=30, filen hint_block = f""" 🎵 IME DATOTEKE: "{filename_hint}" -Iz imena datoteke morda lahko prepoznaš naslov pesmi ali izvajalca. Če je tako: -- Uporabi svoje znanje o **dejanskem besedilu** te pesmi -- Če Whisper transkript ne ustreza znanemu besedilu pesmi, POPRAVI besedilo na **dejansko besedilo pesmi** -- Ohrani timestamp-e iz Whisper-ja (časovne meje so pravilne, samo besede so morda napačne) -🔍 ČE NE POZNAŠ PESMI (npr. slovenske narodno-zabavne, manj znane pesmi) → **UPORABI web_search tool** da poiščeš pravo besedilo! - Primeri search queryjev: - - "[ime izvajalca] [naslov pesmi] besedilo" (slovenske: Modrijani, Veseli Dolenjci, Avseniki, Čuki, Atomik Harmonik) - - "[artist] [title] lyrics" (angleške/nemške) - - Pogosto so besedila na: besedila.com, lyricstranslate.com, genius.com, tekstovi.net (HR/SR), songtexte.com (DE) - Ko najdeš pravo besedilo, uporabi to za popravljanje "corrected_segments" — **transkript bo veliko bolj točen** kot če le ugibaš. +🚨 **PRVI KORAK — VEDNO PRED ANALIZO**: +Iz imena datoteke prepoznaj izvajalca + naslov pesmi. Potem **OBVEZNO uporabi web_search tool** da poiščeš pravo besedilo pesmi — TUDI ČE MISLIŠ DA POZNAŠ PESEM. + +Razlog: večinoma ne poznaš celotnih besedil pesmi (predvsem ne-angleških). Brez pravega besedila NE MOREŠ: +- Pravilno prepoznati strukture (verz / pre-chorus / chorus / bridge) +- Vedeti kje refren **začne in konča** (vključno z outro frazami) +- Popraviti STT halucinacij + +📋 **Search strategija** (univerzalna za vse jezike): +1. Prvo iskanje: `[izvajalec] [naslov] lyrics` ALI `[izvajalec] [naslov] besedilo/Songtext/letra/versuri` +2. Če ni rezultatov: `[del transkripta - 4-5 zaporednih besed] lyrics` +3. Trusted lyrics sajti po jezikih: + - 🇸🇮 SLO: besedila.com, lyricstranslate.com + - 🇩🇪 DE: songtexte.com, lyricstranslate.com + - 🇭🇷🇷🇸 HR/SR/BS: tekstovi.net, lyricstranslate.com + - 🇪🇸 ES: letras.com, musica.com + - 🇷🇴 RO: versuri.ro, lyricstranslate.com + - 🇮🇹 IT: angolotesti.it + - 🇫🇷 FR: paroles.net + - 🇬🇧🇺🇸 EN: genius.com, azlyrics.com + - **Univerzalno**: lyricstranslate.com (vsi jeziki) + +Ko najdeš lyrics: +- Identificiraj kateri del je REFREN (ponavlja se) +- Identificiraj VERZE (zgodba, ne ponavlja se) +- Identificiraj BRIDGE / PRE-CHORUS / OUTRO če obstajajo +- Mapiraj transkript timestamp-e na strukturne dele +- Popravi corrected_segments z dejanskim besedilom """ return f"""Tu je transcript pesmi iz STT modela (timestamp v sekundah, besedilo): @@ -788,8 +806,8 @@ Iz imena datoteke morda lahko prepoznaš naslov pesmi ali izvajalca. Če je tako Cela pesem traja {video_duration:.1f}s. Cilj: izrezati ~{target_duration}s odsek za TikTok/Instagram Reel.{hint_block} -⚠️ POMEMBNO: STT lahko naredi napake — narečne besede, slovanski jeziki, ko glasba prevladuje: -- Pri narečjih in slovanskih jezikih +⚠️ POMEMBNO: STT lahko naredi napake v vseh jezikih, posebej: +- Pri narečjih, slovanskih jezikih, romanskih jezikih - Generira "tipičen" tekst (npr. tekst druge pesmi istega izvajalca) - Lahko vstavi besede ki se POdoBNO slišijo, ampak imajo ČISTO drug pomen @@ -807,32 +825,40 @@ PROSIM: - Refren MORA imeti vse pojavitve ENAKE - Popravi pomešane jezike (vse vrstice v enem jeziku) - Ohrani timestamp-e nespremenjene -3. Prepoznaj REFREN: del besedila ki se PONAVLJA (ponavadi je 2-4 vrstice ki se večkrat ponovijo skozi pesem) +3. Prepoznaj REFREN: del besedila ki se PONAVLJA (ponavadi 2-4 vrstice, ki se v pesmi večkrat ponovijo). To je **univerzalno za vse jezike** — refren je strukturni element pesmi, ne le slovenske/nemške/angleške. -4. **IZBERI ODSEK PO TEM PRIORITETNEM REDU:** +4. **IZBERI ODSEK — REFREN JE GLAVNA STVAR:** - 🥇 **PRVA IZBIRA**: zadnji verz pred refrenom (build-up) + cel **PRVI** refren - - Build-up = zadnji verz pesmi tik PRED prvim refrenom (običajno 8-15s) - - Refren = ves prvi nastop refrena (običajno 10-20s) - - SKUPAJ: 20-35 sekund - - Začni na začetku build-up verza (ne sredi besede) - - **Končaj 1-2 sekunde PO zadnji besedi refrena** — pevec ima outro / drži ton, naj clip zajame celoten emocionalni vrh - - **NE reži clip točno na zadnjo besedo** — refren naj se naravno izteče (vključno s "ej-ej-ej", "oh", "yeah" outroji) - - Primer: če refren začne na 32s in zadnja beseda konča na 48s → izberi 20-50s (12s build-up + 16s refren + 2s outro padding) + ## 🎯 OBVEZNO: cel **PRVI** refren + - **Začetek**: prva vrstica refrena (kjer ponavljanje prvič začne) + - **Konec**: vključno z **vsem naravnim izpevom refrena**: + - Outro fraze ki so del refrena (slo: "aj ja ja", "ej ej ej"; en: "yeah", "oh oh"; es: "ay ay ay"; ro: "hei hei"; ja: "la la la" — uniSAERZALno čez jezike) + - Pevec drži zadnji ton 1-3s — to je **del refrena**, ne reži ga + - Refren naj se **naravno izteče** - 🥈 **DRUGA IZBIRA** (samo če pre-chorus ni dovolj močan): samo cel **PRVI** refren - - Brez build-upa, samo refren z 1-2s padding pred in 1-2s padding po - - Ne sekaj ravno na zadnji besedi + ## 💡 PRE-CHORUS samo če JE pred refrenom in pasta naravno + - **PRE-CHORUS = zadnja 1-2 vrstici verza tik pred refrenom** (slišne, povezane z refrenom) + - **Dodaj samo če**: + - Je tik pred refrenom (brez pavze ali instrumental vmes) + - Vsebinsko vodi v refren (gradnja občutka, "stopnjuje" se) + - Je kratek: 4-10 sekund + - **Ne dodajaj** pre-refrena če: + - Refren se začne neposredno za prejšnjim refrenom + - Verz je predaleč (>2s pavze) ali je instrumental vmes + - Bi presegel skupno dolžino 35s + - **V dvomu**: bolje SAMO REFREN kot da bi dodal čuden pre-chorus - 🥉 **TRETJA IZBIRA** (samo če pesem nima jasnega refrena): najbolj dramatičen/zaključen del + ## 📏 Skupna dolžina: 12-35 sekund + - **Sam refren** (najpogostejša izbira): 12-25s + - **Refren + pre-chorus**: 18-32s - **NIKOLI**: - - Ne izbiraj DRUGEGA ali tretjega refrena (pojasnimo: prvi nastop ima največ energije) - - Ne vključuj instrumentalnih medbridge sekcij ali "la la la" delov - - Ne preskakuj med verzi (clip mora biti ena celota) - - Ne podaljšuj clipa čez 35 sekund + ## 🚫 NIKOLI: + - **Drugi/tretji refren** — vedno PRVI nastop + - **Instrumentalni medbridge** brez petja + - **Skok med verzi** (clip mora biti ena neprekinjena celota) + - **Sekanje sredi besede ali izpeta tona** -5. Če Whisper transkript je v večini halucinacija (manj kot 30% smiselnih besed), v "reason" napiši "WHISPER_HALLUCINATION_DETECTED" in vrni najmanj segmentov (samo tisti ki so smiselni) +5. Če transkript je v večini halucinacija (manj kot 30% smiselnih besed), v "reason" napiši "STT_HALLUCINATION_DETECTED" Odgovori SAMO v JSON formatu (brez markdown, brez razlage): {{