U
    8jJ                     @   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 eeeeeedB f  dddZd	d
 Zedkree  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 ]v}| }| r| dr4qd|krV|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   \/home/ubuntu/service/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 krt	d|  q|t
|d kr6t	d| d| d q|d | }|d  sht	d| d| d q|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' || |	|rh|nd  |
d  || qt	d(t
| d)|j  |sd 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+)Znargsr"   defaultz	--out_dir)r"   r#   z--concurrency   )r"   r&   z--voice_genderZmaleZfemalezfForce all turns to a single-gender voice (picked per emotion's base from MALE_BY_BASE/FEMALE_BY_BASE).)Z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 textZlong_Zsolo_emotionZneutralZ_t_z.mp3Zvadz[plan] z turns to synthesize -> Z
elevenlabs)Zbackendconcurrencyemotionsvadsvoice_seedsvoice_pools	voice_idsz[done])argparseZArgumentParserZadd_argumentr   r   r   Z
parse_argsr!   r.   printlenr   ZsourcesZout_dirmkdirsortedgetr   r   r   r   Zvoice_genderr   r   parentexistsunlinkr   r	   r2   )ZapargswantedZ	scenariosZby_sidZtextsr3   r4   Z	out_pathsr5   r6   r7   r   r   r   scenZturnZis_monologueZscenario_voice_idbaseZout_pathZfnamer   r   r    main-   s    




 



 
rE   __main__)__doc__r8   ZasyncioZjsonpathlibr   scripts.compiler.generate_audior   r   scripts.compiler.ttsr   r   r   r   r	   listtuplestrr   r!   rE   __name__runr   r   r   r    <module>   s   		"L