o
    h                      @   s   d dl Z d dlZd dlZd dlmZmZmZ d dlZde	de
dejfddZ	dde
d	ed
efddZ			dde
d	edee
 deeeeef ef  d
ef
ddZdde
dee
e
f defddZde
fddZdS )    N)OptionalTupleUnionbpayloadsampling_ratereturnc                 C   s   | }d}d}dddd|d|d|d	d
ddg}z!t j|t jt jd}|| }W d   n1 s1w   Y  W n tyH } ztd|d}~ww |d }	t|	tj}
|
j	d dkr_td|
S )z?
    Helper function to read an audio file through ffmpeg.
    1f32leffmpeg-izpipe:0-ac-ar-f-hide_banner	-loglevelquietpipe:1)stdinstdoutNzFffmpeg was not found but is required to load audio files from filenamer   a  Soundfile is either not in the correct format or is malformed. Ensure that the soundfile has a valid audio file extension (e.g. wav, flac or mp3) and is not corrupted. If reading from a remote URL, ensure that the URL is the full address to **download** the audio file.)

subprocessPopenPIPEcommunicateFileNotFoundError
ValueErrornp
frombufferfloat32shape)r   r   aracformat_for_conversionffmpeg_commandffmpeg_processoutput_streamerror	out_bytesaudio r(   X/var/www/html/ai/venv/lib/python3.10/site-packages/transformers/pipelines/audio_utils.pyffmpeg_read
   sB   
r*   r	   chunk_length_sr!   c                 c   s    |  }d}|dkrd}n|dkrd}nt d| dt }|dkr)d	}d
}n|dkr2d}d}n|dkr:d}d
}dd|d|d|d|d|ddddddg}	tt| | | }
t|	|
}|D ]}|V  q^dS )z6
    Helper function ro read raw microphone data.
    r   s16le   r	      Unhandled format ` `. Please use `s16le` or `f32le`LinuxalsadefaultDarwinavfoundationz:0Windowsdshowr
   r   r   r   r   z-fflagsnobufferr   r   r   r   N)r   platformsystemintround_ffmpeg_stream)r   r+   r!   r   r    size_of_sampler:   format_input_r"   	chunk_leniteratoritemr(   r(   r)   ffmpeg_microphone1   sR   
rD   stream_chunk_sstride_length_sc                 c   s`   |dur|}n|}t | ||d}|dkrtj}d}n|dkr%tj}d}ntd| d|du r5|d	 }tt| | | }	t|ttfrJ||g}tt| |d
  | }
tt| |d  | }t	j	
 }t	j|d}t||	|
|fddD ]6}tj|d |d|d< |d d
 | |d d | f|d< | |d< ||7 }t	j	
 |d|  krqw|V  qwdS )a  
    Helper function to read audio from the microphone file through ffmpeg. This will output `partial` overlapping
    chunks starting from `stream_chunk_s` (if it is defined) until `chunk_length_s` is reached. It will make use of
    striding to avoid errors on the "sides" of the various chunks.

    Arguments:
        sampling_rate (`int`):
            The sampling_rate to use when reading the data from the microphone. Try using the model's sampling_rate to
            avoid resampling later.
        chunk_length_s (`float` or `int`):
            The length of the maximum chunk of audio to be sent returned. This includes the eventual striding.
        stream_chunk_s (`float` or `int`)
            The length of the minimal temporary audio to be returned.
        stride_length_s (`float` or `int` or `(float, float)`, *optional*, defaults to `None`)
            The length of the striding to be used. Stride is used to provide context to a model on the (left, right) of
            an audio sample but without using that part to actually make the prediction. Setting this does not change
            the length of the chunk.
        format_for_conversion (`str`, defalts to `f32le`)
            The name of the format of the audio samples to be returned by ffmpeg. The standard is `f32le`, `s16le`
            could also be used.
    Return:
        A generator yielding dictionaries of the following form

        `{"sampling_rate": int, "raw": np.array(), "partial" bool}` With optionnally a `"stride" (int, int)` key if
        `stride_length_s` is defined.

        `stride` and `raw` are all expressed in `samples`, and `partial` is a boolean saying if the current yield item
        is a whole chunk, or a partial temporary result to be later replaced by another larger chunk.


    N)r!   r,   r-   r	   r.   r/   r0      r      )secondsT)stridestreamraw)dtyperJ   r   
   )rD   r   int16r   r   r;   r<   
isinstancefloatdatetimenow	timedeltachunk_bytes_iterr   )r   r+   rE   rF   r!   chunk_s
microphonerM   r>   rA   stride_leftstride_right
audio_timedeltarC   r(   r(   r)   ffmpeg_microphone_livef   s@   &
r\   FrA   rJ   rK   c           
      c   s
   d}|\}}|| |krt d| d| d| d}| D ]L}||7 }|r<t||k r<|df}|d| |ddV  qt||krj||f}|d| |d	}	|rUd
|	d< |	V  |}||| | d }t||ksBqt||kr||dfd	}	|r~d
|	d< |	V  dS dS )z
    Reads raw bytes from an iterator and does chunks of length `chunk_len`. Optionally adds `stride` to each chunks to
    get overlaps. `stream` is used to return partial results even if a full `chunk_len` is not yet available.
        z5Stride needs to be strictly smaller than chunk_len: (z, z) vs r   NT)rL   rJ   partial)rL   rJ   Fr^   )r   len)
rB   rA   rJ   rK   accrX   rY   _stride_leftrL   rC   r(   r(   r)   rU      s:   

rU   buflenc              
   c   s    d}z.t j| t j|d}	 |j|}|dkrn|V  qW d   W dS 1 s*w   Y  W dS  tyB } ztd|d}~ww )zJ
    Internal function to create the generator of data through ffmpeg
    i   )r   bufsizeTr]   NzHffmpeg was not found but is required to stream audio files from filename)r   r   r   r   readr   r   )r"   rb   rc   r#   rL   r%   r(   r(   r)   r=      s    &
r=   )r	   )NNr	   )F)rR   r9   r   typingr   r   r   numpyr   bytesr;   arrayr*   rQ   strrD   r\   boolrU   r=   r(   r(   r(   r)   <module>   s<   *
8
 N#