From fab54845c8f43ff4c0ec6d078412bad353f588da Mon Sep 17 00:00:00 2001 From: David Kifer Date: Mon, 12 Jan 2026 13:38:36 -0500 Subject: [PATCH] syncing the current fixes --- .../__pycache__/translator.cpython-313.pyc | Bin 12051 -> 12775 bytes .../__pycache__/utils.cpython-313.pyc | Bin 12405 -> 12686 bytes .../ai_transcriber_v2/translator.py | 42 ++++++++++++++---- 3 files changed, 33 insertions(+), 9 deletions(-) diff --git a/video_transcription/ai_transcriber_v2/__pycache__/translator.cpython-313.pyc b/video_transcription/ai_transcriber_v2/__pycache__/translator.cpython-313.pyc index 08628846598b1835020e7ae37410db8f729e2d60..190b8639b6dba84949988ee62384ae8c8d652c09 100644 GIT binary patch delta 3362 zcmZ`5ZERE5^?F>I{SrPBmk=N!gHQ-dQzCFkU_89CI-P5rm(*atmtH?s zl4%4@RmWOwZFkj`v1-t+TA^R-lvbKFO{xZT{j;y?z!ijd+zzZ=3oC?K6q78d<4GVZq*B={%3>D3yqYJ=ZHo$I!0J^rHndz7jwbt z8WU0i6IA30V`55Tl7ow5a>~uz4la#(QeNgw`Is-|XZ}=x1spmZQ)Se1<05uAtyVlG>iBoTXcZlFm2MS0X{63h;k*H$aFUHH0|-byI@-T!|H8 z#*L@&ON*LI6EqS2q(P~H?0lIJLrP10r)xu4PRrd@F_K#evNC^DY2()w#b0-ejI>a& zaY1vZX^?21v>YV;qT$xOh9?ugE##@W2^S2*1>QKx)YrKCA~kGz?IdZJ=1aRZf3IsD z)dGVq!8SD3fm+Of-q7!^?V$J~_*XMPC40ghq=$6Z?w^8cn|7%r0p0>r z*d`>%G(B)qi>`&n+5%zEfmxZ(+C}>yvv+?`r}FZJ3AoY-3Xd%)$c$PvXJ!h@Sskrf>WAmY4vujQak8`CJUj-&gQH~Y_WXgV3}dlven3!XPH@= zwQPSWcQkt|)V4ckSvvn*>Im8boGjxAQQ_ku`M%hFu)%&VKL_3(Crduk*nNCrNnFoA z@Ha)Tc}O&NGE!N&>6g=${Rb)!PhE=WoCbOamSob<|JL?O-^dc7_tV(NvG$Yll0d`i zl0cM(r2uJdJ27^-RXx-CQR~`g+)J*;a6A8#9FyRRu66vT+`90B*N()lMoC-m7wsfE zO_wGp2}Pbh_T6J=^b^M_bv+eN&-H7qq`BiN@rT<#gDZ@)`Af0BxAGr1x1RR?$a`k^ zri-5t>q#-Hf$|&HzL62>YSH-3Gqz`1_9WNBn8=e|=)<5ZD3I5mmJ-aYew%-8Hv$?!gFb&oZ6nMb>*obq`)DYS- z&J>jmqih)4xXQy0g}!B2PCw?y8^+`WU@XEvXjo5W?uwkFG5&hw%fT%`F5~!sP(mPY zL|P;?=M^4{uA`a7UD3^ymiV_D$NLN*CtX#C(X^z%3b5Ed7%Gq`3x;qtIm_B;Q(T$_ znV&DNY`P)R1W&Z})6$~W_9k^ReCWU+IsP4L@bAZ0t#$kr%5yN1^`ixgiKty3DHe3Y zs$Pqh-KshM=XleIQ*YuSvtY0dz)A*eKMdDw-ZU&cZ5fSMj~_n{F@3vhn6Bpk?CNt4m-r96>js}j!Dj$~7A%3J$bNvN+gfbDm18qH zIs?zr9oqiby^Z$pw&Z}L?I3?U*&tW7@!us|A~=58vjFZqb2B+i`}nqdHacfw{Hc33 z58&mtXMAp4FPUtPp$f1Cn+Ou?*y1?zJgRas>iBZ~o*i^EA6kQfm|n9)nnd(TWO4*25xjul4EOcK8=PlTF6q`I=2X@7=lQ)oG12(p(!`cmfDehp)pj0b#>+baWz_V2=UD<`DEDK%;GW#x!S&dbO4U z)lKh=ZsZCKe;e8!D3n~jV9hZZ&)~0J=0SiHhOGc#*G<7InynRwxxkn+8~iA+1_4e& zTRLJDisfn`oE%^zozyx#=+v(rs5a-USuEt|*kP2IMS!*DIC_q-4B}1zJX=fV)RCe- t#NGiKh5s^Sqn^N{Na-iU`w8)VLj0eSc7CF_UD`w=*BF1bR~J#ke*mnb{@wrp delta 2618 zcmZuyU2Gf25#BxWj>msW{HG<6RAjo8WXiVU9|f^%$&u<(mK^v>#Es|>C+bKuIq{gi zQzONNDJ20S7bqNc8zeB?*6l-E<)KI*voZKmyjDW3nUPNjgD} zN@4;%i%C$5Nlr@&f#kBJu;fl45-B=*QBmwglIJkw#GazF_bDWKC7Y zAbxGvLlzM_|B7mF2bhAqrmiF8Mk&bmT$GN6gH7OQ1oxpdnhCY-97uLU1k`+Yuyx!3iaCZN^im9jog3Y9yh8vw;_%r04l3>BoHB zx6YaNIYlp<_Jw-Qpk2Z=)r3cLVTe3!+H_*9W7AR5$h>TnUJR#FGiS82tftPKnYxe~ zCqyHUrLx{1I8xY6(~jhzpsA`nFPrxAMcFW&$bccDQvip4aqvnxOkh-1eNfZ&Ip9)ONpM%!XHAG+g@Ty0)y ze&p}p^7n5J9RI+7V%5GQpm6-n&}QG!cPk%;#_3a`;pQiiBX2i1k9=br;nTSLR(JZ% ziESGW_ifuyM|4|sbj0o?_x|M4wM%b@|9oWgnYpboWplK$m8`yY`c@|Q%cZT%$h+CC z%o87F@>`kw2bnXko&7kPxz#uPW9MBPitW3bMBxd%-H!sHtCz1_zM-sM-t-S{ii7{z zaiUnd^cmthVt)@tKi}p-__3PkT_VDAn2hP3I+ekk_e@dud=AG)WHL9s85 zj+{D({_u4X@Q>o-r{dgAdkEy4ao4FFfAbN6$yt8m*Zwj`f9H88ZBfW*BCMNhJHXXF zt~hPt6k)wW67+}Op==iuyBYK_U>p-@z!v!=#iTTYUivR@thtwo83y|R)}4g4JIONW z2QXa*k?XoD8ydOq2)!DqRcm!wEg8z9LH0BA9DwcwNVOj_#3JlzM^H)?SygA{@^hv6 zrFmsuBTIxo4km{-R((IU3x_}?!*nRv)AvB7H=t;8gsG1**e&+?;6U?%V%gt6yjZ3< z#$bfOSF0wE!QR7Ck3J;z3Q-ht5*#G>ZR`ng7@wd$;qP&uV)|D2Y>d%py6ZqoNiJKL zgV$9>X;6P8(rppap=#93RN(?_XSr5|ESIc}oQK79!M%i2 zGir+7I;tS1>7^PW7horwF*Hn2{RZ8>PoT8EvsNdN5NBo{0kI}#N4CCTPIQc8g zo7e?;{w4J)zCh2V_cpD%ZTgaK+LgtcL0EWGIHlHl%H)eRQK>dG>+u|20OS!G$JkZ&U-BEmQ#gY>`Y z;kd=K_si3RC}aWDzuCz5W*m5kKA$~`U35LW59jGt_R=5=oyC^Ty4|!9AnCg-T!R5q z>TK?(mY0`-{l)%K?4!T!KV&)2)29dgBg@Qi1puO)WQ(1=%(lLWV!EMR#&Q{Gy+7K| z29Dzp{bb;<6>XL-4hDr~=DI@H1`{DR8p%rl_xt>Qa1U3WF;QzRzHd{x#PVWFHn&m{*L8+FYyjRrg?uN9c7igjtDEaH50|h;c_i>smclR kbJ&DIj`TGE_-Q|GeIvORP4<6|KUz+n*aa+ diff --git a/video_transcription/ai_transcriber_v2/__pycache__/utils.cpython-313.pyc b/video_transcription/ai_transcriber_v2/__pycache__/utils.cpython-313.pyc index e9125e2a5394e86edc25c66f05d18f1022d74785..8750af8bdff95000ec22c11ee223c26d7b92ae03 100644 GIT binary patch delta 1511 zcmZ8gO>7%Q6!vU(ZP#|1q;{IrrcIMJwhRd_C6y`&O+xBMDQ$=tDnvMJw)Vu{vff?Z zu1!-w;nWkVRE;WrRH0rFAc0iysVagB2{>}3nhR3k0w+p@+5-pP+XPfG(ti8qdvD&n zdGpO*t5<5Jt=`^L499~*!v3=yi~T~Ae@A-9*!uQr>E#XH!*y=(I8X2--^Eir%`?3B z@f4(nV`DMCJ0IhH$F%JwkmmjQ7-aYWVlUr=xSJ32Y(92@K_B18bCK202hlUY_ag4$ zc|H`e*#;{YexpQ7Wv2A-wR%fwV#8J18lVvNXrZXsY-r5N@rh65O}kh*%KNvRsu|3@yh-Bem>7*lx5%AXMUob`TJmJZ)io zM9nvCG7QLIMOQb^v26D^yTYEUS2`9{nqEs(>Q=|DS5A7hc1yTnQ0W9UuP!RSfWUJt z$E=Hva6F%!6^s;~8G_{oHL(5A_S}m6L3@VfyGGBij2)1_>xK9T?gfv?v~dWDiZPQM zL!!)JTy~7=^f-ABMj;4l&@_Y43hkO{g(2AI+o1?d^V1m6B8XBAkwuV|_l?nbRwNH+TIyjK8p~<5e`NJM&xKJZ=6PAqC1#QnE1IO8jTpgHV z%iU`O<5bk`JE&yabRV2OY#grfW@dwA(3GFJ#*A*dph6Drlh zdvHwGY6&=xlwu|<(m(099mlM->WT@lkO>k9+XtJ)lP%^7#yT>KT{|~rus7s~`<{3* zQUK^kmo*g+yf)N?iiZ|7M5y$p=UDJ2I-yP=2;P!f{<}hvOe$T)F;ci4{Ci%*5wIaQ z^Ti1&R`moSsJ^-o{bFu2}odN@?o%<)}-da=CUNwCyY?`R|og4vtgwC(Kd~8HtdZ-8_fx4j*{(8_p z9~@P><5_j32Nr6D`cUps$p95d36aK_=zu{F`fyvknmfh)#%DO&>~0o+G}zPf%Zbv+ z|MvJ8{qP9^hYJ(NiMK*9pL zCF)Wo26P&rir^^0f3H?0r%}IcN1T9f&_ORNSeLmY#j!tK3a19F)* delta 1237 zcmZ8gO>7%g5Z-6+t~a(fG5!JL*o|>WjSC5l(ugPx0V+jmR6(Ju3I!pY#ojm@_Q%Zb z(qnR>;!+7cMdeT=PJmRY66^tSLr8EysyOqIxReVAq?C}tk(qS@D(~>UdEd;Nc{6Y3 zM(=2|eW>eM3D=#VZ;y2(=^hCOB(qTdl-|f4-<9Nx&jt_@V zp|CH#$vPM&^-auVqv1ToRKtYJ3<(+eCk^Z`Orjhzq{ zoZ(aTcF9eA^&H#sLfFCsgnXmkz)D}MHi4d!F z+a5ei?v!g_hZdaW-?SR|alf>lIJHQ8rssS3=24u0`t7708q;-UAJ1RKtJ70*;o(^L zdv5#jndH0DLJP3VhGw`e-inWirvCuvoF0Y% diff --git a/video_transcription/ai_transcriber_v2/translator.py b/video_transcription/ai_transcriber_v2/translator.py index 8fbbff1..db38c65 100644 --- a/video_transcription/ai_transcriber_v2/translator.py +++ b/video_transcription/ai_transcriber_v2/translator.py @@ -1,5 +1,7 @@ import os import sys +import time +from datetime import datetime from google import genai from google.genai import types from tenacity import retry, stop_after_attempt, wait_exponential, retry_if_exception_type @@ -15,36 +17,58 @@ from utils import LANGUAGE_MAP def translate_via_ollama(source_srt_content, target_language="English", model="llama3"): """ Translates SRT content using a local Ollama model (Line-by-Line for progress). + Includes retries and debug logging. """ + debug_log_path = "ollama_debug.log" + try: subs = pysubs2.SSAFile.from_string(source_srt_content) # Using tqdm for progress bar - for line in tqdm(subs, desc=" Ollama Progress", unit="line"): + # dynamic_ncols=True helps it resize properly. leave=True ensures it stays after completion. + for line in tqdm(subs, desc=" Ollama Progress", unit="line", dynamic_ncols=True, leave=True): text = line.text.strip() # Skip empty, numeric-only, or extremely short non-word text if not text or text.isdigit() or len(text) < 2: continue - if text: - prompt = ( - f"Translate this subtitle text to {target_language}. Output ONLY the translation.\n" - f"Text: {text}" - ) + prompt = ( + f"Translate this subtitle text to {target_language}. Output ONLY the translation.\n" + f"Text: {text}" + ) + + # Retry loop for stability + max_retries = 3 + for attempt in range(max_retries): try: response = ollama.chat(model=model, messages=[{'role': 'user', 'content': prompt}]) + + # Check for "model not found" or other soft errors in response if API wraps them + # Usually ollama library raises ResponseError for 404 + translated_text = response['message']['content'].strip() if translated_text: line.text = translated_text + break # Success, exit retry loop + except Exception as e: - # Silent fail on line, logs would be too spammy in progress bar - pass + # Log error details + with open(debug_log_path, "a") as log: + log.write(f"[{datetime.now()}] Error on line '{text}': {str(e)}\n") + + if attempt < max_retries - 1: + time.sleep(2) # Wait before retry + else: + # If all retries fail, keep original text or empty? + # Keeping original might be safer than silence, or just skip. + # For now, we skip updating 'line.text' so it stays as source language (better than corruption) + pass return subs.to_string(format_="srt") except Exception as e: - print(f" [Local LLM] Error: {e}") + print(f" [Local LLM] Critical Error: {e}") return None def translate_fallback_mymemory(source_srt_content, target_language="en"):