
    #Hj                     R   S r SSKrSSKrSSKrSSKrSSKrSSKJrJr  SSK	J
r
  SSKJrJrJrJr  SSKrSSKrSSKJr  SSKJs  Jr  SSKr SSKJr  SrSS	KJrJrJ r J!r!J"r"J#r#  SS
K$J%r%  SSK&J'r'J(r(  SSK)J*r*J+r+J,r,J-r-J.r.  SSK/J0r0  SSK1J2r2J3r3  SSK4J5r5J6r6  SSK7J8r8J9r9J:r:J;r;J<r<J=r=J>r>  \R~                  " \@5      rA\ " S S5      5       rB\ " S S5      5       rC\ " S S5      5       rD\ " S S\%5      5       rE " S S\"5      rFS\GS\G4S jrH " S S\#5      rIS  rJS! rKS"\\G   S\\GS4   4S# jrL S<S$\\G   S%\MS\\GS4   4S& jjrNS=S'\R                  S(\PS\R                  4S) jjrQS'\R                  S*\PS\R                  4S+ jrRS,S-S.S-\R                  " S/5      4S0\PS1\PS2\TS3\PS4\R                  S\R                  4S5 jjrU\R                  " S65      rWS7\GS\R                  4S8 jrXS>S9\\G   S\G4S: jjrY\(R                  " S;\F5        \R                  " \F\I5        g! \ a    Sr GNf = f)?a  Core OmniVoice model implementation.

Defines the ``OmniVoice`` model class, generation config, and inference pipeline.
This is the main entry point for both inference and training:

- **Inference**: ``OmniVoice.from_pretrained()`` loads the model, then
  ``model.generate()`` supports voice cloning, voice design, and auto voice.
- **Training**: ``model.forward()`` computes the training loss; the model is
  built and used by ``omnivoice.training.builder`` and ``omnivoice.training.trainer``.

    N)	dataclassfields)partial)AnyListOptionalUnion)create_block_maskTF)AutoFeatureExtractor	AutoModelAutoTokenizerHiggsAudioV2TokenizerModelPretrainedConfigPreTrainedModel)ModelOutput)CONFIG_MAPPING
AutoConfig)cross_fade_chunksfade_and_pad_audio
load_audioremove_silencetrim_long_audio)RuleDurationEstimator)LANG_IDS
LANG_NAMES)add_punctuationchunk_text_punctuation)_INSTRUCT_ALL_VALID_INSTRUCT_EN_TO_ZH_INSTRUCT_MUTUALLY_EXCLUSIVE_INSTRUCT_VALID_EN_INSTRUCT_VALID_ZH_INSTRUCT_ZH_TO_EN_ZH_REc                   H    \ rS rSr% \R
                  \S'   \\S'   \\S'   Sr	g)VoiceClonePromptZ   ref_audio_tokensref_textref_rms N)
__name__
__module____qualname____firstlineno__torchTensor__annotations__strfloat__static_attributes__r+       :/mnt/workspace/git/OmniVoice/omnivoice/models/omnivoice.pyr&   r&   Z   s    ll"MNr6   r&   c                       \ rS rSr% Sr\\S'   Sr\\S'   Sr	\\S'   Sr
\\S	'   Sr\\S
'   Sr\\S'   Sr\\S'   Sr\\S'   Sr\\S'   Sr\\S'   Sr\\S'   Sr\\S'   Sr\\S'   \S 5       rSrg)OmniVoiceGenerationConfiga       num_stepg       @guidance_scale皙?t_shiftg      @layer_penalty_factorposition_temperature        class_temperatureTdenoisepreprocess_promptpostprocess_outputg      .@audio_chunk_durationg      >@audio_chunk_thresholdpad_durationfade_durationc                     [        U 5       Vs1 s H  o"R                  iM     nnUR                  5        VVs0 s H  u  pEXC;   d  M  XE_M     nnnU " S0 UD6$ s  snf s  snnf )Nr+   )r   nameitems)clskwargs_dictf
valid_keyskvfiltereds          r7   	from_dict#OmniVoiceGenerationConfig.from_dictq   sY    &,Sk2kffk
2%0%6%6%8L%8TQAODAD%8LX 3Ls   AAAr+   N)r,   r-   r.   r/   r<   intr2   r=   r4   r?   r@   rA   rC   rD   boolrE   rF   rG   rH   rI   rJ   classmethodrU   r5   r+   r6   r7   r9   r9   a   s    HcNEGU"%%%"%%%"u"GT"t"##"&%&#'5'L%M5 r6   r9   c                      \ rS rSr% \\S'   \\   \S'   \\   \S'   \\\      \S'   \\\      \S'   \\\      \S'   \\\	R                        \S'   \\\      \S	'   S
r\\\      \S'   S\S\4S jrS\\   4S jrSrg
)GenerationTaskx   
batch_sizetextstarget_lenslangs	instructs	ref_textsr(   r*   Nspeedconfig
frame_ratec                    [        UR                  U-  5      n[        U R                  5       VVs/ s H  u  pEXS::  d  M  UPM     nnn[        U R                  5       VVs/ s H  u  pEXS:  d  M  UPM     nnnXg4$ s  snnf s  snnf N)rW   rH   	enumerater_   )selfrd   re   	thresholdil	short_idxlong_idxs           r7   get_indicesGenerationTask.get_indices   sw    44zAB	#,T-=-=#>Q#>41!.Q#>	Q"+D,<,<"=O"=$!A"=O"" ROs   A< A<!B0Bindicesc                    U(       d  g [        [        U5      U Vs/ s H  o R                  U   PM     snU Vs/ s H  o R                  U   PM     snU Vs/ s H  o R                  U   PM     snU Vs/ s H  o R
                  U   PM     snU Vs/ s H  o R                  U   PM     snU Vs/ s H  o R                  U   PM     snU Vs/ s H  o R                  U   PM     snU R                  (       a!  U Vs/ s H  o R                  U   PM     snS9	$ S S9	$ s  snf s  snf s  snf s  snf s  snf s  snf s  snf s  snf )N	r]   r^   r_   r`   ra   rb   r(   r*   rc   )
r[   lenr^   r_   r`   ra   rb   r(   r*   rc   )ri   rq   rk   s      r7   
slice_taskGenerationTask.slice_task   s   7|*12'Q::a='26=>g))!,g>*12'Q::a='229:'Q~~a(':29:'Q~~a(':@GH133A6H.56g\\!_g66:jj'2'Q::a='2

 
	
 GK

 
	
2>2::H62s.   D 
D%D*6D/D42D9D>?Er+   )r,   r-   r.   r/   rW   r2   r   r3   r   r0   r1   r4   rc   r9   ro   ru   r5   r+   r6   r7   r[   r[   x   s    O9cHSM""HSM""8ELL122(5/""#'E8DK '#"; # #
$s) 
r6   r[   c                   f    \ rS rSr% Sr\\R                     \S'   Sr	\\R                     \S'   Sr
g)OmniVoiceModelOutput   Nlosslogitsr+   )r,   r-   r.   r/   rz   r   r0   r1   r2   r{   r5   r+   r6   r7   rx   rx      s(    #'D(5<<
 '%)FHU\\")r6   rx   c                   v   ^  \ rS rSrSrS\0r     S
S\S\S\S\\	\
      S\\\\4      4
U 4S jjjrS	rU =r$ )OmniVoiceConfig   	omnivoice
llm_configaudio_vocab_sizeaudio_mask_idnum_audio_codebookaudio_codebook_weightsc                    > [        U[        5      (       a  [        US      " S0 UD6nXPl        [        TU ]  " S0 UD6  Xl        X l        X0l        Uc  / SQnX@l	        g )N
model_type)   r      r      r      r   r+   )

isinstancedictr   r   super__init__r   r   r   r   )ri   r   r   r   r   r   kwargs	__class__s          r7   r   OmniVoiceConfig.__init__   sb     j$'''
<(@AOJOJ$"6" 0*"4!)%="&<#r6   )r   r   r   r   r   )i  i   r   NN)r,   r-   r.   r/   r   r   sub_configsrW   r   listr4   r	   r   r   r   r5   __classcell__r   s   @r7   r}   r}      sv    J,K !%!"#8<>B== =  	=
 !)e 5= U4)9#9:;= =r6   r}   name_or_pathreturnc                 j    [         R                  R                  U 5      (       a  U $ SSKJn  U" U 5      $ )Nr   )snapshot_download)ospathisdirhuggingface_hubr   )r   r   s     r7   _resolve_model_pathr      s)    	ww}}\""1\**r6   c                     ^  \ rS rSrSrSrSr\rS<S\S\	\
   4U 4S jjjr\U 4S j5       rS=S\4S	 jjr\R"                  " 5       S
\\\4   S\4S j5       rS rS rS\R.                  S\R.                  S\R.                  4S jr    S>S\R2                  S\R.                  S\	\R2                     S\	\R.                     S\	\R.                     S\	\R2                     4S jjrS\\   4S jrS\\   4S jr\R"                  " 5               S?S\\\\   4   S\\\\   S4   S\\\\   S4   S\\\\   \\R.                  \4   \\\R.                  \4      S4   S\\ \\    S4   S\\\\   S4   S\\!\\	\!      S4   S \\!\\	\!      S4   S!\	\"   S\\#RH                     4S" jj5       r%  S@S\\\\R.                  \4   4   S\	\   S#\&S\ 4S$ jjr'S%\\R.                  \(\R.                     4   S&\\!S4   S'\"S\#RH                  4S( jr)S)\#RH                  S*\\!S4   S'\"S\#RH                  4S+ jr*S,\+S'\"S\(\(\R.                        4S- jr,        SAS\\\\   4   S\\\\   S4   S\\\\   S4   S\\\\   \\R.                  \4   \\\R.                  \4      S4   S\\ \\    S4   S\\\\   S4   S#\&S \\!\\	\!      S4   S\\!\\	\!      S4   S\+4S. jjr-SBS/ jr. SCS0\\/\(\/   4   S1\S2\&S\(\/   4S3 jjr0     SDS\S4\S\	\   S5\	\R.                     S6\	\   S\	\   S7\&4S8 jjr1S,\+S'\"S\(\R.                     4S9 jr2S: r3S;r4U =r5$ )E	OmniVoice   TNrd   llmc                 2  > [         TU ]  U5        Ub  X l        O/[        R                  " U R
                  R                  5      U l        [        R                  " UR                  UR                  -  U R
                  R                  R                  5      U l        U R                  S[        R                  " UR                  5      UR                  -  5        [        R                   " U R
                  R                  R                  UR                  UR                  -  SS9U l        UR$                   Vs/ s H  nU['        UR$                  5      -  PM     snU l        U R+                  5         S U l        S U l        S U l        S U l        S U l        g s  snf )Ncodebook_layer_offsetsF)bias)r   r   r   r   from_configrd   r   nn	Embeddingr   r   hidden_sizeaudio_embeddingsregister_bufferr0   arangeLinearaudio_headsr   sum!normalized_audio_codebook_weights	post_inittext_tokenizeraudio_tokenizerduration_estimatorsampling_rate	_asr_pipe)ri   rd   r   wr   s       r7   r   OmniVoice.__init__   sQ    ? H !,,T[[-C-CDDH "%%(?(??KK""..!
 	$LL223f6M6MM	

 99KK""..%%(?(??
 222
2 F112222
.
 	 ##"&!2
s   6"Fc                   > UR                  SS5      nUR                  SS5      nUR                  SS5      n[        R                  R                  R                  n[        R                  " [        R
                  5         [        U5      n[        TU ]   " U/UQ70 UD6n	U(       Gd  [        R                  " U5      U	l
        [        R                  R                  US5      n
[        R                  R                  U
5      (       d  [        S5      n
[        U	R                   5      R#                  S5      (       a  S	OU	R                   n[$        R                  " XS
9U	l        [(        R                  " U
5      U	l        U	R*                  R,                  U	l        [/        5       U	l        U(       a  U	R3                  US9  [        R                  " U5        U	$ ! [        R                  " U5        f = f)NtrainFload_asrasr_model_nameopenai/whisper-large-v3-turbor   zeustlb/higgs-audio-v2-tokenizermpscpu)
device_map)
model_name)poploggingrootmanagerdisableINFOr   r   from_pretrainedr   r   r   r   joinr   r3   device
startswithr   r   r   feature_extractorr   r   r   load_asr_model)rN   pretrained_model_name_or_pathargsr   
train_moder   r   _prev_disableresolved_pathmodelaudio_tokenizer_pathtokenizer_devicer   s               r7   r   OmniVoice.from_pretrained   s   ZZ/
::j%0$46UV  ,,44%#	+/0MNMG+MKDKFKE'4'D'D]'S$')ww||MCT'U$ww}}%9::+>9,( !.99%@@Eell ! )C(R(R()% +?*N*N(+' ',&=&=&K&K#+@+B(((N(COOM* OOM*s   D<G G-r   c                 T   SSK Jn  [        R                  SU5        [	        U R
                  5      R                  S5      (       a  [        R                  O[        R                  n[        U5      nU" SUUU R
                  S9U l        [        R                  SU R
                  5        g)	zLoad a Whisper ASR model for reference audio transcription.

Args:
    model_name: HuggingFace model name or local path for the Whisper model.
r   )pipelinezLoading ASR model %s ...)cudaxpuzautomatic-speech-recognition)r   dtyper   zASR model loaded on %s.N)transformersr   loggerinfor3   r   r   r0   float16float32r   r   )ri   r   hf_pipeline	asr_dtypes       r7   r   OmniVoice.load_asr_model,  s~     	9.
; -88IIEMMu}} 	 )4
$*{{	
 	-t{{;r6   audior   c                    U R                   c  [        S5      e[        U[        5      (       a"  U R                  U5      S   R	                  5       $ Uu  p#[        U[
        R                  5      (       a  UR                  5       R                  5       n[        R                  " U5      nUUS.nU R                  U5      S   R	                  5       $ )zTranscribe audio using the loaded Whisper ASR model.

Args:
    audio: File path or ``(waveform, sample_rate)`` tuple.
        Waveform can be a numpy array or torch.Tensor of shape
        ``(1, T)`` or ``(T,)``.

Returns:
    Transcribed text.
z;ASR model is not loaded. Call model.load_asr_model() first.text)arrayr   )r   RuntimeErrorr   r3   stripr0   r1   r   numpynpsqueeze)ri   r   waveformsraudio_inputs        r7   
transcribeOmniVoice.transcribeC  s     >>!M  eS!!>>%(06688 LH(ELL11#<<>//1zz(+H!!#K >>+.v6<<>>r6   c                 6    U R                   R                  5       $ rg   )r   get_input_embeddingsri   s    r7   r   OmniVoice.get_input_embeddingsd  s    xx,,..r6   c                 :    U R                   R                  U5        g rg   )r   set_input_embeddings)ri   values     r7   r   OmniVoice.set_input_embeddingsg  s    %%e,r6   	input_ids
audio_maskc                 ,   U R                  5       " USS2SSS24   5      nXR                  S5      -  U R                  R                  SSS5      -   nU R	                  U5      R                  SS9n[        R                  " UR                  S5      XS5      $ )z
Prepares embeddings from input_ids of shape (batch_size, layers, seq_length).
Embedding shape is (batch_size, seq_length, hidden_size).
Nr      dim)r   	unsqueezer   viewr   r   r0   where)ri   r   r   text_embedsshifted_idsaudio_embedss         r7   _prepare_embed_inputsOmniVoice._prepare_embed_inputsj  s     //1)Aq!G2DE ,,Q//'',,QA67
 ,,[9==!=D{{://3\OOr6   labelsattention_maskdocument_idsposition_idsc           
         U R                  X5      nUcu  Ubr  [        (       d  [        S5      e[        [	        US   R                  UR                  5      5      S S UR                  S5      UR                  S5      SUR                  S9nU R                  UUSUS9nUS   n	S n
U	R                  u  pnU R                  U	5      nUR                  UUU R                  R                  U R                  R                  5      R                  SSSS	5      nUb  [         R"                  R$                  R'                  UR                  SS	SS5      US
SS9nUS:g  R)                  5       nUU-  R+                  SS9UR+                  SS9R-                  SS9-  n[         R.                  " U R0                  UR                  S9nUU-  R+                  5       n
[3        U
US9$ )Nzflex_attention is not available in the current environment. If you do not need flex_attention, set "attn_implementation": "sdpa" in your training config.r   r   T)BHQ_LENKV_LEN_compiler   )inputs_embedsr
  return_dictr  r   r      nonei)	reductionignore_index)r   r   r         ?)minr   )rz   r{   )r  _flex_attention_availabler   r
   _get_packed_masktor   sizer   shaper   r  rd   r   r   permuter0   r   
functionalcross_entropyr4   r   clamptensorr   rx   )ri   r   r   r	  r
  r  r  r  llm_outputshidden_statesrz   r]   seq_len_logits_flataudio_logitsper_token_loss
valid_masklayer_meansweightss                       r7   forwardOmniVoice.forward  s    229I!l&>,,"M 
 /  O&&}';';< nnR( ~~b)$++
N hh')%	  
 $A "/!4!4
Q&&}5"''KK**KK((	

 '!Q1
 	 
 #XX00>>$$Q1a0 !	 ? N !D.//1J *J6;; < 6*00S09:K ll66|?R?RG  ')..0D#
 	
r6   c                     [         $ )z(Return a list of supported language IDs.)r   r   s    r7   supported_language_ids OmniVoice.supported_language_ids  s    r6   c                     [         $ )z*Return a list of supported language names.)r   r   s    r7   supported_language_names"OmniVoice.supported_language_names  s    r6   r   languager)   	ref_audiovoice_clone_promptinstructdurationrc   generation_configc
                 >   U R                   b  U R                  c  [        S5      eU	b  U	O[        R	                  U
5      nU R                  5         U R                  UUUUUUUR                  UUS9	nUR                  XR                   R                  R                  5      u  pS/UR                  -  nU(       a>  UR                  U5      nU R                  UU5      n[        UU5       H  u  nnUUU'   M     U(       a>  UR                  U5      nU R                  UU5      n[        UU5       H  u  nnUUU'   M     / n[!        UR                  5       HF  nUU   c   SU S35       eUR#                  U R%                  UU   UR&                  U   U5      5        MH     U$ )u  Generate speech audio given text in various modes.

Supports three modes:

1. **Voice clone** — clone the voice style from the reference audio.
    Should provide ``voice_clone_prompt`` (from
   :meth:`create_voice_clone_prompt`) or ``ref_text`` + ``ref_audio``.
2. **Voice design** — provide ``instruct`` text describing
   the desired voice style; no reference audio needed.
3. **Auto** — provide neither; the model picks a voice itself.

Args:
    text: Target text (single string or list for batch).
    language: Language name (e.g. ``"English"``) or code
        (e.g. ``"en"``). ``None`` for language-agnostic mode.
        Performance is slightly better if you specify the language.
    ref_text: Optional reference text for voice cloning mode.
    ref_audio: Optional reference audio for voice cloning mode.
        Can be a file path or a (waveform, sample_rate) tuple.
    voice_clone_prompt: Reusable prompt from :meth:`create_voice_clone_prompt`.
        If provided, it overrides ``ref_text`` and ``ref_audio``.
    instruct: Style instruction for voice design mode.
    duration: Fixed output duration in seconds. If a single float,
        applies to all items; if a list, one value per item.
        ``None`` (default) lets the model estimate duration from text.
        Overrides ``speed`` when both are provided.
    speed: Speaking speed factor. ``> 1.0`` for faster, ``< 1.0`` for
        slower. If a list, one value per item. ``None`` (default) uses
        the model's default estimation.
    generation_config: Explicit config object. If provided, takes
        precedence over ``**kwargs``.
    **kwargs: Generation config or its fields:
        denoise: Whether to prepend the ``<|denoise|>`` token.
        num_step: Number of iterative decoding steps.
        guidance_scale: Classifier-free guidance scale.
        t_shift: Time-step shift (smaller → emphasise low-SNR).
        postprocess_output: Post-process output (remove silence, fade-in/out, pad edges).
        layer_penalty_factor: Penalty encouraging earlier codebook
            layers to unmask first.
        position_temperature: Temperature for position selection.
        class_temperature: Temperature for token sampling (0 = greedy).
        audio_chunk_duration: If > 0, split long text into chunks of
            this duration (seconds) and generate chunk by chunk.
        audio_chunk_threshold: Only apply chunking if estimated audio
            duration exceeds this threshold (seconds).
        pad_duration: Silence padding duration per side in seconds
            (0 to disable).
        fade_duration: Fade-in/out curve duration in seconds
            (0 to disable).
Returns:
    ``audios`` a list of 1-D ``np.ndarray`` with shape ``(T,)`` and
    sampling rate consistent with the model's audio tokenizer
    (usually 24 000 Hz).  Can be saved directly with
    ``soundfile.write("out.wav", audios[0], model.sampling_rate)``.
NzpModel is not loaded with audio/text tokenizers. Make sure you loaded the model with OmniVoice.from_pretrained().)	r   r8  r)   r9  r:  r;  rE   rc   r<  zResult z was not generated)r   r   r   r9   rU   eval_preprocess_allrE   ro   rd   re   r]   ru   _generate_iterativezip_generate_chunkedrangeappend_decode_and_post_processr*   )ri   r   r8  r)   r9  r:  r;  r<  rc   r=  r   
gen_config	full_taskrm   rn   results
short_taskshort_resultsidxres	long_tasklong_resultsgenerated_audiosrk   s                           r7   generateOmniVoice.generate  s   \ '4+>+>+FE  !, *44V< 	 			((1(:: ) 

	 (33,,33>>
	 &9///"--i8J 44ZLM	=9S" : !,,X6I11)ZHL,7S" 8 y++,A1:)JWQC7I+JJ)##--AJ	 1 1! 4j -  r6   rE   c                    U R                   c  [        S5      e[        U[        5      (       a  [	        XR
                  5      nOUu  pV[        U[        R                  5      (       a  UR                  5       R                  5       nUR                  S:X  a  U[        R                  SS24   nUR                  S   S:  a  [        R                  " USSS9nX`R
                  :w  aK  [        R                   R#                  [        R$                  " U5      UU R
                  S9R                  5       nUn['        [        R(                  " [        R                  " US-  5      5      5      nSUs=:  a  S	:  a  O  OUS	-  U-  nU(       aL  Uc  [+        X@R
                  S
S9n[-        UU R
                  SSSS9nUR                  S   S:X  a  [/        S5      eUR                  S   U R
                  -  nUS
:  a  [0        R3                  SU5        Ucd  U R4                  c%  [0        R7                  S5        U R9                  5         U R;                  X@R
                  45      n[0        R=                  SU5        U R                   R>                  R@                  n	[C        UR                  S   U	-  5      n
U
S:  a  USS2SU
* 24   OUn[        R$                  " U5      RE                  U R                   RF                  5      nU R                   RI                  URK                  S5      5      RL                  RO                  S5      nU(       a  [Q        U5      n[S        UUUS9$ )a  Create a reusable voice clone prompt from reference audio.

Args:
    ref_audio: File path (str) or ``(waveform, sample_rate)`` tuple.
        waveform should be a 1-D or 2-D torch.Tensor (channels x samples).
    ref_text: Transcript of the reference audio. If ``None``, the
        ASR model will be used to auto-transcribe (must call
        :meth:`load_asr_model` first).
    preprocess_prompt: If ``True`` (default), apply silence removal and
        trimming to the reference audio, add punctuation in the end
        of reference text (if not already)

Returns:
    A :class:`VoiceClonePrompt` that can be passed to :meth:`generate`.
Nz_Audio tokenizer is not loaded. Make sure you loaded the model with OmniVoice.from_pretrained().r   r   T)axiskeepdims)	orig_freqnew_freqr   r>   g      4@)trim_threshold   d   mid_sillead_sil	trail_silr   zTReference audio is empty after silence removal. Try setting preprocess_prompt=False.zReference audio is %.1fs long (>20s). This may cause slower generation, higher memory usage, and degraded voice cloning quality. We recommend trimming it to 3-10s.z0ASR model not loaded yet, loading on-the-fly ...zAuto-transcribed ref_text: %s)r(   r)   r*   )*r   r   r   r3   r   r   r0   r1   r   r   ndimr   newaxisr   mean
torchaudior"  resample
from_numpyr4   sqrtr   r   
ValueErrorr   warningr   r   r   r   debugrd   
hop_lengthrW   r  r   encoder  audio_codesr   r   r&   )ri   r9  r)   rE   ref_wavr   r   r*   ref_duration
chunk_size	clip_sizeref_wav_tensorr(   s                r7   create_voice_clone_prompt#OmniVoice.create_voice_clone_prompta  s   * '4 
 i%% ,>,>?G$LH(ELL11#<<>//1}}!#BJJM2~~a 1$778!dC'''%0099$$X. !// :  %'	 
 G
 345wmg-G )// %""G }}R A% ; 
 }}R(4+=+==$NN> 	 ~~%NO##%1C1C'DEHLL8(C))00;;
b)J67	-6]'![yj[.)))'255d6J6J6Q6QR//66$$Q'

+gg
 	 &x0H-
 	
r6   tokensrmsrG  c                 z   U R                   R                  n[        U[        5      (       a  U Vs/ s He  nU R                   R	                  UR                  U5      R                  S5      5      R                  S   R                  5       R                  5       PMg     nn[        X`R                  5      nObU R                   R	                  UR                  U5      R                  S5      5      R                  S   R                  5       R                  5       nU R                  UUUS9nUR                  S5      $ s  snf )u>  
Args:
    tokens: Audio tokens — either a single tensor of shape
        (num_codebooks, seq_len) or a list of chunk tensors.
    rms: RMS of the reference audio for volume adjustment.
    gen_config: Generation config for post-processing options.
Returns:
    Decoded and post-processed audio array of shape (T,).
r   )r*   rG  )r   r   r   r   decoder  r  audio_valuesr   r   r   r   _post_process_audior   )ri   rs  rt  rG  r   tchunk_audiosaudio_waveforms           r7   rF  "OmniVoice._decode_and_post_process  s#     //66fd##  
  A	 $$++ADD1A,B,L,LQ,OPa!     /|=O=OPN $$++FII6F,G,Q,QRS,TUa!	  11! 2 

 %%a((+s   A,D8generated_audior*   c                 4   UR                   (       a  [        UU R                  SSSS9nUb  US:  a  X-  S-  nO4Uc1  [        R                  " U5      R                  5       nUS:  a  X-  S-  n[        UUR                  UR                  U R                  S9nU$ )a>  Optionally remove long silences, adjust volume, and add edge padding.

Args:
    generated_audio: Numpy array of shape (1, T).
    ref_rms: RMS of the reference audio for volume normalisation.
    gen_config: Generation config controlling post-processing behaviour.
Returns:
    Processed numpy array of shape (1, T).
i  rZ  r[  r>   gư>g      ?)rI   rJ   sample_rate)	rF   r   r   r   absmaxr   rI   rJ   )ri   r}  r*   rG  peaks        r7   rx  OmniVoice._post_process_audio  s     ((,""O 7S=-7#=O_66/*..0Dd{"1"83">,#00$22**	
 r6   taskc                   ^ ^^^ / n[        TR                  5       H  nTR                  U   [        TR                  U   5      -  n[        TR                  T R                  R                  R                  -  U-  5      n[        TR                  U   USS9n[        R                  SU S[        U5       SU 35        UR                  U5        M     TR                   Vs/ s H  oSLPM     n	n[        U	5      (       d  [!        U	5      (       a   S5       e[#        S U 5       5      n
[        TR                  5       Vs/ s H  n/ PM     snmUUU U4S	 jn[        U	5      (       a  [        U
5       H  n[        TR                  5       Vs/ s H  oM[        X4   5      :  d  M  UPM     nnU(       d  MC  U" UU Vs/ s H
  oCU   U   PM     snU Vs/ s H  nTR                  U   PM     snU Vs/ s H  nTR$                  U   PM     snS
9  M     T$ [        TR                  5       Vs/ s H  n[        X4   5      S:  d  M  UPM     nnU" UU Vs/ s H
  oCU   S   PM     snS/[        U5      -  S/[        U5      -  S
9  U Vs0 s H  nUTU   S   _M     nn[        SU
5       H  n[        TR                  5       Vs/ s H  oM[        X4   5      :  d  M  UPM     nnU(       d  MC  U" UU Vs/ s H
  oCU   U   PM     snU Vs/ s H  nUU   PM
     snU Vs/ s H
  oCU   S   PM     snS
9  M     T$ s  snf s  snf s  snf s  snf s  snf s  snf s  snf s  snf s  snf s  snf s  snf s  snf s  snf )u  Generate long audio by splitting text into chunks and batching.

Each item in the returned list corresponds to one input and contains
a list of audio token tensors — one per text chunk.

Args:
    task: A :class:`GenerationTask` with one or more items whose
        estimated audio exceeds ``audio_chunk_threshold``.
    gen_config: Generation config (``audio_chunk_duration`` controls
        chunk size).
Returns:
    Per-item list of chunk token-tensor lists.
r  )r   	chunk_lenmin_chunk_lenzItem z chunked into z	 pieces: NznChunked inference requires all items to either have or not have ref_audio. Mixed ref/non-ref is not supported.c              3   8   #    U  H  n[        U5      v   M     g 7frg   )rt   .0cs     r7   	<genexpr>.OmniVoice._generate_chunked.<locals>.<genexpr>B  s     8ZSVVZs   c                   > TR                   n[        U 5       VVs/ s H>  u  pVTR                  X   X5   X%   b  X%   R                  S5      OS U(       a  XF   OSS9PM@     nnn[	        [        U 5      UUU  Vs/ s H  nTR                  U   PM     snU  Vs/ s H  nTR                  U   PM     snUUU  Vs/ s H  nTR                  U   PM     snTR                   (       a   U  Vs/ s H  nTR                   U   PM     snOS S9	nTR                  UT5      n	[        U 5       H  u  pZTU
   R                  X   5        M     g s  snnf s  snf s  snf s  snf s  snf )Nr   r  rc   rs   )rc   rh   _estimate_target_tokensr  r[   rt   r`   ra   r*   rA  rE  )rq   r^   
ref_audiosrb   
speed_listjrk   r_   sub_task
gen_tokensrL  chunk_resultsrG  ri   r  s              r7   
_run_batch/OmniVoice._generate_chunked.<locals>._run_batchG  sT   J &g. /DA ,,HL.8m.GJM&&r*T+5*-3	 -  /   &w<'.56gtzz!}g66=>g4>>!,g>#!+29:'Qa'::>**g6gtzz!}g6$
H 11(JGJ#G,c"))*-8 -+ 7> ;6s   AE9EE9E)E)r^   r  rb   r   r   )rD  r]   r_   rt   r^   rW   rG   r   rd   re   r   r   rh  rE  r(   allanyr  rb   )ri   r  rG  
all_chunksrk   avg_tokens_per_chartext_chunk_lenchunksry  has_refmax_num_chunksr)  r  cirq   	indices_0rL  first_chunk_mapr  s   ```               @r7   rC  OmniVoice._generate_chunked  sn   " 
t'A"&"2"21"5DJJqM8J"J //&&--889%&N
 ,ZZ](F
 LL5>#f+ixPQf% ( +/*?*?@*?QD=*?@7||3w<< 	
=	
/
 8Z88 &+4??%;<%;%;<	9 	94 w<<
 N+&+DOO&<X&<SEW@W1&<X6=>ga=,g>BIJ'Q 5 5a 8'J:AB'Qt~~a0'B		 ,D + %*$//$:U$:qc*->PST>T$:IU1:;A!}Q'; 6C	N2&3y>1	 FOOYcsM#$6q$99YOO A~.&+DOO&<X&<SEW@W1&<X6=>ga=,g><CDGq 2GD9@AA!}Q/A		 / Y A =D Y
 ?JB
 V < P Y
 ?DAs`   "M MM
&M
>MM4M/MMM#
M(M- M-8M2M7$M<c
                 r   [        U[        5      (       a  U/n
O[        U[        5      (       d   S5       eUn
[        U
5      nU R	                  X+5      nU Vs/ s H  n[        U5      PM     nnU R	                  Xk5      n[        U5       HC  u  nnUc  M  [        X   =(       a    [        R                  " X   5      5      n[        UUS9X'   ME     Ub  Uc  Ub  [        R                  S5        Ucf  Ubc  U R	                  X;SS9nU R	                  XKSS9n/ n[        [        U5      5       H)  nUR                  U R                  UU   UU   US95        M+     U R	                  X[5      nUS   bU  U Vs/ s H  nUR                   PM     nnU Vs/ s H  nUR"                  PM     nnU Vs/ s H  nUR$                  PM     nnOS /U-  nS /U-  nS /U-  nUb7  [        U[&        [(        45      (       a  [)        U5      /U-  nO[        U5      nOS nU	b7  [        U	[&        [(        45      (       a  [)        U	5      /U-  nO[        U	5      nOS n/ n[        U5       Hn  nUS L=(       a    UU   S LnU(       a  SOU(       a  UU   OSnU R+                  X   UU   UU   b  UU   R-                  S	5      OS US
9nUR                  U5        Mp     S nUb  U R.                  R0                  R2                  n/ n[        U5       Hp  nUU   bC  [5        S['        UU   U-  5      5      n UU   nUR                  U S:  a  UU -  OS5        U UU'   ML  U(       a  UU   OS nUR                  Ub  UOS5        Mr     OUb  U Vs/ s H
  nUb  UOSPM     nn[7        UU
UUUUUUUS9	$ s  snf s  snf s  snf s  snf s  snf )Nz,text should be a string or a list of strings)use_zhz`Both voice_clone_prompt and ref_text/ref_audio are provided. ref_text/ref_audio will be ignored.F)auto_repeat)r9  r)   rE   r   r  r   r  r   rs   )r   r3   r   rt   _ensure_list_resolve_languagerh   rX   r$   search_resolve_instructr   rg  rD  rE  rq  r)   r(   r*   rW   r4   r  r  r   rd   re   r  r[   )!ri   r   r8  r)   r9  r:  r;  rE   rc   r<  	text_listr]   language_listlanginstruct_listrk   sr  ref_text_listref_audio_listvoice_clone_prompt_listvcref_audio_tokens_listref_rms_list
user_speed	durationsnum_target_tokens_listhas_dur
item_speedestr  re   target_tokenss!                                    r7   r@  OmniVoice._preprocess_all  s:   * dC  Id  >=>  I^
))(?=JK]T*40]K))(?m,DAqy),F6==+FGF06BM	 - ) I$9NN6 %)*? !--hPU-VM!..yRW.XN!#3}-."))22"0"3!.q!1*; 3  / #'"3"34F"S"1%13JK3JRR[[3JMK.E%.E##.E " % 2II1H2BJJ1HLIL!FZ/M%)FZ$7! 6J.L %#u..#El^j8
!%[
J(S%L11"8_-
:	 N	I!#z"A  t+H	!D0HG 'zjmsJ..a (+7 &a(--b1  / C #))#. #" -1
 --44??JJ:&Q<+$'3y|j/H+I$JM03C%%]Q=NcM&9TWX0=*1-)3
1A%%1=acB ' #?IJz!q}!#5zJJ!.##2 

 
	
} LB L% Jn Ks   N 4N%N*,N/<N4c                     Ub  Ub  [        U5      S:X  a  SnSnU R                  R                  XU5      nUS:  a
  US:w  a  XT-  n[        S[	        U5      5      $ )z'Estimate number of target audio tokens.r   zNice to meet you.   r  r   )rt   r   estimate_durationr  rW   )ri   r   r)   num_ref_audio_tokensrc   r  s         r7   r  !OmniVoice._estimate_target_tokens  sg    '8+;s8}PQ?Q*H#% %%770
 19#+C1c#hr6   xr]   r  c                     [        U[        5      (       a  UOU/n[        U5      SU4;  a  [        S[        U5       35      eU(       a  [        U5      S:X  a  Ub  XB-  nU$ )Nr   z6should be either the number of the text or 1, but got )r   r   rt   rf  )ri   r  r]   r  x_lists        r7   r  OmniVoice._ensure_list!  so     !D))sv;
 
 HVV  3v;!+
0F(Fr6   num_target_tokensr(   r  rD   c                 n   SnU(       a  Ub  US-  nU(       a  UOSn	U(       a  UOSn
USU	 S3-  nUSU
 S3-  nU R                  US	S
9R                  R                  U R                  R                  S5      R                  S5      R                  U R                  5      n[        X1S9nSU S3n[        XR                   5      R                  U R                  R                  S5      R                  S5      R                  U R                  5      n[        R                  " SU R                  R                  U4U R                  R                  [        R                  U R                  S9nX/nUb9  UR                  UR                  S5      R                  U R                  5      5        UR                  U5        [        R                  " USS9nUR                   S   nUU-
  nUb  UUR#                  S5      -  n[        R$                  " SU[        R&                  U R                  S9nSUSUS24'   UUS.$ )a  Prepare input_ids and audio masks for inference.
Args:
    text: Target text to generate.
    num_target_tokens: Number of audio tokens to generate.
    ref_text: Optional reference text for voice cloning.
    ref_audio_tokens: Optional reference audio tokens for voice cloning.
        with shape (C, T).
    lang: Optional language ID.
    instruct: Optional style instruction for voice design.
    denoise: Whether to include the <|denoise|> token.
 Nz<|denoise|>Nonez<|lang_start|>z<|lang_end|>z<|instruct_start|>z<|instruct_end|>ptreturn_tensorsr   r   )r)   r   z<|text_start|>z<|text_end|>r   r   r   r   r   T)r   r   )r   r   repeatrd   r   r  r  r   _combine_text_tokenize_with_nonverbal_tagsr0   fullr   longrE  catr   r  zerosrX   )ri   r   r  r)   r(   r  r;  rD   
style_textlang_strinstruct_strstyle_tokens	full_textwrapped_texttext_tokenstarget_audio_tokenspartscond_input_idscond_total_lengthcond_audio_start_idxcond_audio_masks                        r7   _prepare_inference_inputs#OmniVoice._prepare_inference_inputs0  s   0 
'3-'J4V#+xxj==
*<.8HII
 
4@Yvvdkk<<a@Yq\
"KK
	 	 "8?	'	{,?),8K8KLVDKK22A6Yq\
"KK
	 	 $jj..0ABKK%%**;;	
 +'LL)33A699$++FG()5a0*00303DD' $4$9$9"$== ++ 

4;;
 59/001 ()
 	
r6   c                    UR                   n[        U5       H_  n[        R                  SUUR                  U   UR
                  U   UR                  U   UR                  U   UR                  U   5        Ma     [        U5       Vs/ s Hr  nU R                  UR                  U   UR                  U   UR
                  U   UR                  U   UR                  U   UR                  U   UR                  5      PMt     nnU Vs/ s H  ofS   R                  S5      PM     nn[        U5      nU R                  R                  n	[         R"                  " SU-  U R                  R$                  U4U	[         R&                  U R(                  S9n
[         R*                  " SU-  U4[         R,                  U R(                  S9n[         R*                  " SU-  SX4[         R,                  U R(                  S9n[/        U5       H  u  pFXt   UR                  U   pUS   XSS2SU24'   US   XSU24'   SXSS2SU2SU24'   US   S	U* S24   XU-   SS2SU24'   US   S	U* S24   XU-   SU24'   SXU-   SS2SU2SU24'   X:  d  M  [         R0                  " XU R(                  S
9nSXU-   SS2X4'   M     [         R"                  " X0R                  R$                  [        UR                  5      4U R                  R                  [         R&                  U R(                  S9n[3        SSUR4                  UR6                  S9R9                  5       n/ nUR                   H  nUU R                  R$                  -  nUn/ n[        UR4                  5       Ho  nUUR4                  S-
  :X  a  UO.[;        [<        R>                  " UUUS-      UU   -
  -  5      U5      nURA                  [C        U5      5        U[C        U5      -  nMq     URA                  U5        M     [         R0                  " U R                  R$                  U R(                  S
9RE                  SSS5      n[        UR4                  5       GH  nU " U
UUS9RF                  RI                  [         RJ                  5      n[        U5       GH  nUU   U   nUS::  a  M  Xt   UR                  U   nnUXDS-   2SS2UU-
  U2SS24   nUX4-   X4-   S-   2SS2SU2SS24   nU RM                  UUU5      u  nnUUURN                  -  -
  nURP                  S:  a  [S        UURP                  5      nUXDS-   2SS2SU24   n URU                  U U R                  R                  :g  [W        S5      * 5        [         RX                  " UR[                  5       U5      u  n!n"U R[                  5       n#UR[                  5       U"   U#U"'   U R]                  U#R_                  U 5      5        U UXDS-   2SS2SU24'   U XUS-   2SS2UU-
  U24'   U XU-   X4-   S-   2SS2SU24'   GM     GM     [        U5       Vs/ s H  nUUSS2SUR                  U   24   PM     sn$ s  snf s  snf s  snf )a  N-step iterative unmasked decoding.

Args:
    task: A :class:`GenerationTask` containing batch texts, target
        lengths, languages, instructions, and optional reference data.
    gen_config: A :class:`OmniVoiceGenerationConfig` controlling
        decoding steps, guidance, temperatures, etc.
Returns:
    List of generated audio token tensors of shape (C, T) (one per
    input text).
uQ   Item %d — text: %s | ref_text: %s | instruct: %s | lang: %s | target_tokens: %dr   r   r  r   Nr   T.r  rB   r  )t_startt_endr<   r?   r   )r   r   r
  r   inf)0r]   rD  r   rh  r^   rb   ra   r`   r_   r  r(   rD   r  r  rd   r   r0   r  r   r  r   r  rX   rh   r   _get_time_stepsr<   r?   tolistr  mathceilrE  rW   r  r{   r  r   _predict_tokens_with_scoringr@   rA   _gumbel_samplemasked_fill_r4   topkflattencopy_view_as)$ri   r  rG  r  rk   inputs_listinpc_lens	max_c_lenpad_idbatch_input_idsbatch_audio_maskbatch_attention_maskc_lenu_lenpad_diagrs  	timesteps	schedulest_len
total_maskremschedstepnum	layer_idsbatch_logitsrR   c_logitsu_logitspred_tokensscoressample_tokensr)  topk_idxflat_tokenss$                                       r7   rA  OmniVoice._generate_iterative  s    OOqALLc

1q!q!

1  # * 1X
  **

1  #q!%%a(

1q!""  	 
 7BBksk"''*kBK	****UDKK22I>**;;	
 !;;UIejj
  %{{UAy,EJJt{{ 
  ,FA!9d&6&6q&95 -0,<Oq&5&L)*-l*;Y'9= Avvvv!56 14K0@ufg0NOE1fuf,-.1,.?eVW.MUFUF]+=A Q6E66E6!9:  <<MEI$UAx%AB -  ..D4D4D0EFKK%%**;;	
 $((&&	

 &( 	 	%%E!?!??JCEj112 z22Q66 		*	$(0CiPTo0U"VW  SX&s3x 3 U# &" LLKK**4;;

$q"a. 	 *--.D)+3 fRR&	  1XaL&6%y$*:*:1*=u (E	1eeme6KQ(NO'	(91fufa(GH&*&G&Gh
'#V  9z/N/N#NO22S8+FJ4S4STF &qq5y!VeV'; <##!T[[%>%>>u $jj)91=8+335(3(;(;(=h(GH%##K$7$7$FG 0=qq5y!VeV+,GTAE	1eeme.C CD@MA	 11fuf <=E  /V >C1XFXq!2t//2223XFFy
 C^ Gs   A9Y;Z #Zc                    UR                   S:w  aQ  [        R                  " USS9n[        R                  " USS9n[        R                  " XCR                   XE-
  -  -   SS9nO[        R                  " USS9n[	        S5      * USU R
                  R                  4'   UR                  S:  a-  [        USS9n[        XsR                  5      R                  SS9nOUR                  SS9nUR                  SS9S   n	X4$ )	Nr   r   r   r  .rB   r>   )ratio)r=   Flog_softmaxr0   r4   rd   r   rC   _filter_top_kr  argmaxr  )
ri   r
  r  rG  c_log_probsu_log_probs	log_probsfiltered_probsr  confidence_scoress
             r7   r  &OmniVoice._predict_tokens_with_scoring  s    $$)--b9K--b9K))77;;TUUI
 hB7I5:5\M	#t{{0001''#-*9C@N( < <ffn  $**r*2K%MMbM1!4--r6   )	r   r   r   r   r   r   r   r   r   rg   )r   )NNNN)NNNNNNNN)NT)NNNNNTNN)r  )T)NNNNT)6r,   r-   r.   r/   _supports_flex_attn_supports_flash_attn_2_supports_sdpar}   config_classr   r   r   rY   r   r3   r   r0   inference_moder	   tupler   r   r   r1   r  
LongTensorr0  setr3  r6  r   rW   r&   r4   r9   r   ndarrayrQ  rX   rq  r   rF  rx  r[   rC  r@  r  r   r  r  rA  r  r5   r   r   s   @r7   r   r      s2   !N"L& &Xo5N & &P . .h< <. ?S%Z ? 
? ?@/-PP38<<P	P4 .215/337O
##O
 LLO
 ))*	O

 !.O
 u||,O
 u//0O
bC #c(   1504  04>B;?AE%A CcN#A  T#Y,-A  T#Y,-	A 
 I%,,#$u||S()*	
A  "d#34d:
A  T#Y,-A   tHUO4d:;!A " UD%1478#A $ $$=>%A ( 
bjj	)A  A L #'"&	i
eELL#$5667i
 3-i
  	i

 
i
V&)ellD$667&) 5$;&) .	&)
 
&)P%% ud{#% .	%
 
%Nm"m0Im	d5<< 	!md 1504  04"&;?>B%G
CcN#G
 T#Y,-G
 T#Y,-	G

 I%,,#$u||S()*	
G
 "d#34d:
G
 T#Y,-G
   !G
" UD%1478#G
$ tHUO4d:;%G
& 
'G
R  NRsDI~&47FJ	c& #'37""&O
O
 O
 3-	O

 #5<<0O
 smO
 3-O
 O
bXG"XG0IXG	ell	XGt. .r6   r   c                 "    [        [        U 5      $ rg   )r   _mask_mod_packed)r  s    r7   r  r  :  s    #\22r6   c                     X   X   :H  nU$ rg   r+   )r  bhq_idxkv_idxsame_docs         r7   r(  r(  >  s     "l&::HOr6   r8  c                     SSK JnJn  U b  U R                  5       S:X  a  g X;   a  U $ U R                  5       nX2;   a  X#   $ [        R                  SU  S35        g )Nr   )r   LANG_NAME_TO_IDr  z
Language 'a  ' is not recognized. Please use a valid language ID (e.g., 'en', 'zh', 'ja', 'de') or a full language name (e.g., 'English', 'Chinese', 'Japanese'). See supported_language_ids() or supported_language_names() for details. Falling back to None (language-agnostic mode).)omnivoice.utils.lang_mapr   r0  lowerr   rg  )r8  r   r0  keys       r7   r  r  F  sd    B8>>+v5
..
C
##
NN
XJ 9 	: r6   r;  r  c           
      (   U c  gU R                  5       nU(       d  g[        R                  " SU5      nU Vs/ s H  oD(       d  M  UPM     nn/ n/ nU Hx  nUR                  5       R                  5       nU[        ;   a  UR                  U5        M>  [        R                  " U[        SSS9n	UR                  XxU	(       a  U	S   OS45        Mz     U(       a  / n
U HB  u  pxn	U	(       a  U
R                  SU SU S	U	 S
35        M*  U
R                  SU SU S35        MD     SU S3SR                  U
5      -   S-   SR                  [        [        5      5      -   S-   SR                  [        [        5      5      -   S-   n[        U5      e[        S U 5       5      n[        S U 5       5      nU(       a  U(       a  [        S5      eU(       a  SnO	U(       a  SnU(       a'  U Vs/ s H  n[        R                  " X5      PM     nnO&U Vs/ s H  n[         R                  " X5      PM     nn/ n["         H>  nU Vs/ s H  oU;   d  M
  UPM     nn[%        U5      S:  d  M-  UR                  U5        M@     U(       aR  / nU H*  nUR                  SR                  S U 5       5      5        M,     [        SSR                  U5      -   S-   5      e[        S U 5       5      nU(       a  SOSnUR                  U5      $ s  snf s  snf s  snf s  snf )ut  Validate and normalise a voice-design instruct string.

Supported instruct items (case-insensitive for English):

English (comma + space separated):
    gender: male, female
    age: child, teenager, young adult, middle-aged, elderly
    pitch: very low pitch, low pitch, moderate pitch,
           high pitch, very high pitch
    style: whisper
    accent: american accent, british accent, australian accent, ...

Chinese (full-width comma separated):
    gender: 男, 女
    age: 儿童, 少年, 青年, 中年, 老年
    pitch: 极低音调, 低音调, 中音调, 高音调, 极高音调
    style: 耳语
    dialect: 河南话, 陕西话, 四川话, 贵州话, 云南话,
             桂林话, 济南话, 石家庄话, 甘肃话, 宁夏话,
             青岛话, 东北话

Minor issues (auto-fixed):
  - Wrong separator (half-width comma in Chinese instruct or
    full-width comma in English instruct)
  - Leading / trailing commas

Major issues (raise ``ValueError``):
  - Unsupported or misspelled instruct items
  - Suggestions are offered for close matches

Args:
    instruct: Raw instruct string, or ``None``.
    use_zh: If True, normalise all items to Chinese (used when the
        synthesis text contains Chinese and no accent is specified).

Returns:
    Normalised instruct string, or ``None``.

Raises:
    ValueError: if any instruct item is unsupported or misspelled.
Nu   \s*[,，]\s*r   g333333?)ncutoffr   z  'z' -> 'z' (unsupported; did you mean 'z'?)z' (unsupported)z$Unsupported instruct items found in z:

z

Valid English items: z, z
Valid Chinese items: u   ，u   

Tip: Use only English or only Chinese instructs. English instructs should use comma + space (e.g. 'male, indian accent'),
Chinese instructs should use full-width comma (e.g. '男，河南话').c              3   B   #    U  H  oR                  S 5      v   M     g7f)u   话N)endswithr  r5  s     r7   r  $_resolve_instruct.<locals>.<genexpr>  s     <Ajj''s   c              3   ,   #    U  H
  nS U;   v   M     g7f)z accentNr+   r:  s     r7   r  r;    s     8ZY!^Zs   zCannot mix Chinese dialect and English accent in a single instruct. Dialects are for Chinese speech, accents for English speech.TFz vs c              3   .   #    U  H  nS U S 3v   M     g7f)'Nr+   )r  r  s     r7   r  r;    s     $=u!q1Xus   z5Conflicting instruct items within the same category: z; zU. Each category (gender, age, pitch, style, accent, dialect) allows at most one item.c              3   F   #    U  H  n[        S  U 5       5      v   M     g7f)c              3   L   #    U  H  nS Us=:*  =(       a    S:*  Os  v   M     g7f)u   一u   鿿Nr+   r  s     r7   r  ._resolve_instruct.<locals>.<genexpr>.<genexpr>  s      :1X..h..s   "$N)r  r:  s     r7   r  r;    s     OJq::::Js   !)r   resplitr2  r   rE  difflibget_close_matchesr   sortedr!   r"   rf  r  r   getr#   r    rt   )r;  r  r  	raw_itemsr  unknown
normalisedrawr5  suglineserrhas_dialect
has_accent	conflictsr  hitsr  grouphas_zh	separators                        r7   r  r  Z  s   X >>#L ,7I%+IqII+ GJIIK##a ++A/BaPSTCNNCcCFt<=  "KCCs3%vaS0NseSVWXs3%vaS@A	 # 3<.Dii)* ii1234 (	(
 jj 2345.	. 	 o <<<K8Z88JzK
 	

 	 <FGJq(,,Q2J
G
<FGJq(,,Q2J
G I+%2:ac:2t9q=T" , ELL$=u$==> Cii''
 	
 OJOOFTI>>*%%Y ,f HG
 3s#   
L L & L L
>	LLr{   r  c                     [         R                  " XR                  S   -  5      nU R                  USS9u  p4[        R
                  " U [        S5      5      nUR                  SXC5        U$ )Nr   r   z-inf)r  r  r   r  r0   	full_liker4   scatter_)r{   r  rR   valindprobss         r7   r  r    sW    		%,,r**+A{{1"{%HCOOFE&M2E	NN2s Lr6   temperaturec                     X-  n[         R                  " U5      n[         R                  " [         R                  " US-   5      * S-   5      * nX$-   $ )Ng|=)r0   	rand_likelog)r{   r\  scaled_logitsugumbel_noises        r7   r  r    sG    (M&AIIuyyU33e;<<L''r6   rB   r  
   r   r  r  r<   r?   r   c                 x    [         R                  " XUS-   5      R                  U5      nX5-  SUS-
  U-  -   -  nU$ )Nr   )r0   linspacer  )r  r  r<   r?   r   r   s         r7   r  r    sD     wx!|<??GI#qGaK9+D'DEIr6   z\[(laughter|sigh|confirmation-en|question-en|question-ah|question-oh|question-ei|question-yi|surprise-ah|surprise-oh|surprise-wa|surprise-yo|dissatisfaction-hnn)\]r   c                    / nSn[         R                  U 5       H  nUR                  5       U:  a;  XUR                  5        nU" USS9R                  nU(       a  UR	                  U5        U" UR                  5       SS9R                  nU(       a  UR	                  U5        UR                  5       nM     U[        U 5      :  a-  XS nU" USS9R                  nU(       a  UR	                  U5        U(       d  U" U SS9R                  nU$ / n	U H  n
U	R                  U
5        M     [        R                  " U	/[        R                  S9nU$ )a  Tokenize text containing non-verbal tags, handling each tag independently.

Non-verbal tags are tokenized standalone to guarantee consistent token
IDs regardless of surrounding language context (Chinese, English, etc.).

Args:
    text: Full text string potentially containing non-verbal tags.
    tokenizer: HuggingFace text tokenizer instance.
Returns:
    Token IDs tensor of shape (1, seq_len).
r   F)add_special_tokensNr  r  )r   )_NONVERBAL_PATTERNfinditerstartr   rE  rS  endrt   extendr0   r%  r  )r   	tokenizerr  last_endmsegmentidstag_idsresultcombinedps              r7   r  r     s     EH((.779xaggi0GG>HHCS!AGGI%@JJLL!557 / #d)y/E:DDLL45?? M	 AOOA xj

;Mr6   r)   c                 h   U(       a%  UR                  5       S-   U R                  5       -   nOU R                  5       n[        R                  " SSU5      nUR                  SS5      R                  SS5      n[        R                  " SSU5      nS	nS
U SU S3n[        R                  " USU5      nU$ )N z[\r\n]+r  u   （(u   ）)z[ \t]+z[\u4e00-\u9fff]z(?<=z)\s+|\s+(?=)r   rB  subreplace)r   r)   r  chinese_rangepatterns        r7   r  r  (  s     NN$s*TZZ\9	JJL	 z2y1I !!(C0883GI y#y1I 'Mm_Ka@GwI.Ir6   r   )F)r>   rg   )[__doc__rD  r   r  r   rB  dataclassesr   r   	functoolsr   typingr   r   r   r	   r   r   r0   torch.nnr   torch.nn.functionalr"  r  rb  !torch.nn.attention.flex_attentionr
   r  ImportErrorr   r   r   r   r   r   r   transformers.modeling_outputsr   transformers.models.autor   r   omnivoice.utils.audior   r   r   r   r   omnivoice.utils.durationr   r1  r   r   omnivoice.utils.textr   r   omnivoice.utils.voice_designr   r   r    r!   r"   r#   r$   	getLoggerr,   r   r&   r9   r[   rx   r}   r3   r   r   r  r(  r  rX   r  r1   r4   r  r  r   rW   r  compilerh  r  r  registerr+   r6   r7   <module>r     s  $
    	 	 )  - -      &C $  6 ?  ; 9 H   
		8	$      , 
 
 
B *; * *=& =8+c +c +i. i.b#3 %T	2B * -2A&smA&%)A&
39A&H%,, u u|| (5<< (e ( (  <<.			 	 		
 LL	 \\	 ZZ* % %5<< %P(3- 3 :   K 1 	  ?I .k0  & %&s   H H&%H&