U
    ·ÜŸjÜ  ã                   @  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                   @  sL   e Zd Zdddœdd„Zdddœd	d
„Zdddœdd„Zdddœdd„ZdS )ÚLocalAudioPlayerNzUnion[Callable[[], bool], None])Úshould_stopc                 C  s   d| _ tj| _|| _d S )Né   )ÚchannelsÚnpÚfloat32Údtyper   )Úselfr   © r   úE/tmp/pip-unpacked-wheel-2qj3ofc_/openai/helpers/local_audio_player.pyÚ__init__   s    zLocalAudioPlayer.__init__zmUnion[_legacy_response.HttpxBinaryResponseContent, AsyncStreamedBinaryAPIResponse, StreamedBinaryAPIResponse]únpt.NDArray[np.float32])ÚresponseÚreturnc                 Ã  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 }|rH| |¡ qH6 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_bufferz�Union[npt.NDArray[np.int16], npt.NDArray[np.float32], _legacy_response.HttpxBinaryResponseContent, AsyncStreamedBinaryAPIResponse, StreamedBinaryAPIResponse]ÚNone)Úinputr   c              	   ƒ  sê   t |tjƒrj|jtjkr@ˆjtjkr@| tj¡d  dˆj¡‰ qz|jtjkrXt	d|ƒ‰ qzt
d|j› �ƒ‚nˆ |¡I d H ‰ t ¡ ‰t ¡ ‰d‰dddddœ‡ ‡‡‡‡fd	d
„}tjt|ˆ jˆ jd d�}|� ˆ ¡ I d H  W 5 Q R X d S )Nr   r    r   zUnsupported dtype: r   Úintr   ©ÚoutdataÚframe_countÚ
_time_infoÚ_statusc                   sx   t ˆ ƒˆ }|dks&tˆjƒr8ˆ ¡ r8ˆ ˆj¡ tj‚||krD|n|}ˆ ˆˆ| … | d |…< d| |d …< ˆ|7 ‰d S )Nr   )ÚlenÚcallabler   Úcall_soon_threadsafeÚsetÚsdÚCallbackStop)r.   r/   r0   r1   Ú	remainderZvalid_frames©Zaudio_contentÚeventÚidxÚloopr   r   r   ÚcallbackN   s    z'LocalAudioPlayer.play.<locals>.callbackr   )Ú
samplerater=   r   r   )r!   r   Zndarrayr   r$   r   r%   r&   r   r   Ú
ValueErrorr)   ÚasyncioÚget_event_loopÚEventr6   ÚOutputStreamÚSAMPLE_RATEÚshapeÚwait)r   r+   r=   Ústreamr   r9   r   Úplay5   s&     üzLocalAudioPlayer.playzQAsyncGenerator[Union[npt.NDArray[np.float32], npt.NDArray[np.int16], None], None])Úbuffer_streamr   c              	   ƒ  s    t  ¡ ‰t  ¡ ‰tjdd�‰‡‡‡fdd„}dddddœ‡ ‡‡‡‡‡fd	d
„}d ‰d‰ t  |ƒ ¡}tjtˆj	ˆj
|d�� ˆ ¡ I d H  W 5 Q R X |I d H  d S )Né2   )Úmaxsizec                  “  sP   ˆ2 z.3 d H W } | d kr q6ˆ  d ˆ j| ¡I d H  q6 ˆ  d ˆ jd ¡I d H  d S )N)Úrun_in_executorÚput)Úbuffer)Úbuffer_queuerI   r<   r   r   Úbuffer_producerp   s
    z5LocalAudioPlayer.play_stream.<locals>.buffer_producerr   r,   r   r-   c                   sò   d}||k rîˆd ks ˆ t ˆƒkr¦z`ˆjdd�‰ˆd krHˆ ˆj¡ tj‚d‰ ˆjtjkr~ˆjtj	kr~ˆ 
tj	¡d  dˆj¡‰W n$ tjk
r¤   d| |d …< Y d S X t ˆƒˆ  }t|| |ƒ}ˆˆ ˆ | … | ||| …< ˆ |7 ‰ ||7 }qd S )Nr   gš™™™™™¹?)Útimeoutr   r    )r2   Úgetr4   r5   r6   r7   r   r   r$   r   r%   r&   r   ÚqueueÚEmptyÚmin)r.   r/   r0   r1   Zframes_writtenZremaining_framesZframes_to_write)Ú
buffer_posrO   Úcurrent_bufferr:   r<   r   r   r   r=   w   s,     ÿz.LocalAudioPlayer.play_stream.<locals>.callbackr   )r>   r   r   r=   )r@   rA   rB   rS   ÚQueueÚcreate_taskr6   rC   rD   r   r   rF   )r   rI   rP   r=   Zproducer_taskr   )rV   rO   rI   rW   r:   r<   r   r   Úplay_streamh   s     "!üzLocalAudioPlayer.play_stream)N)Ú__name__Ú
__module__Ú__qualname__r   r)   rH   rZ   r   r   r   r   r      s
    þ3r   )Ú
__future__r   rS   r@   Útypingr   r   r   r   r   Útyping_extensionsr   Ú r
   Z_extrasr   r   r   r6   Ú	_responser   r   Znumpy.typingZnptrD   r   r   r   r   r   Ú<module>   s   