o
    4ѹg#                     @   sF  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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 zd dlmZ W n   ed Y d dlZd dlZd dlmZmZ zd dlmZ W n   Y dd	 Zd
Ze rpdZned 				ddedefddZdd Z	ddefddZd de fddZ!dde defddZ"dS )!    N)BytesIO)pad_sequence)download_from_urlzHurllib is not installed, if you infer from url, please install it first.)CalledProcessErrorrun)AudioSegmentc               	   C   s@   zt jddgt jd} d| dv W S  t jtfy   Y dS w )Nffmpegz-version)stderrzffmpeg versionzutf-8F)
subprocesscheck_outputSTDOUTdecoder   FileNotFoundError)output r   [/Users/admin/.pyenv/versions/3.10.0/lib/python3.10/site-packages/funasr/utils/load_utils.pyis_ffmpeg_installed   s   r   FTzNotice: ffmpeg is not installed. torchaudio is used to load audio
If you want to use ffmpeg backend to load audio, please install it by:
	sudo apt install ffmpeg # ubuntu
	# brew install ffmpeg # mac>  soundfsaudio_fsc              	      s  t | ttfr^d urRt ttfrRgt|  }dd D }tt|| D ](\}\}	}
tt|	|
D ]\}\}}t|f ||d}|| | q4q'|S  fdd| D S t | trl| 	drlt
| } t | trwtj| s|t| drd u sdkrt| drt| dr| d	 zt| \}  d
dr| d	} W n*   t| d} t|  } Y ndkr|d ur|| } n
dkrndkr	 dv rdd d< dd d< net | trdkr|d ur|| } nRt | tjrt| } nEt | trGdkrGt| }t |tr|\ }n|}|jdks,|jdkr6|tj}|d }|j dkrD|d d d	f }|} n	  kridkritj!" }|| d d d f d	d d f } | S )Nc                 S   s   g | ]}g qS r   r   ).0dr   r   r   
<listcomp>;   s    z/load_audio_text_image_video.<locals>.<listcomp>)r   r   	data_type	tokenizerc                    s$   g | ]}t |f d qS ))r   r   r   )load_audio_text_image_video)r   audior   r   r   kwargsr   r   r   N   s    )zhttp://zhttps://readr   seekr   Zreduce_channelsT)srtextimagevideocacheis_finalFZis_streaming_inputZ	kaldi_arkint16int32i      )#
isinstancelisttuplelen	enumeratezipr   appendstr
startswithr   ospathexistshasattrr!   
torchaudioloadgetmean_load_audio_ffmpegtorch
from_numpyZsqueezeencodenpndarraykaldiioZload_matdtypeastypeZfloat64ndimZ
transformsZResample)Zdata_or_path_or_listr   r   r   r   r   
data_typesZdata_or_path_or_list_retiZdata_type_iZdata_or_path_or_list_ijZdata_type_jZdata_or_path_or_list_jZdata_matmatZ	resamplerr   r   r   r   0   s    



 r   c                 C   s   zt | } W n   Y tj| tjd}t|}|jjdvr"tdtd}|jdkr0tdt|j}d|j	d  }|j
| }tj||| | tjd}|S )	N)rC   iuz*'middle_data' must be an array of integersfloat32fz%'dtype' must be a floating point typer*      )validate_frame_rater@   
frombufferr(   ZasarrayrC   kind	TypeErrorZiinfobitsminrD   rK   )inputZmiddle_datarC   rG   Zabs_maxoffsetarrayr   r   r   
load_bytes   s    



rW   c                 C   sd   t | }zt|}W n   td|j|kr0||}t  }|j|dd |d | } | S )NzSYou are decoding the pcm data, please install pydub first. via `pip install pydub`.Zwav)formatr   )	r   r   	from_fileRuntimeErrorZ
frame_rateZset_frame_rateZexportr!   r    )rT   r   Z	byte_datar   r   r   r   r   rN      s   


rN   r   c                 K   s8  t | tjr't| } t| jdk r| d d d f } |d u r$| jd gn|}nQt | tjrIt| jdk r<| d d d f } |d u rF| jd gn|}n/t | tt	frxg g }}| D ]}t |tjrdt|}|
| |
|jd  qWt|dd} || |fi |\} }t |tt	frt|g}| tj|tjfS )Nr*   rM   r   T)Zbatch_first)r+   r@   rA   r=   r>   r.   shapeZTensorr,   r-   r1   r   ZtensortorK   r)   )datadata_lenr   Zfrontendr   Z	data_listZdata_ir   r   r   extract_fbank   s*   



r_   filer"   c                 C   s   ddddd| dddd	d
ddt |dg}z
t|dddj}W n ty4 } ztd|j  |d}~ww t|tj	
 tjd S )a?  
    Open an audio file and read as mono waveform, resampling as necessary

    Parameters
    ----------
    file: str
        The audio file to open

    sr: int
        The sample rate to resample the audio if necessary

    Returns
    -------
    A NumPy array containing the audio waveform, in float32 dtype.
    r   z-nostdinz-threads0z-iz-fZs16lez-ac1z-acodecZ	pcm_s16lez-ar-T)capture_outputcheckzFailed to load audio: Ng      @)r2   r   stdoutr   rZ   r	   r   r@   rO   r(   flattenrD   rK   )r`   r"   cmdouter   r   r   r<      s"   r<   )r   r   r   N)r   )Nr   N)#r4   r=   jsonior   Ztorch.distributedZdistributeddistZnumpyr@   rB   Zlibrosar8   timeloggingZtorch.nn.utils.rnnr   Zfunasr.download.filer   printpdbr
   r   r   Zpydubr   r   Z
use_ffmpegintr   rW   rN   r2   r_   r<   r   r   r   r   <module>   s\    


b
