
    iL                         d Z ddlZddlZddlZddlZddlZddlZddlmZm	Z	m
Z
 d Zd Zd Zd Zd Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zedk(  r e        yy)u/   
苏小小的美丽传说 - 完整处理脚本
    N)Image	ImageDraw	ImageFontc                     ddddddd| g}t        j                  |dd	      }|j                  d
k(  r/t        t	        |j
                  j                               dz        S y
)u5   
    获取音频/视频文件时长（毫秒）
    ffprobe-vquiet-show_entriesformat=duration-of"default=noprint_wrappers=1:nokey=1Tcapture_outputtextr     )
subprocessrun
returncodeintfloatstdoutstrip)	file_pathcmdresults      2C:\dev\xtrs\vdcb\srtsegjoin\process_suxiao_full.pyget_file_durationr      se     dG_6GPtv  AC^^C4@FA5,,./$677    c                    g }g }d}t        d | D              }|rh| D ]b  }|j                  |      }|d   |d   z
  }	||	z   |k  r|j                  |       ||	z  }>|j                  dj                  |             |g}|	}d n| j	                         }
|j                  d      }|d   |d   z
  }|
D ]~  }|j                  |      }|d   |d   z
  }|rK||z   |z   |k  r|j                  |       |||z   z  }F|j                  dj                  |             |g}|}l|j                  |       |} |rD|r"|j                  dj                  |             |S |j                  dj                  |             |S )u   
    自动换行文本
    r   c              3   N   K   | ]  }d t        |      cxk  xr dk  nc   yw)i N  i  N)ord).0cs     r   	<genexpr>zwrap_text.<locals>.<genexpr>#   s"     ?$QfA0&00$s   #%     )anygetbboxappendjoinsplit)r   font	max_widthlinescurrent_linecurrent_widthhas_chinesecharbbox
char_widthwords
bbox_spacespace_widthword	bbox_word
word_widths                   r   	wrap_textr<      s    ELM?$??KD<<%Da47*Jz)Y6##D)+RWW\23 $v *  

\\#&
 mjm3DT*I"1	!4J ;.;yH ''-![:%==MLL,!78$(6L$.M##D) *   LL./ L LL,/0Lr   c                 \   t         j                  j                  | d      }t        j                  |      }g }|D ]U  }t         j                  j	                  |      }	 t        |j                  d      d   dd       }|j                  ||f       W |j                  d        |S #  Y qxY w)u4   
    获取音频文件列表，按序号排序
    zseg*.mp3-r      Nc                     | d   S Nr    xs    r   <lambda>z!get_audio_files.<locals>.<lambda>\       1Q4r   key	ospathr+   globbasenamer   r,   r*   sort)	audio_dirpatternfilesaudio_filesfilefilenameidxs          r   get_audio_filesrV   N   s     ggll9j1GIIgEK77##D)	hnnS)!,QR01CT{+	  (	s   3B''B+c                 r   t         j                  j                  | d      }t        j                  |      }g }|D ]`  }t         j                  j	                  |      }	 t        |j                  dd      j                  dd            }|j                  ||f       b |j                  d        |S #  Y |xY w)u1   
    获取TTS文件列表，按序号排序
    ztts*.mp3tts_r&   .mp3c                     | d   S rA   rB   rC   s    r   rE   zget_tts_files.<locals>.<lambda>n   s    1r   rG   )	rJ   rK   r+   rL   rM   r   replacer*   rN   )tts_dirrP   rQ   	tts_filesrS   rT   rU   s          r   get_tts_filesr^   `   s     ggll7J/GIIgEI77##D)	h&&vr2::62FGCc4[)	  NN~N&	s   >B22B6c                 z   t         j                  j                  | d      }t        j                  |      }g }|D ]d  }t         j                  j	                  |      }	 t        |j                  d      d   j                  d      d         }|j                  ||f       f |j                  d        |S #  Y xY w)u4   
    获取图片文件列表，按序号排序
    zsubtitle*.png_   .r   c                     | d   S rA   rB   rC   s    r   rE   z!get_image_files.<locals>.<lambda>   rF   r   rG   rI   )	image_dirrP   rQ   image_filesrS   rT   rU   s          r   get_image_filesrf   r   s     ggll9o6GIIgEK77##D)	hnnS)!,2237:;CT{+	  (	   AB66B:c           	         d}d}t         j                  j                  |      s#t        j                  |       t	        d|        	 t        j                  |      }|j                         }|j                  d| f       |j                         }t	        dt        |       d       t        j                  dd      }t        j                  dd	      }t        j                  dd
      }	t        j                  dd      }
t        |      D ]  \  }\  }}}t        j                  ddd      }t!        j"                  |      }d}t%        ||d      }d}|D ]@  }|j'                  |      }d|d   |d   z
  z
  dz  }|j)                  ||f||d       |dz  }B d| }|j'                  |      }d|d   |d   z
  z
  dz  }|j)                  ||dz   f||d       |j+                  d      }t%        ||	d      }|dz   }|D ]@  }|	j'                  |      }d|d   |d   z
  z
  dz  }|j)                  ||f||	d       |dz  }B |j+                  d       }t%        ||
d      }|dz  }|D ]@  }|
j'                  |      }d|d   |d   z
  z
  dz  }|j)                  ||f||
d       |d!z  }B t         j                  j-                  |d"|d#d$      }|j/                  |       |d%z   d&z  dk(  st	        d'|d%z    d(t        |               t	        d)t        |       d*       j7                          y,# t0        $ r,}t	        d+|        dd,l}|j5                          Y d,}~Ad,}~ww xY w# j7                          w xY w)-u   
    生成字幕图片
    \\ll\D\xtrssvjj\dpd.db   苏小小的美丽传说_images   创建输出目录: z8SELECT idx, cn, en FROM srts WHERE adid = ? ORDER BY idx   找到 
    句字幕z
simsun.ttc@   4   B   z	arial.ttfH   RGB)8  i  black)coloru   苏小小的美丽传说r   i  rs   r%   r   white)r-   fillT   u   译自@(   u   ，。！？，。！？   z#FFD700V   z,.!?\   	subtitle_03dz.pngra   
   u   生成字幕图片 /   完成！生成了 u    张字幕图片   错误: N)rJ   rK   existsmakedirsprintsqlite3connectcursorexecutefetchalllenr   truetype	enumerater   newr   Drawr<   r)   r   rstripr+   save	Exception	traceback	print_excclose)adidauthordb_path
output_dirconnr   	subtitles
title_fontsubtitle_fontchinese_fontenglish_fontirU   cnenimgdrawtitletitle_linesyliner4   rD   subtitlecn_cleancn_linesen_cleanen_linesoutput_pather   s                                  r   generate_subtitle_imagesr      s    (G2J77>>*%
J$ZL12Cw'QTXSZ[OO%	I'z23''b9
!**<< )),; ))+r: )) 4A}R))E<w?C>>#&D /E#E:t<KA#!))$/T!WtAw./A5		1a&$Zg	FR	 $ !)H ((2Da47*+1AIIq!b&k8-gIN yy!;<H <>HCA #++D1T!WtAw./A5		1a&$\		JR	 ! yy(H <>HGA #++D1T!WtAw./A5		1a&$\	HR	 ! '',,zYs3it3LMKHH[!A|q +AE7!C	N3CDEY !5\ 	#C	N#33CDE 	

  n
 	

s1   J#L6 -8L6 6	M+?"M&!M. &M++M. .N c                 x   d}d}d}t         j                  j                  |      s#t        j                  |       t	        d|        	 t        j                  |      }|j                         }|j                  d| f       |j                         d   }t         j                  j                  || d      }t         j                  j                  |      s t	        d|        	 |j                          y	t	        d
|        |j                  d| f       |j                         }t	        dt        |       d       t        t        |            D ]n  }	||	   \  }
}}|	dk(  r|}n|||	dz
     d   z
  }|	t        |      dz
  k  r||	dz      d   }||z
  }nd	}d}|	dk(  rd}n||	dz
     d   |z   dz  }|	t        |      dz
  k  r	||z   dz  }n|dz   }|dk  rdnd}|dk  rdnd}||z
  }||z
  }d|
dd| d| d| d| d| d| d}t         j                  j                  ||      }ddg}|dkD  r|j                  d|dz   g       |r|j                  d|dz   g       |j                  d|g       |j                  dd|g       t!        j"                  |ddd d!"      }|j$                  dk(  rd#d$d%d&d'd(d)|g}t!        j"                  |dd*      }|j$                  dk(  rt'        t)        |j*                  j-                               dz        }d|
dd| d| d| d| d| d| d| d}t         j                  j                  ||      }t         j                  j                  |      rt        j.                  |       t        j0                  ||       |	dz   d+z  dk(  sRt	        d,|	dz    d-t        |              q t	        d.t        |       d/       j                          y	# t2        $ r,}t	        d0|        dd	l} | j7                          Y d	}~Ad	}~ww xY w# j                          w xY w)1u   
    分割音频
    ri   z\\ll\D\xtrssvjj   苏小小的美丽传说_audiork   z/SELECT DISTINCT adname FROM srts WHERE adid = ?r   rY   u   音频文件不存在: Nu   音频文件: z_
            SELECT idx, start, end FROM srts 
            WHERE adid = ? ORDER BY idx
        rl   rm   ra   r%   r   i   vrD   segr~   r>   z-0-ffmpeg-yz-ssz-to-i-ccopyTutf-8ignorer   r   encodingerrorsr   r   r	   r
   r   r   r   r   r   u   分割音频 r   u   完成！分割了 u    个音频片段r   )rJ   rK   r   r   r   r   r   r   r   fetchoner+   r   r   r   rangeextendr   r   r   r   r   r   r   removerenamer   r   r   )!r   r   rO   r   r   r   adname
audio_filer   r   rU   start_msend_msprev_gap
next_startnext_gap	seg_startseg_endheader_fixed
tail_fixedsubtitle_durationaudio_segment_durationoutput_namer   r   r   	probe_cmdprobe_resultactual_durationnew_namenew_pathr   r   s!                                    r   split_audior      s    (G"I1J77>>*%
J$ZL12dw' 	H4'R"1%WW\\)xt_=
ww~~j)+J<89r 	

o 	zl+, 	  W	 OO%	I'z23s9~&A$-aL!C6 Av##iA&6q&993y>A%%&q1u-a0
%.!
 Av	&q1u-a08;A	3y>A%%!J.14 !4- #+S.3cL (3CJ !' 1%,y%8"  Cy,q
!DUCVVWXnWoors{r||}  I  ~J  JN  OK'',,z;?K T"C1}

Ei$&6%79:

Egn%578JJj)*JJfk23^^C4RYbjkF  A%&gHY[`  cG  IT  U	)~~iSWX**a/&)%0C0C0I0I0K*Lt*S&TO!$SIQ|nAhZqIZH[[\]s\ttu  wF  vG  GH  IQ  HR  RS  T^  S_  _c   dH!ww||JAHww~~h/		(+IIk84A|q a!eWAc)n-=>?G 'J 	#C	N#33CDE 	

  n
 	

s8   
BO/ 7J-O/ &8O/ /	P$8"PP' P$$P' 'P9c                 r   K   t        j                  | dd      }|j                  |       d{    y7 w)u"   
    为单个字幕生成TTS
    zen-US-AriaNeuralz-30%)rateN)edge_ttsCommunicater   )en_textr   communicates      r   generate_tts_for_subtitler   H  s1      &&w0BPK


;
'''s   -757c           	        K   d}d}t         j                  j                  |      s#t        j                  |       t	        d|        	 t        j                  |      }|j                         }|j                  d| f       |j                         }t	        dt        |       d       t        |      D ]  \  }\  }}t         j                  j                  |d|dd	      }	t         j                  j                  |	      rt	        d
| d       ]t        ||	       d{    |dz   dz  dk(  s}t	        d|dz    dt        |               t	        dt        |       d       j#                          y7 X# t        $ r,}
t	        d|
        ddl}|j!                          Y d}
~
Cd}
~
ww xY w# j#                          w xY ww)u   
    生成TTS
    ri      苏小小的美丽传说_ttsrk   z4SELECT idx, en FROM srts WHERE adid = ? ORDER BY idxrl   rm   rX   r~   rY   z  u   : 已存在，跳过Nra   r   r   u
   生成TTS r   r       个TTS文件r   )rJ   rK   r   r   r   r   r   r   r   r   r   r   r+   r   r   r   r   r   )r   r   r   r   r   r   r   rU   r   r   r   r   s               r   generate_ttsr   P  s     (G/J77>>*%
J$ZL12w'MPTwWOO%	I'z23%i0LAyR'',,zT#c$3GHKww~~k*3%345+B<<<A|q 
1q5'3y>*:;< 1 	#C	N#3=AB 	

 =  n
 	

sU   AG	
CE< !E:"E< 27E< )G	:E< <	F1"F,'F4 ,F11F4 4GG	c                  z   d} d}d}d}t         j                  j                  |      s#t        j                  |       t	        d|        t        |       }t        |      }t        |      }t	        dt        |       d       t	        dt        |       d       t	        dt        |       d	       t        t        |      t        |      t        |            }t	        d
| d       t        |      D ]  }||   \  }	}
||   \  }}||   \  }}|	|k7  s|	|k7  rt	        d|	 d| d|        :t         j                  j                  |d|	dd      }ddddd|d|
d|ddddddddddd d!d"d#d$|g}t        j                  |d%d%d&d'(      }|d)z   d*z  d+k(  st	        d,|d)z    d-|         t	        d.| d       y/)0u   
    生成视频片段
    r   r   rj      苏小小的美丽传说_videosrk   rl   u    个音频文件r   u    个图片文件u
   将处理     个视频片段u    错误: 索引不匹配 - audio:z, tts:z, image:video_r~   .mp4r   r   z-loop1r   -filter_complexz"[1:a][2:a]concat=n=2:v=0:a=1[outa]-mapz0:v[outa]-c:vlibx264z-tune
stillimage-c:aaac-b:a192kz	-shortestTr   r   r   ra   r   r   u   生成视频片段 r   r   N)rJ   rK   r   r   r   rV   r^   rf   r   minr   r+   r   r   )rO   r\   rd   r   rR   r]   re   min_lenr   	audio_idx
audio_pathtts_idxtts_path	image_idx
image_pathr   r   r   s                     r   generate_video_segmentsr   z  s    1I,G1I2J77>>*%
J$ZL12!),Kg&I!),K	GC$%%5
67	GC	N#=
12	GC$%%5
67 #k"C	NC4DEG	Jwi/
017^ +A	:%aL +A	:9	#94YKvgYhW`Vabcggll:	#d/KL dS$
*(CEHI\EF
  Dtg^fgER<1'Away9:= @ 
y(8
9:r   c                 .   | syd}g }d}t        |       D ],  \  }\  }}|j                  d|g       |d| d| dz  }|dz  }. t        |       }	|d	|	 d
z  }t        j                  j                  |d|dd      }
ddg|z   d|dddddddddd|
gz   }	 t        j                  |dddd      }|j                  dk(  rt        d| d|
        |
S t        d| d |j                  dd!         y# t        $ r}t        d| d"|        Y d}~yd}~ww xY w)#u   
    合并一批视频
    Nr&   r   r   [z:0][z:1]ra   z	concat=n=z:v=1:a=1[outv][outa]batch_r~   r   r   r   r   r   z[outv]r   r   r   r   r   r   r   Tr   r   r   u	     批次 u	    成功: u	    失败: rz   u	    错误: )r   r   r   rJ   rK   r+   r   r   r   r   stderrr   )videos	batch_numr   filter_complex
input_argsinput_indexr   rU   rK   
num_videosr   r   r   r   s                 r   combine_batchr    sw    NJK#F+;C4,'Ak]${m3??q ,
 VJ	*-ABBN'',,zVIc?$+GHK 	$ 	>	
C
Dtg^fg!Ii[	+?@Ii[	&--2E1FGH 	)IaS12s   ;C0 C0 0	D9DDc                     d} d}t         j                  j                  |      s#t        j                  |       t	        d|        t        |       }t	        dt        |       d       t        |      dz   dz
  dz  }g }t        |      D ]f  }|dz  }t        |dz   t        |            }||| }t	        d|dz    d	| d
t        |       d       t        |||      }	|	sV|j                  |	       h |st	        d       yt	        dt        |       d       t         j                  j                  |d      }
t        |
dd      5 }|D ]F  }	t         j                  j                  |	      j                  dd	      }|j                  d| d       H 	 ddd       d}ddddddd|
dd |g}	 t!        j"                  |d!d!dd"#      }|j$                  d$k(  rt	        d%|        t         j                  j'                  |      d&z  }t	        d'|d(d)       |D ]7  }	t         j                  j                  |	      s#t        j(                  |	       9 t         j                  j                  |
      rt        j(                  |
       t	        d*|        yt	        d+|j*                          y# 1 sw Y   xY w# t,        $ r}t	        d+|        Y d}~yd}~ww xY w),u   
    合并所有视频
    r   u)   苏小小的美丽传说_bilingual_outputrk   rl   r   r   ra   u   正在处理批次 r   z (u    个视频)...u&   错误: 没有成功生成任何批次Nu   
正在合并所有批次 (u    个批次)...zconcat_list.txtwr   )r   \zfile 'z'
uY   苏小小的美丽传说__苏小小__杭州__历史__人文__爱情__艺术_bilingual.mp4r   r   z-fconcatz-safe0r   r   r   Tr   r   r   u   成功: i   u   文件大小: z.2fz MBu!   
完成！双语视频保存到: r   )rJ   rK   r   r   r   get_video_filesr   r   r   r  r*   r+   openabspathr[   writer   r   r   getsizer   r   r   )	video_dirr   r   total_batchesbatch_filesr  	start_idxend_idxbatch_videos
batch_fileconcat_filefabs_pathfinal_outputr   r   	file_sizer   s                     r   combine_all_videosr    s    2I<J77>>*%
J$ZL12Y'F	GCK= 0
12[2%)b0MK=)	N	i"nc&k2i0#IM?!M?"SEVDWWefg"<JG
z* * 67	([)9(:.
IJ'',,z+<=K	k3	1Q%Jwwz2::4EHGGfXJc*+ & 
2
 oL 	$hkfCDtg^fg!H\N+,5EIN9S/56)
77>>*-IIj) * ww~~k*		+&6|nEFHV]]O,-C 
2	1D  ns3   AJ.-BJ; ;AJ; J; .J8;	KKKc                 z   t         j                  j                  | d      }t        j                  |      }g }|D ]d  }t         j                  j	                  |      }	 t        |j                  d      d   j                  d      d         }|j                  ||f       f |j                  d        |S #  Y xY w)u4   
    获取视频文件列表，按序号排序
    zvideo_*.mp4r`   ra   rb   r   c                     | d   S rA   rB   rC   s    r   rE   z!get_video_files.<locals>.<lambda><  rF   r   rG   rI   )r  rP   rQ   video_filesrS   rT   rU   s          r   r  r  .  s     ggll9m4GIIgEK77##D)	hnnS)!,2237:;CT{+	  (	rg   c                  Z   d} d}t        d       t        d|         t        d|        t        d       t        | |       t        d       t        |        t        d       t        j                  t        |              t        d	       t                t        d
       t                y)u   
    主函数
    i   u   阿敏谈艺录u-   === 苏小小的美丽传说 完整处理 ===zadid: zauthor: u   
1. 生成字幕图片u   
2. 分割音频u   
3. 生成TTSu   
4. 生成视频片段u   
5. 拼接视频N)r   r   r   asyncior   r   r   r  )r   r   s     r   mainr#  @  s     DF	
9:	F4&/	HVH
 

#$T6* 

 

KKT"# 

#$ 

r   __main__)__doc__rJ   r   rL   r   r"  r   PILr   r   r   r   r<   rV   r^   rf   r   r   r   r   r   r  r  r  r#  __name__rB   r   r   <module>r(     s    
      + +0f$$$Nbpf('T9;x+\HT$@ zF r   