
    3jʁ                     R   S SK r S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SK	r	S SK
Jr  S SKJrJrJr   " S S\R                   5      r " S S\R                   5      r " S S	\R                   5      rS6S
 jr " S S\R                   5      r " S S\R                   5      r " S S\R                   5      r " S S\R                   5      r " S S\R                   5      r " S S\R                   5      r " S S\R                   5      rS\R8                  S\R8                  4S jrS\S\\R8                  \ 4   4S jr! " S S\R                   5      r" " S  S!\R                   5      r# " S" S#\R                   5      r$ " S$ S%\R                   5      r% " S& S'\R                   5      r&S( r' " S) S*\R                   5      r( " S+ S,\R                   5      r) " S- S.\R                   5      r* " S/ S0\R                   5      r+ " S1 S2\R                   5      r, " S3 S4\5      r-S\-4S5 jr.g)7    N)override)ComfyExtensionIOUIc                   T    \ rS rSr\S 5       r\S\R                  4S j5       r\r	Sr
g)EmptyLatentAudio   c                     [         R                  " SSSS[         R                  R                  SSSSS	S
9[         R                  R                  SSSSSS9/[         R
                  R                  5       /S9$ )Nr   zEmpty Latent Audiomodel/latentAudiosecondsgG@      ?     @@皙?defaultminmaxstep
batch_size   i   z)The number of latent images in the batch.r   r   r   tooltip)node_iddisplay_namecategoryessentials_categoryinputsoutputs)r   SchemaFloatInputIntLatentOutputclss    8/home/wildlama/comfy/ComfyUI/comfy_extras/nodes_audio.pydefine_schemaEmptyLatentAudio.define_schema   su    yy&-# 'y$CVRUV !Fq   YY%%'(
 	
    returnc                     [        US-  S-  S-  5      S-  n[        R                  " USU/[        R                  R                  5       S9n[        R                  " USSS.5      $ )ND  i      @   )deviceaudio)samplestypedownscale_ratio_temporal)roundtorchzeroscomfymodel_managementintermediate_devicer   
NodeOutput)r'   r   r   lengthlatents        r(   executeEmptyLatentAudio.execute   s\    %$.!34q8j"f5e>T>T>h>h>jk}}^bcddr+    N)__name__
__module____qualname____firstlineno__classmethodr)   r   r<   r?   generate__static_attributes__rA   r+   r(   r   r      s=    
 
 eR]] e e
 Hr+   r   c                   T    \ rS rSr\S 5       r\S\R                  4S j5       r\r	Sr
g)ConditioningStableAudio'   c                    [         R                  " SS[         R                  R                  S5      [         R                  R                  S5      [         R                  R                  SSSSSS	9[         R                  R                  S
SSSSS	9/[         R                  R                  SS9[         R                  R                  SS9/S9$ )NrJ   zmodel/conditioning/stable audiopositivenegativeseconds_start        r   r   r   seconds_totalg     G@r   )r   r   r   r   )r   r    Conditioningr"   r!   r%   r&   s    r(   r)   %ConditioningStableAudio.define_schema(   s    yy-6%%j1%%j1&WZ[#6X[\	 &&J&?&&J&?
 	
r+   r,   c                     [         R                  " XUS.5      n[         R                  " X#US.5      n[        R                  " X5      $ )N)rO   rQ   )node_helpersconditioning_set_valuesr   r<   )r'   rM   rN   rO   rQ   s        r(   r?   ConditioningStableAudio.execute9   sS    77  uB  CC  D77  uB  CC  D}}X00r+   rA   N)rB   rC   rD   rE   rF   r)   r   r<   r?   appendrH   rA   r+   r(   rJ   rJ   '   s:    
 
  1"-- 1 1
 Fr+   rJ   c                   T    \ rS rSr\S 5       r\S\R                  4S j5       r\r	Sr
g)VAEEncodeAudioB   c           
          [         R                  " SS/SS[         R                  R                  S5      [         R                  R                  S5      /[         R
                  R                  5       /S9$ )Nr[   zaudio to latentzVAE Encode Audior   r2   vaer   search_aliasesr   r   r   r   )r   r    r   r"   Vaer$   r%   r&   s    r(   r)   VAEEncodeAudio.define_schemaC   s\    yy$-.+#w'U# YY%%'(

 
	
r+   r,   c                    Uc  [        S5      eUS   n[        USS5      nXC:w  a$  [        R                  R	                  US   X45      nOUS   nUR                  UR                  SS5      5      n[        R                  " SU05      $ )	NzKVAEEncodeAudio: input audio is None (source video may have no audio track).sample_rateaudio_sample_rater.   waveformr   r3   )	
ValueErrorgetattr
torchaudio
functionalresampleencodemovedimr   r<   )r'   r^   r2   rd   vae_sample_raterf   ts          r(   r?   VAEEncodeAudio.executeQ   s    =jkkM*!#':EB)!,,55eJ6GfHZ(HJJx''2./}}i^,,r+   rA   N)rB   rC   rD   rE   rF   r)   r   r<   r?   rm   rH   rA   r+   r(   r[   r[   B   s:    
 
 -BMM - - Fr+   r[   c           	      :   Ub%  U R                  US   X"US9R                  SS5      nO$U R                  US   5      R                  SS5      n[        R                  " USS/SS9S-  nS	XUS	:  '   XE-  n[        U S
[        U SS5      5      nUSU;  a  US.$ US   S.$ )Nr3   )tile_xtile_yoverlaprg   r   r/   T)dimkeepdimg      @r   audio_sample_rate_outputre   r.   rd   rf   rd   )decode_tiledrn   decoder7   stdri   )r^   r3   tileru   r2   r|   ro   s          r(   vae_decode_audior~   b   s      !3DW^ _gghjlmn

79-.66r1=
))E1vt
4s
:CCc	N	LEc#=wsL_af?ghOV]A]ozzcjkxcyzzr+   c                   T    \ rS rSr\S 5       r\S\R                  4S j5       r\r	Sr
g)VAEDecodeAudioo   c           
          [         R                  " SS/SS[         R                  R                  S5      [         R                  R                  S5      /[         R
                  R                  5       /S9$ )Nr   latent to audiozVAE Decode Audior   r3   r^   r_   )r   r    r$   r"   ra   r   r%   r&   s    r(   r)   VAEDecodeAudio.define_schemap   sZ    yy$-.+#			*U# XX__&'

 
	
r+   r,   c                 @    [         R                  " [        X5      5      $ Nr   r<   r~   )r'   r^   r3   s      r(   r?   VAEDecodeAudio.execute~   s    }}-c;<<r+   rA   N)rB   rC   rD   rE   rF   r)   r   r<   r?   r{   rH   rA   r+   r(   r   r   o   s:    
 
 =bmm = = Fr+   r   c                   P    \ rS rSr\S 5       r\S\R                  4S j5       rSr	g)VAEDecodeAudioTiled   c                 h   [         R                  " SS/SS[         R                  R                  S5      [         R                  R                  S5      [         R
                  R                  SSS	S
SS9[         R
                  R                  SSSSSS9/[         R                  R                  5       /S9$ )Nr   r   zVAE Decode Audio (Tiled)r   r3   r^   	tile_sizei       i       r   ru   r0   r   i   r_   )r   r    r$   r"   ra   r#   r   r%   r&   s    r(   r)   !VAEDecodeAudioTiled.define_schema   s    yy)-.3#			*U#[#24aPYt!L	 XX__&'
 	
r+   r,   c                 B    [         R                  " [        XX45      5      $ r   r   )r'   r^   r3   r   ru   s        r(   r?   VAEDecodeAudioTiled.execute   s    }}-cIOPPr+   rA   N
rB   rC   rD   rE   rF   r)   r   r<   r?   rH   rA   r+   r(   r   r      s6    
 
 Q"-- Q Qr+   r   c                   X    \ rS rSr\S 5       r\SS\R                  4S jj5       r\r	Sr
g)	SaveAudio   c                    [         R                  " SS/SSS[         R                  R                  S5      [         R                  R                  SSS9/[         R
                  R                  [         R
                  R                  /S	S	S
9	$ )Nr   zexport flaczSave Audio (FLAC) (Deprecated)r2   r   filename_prefixaudio/ComfyUIr   T	r   r`   r   r   r   r   hiddenis_output_nodeis_deprecated)r   r    r   r"   StringHiddenpromptextra_pnginfor&   s    r(   r)   SaveAudio.define_schema   sr    yy)?9 'w'		 1?K II$$bii&=&=>
 	
r+   r,   c           	      ~    Uc  [        S5      e[        R                  " [        R                  R                  XXS9S9$ )NzFSaveAudio: input audio is None (source video may have no audio track).r   r'   formatuirh   r   r<   r   AudioSaveHelperget_save_audio_ui)r'   r2   r   r   s       r(   r?   SaveAudio.execute   s>    =eff}}!!33E`c3s
 	
r+   rA   N)ComfyUIflacrB   rC   rD   rE   rF   r)   r   r<   r?   	save_flacrH   rA   r+   r(   r   r      s:    
 
  
 
 
 Ir+   r   c                   X    \ rS rSr\S 5       r\SS\R                  4S jj5       r\r	Sr
g)SaveAudioMP3   c                 V   [         R                  " SS/SSS[         R                  R                  S5      [         R                  R                  SSS9[         R
                  R                  S	/ S
QSS9/[         R                  R                  [         R                  R                  /SSS9	$ )Nr   z
export mp3zSave Audio (MP3) (Deprecated)r2   r   r   r   r   qualityV0128k320kr   optionsr   Tr   	r   r    r   r"   r   Combor   r   r   r&   s    r(   r)   SaveAudioMP3.define_schema   s    yy"(>8 'w'		 1?Ky2HRVW
 II$$bii&=&=>
 	
r+   r,   c           
          Uc  [        S5      e[        R                  " [        R                  R                  XXUS9S9$ )NzISaveAudioMP3: input audio is None (source video may have no audio track).r   r'   r   r   r   r   r'   r2   r   r   r   s        r(   r?   SaveAudioMP3.execute   sE    =hii}}!!33CX_ 4 
 	
r+   rA   N)r   mp3r   )rB   rC   rD   rE   rF   r)   r   r<   r?   save_mp3rH   rA   r+   r(   r   r      s=    
 
" 
XZXeXe 
 
 Hr+   r   c                   X    \ rS rSr\S 5       r\SS\R                  4S jj5       r\r	Sr
g)SaveAudioOpus   c                 T   [         R                  " SS/SS[         R                  R                  S5      [         R                  R                  SSS9[         R
                  R                  S/ S	QS
S9/[         R                  R                  [         R                  R                  /SSS9$ )Nr   zexport opuszSave Audio (Opus) (Deprecated)r2   r   r   r   r   64k96kr   192kr   r   r   T)r   r`   r   r   r   r   r   r   r   r&   s    r(   r)   SaveAudioOpus.define_schema   s    yy#)?9w'		 1?Ky2Xbhi
 II$$bii&=&=>
 	
r+   r,   c           
          Uc  [        S5      e[        R                  " [        R                  R                  XXUS9S9$ )NzJSaveAudioOpus: input audio is None (source video may have no audio track).r   r   r   r   s        r(   r?   SaveAudioOpus.execute   sE    =ijj}}!!33CX_ 4 
 	
r+   rA   N)r   opusV3)rB   rC   rD   rE   rF   r)   r   r<   r?   	save_opusrH   rA   r+   r(   r   r      s=    
 
  
WYWdWd 
 
 Ir+   r   c                   X    \ rS rSr\S 5       r\S\S\S\R                  4S j5       r
Srg)	SaveAudioAdvanced   c                    [         R                  " S/ SQSSS[         R                  R                  SSS9[         R                  R                  SS	S
S9[         R
                  R                  S[         R
                  R                  S/ 5      [         R
                  R                  S[         R                  R                  S/ SQSS9/5      [         R
                  R                  S[         R                  R                  S/ SQSS9/5      /SS9/[         R                  R                  [         R                  R                  /SS9$ )Nr   )z
save audiozexport audiozoutput audiozwrite audior   r   r   zSave Audio (Advanced)z7Saves the input audio to your ComfyUI output directory.r2   zThe audio to save.)r   r   r   zYThe prefix for the file to save. May include formatting tokens such as %date:yyyy-MM-dd%.)r   r   r   r   r   r   r   r   r   r   r   r   z+The file format in which to save the audio.r   r   T)r   r`   r   descriptionr   r   r   r   )r   r    r   r"   r   DynamicComboOptionr   r   r   r   r&   s    r(   r)   SaveAudioAdvanced.define_schema   s   yy'o0Qw0DE		%+5	    %%..vr:..uHHNN9>T^bNc7  ..vHHNN9>dntNu8  J & 0 II$$bii&=&=>? 
  	
r+   r   r   r,   c                     UR                  SS 5      nUR                  SS 5      nU(       a   [        R                  R                  XXUS9nO[        R                  R                  XXS9n[        R
                  " US9$ )Nr   r   r   r   r   )getr   r   r   r   r<   )r'   r2   r   r   file_formatr   r   s          r(   r?   SaveAudioAdvanced.execute  sv    jj40**Y-!!33E`c  BI3  JB!!33E`c3xB}}##r+   rA   N)rB   rC   rD   rE   rF   r)   strdictr   r<   r?   rH   rA   r+   r(   r   r      sB    !
 !
F $S $$ $2== $ $r+   r   c                   T    \ rS rSr\S 5       r\S\R                  4S j5       r\r	Sr
g)PreviewAudioi'  c           
          [         R                  " SS/SS[         R                  R                  S5      /[         R                  R
                  [         R                  R                  /SS9$ )Nr   z
play audiozPreview Audior2   T)r   r`   r   r   r   r   r   )r   r    r   r"   r   r   r   r&   s    r(   r)   PreviewAudio.define_schema(  sW    yy"(>(w' II$$bii&=&=>

 
	
r+   r,   c                 j    Uc  [        S5      e[        R                  " [        R                  " XS9S9$ )NzIPreviewAudio: input audio is None (source video may have no audio track).r&   r   )rh   r   r<   r   r   r'   r2   s     r(   r?   PreviewAudio.execute6  s+    =hii}} ?@@r+   rA   Nr   rA   r+   r(   r   r   '  s=    
 
 Ar}} A A
 Ir+   r   wavr,   c                 0   U R                   R                  (       a  U $ U R                   [        R                  :X  a  U R	                  5       S-  $ U R                   [        R
                  :X  a  U R	                  5       S-  $ [        SU R                    35      e)z*Convert audio to float 32 bits PCM format.i   l        zUnsupported wav dtype: )dtypeis_floating_pointr7   int16floatint32rh   )r   s    r(   f32_pcmr   ?  sm    
yy""
	ekk	!yy{g&&	ekk	!yy{g&&
.syyk:
;;r+   filepathc                    [         R                  " U 5       nUR                  R                  (       d  [	        S5      eUR                  R                  S   nUR
                  R                  nUR                  n/ nSnUR                  UR                  S9 H|  n[        R                  " UR                  5       5      nUR                  S   U:w  a   UR                  SU5      R                  5       nUR!                  U5        XhR                  S   -  nM~     U(       d  [	        S5      e[        R"                  " USS9n	[%        U	5      n	X4sS S S 5        $ ! , (       d  f       g = f)Nz"No audio stream found in the file.r   )streamsrg   r   zNo audio frames decoded.rv   )avopenr   r2   rh   codec_contextrd   channelsr{   indexr7   
from_numpy
to_ndarrayshapeviewrp   rY   catr   )
r   afstreamsr
n_channelsframesr=   framebufr   s
             r(   loadr  I  s   		bzzABB!!!$!!--__
YYv||Y4E""5#3#3#56Cyy|z)hhr:.002MM#iil"F 5 788iiA&clw/ 
		s   D3E
E"c                   t    \ rS rSr\S 5       r\S\R                  4S j5       r\S 5       r	\S 5       r
\rSrg)		LoadAudioic  c                    [         R                  " 5       n[        R                  " USS9  [         R                  " [        R
                  " U5      SS/5      n[        R                  " S/ SQSSS[        R                  R                  S[        R                  R                  [        U5      S	9/[        R                  R                  5       /S
9$ )NT)exist_okr2   videor  )zimport audioz
open audioz
audio filez
Load Audior   )uploadr   )r   r`   r   r   r   r   r   )folder_pathsget_input_directoryosmakedirsfilter_files_content_typeslistdirr   r    r   r"   
UploadTyper2   sortedr   r%   )r'   	input_dirfiless      r(   r)   LoadAudio.define_schemad  s     446	
I-77

98MPWY`OabyyG% 'wr}}/B/BFSXMZ XX__&'

 
	
r+   r,   c                     [         R                  " U5      n[        U5      u  p4UR                  S5      US.n[        R
                  " U5      $ Nr   ry   r  get_annotated_filepathr  	unsqueezer   r<   r'   r2   
audio_pathrf   rd   s        r(   r?   LoadAudio.executeu  sC    !88?
 $Z 0%//2;O}}U##r+   c                    [         R                  " U5      n[        R                  " 5       n[	        US5       nUR                  UR                  5       5        S S S 5        UR                  5       R                  5       $ ! , (       d  f       N,= f)Nrb)	r  r  hashlibsha256r   updatereaddigesthex)r'   r2   
image_pathmfs        r(   fingerprint_inputsLoadAudio.fingerprint_inputs|  s]    !88?
NN*d#qHHQVVX $xxz~~ $#s    A>>
Bc                 \    [         R                  " U5      (       d  SR                  U5      $ g)NzInvalid audio file: {}T)r  exists_annotated_filepathr   r   s     r(   validate_inputsLoadAudio.validate_inputs  s'    55e<<+22599r+   rA   N)rB   rC   rD   rE   rF   r)   r   r<   r?   r+  r/  r  rH   rA   r+   r(   r  r  c  sb    
 
  $r}} $ $      
 Dr+   r  c                   T    \ rS rSr\S 5       r\S\R                  4S j5       r\r	Sr
g)RecordAudioi  c           	          [         R                  " S/ SQSS[         R                  " S5      R                  S5      /[         R                  R                  5       /S9$ )Nr2  )zmicrophone inputzaudio capturezvoice inputzRecord Audior2   AUDIO_RECORDr_   )r   r    Customr"   r   r%   r&   s    r(   r)   RecordAudio.define_schema  sN    yy!O'		.)//8 XX__&'	
 		
r+   r,   c                     [         R                  " U5      n[        U5      u  p4UR                  S5      US.n[        R
                  " U5      $ r  r  r  s        r(   r?   RecordAudio.execute  sC    !88?
 $Z 0%//2;O}}U##r+   rA   N)rB   rC   rD   rE   rF   r)   r   r<   r?   r  rH   rA   r+   r(   r2  r2    s:    

 

 $r}} $ $ Dr+   r2  c                   T    \ rS rSr\S 5       r\S\R                  4S j5       r\r	Sr
g)TrimAudioDurationi  c                 2   [         R                  " S/ SQSSS[         R                  R                  S5      [         R                  R                  SSSS	S
SS9[         R                  R                  SSSS
SS9/[         R                  R                  5       /S9$ )Nr:  )z	cut audioz
audio clipzshorten audiozTrim Audio Durationz)Trim audio tensor into chosen time range.r2   start_indexrP   l     {Gz?zTStart time in seconds, can be negative to count from the end (supports sub-seconds).r   r   r   r   r   duration      N@zDuration in seconds)r   r   r   r   r   r`   r   r   r   r   r   )r   r    r   r"   r!   r%   r&   s    r(   r)   TrimAudioDuration.define_schema  s    yy'G.Cw'!+*r    1  $ XX__&'1
 	
r+   r,   c                    Uc  [         R                  " S 5      $ US   nUS   nUR                  S   nUS:X  a  [         R                  " U5      $ US:  a  U[        [	        X%-  5      5      -   nO[        [	        X%-  5      5      n[        S[        Xv5      5      nU[        [	        X5-  5      5      -   n[        S[        X5      5      nXx:  a  [        S5      e[         R                  " USXx24   US.5      $ )Nrf   rd   rg   r   zXTrimAudioDuration: Start time must be less than end time and be within the audio length..ry   )r   r<   r   intr6   r   r   rh   )	r'   r2   r<  r@  rf   rd   audio_lengthstart_frame	end_frames	            r(   r?   TrimAudioDuration.execute  s    ===&&$M*~~b)1==''?&U;3L-M)NNKeK$=>?K!S;<#eH,B&C"DD	3y78	#wxx}}(38M3M*N_jkllr+   rA   N)rB   rC   rD   rE   rF   r)   r   r<   r?   trimrH   rA   r+   r(   r:  r:    s=    
 
8 mbmm m m0 Dr+   r:  c                   T    \ rS rSr\S 5       r\S\R                  4S j5       r\r	Sr
g)SplitAudioChannelsi  c                     [         R                  " SS/SSS[         R                  R                  S5      /[         R                  R	                  SS9[         R                  R	                  SS9/S	9$ )
NrL  zstereo to monozSplit Audio Channelsz1Separates the audio into left and right channels.r2   leftrR   rightrB  r   r    r   r"   r%   r&   s    r(   r)    SplitAudioChannels.define_schema  se    yy(,-/Kw' V4W5
 	
r+   r,   c                    Uc  [         R                  " S S 5      $ US   nUS   nUR                  S   S:w  a  [        SUR                  S    S35      eUSSS2S S 24   nUSSS2S S 24   n[         R                  " XCS	.XSS	.5      $ )
Nrf   rd   r   r/   z9AudioSplit: Input audio must be stereo (2 channels), got z channel(s)..r   ry   )r   r<   r   rh   )r'   r2   rf   rd   left_channelright_channels         r(   r?   SplitAudioChannels.execute  s    ===t,,$M*>>!!XYaYgYghiYjXkkwxyyQqS!, ac1-}},Sbo  VM  N  	Nr+   rA   N)rB   rC   rD   rE   rF   r)   r   r<   r?   separaterH   rA   r+   r(   rL  rL    s=    
 
  Nr}} N N Hr+   rL  c                   P    \ rS rSr\S 5       r\S\R                  4S j5       rSr	g)JoinAudioChannelsi  c                     [         R                  " SSSS[         R                  R                  S5      [         R                  R                  S5      /[         R                  R	                  SS9/S9$ )	NrX  zJoin Audio Channelsz=Joins left and right mono audio channels into a stereo audio.r2   
audio_leftaudio_rightrR   )r   r   r   r   r   r   rP  r&   s    r(   r)   JoinAudioChannels.define_schema  s]    yy'.W|,}-
 W5
 	
r+   r,   c                    Uc  Uc  [         R                  " S 5      $ Uc  [         R                  " U5      $ Uc  [         R                  " U5      $ US   nUS   nUS   nUS   nUR                  S   S:w  d  UR                  S   S:w  a  [        S5      e[	        X4XV5      u  p5nUR                  S   nUR                  S   n	X:w  aa  [        X5      n
X:  a&  [        R                  " SU SU
 S35        US	S U
24   nX:  a&  [        R                  " S
U	 SU
 S35        US	S U
24   nUS	SS2S S 24   nUS	SS2S S 24   n[        R                  " X/SS9n[         R                  " XS.5      $ )Nrf   rd   r   z*AudioJoin: Both input audios must be mono.rg   z.JoinAudioChannels: Trimming left channel from  to z	 samples..z/JoinAudioChannels: Trimming right channel from r   r   ry   )
r   r<   r   rh   match_audio_sample_ratesr   logginginfor7   r   )r'   rZ  r[  waveform_leftsample_rate_leftwaveform_rightsample_rate_rightoutput_sample_ratelength_leftlength_right
min_lengthrS  rT  stereo_waveforms                 r(   r?   JoinAudioChannels.execute  s   +"5==&&==--==,,":.%m4$Z0'6q!Q&.*>*>q*AQ*FIJJ =U^=
9'9
 $))"-%++B/&[7J'Mk]Z^_i^jjstu -c;J;.> ?(N|n\`ak`lluvw!/[j[0@!A %S!A#q[1&sAaC{3))\$AqI}}/]^^r+   rA   Nr   rA   r+   r(   rX  rX    s6    
 
 &_ &_ &_r+   rX  c                 "   X:w  a  X:  a@  [         R                  R                  X#U5      nUn[        R                  " SU SU S35        OB[         R                  R                  XU5      n Un[        R                  " SU SU S35        OUnXU4$ )NzResampling audio2 from zHz to zHz for merging.zResampling audio1 from )rj   rk   rl   r`  ra  )
waveform_1sample_rate_1
waveform_2sample_rate_2rf  s        r(   r_  r_  >  s    %(#..77
S`aJ!.LL2=/Vefg#..77
S`aJ!.LL2=/Vefg*#555r+   c                   T    \ rS rSr\S 5       r\S\R                  4S j5       r\r	Sr
g)AudioConcatiM  c                 .   [         R                  " S/ SQSSS[         R                  R                  S5      [         R                  R                  S5      [         R                  R                  SS	S
/S	SS9/[         R                  R                  5       /S9$ )Nrr  )z
join audiozcombine audiozappend audiozConcatenate Audioz=Concatenates the audio1 to audio2 in the specified direction.r2   audio1audio2	directionafterbeforez0Whether to append audio2 after or before audio1.)r   r   r   rB  r   r    r   r"   r   r%   r&   s    r(   r)   AudioConcat.define_schemaN  s    yy!J,Wx(x($h/#N	  	 XX__&'!
 	
r+   r,   c                 x   Uc  Uc  [         R                  " S 5      $ Uc  [         R                  " U5      $ Uc  [         R                  " U5      $ US   nUS   nUS   nUS   nUR                  S   S:X  a)  UR                  SSS5      n[        R
                  " S5        UR                  S   S:X  a)  UR                  SSS5      n[        R
                  " S5        [        XFXW5      u  pEnUS:X  a  [        R                  " XE4SS9n	OUS	:X  a  [        R                  " XT4SS9n	[         R                  " W	US
.5      $ )Nrf   rd   r   r/   zHAudioConcat: Converted mono audio1 to stereo by duplicating the channel.zHAudioConcat: Converted mono audio2 to stereo by duplicating the channel.rw  r   rx  ry   )	r   r<   r   repeatr`  ra  r_  r7   r   )
r'   rt  ru  rv  rm  ro  rn  rp  rf  concatenated_audios
             r(   r?   AudioConcat.executec  s6   >fn==&&>==((>==((J'
J'
}-}-A!##**1a3JLLcdA!##**1a3JLLcd5Mjis  6D2
 2!&J+C!K("!&J+C!K}}*<M_`aar+   rA   N)rB   rC   rD   rE   rF   r)   r   r<   r?   concatrH   rA   r+   r(   rr  rr  M  s=    
 
( b2== b b8 Fr+   rr  c                   T    \ rS rSr\S 5       r\S\R                  4S j5       r\r	Sr
g)
AudioMergei  c                 ,   [         R                  " S/ SQSSS[         R                  R                  S5      [         R                  R                  S5      [         R                  R                  S/ S	QS
S9/[         R                  R                  5       /S9$ )Nr  )z	mix audiozoverlay audiozlayer audiozMerge Audioz7Combine two audio tracks by overlaying their waveforms.r2   rt  ru  merge_method)addmeansubtractmultiplyz/The method used to combine the audio waveforms.r   rB  ry  r&   s    r(   r)   AudioMerge.define_schema  sx    yy H&Qx(x("CM   XX__&'
 	
r+   r,   c                    Uc  Uc  [         R                  " S 5      $ Uc  [         R                  " U5      $ Uc  [         R                  " U5      $ US   nUS   nUS   nUS   n[        XFXW5      u  pEnUR                  S   n	UR                  S   n
U	S:X  d  U
S:X  a  [         R                  " XHS.5      $ X:  a'  [        R
                  " SU
 SU	 S35        US	S U	24   nO}X:  ax  [        R
                  " S
U
 SU	 S35        [        UR                  5      nX-
  US'   [        R                  " XR                  UR                  S9n[        R                  " X\4SS9nUS:X  a  XE-   nO#US:X  a  XE-
  nOUS:X  a  XE-  nOUS:X  a  XE-   S-  nWR                  5       R                  5       nUS:  a  X-  n[         R                  " XS.5      $ )Nrf   rd   rg   r   ry   z!AudioMerge: Trimming audio2 from r^  z  samples to match audio1 length..z AudioMerge: Padding audio2 from )r   r1   r   r  r  r  r  r/   r   )r   r<   r_  r   r`  ra  listr7   r8   r   r1   r   absr   )r'   rt  ru  r  rm  ro  rn  rp  rf  length_1length_2	pad_shape
pad_tensorrf   max_vals                  r(   r?   AudioMerge.execute  s   >fn==&&>==((>==((J'
J'
}-}-5Mjis  6D2
 2##B'##B'q=HM==j!\]]LL<XJd8*Ttuv#C(N3J LL;H:T(SstuZ--.I$/IbMY6F6FzO`O`aJJ#;DJ5 !.HZ'!.HZ'!.HV#"/14H,,.$$&S=)H}}(VWWr+   rA   N)rB   rC   rD   rE   rF   r)   r   r<   r?   mergerH   rA   r+   r(   r  r    s>    
 
& +Xbmm +X +XZ Er+   r  c                   T    \ rS rSr\S 5       r\S\R                  4S j5       r\r	Sr
g)AudioAdjustVolumei  c                     [         R                  " S/ SQSSS[         R                  R                  S5      [         R                  R                  SSSS	S
S9/[         R                  R                  5       /S9$ )Nr  )z
audio gainloudnesszaudio levelzAdjust Audio Volumer2   zFAdjust the volume of the audio by a specified amount in decibels (dB).volumer   id   zNVolume adjustment in decibels (dB). 0 = no change, +6 = double, -6 = half, etcr   )r   r`   r   r   r   r   r   )r   r    r   r"   r#   r%   r&   s    r(   r)   AudioAdjustVolume.define_schema  sn    yy'D.`w'l  	 XX__&'!
 	
r+   r,   c                     Uc  [         R                  " S 5      $ US:X  a  [         R                  " U5      $ US   nUS   nSUS-  -  nX5-  n[         R                  " X4S.5      $ )Nr   rf   rd   
      ry   )r   r<   )r'   r2   r  rf   rd   gains         r(   r?   AudioAdjustVolume.execute  sg    ===&&Q;==''$M*frk"?}}(OPPr+   rA   N)rB   rC   rD   rE   rF   r)   r   r<   r?   adjust_volumerH   rA   r+   r(   r  r    s=    
 
( Qr}} Q Q Mr+   r  c                   T    \ rS rSr\S 5       r\S\R                  4S j5       r\r	Sr
g)
EmptyAudioi  c                 6   [         R                  " SS/SS[         R                  R                  SSSSS	S
S9[         R                  R                  SSSSSSS9[         R                  R                  SSSSSSS9/[         R
                  R                  5       /S9$ )Nr  zblank audiozEmpty Audior2   r@  rA  rP   r=  r>  z+Duration of the empty audio clip in secondsr?  rd   r.   z$Sample rate of the empty audio clip.r   i  T)r   r   r   r   advancedr   r/   z4Number of audio channels (1 for mono, 2 for stereo).)r   r   r   r   r  r_   )r   r    r!   r"   r#   r   r%   r&   s    r(   r)   EmptyAudio.define_schema  s    yy )?& *I   !!B!   R!  #4 XX__&'? 
  	
r+   r,   c                     [        [        X-  5      5      n[        R                  " SX44[        R                  S9n[
        R                  " XRS.5      $ )Nr   )r   ry   )rE  r6   r7   r8   float32r   r<   )r'   r@  rd   r   num_samplesrf   s         r(   r?   EmptyAudio.execute  s?    % 678;;89O}}(OPPr+   rA   N)rB   rC   rD   rE   rF   r)   r   r<   r?   create_empty_audiorH   rA   r+   r(   r  r    s?    !
 !
F Q Q Q
 !r+   r  c                   P    \ rS rSr\S 5       r\S\R                  4S j5       rSr	g)AudioEqualizer3Bandi  c                 x   [         R                  " S/ SQSSS[         R                  R                  S5      [         R                  R                  SSSS	S
SS9[         R
                  R                  SSSSSS9[         R                  R                  SSSS	S
SS9[         R
                  R                  SSSSSS9[         R                  R                  SSS
SS
SS9[         R                  R                  SSSS	S
SS9[         R
                  R                  S S!SS"S#S9/[         R                  R                  5       /S$9$ )%Nr  )eqz
bass boostztreble boost	equalizerzAudio Equalizer (3-Band)r2   Tlow_gain_dBrP   g      8g      8@r   zGain for Low frequencies (Bass)r?  low_freqr  r  i  zCutoff frequency for Low shelfr   mid_gain_dBzGain for Mid frequenciesmid_freqi     i  zCenter frequency for Midsmid_q9v?g      $@zQ factor (bandwidth) for Midshigh_gain_dBz"Gain for High frequencies (Treble)	high_freqi  i:  zCutoff frequency for High shelf)r   r`   r   r   is_experimentalr   r   )r   r    r   r"   r!   r#   r%   r&   s    r(   r)   !AudioEqualizer3Band.define_schema  s    yy)L3 w'}cu$UX  cD  EZ"#Oop}cu$UXb|}Z3DRmnw3Ds\{|~s4VY  dH  I[$DeUvw	 XX__&'!
 	
r+   r,   c	                 
   Uc  [         R                  " S 5      $ US   n	US   n
U	R                  S   S:X  a  [         R                  " U5      $ U	R                  5       nUS:w  a*  [        R
                  R                  UU
U[        U5      SS9nUS:w  a*  [        R
                  R                  UU
[        U5      UUS9nUS:w  a*  [        R
                  R                  UU
U[        U5      SS9n[         R                  " XS.5      $ )	Nrf   rd   rg   r   r  )r  central_freqQ)center_freqr  r  ry   )
r   r<   r   clonerj   rk   bass_biquadr   equalizer_biquadtreble_biquad)r'   r2   r  r  r  r  r  r  r  rf   rd   eq_waveforms               r(   r?   AudioEqualizer3Band.execute4  s   ===&&$M*>>""==''nn& !$//;; "8_ < K !$//@@!(O  A K 1$//==!"9- > K }}+RSSr+   rA   Nr   rA   r+   r(   r  r    s9    
 
( )Tmomzmz )T )Tr+   r  c                   L    \ rS rSr\S\\\R                        4S j5       r	Sr
g)AudioExtensionia  r,   c                    #    [         [        [        [        [        [
        [        [        [        [        [        [        [        [        [        [        [         ["        [$        [&        /$ 7fr   )r   r[   r   r   r   r   r   r   r  r   rJ   r2  r:  rL  rX  rr  r  r  r  r  )selfs    r(   get_node_listAudioExtension.get_node_listb  sM      #)
 	
s   A'A)rA   N)rB   rC   rD   rE   r   r  r4   r   	ComfyNoder  rH   rA   r+   r(   r  r  a  s)    
T$r||*<%= 
 
r+   r  c                     #    [        5       $ 7fr   )r  rA   r+   r(   comfy_entrypointr  {  s     s   )NN)/r   rj   r7   comfy.model_managementr9   r  r  r"  rV   r`  typing_extensionsr   comfy_api.latestr   r   r   r  r   rJ   r[   r~   r   r   r   r   r   r   r   Tensorr   r   tuplerE  r  r  r2  r:  rL  rX  r_  rr  r  r  r  r  r  r  rA   r+   r(   <module>r     s   	     	    & 3 3r|| 4bll 6R\\ @
{R\\ ,Q",, Q, :2<< @BLL >-$ -$`2<< 0< <%,, <3 5s!23 4' 'T",, 27 7t! !F8_ 8_v63",, 3lC CL$ $N+! +!\@T",, @TF
^ 
4 r+   