o
    ?Hh                     @  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   a/home/air/sanwanet/gpt-api/venv/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
   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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)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_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_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   