
    rh/                     &   d dl Z d dlZd dlZd dlmZmZ d dlZdede	dej                  fdZ	 	 	 dde	deded	ee   d
eee      f
dZ	 	 	 	 	 dde	dedee	   deeeeef   ef      ded	ee   d
eee      fdZdde	dee	e	f   defdZde	fdZd Zy)    N)OptionalUnionbpayloadsampling_ratereturnc                    | }d}d}dddd|d|d|d	d
ddg}	 t        j                  |t         j                  t         j                        5 }|j                  |       }ddd       d   }	t        j                  |	t        j                        }
|
j                  d   dk(  rt        d      |
S # 1 sw Y   QxY w# t        $ r}t        d      |d}~ww xY w)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audios              u/var/www/html/ai-insurance-compliance-backend/venv/lib/python3.12/site-packages/transformers/pipelines/audio_utils.pyffmpeg_readr*   
   s     ?B	B#

N nnJOOJOO\ 	A`n*66x@M	A a IMM)RZZ0E{{1~[
 	

 L	A 	A nabhmmns/   4B: B.B: .B73B: :	CCCchunk_length_sr"   ffmpeg_input_deviceffmpeg_additional_argsc              #     K   |  }d}|dk(  rd}n|dk(  rd}nt        d| d      t        j                         }|dk(  r	d	}	|xs d
}
n#|dk(  r	d}	|xs d}
n|dk(  rd}	|xs
 t               }
|g n|}dd	d
d|d|d|ddddddg}|j	                  |       t        t        | |z              |z  }t        ||      }|D ]  }|  yw)a  
    Helper function to read audio from a microphone using ffmpeg. The default input device will be used unless another
    input device is specified using the `ffmpeg_input_device` argument. Uses 'alsa' on Linux, 'avfoundation' on MacOS and
    'dshow' on Windows.

    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.
        format_for_conversion (`str`, defaults 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.
        ffmpeg_input_device (`str`, *optional*):
            The identifier of the input device to be used by ffmpeg (i.e. ffmpeg's '-i' argument). If unset,
            the default input device will be used. See `https://www.ffmpeg.org/ffmpeg-devices.html#Input-Devices`
            for how to specify and list input devices.
        ffmpeg_additional_args (`list[str]`, *optional*):
            Additional arguments to pass to ffmpeg, can include arguments like -nostdin for running as a background
            process. For example, to pass -nostdin to the ffmpeg process, pass in ["-nostdin"]. If passing in flags
            with multiple arguments, use the following convention (eg ["flag", "arg1", "arg2]).

    Returns:
        A generator yielding audio chunks of `chunk_length_s` seconds as `bytes` objects of length
        `int(round(sampling_rate * chunk_length_s)) * size_of_sample`.
    r	   s16le   r
      Unhandled format ` `. Please use `s16le` or `f32le`LinuxalsadefaultDarwinavfoundationz:defaultWindowsdshowNr   r   r   r   r   z-fflagsnobufferr   r   r   r   )r   platformsystem_get_microphone_nameextendintround_ffmpeg_stream)r   r+   r"   r,   r-   r    r!   size_of_sampler=   format_input_r#   	chunk_leniteratoritems                  r)   ffmpeg_microphonerI   1   s0    D ?B	B'	'	)-.C-DDdeff__F$1		8	 $2
	9	$>(<(>#9#ARG] 	

#N( 01E-.89:^KIni8H 
s   CCstream_chunk_sstride_length_sc              #     K   ||}n|}t        | ||||g n|      }|dk(  rt        j                  }	d}
n'|dk(  rt        j                  }	d}
nt	        d| d      ||d	z  }t        t        | |z              |
z  }t        |t
        t        f      r||g}t        t        | |d
   z              |
z  }t        t        | |d   z              |
z  }t        j                  j                         }t        j                  |      }t        ||||fd      D ]n  }t        j                  |d   |	      |d<   |d   d
   |
z  |d   d   |
z  f|d<   | |d<   ||z  }t        j                  j                         |d|z  z   kD  rk| p yw)a
  
    Helper function to read audio from a microphone using 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. The default input device will be used unless another input device is
    specified using the `ffmpeg_input_device` argument. Uses 'alsa' on Linux, 'avfoundation' on MacOS and 'dshow' on Windows.

    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*):
            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`, *optional*, defaults 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.
        ffmpeg_input_device (`str`, *optional*):
            The identifier of the input device to be used by ffmpeg (i.e. ffmpeg's '-i' argument). If unset,
            the default input device will be used. See `https://www.ffmpeg.org/ffmpeg-devices.html#Input-Devices`
            for how to specify and list input devices.
        ffmpeg_additional_args (`list[str]`, *optional*):
            Additional arguments to pass to ffmpeg, can include arguments like -nostdin for running as a background
            process. For example, to pass -nostdin to the ffmpeg process, pass in ["-nostdin"]. If passing in flags
            with multiple arguments, use the following convention (eg ["flag", "arg1", "arg2]).

    Return:
        A generator yielding dictionaries of the following form

        `{"sampling_rate": int, "raw": np.array(), "partial" bool}` With optionally 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/   r0   r
   r1   r2   r3      r      )secondsT)stridestreamraw)dtyperP   r   
   )rI   r   int16r   r   r@   rA   
isinstancefloatdatetimenow	timedeltachunk_bytes_iterr   )r   r+   rJ   rK   r"   r,   r-   chunk_s
microphonerS   rC   rF   stride_leftstride_right
audio_timedeltarH   s                    r)   ffmpeg_microphone_liverb      s    ` !  "3/%;%CrI_J '	'	)

-.C-DDdeff(1,E-.89:^KI/C<0*O<eMOA,>>?@>QKu]_Q-??@ANRL""&&(Jw/E Y\?Zcgh mmDKu=UN1/N1/
X !._e
  "Z"u*%<<
s   FF	rF   rP   rQ   c              #   t  K   d}|\  }}||z   |k\  rt        d| d| d|       d}| D ]i  }||z  }|rt        |      |k  r|df}|d| |dd (t        |      |k\  s7||f}|d| |d	}	|rd
|	d<   |	 |}|||z
  |z
  d }t        |      |k\  r3k t        |      |kD  r||dfd	}	|rd
|	d<   |	 yyw)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)rR   rP   partial)rR   rP   Fre   )r   len)
rG   rF   rP   rQ   accr^   r_   _stride_leftrR   rH   s
             r)   r[   r[      s-    
 C &K\!Y.CK=PRS_R``efoepq
 	
 L Ds
c#h*"A&Fjy/VMMc(i'&5":I&A&+DO
*)k1L@BC c(i'D  3x+|Q&78#DO
	 s   AB8!2B8$B8buflenc              #     K   d}	 t        j                  | t         j                  |      5 }	 |j                  j	                  |      }|dk(  rn| &	 ddd       y# 1 sw Y   yxY w# t
        $ r}t        d      |d}~ww xY ww)zJ
    Internal function to create the generator of data through ffmpeg
    i   )r   bufsizerd   NzHffmpeg was not found but is required to stream audio files from filename)r   r   r   r   readr   r   )r#   ri   rk   r$   rR   r&   s         r)   rB   rB     s      GpnZ__gV 	Zh$++008#:		  		 	 	  pcdjoopsK   B&A* (AA* BA'#A* &B'A* *	B3A??BBc                  L   g d} 	 t        j                  | dt         j                  d      }|j                  j	                         D cg c]	  }d|v s| }}|r*|d   j                  d      d   }t        d	|        d
| S 	 yc c}w # t        $ r t        d       Y yw xY w)z3
    Retrieve the microphone name in Windows .
    )r   z-list_devicestruer   r:   r    Tzutf-8)textstderrencodingz(audio)r   "rN   zUsing microphone: zaudio=zOffmpeg was not found. Please install it or make sure it is in your system PATH.r6   )r   runr   rq   
splitlinessplitprintr   )commandffmpeg_deviceslinemicrophone_linesmicrophone_names        r)   r>   r>     s     KG	a#d:??]de-;-B-B-M-M-OeTS\`dSdDee.q177<Q?O&&789O,--   f  a_`as*   AB 		BB-B B B#"B#)r
   NN)NNr
   NN)F)rX   r<   r   typingr   r   numpyr   bytesr@   arrayr*   rW   strlistrI   tuplerb   boolr[   rB   r>    rd   r)   <module>r      sF      " $% $ $ $T "))-26RRR R "#	R
 %T#Y/Rp %)CG!()-26\\\ SM\ eE%,$7$>?@	\
 \ "#\ %T#Y/\~ #  uS#X  PT  Fp3 p rd   