o
    յi2                     @   s^   d dl Z d dlZd dlmZmZmZ d dlmZ d dlZd dl	Z	ddl
mZ G dd dZdS )    N)AsyncLLMEngineAsyncEngineArgsSamplingParams)AutoTokenizer   )tokens_decoder_syncc                   @   s^   e Zd ZejfddZdd Zdd Zdd ZdddZ	ddddddgdfddZ
dd ZdS )OrpheusModelc                 C   s6   |  || _|| _|  | _g d| _t|| _d S )N)zoezacjessleomiajulialeah)	_map_model_params
model_namedtype_setup_engineengineavailable_voicesr   from_pretrained	tokeniser)selfr   r    r   L/home/ubuntu/.local/lib/python3.10/site-packages/orpheus_tts/engine_class.py__init__
   s
   

zOrpheusModel.__init__c                 C   sD   dddii}g d}||v rt d| d||v r || d S |S )Nz	medium-3brepo_idz(canopylabs/orpheus-tts-0.1-finetune-prod)z	nano-150mz
micro-400mzsmall-1bzModel zg is not supported. Only medium-3b is supported, small, micro and nano models will be released very soon)
ValueError)r   r   	model_mapunsupported_modelsr   r   r   r      s   zOrpheusModel._map_model_paramsc                 C   s   t d| j| jd}t|S )NT)enforce_eagermodelr   )r   r   r   r   from_engine_args)r   engine_argsr   r   r   r   )   s
   
zOrpheusModel._setup_enginec                 C   s.   |r|| j jvrtd| d| j d S d S )NzVoice z is not available for model )r   r   r   r   )r   voicer   r   r   validate_voice0   s
   zOrpheusModel.validate_voicetaralargerc           
      C   s   |dkr|rd| d| dS d| dS |rO| d| }| j |dd}tjd	ggtjd
}tjg dgtjd
}tj||j|gdd}| j |d }	|	S | j |dd}tjd	ggtjd
}tjg dgtjd
}tj||j|gdd}| j |d }	|	S )Nsmallerz<custom_token_3>[z!]<custom_token_4><custom_token_5>z <custom_token_4><custom_token_5>z: pt)return_tensorsi )r   )i	 i i i r   )dimr   )r   torchtensorint64cat	input_idsdecode)
r   promptr$   
model_typeadapted_promptprompt_tokensstart_token
end_tokensall_input_idsprompt_stringr   r   r   _format_prompt5   s$   zOrpheusModel._format_promptNzreq-001g333333?g?i  i  g?c	                 #   s     ||t| t|||||dt fdd  fdd}	tj|	d}
|
  	  }|d u r<n|V  q3|
	  d S )N)temperaturetop_p
max_tokensstop_token_idsrepetition_penaltyc                     sD   j j d2 z3 d H W } | jd j q
6 d  d S )N)r3   sampling_params
request_idr   )r   generateputoutputstext)result)r:   rB   rA   r   token_queuer   r   async_producer\   s
   z9OrpheusModel.generate_tokens_sync.<locals>.async_producerc                      s   t    d S )N)asynciorunr   )rI   r   r   	run_asyncb   s   z4OrpheusModel.generate_tokens_sync.<locals>.run_async)target)
r;   printr   queueQueue	threadingThreadstartgetjoin)r   r3   r$   rB   r<   r=   r>   r?   r@   rL   threadtokenr   )rI   r:   rB   rA   r   rH   r   generate_tokens_syncO   s,   z!OrpheusModel.generate_tokens_syncc                 K   s   t | jdi |S )Nr   )r   rX   )r   kwargsr   r   r   generate_speechp   s   zOrpheusModel.generate_speech)r&   r'   )__name__
__module____qualname__r-   bfloat16r   r   r   r%   r;   rX   rZ   r   r   r   r   r   	   s    
!r   )rJ   r-   vllmr   r   r   transformersr   rQ   rO   decoderr   r   r   r   r   r   <module>   s    