원래 Medium에 게시되었습니다. 개발자 커뮤니티를 위해 여기에 크로스 포스팅됩니다.
개발자의 관점에서 본 문제점
언어 학습자가 제시할 만한 사양(spec)은 다음과 같습니다:
“아무 비디오나 가져와 주세요. 문장 단위로 반복 재생하고, 제가 어떤 발음을 틀렸는지 알려주세요.”
듣기엔 주말 프로젝트처럼 보입니다. 자막을 가져오고, 루프 버튼을 추가한 다음, 음성 API를 호출하면 끝일 것 같습니다. 하지만 실제로는 이 세 단계 각각에서 일본어 때문에 문제가 발생합니다. 단어 사이에 공백이 없고, 문장이 15초 동안 지속되며, 자막은 오디오가 아닌 읽기 시간에 맞춰져 있고, 같은 단어에 대해 두 가지 문자 체계(쓰기 시스템)를 사용해야 하기 때문입니다.
저희는 비디오를 일본어, 영어, 중국어, 한국어 학습 자료로 변환하는 웹 및 모바일 앱인 Corodomo의 개발팀입니다. 이 글에서는 **세그멘테이션(segmentation), 타임스탬프 동기화(timestamp sync), 발음 채점(pronunciation scoring), 받아쓰기 확인(dictation checking)**을 위해 저희가 취한 접근 방식을 설명합니다. 저희 내부 구조 전체를 다루는 것은 아니지만, 음성 처리, 자막 또는 학습자 피드백과 관련된 모든 사람들에게 유용할 만한 결정 사항과 교훈들을 공유하고자 합니다.
요약 (TL;DR)
| 문제점 | 단순 접근 방식 | 더 효과적이었던 방법 |
|---|
| 비디오를 연습 단위로 분할하기 | 자막 블록 사용 | 언어 경계(텍스트)와 일시 정지(오디오)를 결합하고, 최대 길이 제한 설정 |
| ... | | |
- 공백 없음(No whitespace)의 경우에도 어쨌든 단어 분할기(word segmenter)가 필요하다 (클릭 가능한 사전에서도 재사용한다).
- 긴 연결 구문(〜て, 〜けど, 〜から)의 경우 문장이 너무 길 때 절 경계에서 분할을 허용한다.
- 발화(Speech)는 구두점(punctuation)과 같지 않다. 사람들은 구절 중간에 멈추고 숨을 쉬면서 뒤에 ね/よ를 추가한다.
텍스트만 이용한 분할은 화자가 어디서 숨을 쉬는지 무시한다. 일시 정지(Pause)만을 이용한 분할은 모든 망설임을 잘라낸다. 두 신호를 모두 사용했을 때 테스트에서 눈에 띄게 더 자연스러운 루프를 생성했다.
2. 타임스탬프 동기화(Timestamp sync): 루프는 발화에서 시작하고 끝나야 함
300ms만 어긋나도 학습자는 첫 모라(mora)를 놓치거나 다음 줄의 시작을 듣게 된다. 도움이 된 방법:
- 캡션 블록이 아닌 **단어 수준의 타임스탬프(word-level timestamps)**로 작업한다.
- 경계를 가장 가까운 일시 정지 지점 쪽으로 조정한다(Nudge).
- 첫 자음이 잘리지 않도록 **작은 패딩(padding)**을 추가한다.
- 학습자가 직접 잘못된 줄을 수정할 수 있도록 **자막 편집 기능(subtitle editing)**을 구현한다.
4번 항목이 노력 대비 최고의 효과를 가져왔다. 사용자는 두 번의 탭으로 수정할 수 있는 잘못된 경계는 용서해준다.
3. 발음 채점(Pronunciation scoring): 숫자는 피드백이 아니다
"72/100"은 학습자에게 아무것도 알려주지 않는다. 일본어의 자연스러운 단위는 음절/모라(syllable/mora)이므로, 각 시도는 개별 음절 점수와 전체 점수를 보여줘야 한다.
고수준 파이프라인:
record attempt ──► align to reference text ──► assess each unit ──► aggregate
(per syllable) (sounds + pitch) (sentence score)
교훈:
- 학습자가 말한 내용을 기록한 전사본(transcript)이 아닌, 목표 발화(target)를 기준으로 점수를 매겨야 한다. 그렇지 않으면 인식기(recogniser)의 추측을 채점하는 셈이다.
- 점수 옆에 참고 자료(reference, 선택적 후리가나 포함)를 보여준다.
- 반복을 위해 설계한다: 격려 메시지와 다음 목표를 제시하여 사람들이 계속 연습하도록 유도한다.
- 음높이 악센트(pitch accent)도 점수화해야 한다. 각 음절의 점수는 그 음높이(높음/낮음)가 참고 자료와 일치하는지 여부를 포함하므로, 모든 소리가 정확해도 악센트가 틀린 はし는 플래그 처리된다.
- 한계를 명시한다. 점수는 판결이 아니라 가이드라인이므로, 학습자가 다시 들어야 할 부분을 알려준다.
4. 받아쓰기(Dictation): 원본 문자열을 비교하지 마세요 (don't diff raw strings)
'すこし'와 '少し'는 듣기 오류가 아닙니다. 하지만 'しょう'와 'しよう'는 그렇습니다. 따라서 실제 들린 것을 반영하는 작은 가나(small kana)와 장모음(long vowels) 같은 구별점은 유지하면서, 두 문자열 모두 (스크립트, 구두점)을 비교하기 전에 정규화합니다. 가나 또는 한자로 된 답변 모두 허용됩니다. 그런 다음 차이점을 나란히 강조 표시합니다.
- 사용자의 **작업 단위(unit of work)**를 모델링하고, 모든 파이프라인 단계를 이를 중심으로 구축하세요.
- 경계 구분을 위해 신호들을 융합(fuse signals) 하세요 (텍스트 + 오디오).
- 피드백을 세분화되고 실행 가능하게(granular and actionable) 만드세요.
- ML이 생성하는 모든 것에 대해 사용자에게 편집 버튼을 제공하세요.
- **모델이 판단할 수 없는 것(what the model can't judge)**에 대해 명확하게 밝히세요.
사용해보기 / 피드백 받기 (Try it / roast it)
Corodomo는 웹, iPhone, iPad, Mac 및 Android에서 실행됩니다. 가입하지 않고도 학습을 시작할 수 있습니다. 자체 비디오 가져오기, 발음 확인 및 AI 말하기 연습은 무료 계정이 필요하며, 무료 플랜에는 월 1시간의 AI 사용 시간이 포함되어 있습니다.
저희는 베트남 다낭에 있는 두 명의 핵심 팀원(그리고 몇몇 파트타임 협력자)으로 구성되어 있습니다. 강제 정렬(forced alignment), 일본어 토큰화(Japanese tokenisation) 또는 발음 평가를 사용하여 무언가를 구축한 경험이 있다면, 엣지 케이스(edge cases)를 어떻게 처리했는지 듣고 싶습니다. 댓글은 언제나 환영합니다.
— Viet, Corodomo 설립자