o
    ͩZh                     @  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   X/var/www/html/lang_env/lib/python3.10/site-packages/openai/helpers/local_audio_player.py__init__   s   
zLocalAudioPlayer.__init__responsemUnion[_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
   ZHttpxBinaryResponseContentr   Z
iter_bytesappendjoinr   Z
frombufferint16astyper   reshape)r   r   chunkschunkZaudio_bytesZaudio_npr   r   r   _tts_response_to_buffer   s&   


z(LocalAudioPlayer._tts_response_to_bufferinputUnion[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)r/   r0   r2   r3   	remainderZvalid_framesZaudio_contenteventidxloopr   r   r   callbackN   s   z'LocalAudioPlayer.play.<locals>.callbackr   )
samplerater?   r   r   r/   r   r0   r1   r2   r   r3   r   )r#   r   Zndarrayr   r&   r   r'   r(   r   r   
ValueErrorr+   asyncioget_event_loopEventr8   OutputStreamSAMPLE_RATEshapewait)r   r,   r?   streamr   r;   r   play5   s*   "zLocalAudioPlayer.playbuffer_streamQAsyncGenerator[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 )N2   )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_queuerL   r>   r   r   buffer_producerp   s   z5LocalAudioPlayer.play_stream.<locals>.buffer_producerr/   r   r0   r1   r2   r   r3   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"   )r4   getr6   r7   r8   r9   r   r   r&   r   r'   r(   r   queueEmptymin)r/   r0   r2   r3   Zframes_writtenZremaining_framesZframes_to_write)
buffer_posrT   current_bufferr<   r>   r   r   r   r?   w   s0   
z.LocalAudioPlayer.play_stream.<locals>.callbackr   )r@   r   r   r?   rA   )rC   rD   rE   rX   Queuecreate_taskr8   rF   rG   r   r   rI   )r   rL   rU   r?   Zproducer_taskr   )r[   rT   rL   r\   r<   r>   r   r   play_streamh   s$   !zLocalAudioPlayer.play_streamrP   )r   r   )r   r   r   r   )r,   r-   r   r.   )rL   rM   r   r.   )__name__
__module____qualname__r   r+   rK   r_   r   r   r   r   r      s    

3r   )
__future__r   rX   rC   typingr   r   r   r   r   Ztyping_extensionsr    r
   _extrasr   r   r   r8   	_responser   r   Znumpy.typingZnptrG   r   r   r   r   r   <module>   s   