
    mi                         d dl Z d dlZd dlZd dlmZ d dlmZ d dlmZm	Z	m
Z
mZ d dlmZmZ d dlmZ d dlmZ  ed      ( ed	        ed
        ed        ed        ed       ddZd dlZd ZddZy)    N)FileResponse)detect)remove_filesplit_text_by_languageget_sentiment_logicapply_smart_tashkeel)AudioSegmenteffects)which)detect_leading_silenceffmpegz3
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!zWARNING: ffmpeg NOT FOUND!z-pydub needs ffmpeg to merge audio seamlessly.z.Please install ffmpeg and add it to your PATH.z3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
c                 x    t        | |      }t        | j                         |      }t        |       }| |||z
   S )z3Trim silence from start and end of an AudioSegment.)silence_threshold)r   reverselen)audio	threshold
start_trimend_trimdurations        0/var/www/html/speakWrite/services/tts_service.pytrim_silencer      s;    'KJ%emmoSH5zHHX-..    c                 x   K   t        j                  | ||||      }|j                  |       d{    |S 7 w)z3Helper function to generate a single audio segment.ratepitchvolumeN)edge_ttsCommunicatesave)textvoicer   r   r   output_pathcommunicates          r   generate_segment_audior&      s>     &&tUUSYZK


;
''' (s   /:8:c                 X  K   t        t        j                               }d| d}	g }
d}	 |dk7  r|dk7  rz|}|rt        |      }t	        |      }t        ||      \  }}}|dk(  r|n|}|dk(  r|n|}|dk(  r|n|}t        j                  |||||      }|j                  |	       d {    nt        |      }t        |      dk  rz|}|rt        |      }t	        |      }t        ||      \  }}}|dk(  r|n|}|dk(  r|n|}|dk(  r|n|}t        j                  |||||      }|j                  |	       d {    n{g }g }t        |      D ]  \  }\  }}|}|dk(  r|rt        |      }t        ||      \  }}}|dk(  r|n|}|dk(  r|n|}|dk(  r|n|}d	| d
| d}|
j                  |       |j                  t        ||||||             |j                  |        t        j                  |  d {    d }|D ]  }t         j"                  j%                  |      s#t         j"                  j'                  |      dkD  sFt)        j*                  |d      }t-        |      } t/        j0                  |       }!||!}|j                  |!d      } |r!t        |      dkD  r|j3                  |	d       t         j"                  j%                  |	      r"t         j"                  j'                  |	      dk(  r/t        j                  |d      }|j                  |	       d {    |r|	|
fS | j5                  t6        |	       |
D ]  }"| j5                  t6        |"        t9        |	dd      S #  d}Y ,xY w7 #  d}Y xY w7 P7 7 h# t:        $ r}#t         j"                  j%                  |	      rt!        j<                  |	       |
D ]7  }"t         j"                  j%                  |"      s#t!        j<                  |"       9 |r|#dt        |#      icY d }#~#S d }#~#ww xY ww)Nspeech_z.mp3zen-US-AvaMultilingualNeuralAuto arr      temp__r   mp3)formatd   )	crossfadezar-EG-SalmaNeuralz
audio/mpegz
speech.mp3)path
media_typefilenameerror)struuiduuid4r   r   r   r   r    r!   r   r   	enumerateappendr&   asynciogatherosr3   existsgetsizer	   	from_filer   r
   	normalizeexportadd_taskr   r   	Exceptionremove)$background_tasksr"   r#   r   r   r   tashkeelreturn_pathfile_idr$   
temp_filesDEFAULT_MULTILINGUAL_VOICEprocessed_textlangs_rates_pitchs_volumef_ratef_pitchf_volumer%   segmentstaskssegment_dataiseg_textseg_langprocessed_segtemp_seg_pathcombined_audio	temp_pathsegment_audiotrimmed_segmentnormalized_segmentfes$                                       r   tts_servicerd   $   s?    $**,GG9D)KJ!>\!F?u{!N!5d!;t )<D$(G%FGX#v~V4F!&&geG#)V#3xH"..~u6Y`iqrK"";/// .d3H8}!!%%9$%?N"4LT,?d,K)#'6>t%*f_'%'-'78V&22>C]djry  CK  L!&&{333 !/8/B 7+A+($,M4'H(<X(F0CHh0W-FGX'+v~V4F).&geG+1V+;xH&+G9AaS$=M%%m4 LL!7Gacikrt|  L  "M  N ''67$ nne,,, "&!- 	fIww~~i0RWW__Y5ORS5S(4(>(>yQV(W*6}*E-4->->-O*)1-?N-;-B-BCUad-B-eN	f "c.&9A&="))+e)Dww~~k*bggook.Ja.O"..t5HIK"";///
**!!+{; 	6A%%k15	6 P\]]]  4D 0 $t 40 -( 0  !77>>+&		+(> 	/Aww~~a "))A,	/aQ  !s   (P*N M4 AN (M>).N N "AN ;N<B>N :N;*N &"N 	CN (N)	N 2P*3A N 3P*4M;8N NN N N 	P'AP"5'P"P'P*"P''P*)g      T)F)r>   r8   r   fastapi.responsesr   
langdetectr   utilsr   r   r   r   pydubr	   r
   pydub.utilsr   pydub.silencer   printr   r<   r&   rd    r   r   <module>rm      so    	   *  ` ` '  0 	?	-	
&'	
9:	
:;	-/ b!r   