
    fTh/                     :   S SK r S SKrS SKrS SKJrJrJr  S SKrS\	S\
S\R                  4S jr   SS\
S\S\S	\\   S
\\\      4
S jjr     SS\
S\S\\
   S\\\\\4   \4      S\S	\\   S
\\\      4S jjrSS\
S\\
\
4   S\4S jjrS\
4S jrS rg)    N)OptionalTupleUnionbpayloadsampling_ratereturnc                    U nSnSnSSSSUSUSUS	S
SS/n [         R                  " U[         R                  [         R                  S9 nUR                  U 5      nSSS5        WS   n	[        R                  " U	[        R                  5      n
U
R                  S   S:X  a  [        S5      eU
$ ! , (       d  f       NX= f! [         a  n[        S5      UeSnAff = f)z7
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              Z/var/www/auris/envauris/lib/python3.13/site-packages/transformers/pipelines/audio_utils.pyffmpeg_readr+   
   s     ?B	B#

N nnJOOJOO\`n*66x@M ] a IMM)RZZ0E{{1~[
 	

 L ]\ nabhmmns5   2B? 
B.B? .
B<8B? <B? ?
C	CCchunk_length_sr#   ffmpeg_input_deviceffmpeg_additional_argsc              #     #    U  nSnUS:X  a  SnOUS:X  a  SnO[        SU S35      e[        R                  " 5       nUS:X  a  S	n	U=(       d    S
n
O/US:X  a  Sn	U=(       d    Sn
OUS:X  a  Sn	U=(       d
    [        5       n
Uc  / OUnSSW	SW
SUSUSUSSSSSS/nUR	                  U5        [        [        X-  5      5      U-  n[        X5      nU H  nUv   M	     g7f)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_microphonerJ   1   s&    D ?B	B'	'	)-.C-DDdeff__F$1		8	 $2
	9	$>(<(>#9#ARG] 	

#N( 01E-89:^KIn8H
 s   CCstream_chunk_sstride_length_sc              #     #    Ub  UnOUn[        U UUUUc  / OUS9nUS:X  a  [        R                  n	Sn
O(US:X  a  [        R                  n	Sn
O[	        SU S35      eUc  US	-  n[        [        X-  5      5      U
-  n[        U[
        [        45      (       a  X3/n[        [        XS
   -  5      5      U
-  n[        [        XS   -  5      5      U
-  n[        R                  R                  5       n[        R                  " US9n[        XX4SS9 Hn  n[        R                  " US   U	S9US'   US   S
   U
-  US   S   U
-  4US'   U US'   X-  n[        R                  R                  5       USU-  -   :  a  Mj  Uv   Mp     g7f)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.   r0   r1   r   r2   r3   r4      r      )secondsT)stridestreamraw)dtyperQ   r   
   )rJ   r   int16r   r   rA   rB   
isinstancefloatdatetimenow	timedeltachunk_bytes_iterr   )r   r,   rK   rL   r#   r-   r.   chunk_s
microphonerT   rD   rG   stride_leftstride_right
audio_timedeltarI   s                    r*   ffmpeg_microphone_liverc      s    ` !  "3/%;%CrI_J '	'	)

-.C-DDdeff(1,E-89:^KI/C<00*<eMA,>>?@>QKu]Q-??@ANRL""&&(Jw/E ?ZcghmmDKu=UN1/N1/
X !._
  "Z"u*%<<
 is   FFrG   rQ   rR   c              #     #    SnUu  pVXV-   U:  a  [        SU SU SU 35      eSnU  Hw  nXH-  nU(       a   [        U5      U:  a  US4nUSU USS.v   M.  [        U5      U:  d  M?  Xv4nUSU US	.n	U(       a  S
U	S'   U	v   UnXAU-
  U-
  S n[        U5      U:  a  M8  My     [        U5      U:  a  XGS4S	.n	U(       a  S
U	S'   U	v   gg7f)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)rS   rQ   partial)rS   rQ   Frf   )r   len)
rH   rG   rQ   rR   accr_   r`   _stride_leftrS   rI   s
             r*   r\   r\      s    
 C &K!Y.CK=PRS_R``efoepq
 	
 L
c#h*"A&Fjy/VMMc(i'&5":I&A&+DO
*k1L@BC c(i'   3x+Q&78#DO
	 s   A"C(6C +Cbuflenc              #     #    Sn [         R                  " U [         R                  US9 n UR                  R	                  U5      nUS:X  a  OUv   M(  SSS5        g! , (       d  f       g= f! [
         a  n[        S5      UeSnAff = f7f)zB
Internal function to create the generator of data through ffmpeg
i   )r   bufsizere   NzHffmpeg was not found but is required to stream audio files from filename)r   r   r   r   readr   r   )r$   rj   rl   r%   rS   r'   s         r*   rC   rC     s      GpnZ__gVZh$++008#:		  WVV  pcdjoopsK   B$A. *AA. B
A+'A. *B+A. .
B	8BB		Bc                  `   / SQn  [         R                  " U S[         R                  SS9nUR                  R	                  5        Vs/ s H  nSU;   d  M  UPM     nnU(       a*  US   R                  S5      S   n[        S	U 35        S
U 3$  gs  snf ! [         a    [        S5         gf = f)z+
Retrieve the microphone name in Windows .
)r   z-list_devicestruer   r;   r    Tzutf-8)textstderrencodingz(audio)r   "rO   zUsing microphone: zaudio=zOffmpeg was not found. Please install it or make sure it is in your system PATH.r7   )r   runr   rr   
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e-OTS\`dSdD-Oe.q177<Q?O&&789O,--   f  a_`as*   AB 
BB2B B B-,B-)r   NN)NNr   NN)F)rY   r=   r   typingr   r   r   numpyr   bytesrA   arrayr+   rX   strlistrJ   rc   boolr\   rC   r?    re   r*   <module>r      sI      ) ) $% $ $ $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 re   