o
    jJ                  	   @   s   d Z ddlZddlZddlZddlmZ ddlmZmZ ddl	m
Z
mZmZmZmZ dedeeeeedB f  fdd	Zd
d ZedkrLee  dS dS )a*  Regenerate specific (scenario_id, turn_index) pairs only.

Usage:
    python -m scripts.regenerate_turns         --turns scripts/_pron_turns.txt         --out_dir /dataset/AnimaSync-mic-fix/data/audio_preview_pron_fixed

Each line in --turns is "<scenario_id>:<turn_index>", e.g. "daily_157_p1:2".
    N)Path)DEFAULT_SOURCESload_scenarios)dominant_base_for_turnsEMOTION_TO_BASEFEMALE_BY_BASEMALE_BY_BASE	synth_allpathreturnc                 C   s   g }|    D ];}| }| r| drqd|v r+|dd\}}| }n| d}}|d\}}||t||f q|S )zEach line is `<scenario_id>:<turn_index>` (output goes to --out_dir
    with default filename) OR `<scenario_id>:<turn_index>	<abs_dest_path>`
    to pin a specific destination (e.g. straight into a setNN/prefixed file).
    #	   N:)		read_text
splitlinesrstripstriplstrip
startswithsplitappendint)r
   outlinespecdestsidti r   P/dataset/kemix-engine/package/face/animasync-face-v3/scripts/regenerate_turns.pyparse_turn_spec   s   
r!   c                     s  t  } | jdtddd | jddttd | jdtdd	 | jd
tdd | jdddgd dd |  }t|j}t	dt
| d t|j}dd |D }g g g g f\}}}}g g g }	}
}|jjddd t|D ]\}}}||}|d u rt	d|  qo|t
|d krt	d| d| d qo|d | }|d  st	d| d| d qo|d p|d!}d }|rtt|d  }|jrt|d" pd#d#}|jdkrtnt| }|rt|}|jjddd n| d$| d%|d"  d&}|j| }| r	|  ||d  ||d"  ||d' || |	|r+|nd  |
d  || qot	d(t
| d)|j  |sKd S t||d*|j|||	|
|d+	I d H  t	d, d S )-Nz--turnsTz-File with <scenario_id>:<turn_index> per line)typerequiredhelpz	--sources+)nargsr"   defaultz	--out_dir)r"   r#   z--concurrency   )r"   r'   z--voice_gendermalefemalezfForce all turns to a single-gender voice (picked per emotion's base from MALE_BY_BASE/FEMALE_BY_BASE).)choicesr'   r$   z[want] z specific turnsc                 S   s   i | ]}|d  |qS )scenario_idr   ).0sr   r   r    
<dictcomp>=   s    zmain.<locals>.<dictcomp>)parentsexist_okz[miss] scenario not found: turnsz[miss] z: turn z out of rangetextz[skip] r   z has empty textlong_solo_emotionneutral_t_z.mp3vadz[plan] z turns to synthesize -> 
elevenlabs)backendconcurrencyemotionsvadsvoice_seedsvoice_pools	voice_idsz[done])argparseArgumentParseradd_argumentr   r   r   
parse_argsr!   r2   printlenr   sourcesout_dirmkdirsortedgetr   r   r   r   voice_genderr   r   parentexistsunlinkr   r	   r=   )apargswanted	scenariosby_sidtextsr>   r?   	out_pathsr@   rA   rB   r   r   r   scenturnis_monologuescenario_voice_idbaseout_pathfnamer   r   r    main-   s   








r`   __main__)__doc__rC   asynciojsonpathlibr   scripts.compiler.generate_audior   r   scripts.compiler.ttsr   r   r   r   r	   listtuplestrr   r!   r`   __name__runr   r   r   r    <module>   s    	$	L