o
    ØRWjÜ  ã                   @  s–   d dl mZ d dlZd dlZd dlmZmZmZmZm	Z	 d dl
mZ ddlmZ ddlmZmZ ddlmZmZ er@d dlmZ d	ZG d
d„ dƒZdS )é    )ÚannotationsN)ÚAnyÚUnionÚCallableÚAsyncGeneratorÚcast)ÚTYPE_CHECKINGé   )Ú_legacy_response)ÚnumpyÚsounddevice)ÚStreamedBinaryAPIResponseÚAsyncStreamedBinaryAPIResponseiÀ]  c                   @  s8   e Zd Z	dddd„Zdd
d„Zddd„Zddd„ZdS )ÚLocalAudioPlayerNÚshould_stopúUnion[Callable[[], bool], None]c                 C  s   d| _ tj| _|| _d S )Né   )ÚchannelsÚnpÚfloat32Údtyper   )Úselfr   © r   úp/home/esfera/Documents/content_generation/venv/lib/python3.10/site-packages/openai/helpers/local_audio_player.pyÚ__init__   s   
zLocalAudioPlayer.__init__ÚresponseúmUnion[_legacy_response.HttpxBinaryResponseContent, AsyncStreamedBinaryAPIResponse, StreamedBinaryAPIResponse]Úreturnúnpt.NDArray[np.float32]c                 Ã  sž   �g }t |tjƒst |tƒr|jdd�D ]	}|r| |¡ qn|jdd�2 z3 d H W }|r2| |¡ q%6 d |¡}tj|tj	d� 
tj¡d }| dd¡}|S )Ni   )Ú
chunk_sizeó    )r   ç    Àÿß@éÿÿÿÿr   )Ú
isinstancer
   ÚHttpxBinaryResponseContentr   Ú
iter_bytesÚappendÚjoinr   Ú
frombufferÚint16Úastyper   Úreshape)r   r   ÚchunksÚchunkÚaudio_bytesÚaudio_npr   r   r   Ú_tts_response_to_buffer   s&   €ÿ
€þ
€þ
z(LocalAudioPlayer._tts_response_to_bufferÚinputú�Union[npt.NDArray[np.int16], npt.NDArray[np.float32], _legacy_response.HttpxBinaryResponseContent, AsyncStreamedBinaryAPIResponse, StreamedBinaryAPIResponse]ÚNonec                 ƒ  sö   �t |tjƒr5|jtjkr!ˆjtjkr!| tj¡d  dˆj¡‰ n|jtjkr-t	d|ƒ‰ nt
d|j› �ƒ‚ˆ |¡I d H ‰ t ¡ ‰t ¡ ‰d‰d‡ ‡‡‡‡fdd„}tjt|ˆ jˆ jd d�}|� ˆ ¡ I d H  W d   ƒ d S 1 stw   Y  d S )Nr!   r"   r   zUnsupported dtype: r   ÚoutdataÚframe_countÚintÚ
_time_infor   Ú_statusc                   sx   t ˆ ƒˆ }|dkstˆjƒrˆ ¡ rˆ ˆj¡ tj‚||kr"|n|}ˆ ˆˆ| … | d |…< d| |d …< ˆ|7 ‰d S )Nr   )ÚlenÚcallabler   Úcall_soon_threadsafeÚsetÚsdÚCallbackStop)r4   r5   r7   r8   Ú	remainderÚvalid_frames©Úaudio_contentÚeventÚidxÚloopr   r   r   ÚcallbackN   s   z'LocalAudioPlayer.play.<locals>.callbackr   )Ú
sampleraterF   r   r   ©r4   r   r5   r6   r7   r   r8   r   )r#   r   Úndarrayr   r)   r   r*   r+   r   r   Ú
ValueErrorr0   ÚasyncioÚget_event_loopÚEventr=   ÚOutputStreamÚSAMPLE_RATEÚshapeÚwait)r   r1   rF   Ústreamr   rA   r   Úplay5   s*   €ü"ÿzLocalAudioPlayer.playÚbuffer_streamúQAsyncGenerator[Union[npt.NDArray[np.float32], npt.NDArray[np.int16], None], None]c                 ƒ  s¬   �t  ¡ ‰t  ¡ ‰tjdd�‰‡‡‡fdd„}d‡ ‡‡‡‡‡fdd„}d ‰d‰ t  |ƒ ¡}tjtˆj	ˆj
|d�� ˆ ¡ I d H  W d   ƒ n1 sJw   Y  |I d H  d S )Né2   )Úmaxsizec                  “  sR   �ˆ2 z3 d H W } | d u r nˆ  d ˆ j| ¡I d H  q6 ˆ  d ˆ jd ¡I d H  d S ©N)Úrun_in_executorÚput)Úbuffer)Úbuffer_queuerT   rE   r   r   Úbuffer_producerp   s   €ýz5LocalAudioPlayer.play_stream.<locals>.buffer_producerr4   r   r5   r6   r7   r   r8   c                   sú   d}||k r{ˆd u sˆ t ˆƒkrRz0ˆjdd�‰ˆd u r$ˆ ˆj¡ tj‚d‰ ˆjtjkr?ˆjtj	kr?ˆ 
tj	¡d  dˆj¡‰W n tjyQ   d| |d …< Y d S w t ˆƒˆ  }t|| |ƒ}ˆˆ ˆ | … | ||| …< ˆ |7 ‰ ||7 }||k sd S d S )Nr   gš™™™™™¹?)Útimeoutr!   r"   )r9   Úgetr;   r<   r=   r>   r   r   r)   r   r*   r+   r   ÚqueueÚEmptyÚmin)r4   r5   r7   r8   Úframes_writtenÚremaining_framesÚframes_to_write)Ú
buffer_posr\   Úcurrent_bufferrC   rE   r   r   r   rF   w   s0   €þ
ÿêz.LocalAudioPlayer.play_stream.<locals>.callbackr   )rG   r   r   rF   rH   )rK   rL   rM   r`   ÚQueueÚcreate_taskr=   rN   rO   r   r   rQ   )r   rT   r]   rF   Úproducer_taskr   )rf   r\   rT   rg   rC   rE   r   r   Úplay_streamh   s$   €!üúzLocalAudioPlayer.play_streamrX   )r   r   )r   r   r   r   )r1   r2   r   r3   )rT   rU   r   r3   )Ú__name__Ú
__module__Ú__qualname__r   r0   rS   rk   r   r   r   r   r      s    þ

3r   )Ú
__future__r   r`   rK   Útypingr   r   r   r   r   Útyping_extensionsr   Ú r
   Ú_extrasr   r   r   r=   Ú	_responser   r   Únumpy.typingÚnptrO   r   r   r   r   r   Ú<module>   s   