Universal chorus selection: chorus mandatory, pre-chorus only natural extension

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.
This commit is contained in:
Sebastjan Artič 2026-04-29 13:36:34 +00:00
parent 389c26d012
commit 90cdad516b

View File

@ -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):
{{