o
    S6iS                     @   s   d Z ddlZddlmZmZ dedeeeef fddZd	edee	 fd
dZ
	ddee	 dedee fddZdedefddZdS )z!Text to viseme conversion module.    N   )KOREAN_PHONEME_MAP
VISEME_SETcharreturnc                 C   sn   | rd|   krdksdS  dS t | d }|d }|d d }|d }d}d}d	}|| || ||  fS )
zu
    Decompose a Korean character into its components.

    Returns: (initial consonant, vowel, final consonant)
       가   힣) r	   r	   i   iL     u9   ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎu?   ㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣuR    ㄱㄲㄳㄴㄵㄶㄷㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅄㅅㅆㅇㅈㅊㅋㅌㅍㅎ)ordstrip)r   codeZinitial_idxZ	vowel_idxZ	final_idxinitialsZvowelsZfinals r   Q/var/www/tkim.planitai.co.jp/blog/20251208-make-apng-tool/./src/text_to_viseme.pydecompose_korean_char   s   
r   textc           	      C   s  g }| D ]}d|  krdkrQn n?t |\}}}|r.|dkr.t|d}||d|d |r?t|d}||d|d |rPt|d}||d|d q| r| }i d	dd
ddddddddddddddddddddddddddddd d!d d d d"d#}||d}||d$|d q|d%v r|dd$d&d q|d'v r|dd(|d q|S ))z
    Convert Korean text to a sequence of visemes with timing hints.

    Returns: List of dicts with 'viseme', 'duration', 'char' keys
    r   r   u   ㅇrestg?)visemedurationr   Ag333333?aeEiIoOuUbMmpfFvlLrdtnsCzW)cjwg?z 	
 z.,!?g333333?)r   r   getappendisalphalower)	r   resultr   initialZvowelfinalr   Z
char_lowerZ
viseme_mapr   r   r   korean_text_to_visemes!   s   

r<      viseme_sequencefpsc                 C   s<   g }| D ]}t dt|d | }||d g|  q|S )z
    Convert viseme sequence with durations to frame-by-frame viseme list.

    Args:
        viseme_sequence: Output from korean_text_to_visemes
        fps: Frames per second

    Returns:
        List of viseme codes, one per frame
    r   r   r   )maxintextend)r>   r?   framesitemZ
num_framesr   r   r   viseme_sequence_to_framesj   s
   rE   r   c                 C   s   t | dS )z&Get the description for a viseme code.zUnknown viseme)r   r5   )r   r   r   r   get_viseme_info   s   rF   )r=   )__doc__reconfigr   r   strtupler   listdictr<   rA   rE   rF   r   r   r   r   <module>   s    K
