중국어 성조를 교정하기 위해 9M 파라미터로 훈련된 모델을 만들었어요
(simedw.com)- 중국어 발음과 성조 연습을 돕기 위해 약 300시간의 음성 데이터로 훈련된 9M 파라미터 CTC 기반 음성 모델을 직접 만들어 봄
- Conformer 인코더 구조를 사용해 지역적 음성 특징과 전역적 문맥을 모두 포착하며, Pinyin+성조 단위 토큰화로 발음 오류를 명확히 구분
- CTC 손실을 통해 사용자가 실제로 발음한 내용을 프레임 단위로 평가하고, Viterbi 알고리듬으로 시간 정렬을 수행
- 모델 크기를 75M→9M으로 줄여도 정확도 손실이 거의 없었으며, INT8 양자화 후 약 11MB로 웹 브라우저에서도 즉시 실행 가능
- 브라우저 기반 데모는 온디바이스 발음 교정 시스템의 가능성을 보여주며, 데이터 품질 개선이 향후 성능 향상의 핵심임
발음 평가 모델 개요
- 중국어 발음 학습의 어려움을 해결하기 위해 발음을 채점하는 소형 음성 모델을 직접 훈련
- 약 300시간의 전사된 음성 데이터(AISHELL-1, Primewords)를 사용
- 브라우저에서 직접 실행 가능한 형태로 제공
- 기존의 피치 시각화 방식은 잡음, 발화 차이 등으로 불안정했으며, 데이터 기반 접근이 더 효과적임을 확인
- 목표는 상용 API 없이 온디바이스 Computer-Assisted Pronunciation Training (CAPT) 시스템 구현
모델 구조와 학습 방식
-
Conformer 인코더 + CTC 손실 구조를 채택
- CNN이 짧은 시간대의 음향 특징(예: zh vs z)을 포착
- Transformer가 문맥적 성조 패턴(예: tone sandhi)을 처리
-
CTC 방식은 프레임별 확률 분포를 출력해 실제 발음된 음소를 직접 평가
- `` 토큰을 활용해 반복과 공백을 정렬
- 자동 보정 없이 실제 발음된 내용을 그대로 반영
토큰화 및 정렬
-
Pinyin+성조 조합을 하나의 토큰으로 정의
- 예:
zhong1과zhong4는 서로 다른 토큰 - 중성조는 tone 5(
ma5)로 통일 - 총 1,254개 토큰 +
,구성
- 예:
-
Viterbi 알고리듬으로 음성 프레임과 토큰 간 최적 경로를 계산
- 예: “Nǐ hǎo” 발음 시
ni3와hao3구간을 구분
- 예: “Nǐ hǎo” 발음 시
모델 경량화 및 성능
- 초기 75M 파라미터 모델에서 9M까지 축소
- 75M: TER 4.83%, Tone Accuracy 98.47%
- 9M: TER 5.27%, Tone Accuracy 98.29%
- 정확도 손실이 미미해 데이터 의존적(data-bound) 과제임을 시사
- FP32 모델(37MB)을 INT8 양자화로 11MB까지 축소
-
onnxruntime-web을 통해 브라우저에서 즉시 로드 가능
-
정렬 오류와 수정
-
무음 구간이 발음 평가를 왜곡하는 문제 발생
- 예: “我喜欢…” 발음 전 1초 정적이
wo3로 잘못 정렬되어 0점 처리
- 예: “我喜欢…” 발음 전 1초 정적이
- 해결책: 무음 프레임을 점수 계산에서 제외
- `` 확률이 0.7 이상인 프레임을 필터링
- 수정 후 첫 음절 신뢰도 점수가 0.0 → 0.99로 개선
결과 및 한계
- 베타 테스트 중 발음 교정 효과를 체감
- 모델은 매우 엄격하게 채점
-
원어민과 아동 음성은 정확도 저하
- AISHELL 데이터가 주로 낭독체 음성이라 속도·억양 차이 존재
- 향후 Common Voice 등 대화체 데이터 추가가 필요
- 웹 데모는 약 13MB로, 대부분의 웹사이트보다 가벼운 크기에서 완전한 발음 교정 기능 제공
Hacker News 의견들
-
정말 멋진 프로젝트임에 감사함
다만 “我想学中文” 문장에서 “wén”을 “guó”로 인식한 점이 이상했음
이는 모델이 성조보다는 단어 구조를 학습한 결과로 보임. “Zhōng guó”가 학습 데이터에 많이 등장해 그런 편향이 생긴 듯함
블로그 글에서 말한 것처럼 “내가 실제로 한 발음을 알려주는 모델”이 아니라, 가능한 1254개의 음절 중 가장 가까운 것을 매핑하는 구조로 보임- “guó”를 여러 번 반복해봤지만 반복 인식이 안 됐음
그래도 이런 음성 중심 학습 접근법은 마음에 듦. 문자 기반 학습은 국가마다 표기법이 달라 혼란스러움. 초보자에게는 pinyin조차 헷갈리는 기호가 많음
- “guó”를 여러 번 반복해봤지만 반복 인식이 안 됐음
-
아이디어와 UI가 직관적이라 인상 깊었음
하지만 베이징 출신으로 표준 중국어를 완벽히 구사하는 나조차 쉬운 문항을 통과하기 어려웠음
예시 “你好吃饭了吗”에서 성조 인식이 틀렸고, “了”는 문맥상 “liǎo”가 아니라 “le”여야 함
성조에 대해 걱정하는 의견이 많지만, 실제로는 성조가 완벽하지 않아도 의사소통에 큰 문제 없음
지역마다 억양이 달라 성조가 섞여도 다들 잘 이해함. 성조에 너무 집착하지 말고 맥락 중심 학습을 추천함- 모국어 화자로서 반박하자면, 성조는 매우 중요함
지역 방언이 달라도 사람들이 의사소통 가능한 이유는 1) 인접 지역 간 성조 차이가 크지 않고, 2) 서로 통하지 않을 땐 표준어(보통화) 로 전환하기 때문임
중국어가 존재하는 이유 자체가 성조 체계 덕분임. 성조가 틀리면 의사소통이 거의 불가능함 - 대만에서 C1 수준으로 배운 입장에서 보면, 성조는 초반엔 중요하지만 표현력이 늘수록 맥락이 보완해줌
다만 중국이 문자 중심으로 의사소통하는 이유 중 하나가, 지역마다 발음과 성조가 달라 음성만으로는 통하지 않기 때문이기도 함 - 원어민끼리는 성조 패턴이 다르더라도 문법과 억양이 예측 가능해 이해가 가능하지만, 학습자는 그렇지 않음
성조를 무시하도록 동기부여하는 건 위험함. 성조가 정말 중요하지 않았다면 이미 사라졌을 것임 - “了” 문제는 JavaScript 버그였고 수정 완료됨. 나머지는 더 다양한 데이터셋으로 개선 가능함
- 성조가 중요하지 않다고 해도, “熊猫(xióngmāo)”와 “胸毛(xiōngmáo)”처럼 성조 차이로 전혀 다른 의미가 되는 경우가 많음
맥락이 좁을 땐 혼란이 생기므로, 성조는 여전히 핵심임. 또한 “吃”를 “shi2”로 인식하는 등 데이터 보강이 필요함
- 모국어 화자로서 반박하자면, 성조는 매우 중요함
-
중급 학습자로서 피드백을 남기기 위해 계정을 새로 만들었음
빠르게 말하면 음소 추적이 잘 안 되고 성조 인식이 어긋남
예를 들어 “他是我的朋友”를 자연 속도로 말하면 “我”를 “de”로 인식하거나 “是”를 “si”로 처리함
천천히 또박또박 말하면 정확히 인식함
연속된 제3성 변화(성조 변환) 같은 현상도 고려해야 함. 자연스러운 회화 속 발음을 다루는 기능이 필요함- 성조 변환은 중국어 발음의 핵심임. 현재는 초급자용 수준이라 개선이 필요함
- 피드백 덕분에 sandhi(성조 변환) 지원을 추가했음. 잘 작동하는지 알려달라고 함
- 나도 성조 변환 처리가 안 되는 것 같았음. 그래도 아이디어는 정말 멋짐
- 나도 같은 문제를 겪었음. 혹시 “다팡즈(dapangzi)”라서 그런 걸까 농담함
-
유럽 언어권 화자가 중국어나 다른 성조 언어를 배우는 건 매우 어렵음
귀가 성조에 익숙하지 않아 자신은 맞게 말한다고 생각하지만 원어민은 못 알아들음- 중국어 원어민으로서, 영어의 모음 체계가 훨씬 어렵다고 느낌
영어는 지역마다 모음이 달라지고, “done vs down”, “beat vs bit” 같은 차이를 구분하기 힘듦
반면 스페인어는 모음이 단순해 훨씬 배우기 쉬웠음 - 그래서 중국인들이 영어·독일어 발음에서 실수하는 이유를 이해함. 주의 초점이 다르기 때문임
- 성조나 음높이에 익숙하지 않은 사람에게는 미칠 정도로 어렵지만, 이런 도구들이 그 과정을 덜 고통스럽게 만들어줌
일본어 피치 악센트를 배울 때도 처음엔 아무 차이도 못 느꼈지만, 반복 훈련으로 점점 들리기 시작했음
“uh-oh”처럼 영어에도 피치 패턴이 있다는 걸 깨닫고 나서 감이 잡혔음 - 가끔 간단한 문장을 말해도 사람들이 못 알아듣는 경우가 많음.
특히 영어식 억양으로 불확실성을 표현하려는 습관이 문제임 - 하지만 성조는 그렇게 어렵지 않음. 진짜 어려운 건 어휘량임
성조와 문법은 초반에 익히는 기본이고, 이후 수년간은 단어 암기에 대부분의 노력이 들어감
중국어의 진짜 난점은 공유 어휘의 부족과 비음소적 문자 체계임
- 중국어 원어민으로서, 영어의 모음 체계가 훨씬 어렵다고 느낌
-
단어 단위로 말할 때만 잘 작동하고, 문장 단위나 자연 속도에서는 오인식이 많음
나는 표준어 2A 자격증을 가진 원어민인데도 캐주얼하게 말하면 오류가 남
일상 회화와 공식 발음의 차이를 모델이 구분하지 못함 -
대만에서 공부할 때 성조를 기억하려고 손으로 성조 곡선을 그리며 연습했음
미친 외국인처럼 보였지만 효과는 확실했음
지역 억양 차이도 크니, 기준 데이터를 원어민별로 수집하면 좋겠음- 내 수업에서도 어떤 학생이 성조를 과장되게 말했는데, 나중엔 가장 정확한 발음을 구사하게 됨
그때 따라 하지 않은 걸 후회함 - Mike Laoshi의 유튜브 강의를 추천함
- 나도 친구 몇 명으로만 테스트했는데, 지역을 파라미터로 설정할지 고민 중임. 모든 방언을 학습시키면 너무 관대해질 수 있음
- 이건 마치 솔페지오 훈련처럼 손동작으로 음높이를 표현하는 방식과 비슷함
- 손동작은 특히 새로운 단어를 외울 때 도움이 됨. 손가락으로 성조를 표시하면 기억이 잘 남음
- 내 수업에서도 어떤 학생이 성조를 과장되게 말했는데, 나중엔 가장 정확한 발음을 구사하게 됨
-
원어민인데 데모가 내 발음을 인식하지 못했음
아마 배경 소음 때문인 듯함. 옆에서 딸이 만화 보고 있었음- 현재는 배경 소음에 민감하지만, 데이터 증강으로 개선된 버전을 훈련 중이라고 함
-
정말 멋진 프로젝트지만, 외부 피드백에 과도하게 의존하지 말라고 조언하고 싶음
발음 교정의 핵심은 귀 훈련임. 성인 학습자도 신경가소성이 남아 있으므로, 최소쌍 듣기 훈련 등으로 귀를 단련해야 함
이렇게 하면 발음뿐 아니라 청취력과 어휘 습득 속도도 크게 향상됨- 나는 Phrasing.app을 개발 중인데, 이 조언에 전적으로 동의함
SST보다 텍스트-오디오 동기화(가라오케 스타일) 가 훨씬 효과적이었음
사용자가 자신의 음성을 원본과 겹쳐 들으며 차이를 스스로 인식하는 방식이 학습에 매우 유용했음 - 나도 같은 생각임. 듣기가 곧 말하기의 핵심임
단어별 성조를 외우기보다, 원어민 발음을 그대로 모방하는 게 훨씬 자연스러움
- 나는 Phrasing.app을 개발 중인데, 이 조언에 전적으로 동의함
-
ONNX Runtime Web으로 브라우저 내에서 전부 실행되는 점이 인상적임
강제 정렬 방식으로 의미 추측을 배제하고 성조 문제만 분리한 접근이 영리함
향후 버전에서는 성조 변환(sandhi) 을 후처리 단계로 추가하면 회화 속도 연습에 더 유용할 것임 -
pinyin 모드가 있었으면 좋겠음. 나는 말하기만 배우고 문자 읽기는 배우지 않음
내가 만든 플래시카드 웹앱으로 어휘를 정리 중임- 좋은 제안이라 pinyin 토글 기능을 추가했다고 함
- 나도 같은 생각임. 다만 자음 인식이 잘 안 돼서 답답했음. 내가 그렇게 나쁜 발음은 아닐 텐데
- pinyin 모드에 한 표 추가함