
    jV*                     ~    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Zd Zd Z	d Z
d Zd Zd Zed	k(  r e        yy)
uM   
截取中文音频并拼接双语音频
用法: python joinbiliad.py <adid>
    Nc                 T   ddddddddd	d
d|  g}t        j                  |dd      }|j                  ry	 t        t	        |j
                  j                               dz        S # t        $ r8}t        d|       t        d|        t        d|j
                         Y d}~yd}~ww xY w)u.   
    获取音频文件时长（毫秒）
    ffprobe-fmp3z-vquietz-show_entrieszformat=durationz-ofz"default=noprint_wrappers=1:nokey=1-izfile:T)capture_outputtextr     xxxzffprobe file=z stdout:N)	
subprocessrun
returncodeintfloatstdoutstrip	Exceptionprint)	file_pathcmdresultexs       )c:\dev\xtrs\vdcb\srtsegjoin\joinbiliad.pyget_file_durationr      s     d5wARTY[  BF  IN  OX  NY  GZ  [C^^C4@F 5,,./$677 eBoi(j'	s   .A& &	B'/.B""B'c           	         ddl }|j                         j                  j                  }|j                         j                  }d}d}	 t        j                  |d      }|j                         }|j                  d| f       g }|j                         D ]6  }|\  }	}
}}}t        |
      }t        |      }|j                  |	||||f       8 ||r|j                          |r|j                          S S # t        $ rY}ddl}t        d| d| d|        |j!                          g cY d}~|r|j                          |r|j                          S S d}~ww xY w# |r|j                          |r|j                          w w xY w)	u(   
    从数据库获取字幕信息
    r   N      N@timeoutzt
            SELECT idx, start, end, cn, en FROM srts 
            WHERE adid = ? 
            ORDER BY idx
           错误 [函数: 
   , 行号:    ]: 操作失败: )inspectcurrentframef_codeco_namef_linenosqlite3connectcursorexecutefetchallr   appendcloser   	tracebackr   	print_exc)adiddb_pathr#   	func_nameline_noconnr*   	subtitlesrowidxstartendcnenstart_msend_mser/   s                     r   get_subtitlesr@   "   so    $$&--55I""$--GDFw5  W		 	??$C&)#CR5zHXFc8VR<=	 %  LLNJJL    :gY>OPQsST	LLNJJL  LLNJJL s1   BC4 4	E=)E&E'E EE 'F c           	      `   ddl }|j                         j                  j                  }|j                         j                  }d}	 t        j                  |d      }|j                         }|j                  d| f       |j                         }|r|d   |r|j                          S S d|  |r|j                          S S # t        $ rJ}ddl}	t        d| d| d	|        |	j                          d|  cY d}~|r|j                          S S d}~ww xY w# |r|j                          w w xY w)
u"   
    从数据库获取adname
    r   Nr   r   z7SELECT DISTINCT adname FROM srts WHERE adid = ? LIMIT 1adid_r    r!   r"   )r#   r$   r%   r&   r'   r(   r)   r*   r+   fetchoner.   r   r/   r   r0   )
r1   r2   r#   r3   r4   r5   r*   r   r?   r/   s
             r   
get_adnamerD   H   s$    $$&--55I""$--GDw5PSWRYZ"!9 JJL  tf~ JJL    :gY>OPQsSTtf~JJL  JJL s7   AC *C 	D,D7D8D DD D-c                 h    | dz  }dddddddt        |      d	d
|g}t        j                  |d       y)u+   
    生成指定长度的静音音频
    r   ffmpeg-yr   lavfir   z0anullsrc=channel_layout=stereo:sample_rate=44100-t-acodec
libmp3lameTr	   N)strr   r   )duration_msoutput_pathduration_secr   s       r   generate_silencerQ   e   sG     %L$g@c,<C NN3t,    c                 X   d}t        d|        t        j                  j                  d| d      }t        d|        t        j                  j	                  |      st        d|        yt        |      }t        d| d	       | d
}t        j                  j                  dd|      }t        j                  j	                  |      st        d|        yt        j                  j	                  |      r	 t        j                  |       	 t        j                  |d       t        | |      }t        dt        |       d       |st        d       yg }	t        |      D ]  \  }
\  }}}}}|
dkD  r||
dz
     d   nd}|
dkD  r||z
  nd}|
t        |      dz
  k  r||
dz      d   }||z
  }n|}||kD  r||z
  nd}|
dk(  rd}n||z   dz  }|
t        |      dz
  k(  r|dz
  }n||z   dz  }|
dk(  rd}nd||z
  z
  }|dk  rd}|
t        |      dz
  k(  rd}nd||z
  z
  }|dk  rd}|	j                  |||||||||f	        t        d       t        |	      D ]+  \  }
\	  }}}}}}}}}|dz  }||z
  dz  }t        j                  j                  |d|dd      }dddt        |      d t        |      d!|d"d#d$d%d&d'|g}t        j                   |d(       t        |      }d|dd)| d)| d)| d	}t        j                  j                  ||      }t        j                  j	                  |      rt        j"                  |       t        j$                  ||       |
dz   d*z  dk(  st        d+|
dz    d,t        |	              . t        d-t        |	       d.       t        d/|        t        d0       t'        j(                         5 }t        j                  j                  |d1      } t+        | d2d34      5 }!t        |	      D ]Y  \  }
\	  }}}}}}}}}t        j                  j                  |d|dd)| d)| d5      }"t-        j,                  |"      }#|#r7t        j                  j/                  |#d         }$|!j1                  d6|$ d7       |ri|dkD  rdt        j                  j                  |d8| d      }%t3        ||%       t        j                  j/                  |%      }&|!j1                  d6|& d7       t        j                  j                  |d9|d:d      }'t-        j,                  |'      }(|(r|(d   })t        j                  j                  |d;|d:d      }*t        j                   ddd!|)d<d=d&d'd$d%|*gd(       t        j                  j/                  |*      }+|!j1                  d6|+ d7       |
d*z  dk(  rt        d>|(d           |
t        |	      dz
  k  s|	|
dz      d?   },|,s|,dkD  st        j                  j                  |d@|
dz    d      }%t3        |,|%       t        j                  j/                  |%      }&|!j1                  d6|& d7       \ 	 ddd       | dA}-dddBdCdDdEd!| d"d#d$d%d&d'|-g}t        dF       t        j                   |d(      }.|.j4                  dk(  rt        dG|-        	 ddd       y	 |.j6                  j9                  d3dHI      }/t        dK|/        	 ddd       y# t        $ r}t        d|        Y d}~d}~ww xY w# t        $ r}t        d|        Y d}~yd}~ww xY w# 1 sw Y   xY w#  	 |.j6                  j9                  dJdHI      }/n#  t        |.j6                        }/Y nxY wY xY w# 1 sw Y   yxY w)Lu1   
    截取中文音频并拼接双语音频
    z\\ll\D\xtrssvjj\db\dpd.dbzadname: z\\ll\D\xtrssvjjz.mp3u   音频文件: u    错误：音频文件不存在: Fu   音频总长度: u    毫秒	_cn_audiottsu#   错误：英文TTS目录不存在: u   警告：删除目录失败: NT)exist_oku   错误：创建目录失败: u   找到 u
    句字幕u   错误：未找到字幕信息r         i  u*   
=== 步骤1: 截取中文音频片段 ===r   seg03drF   rG   z-ssrI   r   rJ   rK   z-ar44100z-ac2rL   -
   u   截取音频 /u   完成！截取了 u    个音频片段u   输出目录: u$   
=== 步骤2: 拼接双语音频 ===zfilelist.txtwzutf-8)encodingz-*.mp3zfile 'z'
silence_end_z*-04dslowed_tts_z	-filter:az
atempo=0.7u   添加 TTS 文件 (70%速度):    silence_start_z_bilingual.mp3r   concatz-safe0u   开始拼接双语音频...u   拼接完成！输出文件: replace)errorsgbku   拼接失败！错误信息: )r   ospathjoinexistsr   shutilrmtreer   makedirsr@   len	enumerater-   rM   r   r   removerenametempfileTemporaryDirectoryopenglobabspathwriterQ   r   stderrdecode)0r1   adnamer2   
audio_fileaudio_durationcn_audio_dir
en_tts_dirr?   r6   enhanced_subtitlesir8   r9   r:   r;   r<   prevendstartgap	nextstartendgapstartposendposaddstartaddend	start_secrP   rO   r   actual_durationnew_filenamenew_pathtemp_dirfilelist_pathfcn_audio_filecn_filescn_file_abssilence_filesilence_file_absen_tts_patternen_tts_filestts_fileslowed_tts_fileen_tts_file_absnext_addstartoutput_filer   	error_msgs0                                                   r   extract_and_combiner   u   s    +G	HVH
0VHD/BJ	N:,
'(77>>*%0=>&z2N	n-W
56XY'L0%@J77>>*%3J<@A	ww~~l#	7MM,'
L40
 dG,I	GC	N#:
././(1)(<$$CR'(1u)AaC.#!&'!e57?s9~a!!A#q)I_F&I(6(<Y_!F6H%A-HIq  #a'FIo!+F6Heh./H1}Iq  FFSL)F{!!3sHfhPVXZ\^"_`G )=J 

78LUVhLiHHCXvxRtO	)T1ggll<3s3it1DE d3y>#l#*|73	
 	s40+K8SIQxj&?:K4P77<<l;77>>(#IIh
		+x(ER<1M!A#a,>(?'@AB; Mj> 
$6 788H
IJ	N<.
)*	
12		$	$	&(X~>-w71T]^pTqPPCXvxR "\SS	8*TUV\U]]c;d e99]3"$''//(1+">KGGf[M56fqj#%77<<LT:R#SL$V\:')ww|'D$GGf%5$6c:; "$jBs3it:L!M#yy8+AH&(ggll8{3s)SW=X&YONN $h#\sE7'	$
 '+, ')ggooo&FOGGf_$5S9:tQw ?Q?PQRs-.22$6qs$;A$>M$):')ww||HqQRseSW>X'Y(E+-77??<+H(&)9(:# >?M Ur 8R  /d(S-|73	
 	+,D9!1+?@{ 
'	&~3"MM000K	 1)=>O 
'	&s  	71!566	7  -aS12p 87|33 & 4 4U9 4 MI3 #FMM 2IK 
'	&s   >\	 \. /^ G']+]:]A*],A^ ]1^ 		\+\&&\+.	]7]

]]	^ ^!]?>^?^^^  ^)c                     t        t        j                        dk7  r+t        d       t        d       t        j                  d       	 t        t        j                  d         } t        d       t        d         t        |       }|rt        d       y
t        d	       t        j                  d       y
# t        $ r# t        d       t        j                  d       Y ~w xY w)u   
    主函数
    rX   u#   用法: python joinbiliad.py <adid>u!   示例: python joinbiliad.py 8496rW   u   错误：adid必须是数字u    === 双语音频制作工具 ===zadid: u   
制作完成！u   
制作失败！N)rs   sysargvr   exitr   
ValueErrorr   )r1   successs     r   mainr   2  s     388}3412388A;
 
,.	F4&/!$'G!"!"  ,-s   	B8 8)C$#C$__main__)__doc__rl   r   r(   r   rp   rw   rz   r   r@   rD   rQ   r   r   __name__ rR   r   <module>r      sV   
 
 
     "%L:- zz6 zF rR   