# APNG Lip Sync Tool 개발기 - v10: 텍스트 → 발음기호 변환 ## 개요 입력된 텍스트를 viseme 시퀀스로 변환합니다. 한글 음절을 분해하여 각 음소에 해당하는 입모양을 매핑합니다. ## 한글 음절 분해 ```python def decompose_korean_char(char: str) -> tuple[str, str, str]: """Decompose a Korean character into its components.""" if not '\uac00' <= char <= '\ud7a3': return ('', '', '') code = ord(char) - 0xAC00 initial_idx = code // (21 * 28) # 초성 vowel_idx = (code % (21 * 28)) // 28 # 중성 final_idx = code % 28 # 종성 initials = "ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ" vowels = "ㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣ" finals = " ㄱㄲㄳㄴㄵㄶㄷㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅄㅅㅆㅇㅈㅊㅋㅌㅍㅎ" return (initials[initial_idx], vowels[vowel_idx], finals[final_idx].strip()) ``` ## Viseme 시퀀스 생성 ```python def korean_text_to_visemes(text: str) -> list[dict]: """Convert Korean text to viseme sequence with timing.""" result = [] for char in text: if '\uac00' <= char <= '\ud7a3': initial, vowel, final = decompose_korean_char(char) # 초성 (짧게) if initial and initial != 'ㅇ': result.append({'viseme': KOREAN_PHONEME_MAP[initial], 'duration': 0.05}) # 중성 (길게) result.append({'viseme': KOREAN_PHONEME_MAP[vowel], 'duration': 0.15}) # 종성 (짧게) if final: result.append({'viseme': KOREAN_PHONEME_MAP[final], 'duration': 0.05}) return result ``` ## 예시 "안녕" → `[M(ㅇ), A(ㅏ), L(ㄴ), L(ㄴ), A(ㅕ), rest(ㅇ)]` --- *다음: v11 - 립싱크 타이밍 동기화*