- Etri의 발음 평가 모델과 올바르미 발음 분석 알고리즘을 각각 0.7, 0.3의 가중치를 두어 합산한 후 최종 accuracy를 계산
- Etri 발음 평가 모델의 경우 오디오 자체가 가지는 특성을 통해 발음을 분석하고, 올바르미 발음 분석 알고리즘의 경우 오디오로부터 텍스트를 추출하여 발음을 분석
- 즉, 최종 accuray = (오디오 기반의 발음 분석 결과 * 0.7) + (텍스트 기반의 발음 분석 결과 * 0.3)
- 최종 accuray는 0~5 사이의 float 값을 가지도록 scaling
- 평가 전문가가 학습 데이터에 대해 발음 점수 채점
- 음성 신호 입력받아 전문가 점수 출력하도록 모델 학습
- 음성 신호를 40여개의 특징으로 분석하여 예측 모델의 성능 높임
- 주요 특징으로 음소, pause(멈춤), chunk(한 번에 말하는 묶음) 등의 길이, 속도 등에 대한 분석 정보, native, non-native 음향 모델 점수, 강세/억양 등의 운율 특징이 있음
- 녹음된 사용자의 음성을 google STT 기술을 통해 text로 변환
- target 문장(이하 script)의 글자 수를 letter_total에 저장
- script와 1.의 문장(이하 voice)를 어절 단위로 분해한 후 어절 단위로 1:1 비교
- 어절이 일치하면: letter_correct에 어절의 글자 수를 더함
- 어절이 일치하지 않으면: 두 가지 경우로 나눠 정확도를 계산하고, 그 중 더 높은 값을 적용
- 가령 voice가 "안냐세요"라면 CASE 1, "구지" 라면 CASE 2에 해당됨
- CASE 1: 어절을 각각의 글자로 분해하여 한 글자씩 비교
- 분해된 voice와 voice를 일치하는 것과 일치하지 않는 것을 찾아 거리가 3 이내인 것과 비교하여 매핑(대응 쌍 만들기)
- {0: {'안': ['안']}, 1: {'냐': ['녕']}, 2: {'세': ['세']}, 3: {'요': ['요']}}
- 일치하는 글자는 그대로 letter_correct에 반영
- ex) 위에서 0, 2, 3의 경우
- 일치하지 않는 글자는 발음이 틀린 것
- ex) 위에서 1의 경우
- 분해된 voice와 voice를 일치하는 것과 일치하지 않는 것을 찾아 거리가 3 이내인 것과 비교하여 매핑(대응 쌍 만들기)
- CASE 2: 어절 자체를 비교
- 초성, 중성, 종성으로 나누어 판단하는데 초성이 같은 지점부터 구개음화, ㅔ와 ㅐ 발음, 연음을 고려하여 발음 판단
- 구개음화
- 정의: ㄷ이나 ㅌ이 모음 ㅣ를 만나 ㅈ, ㅊ으로 바뀌는 것
- script에서 첫 글자의 종성이 ㅌ이고 그 다음 글자의 초성이 ㅇ, 중성이 ㅣ인 경우에 voice의 초성이 ㅊ인 경우 correct
- script에서 첫 글자의 종성이 ㄷ이고 그 다음 글자의 초성이 ㅇ, 중성이 ㅣ인 경우에 voice의 초성이 ㅈ인 경우 correct
- ex) '굳이' -> '구지'
- 모음 ㅔ와 ㅐ 발음
- 중성이 ㅔ 또는 ㅐ이면 둘 중 무엇으로 발음되든 correct
- ex) '애호박' -> '에호박'
- 연음
- 정의: 받침 뒤에 모음으로 시작하는 음절이 올 경우 받침이 다음 음절로 옮겨 발음되는 것
- script의 두 번째 글자의 초성이 ㅇ이라면 voice의 초성이 script 첫 글자의 종성과 일치하는 경우 correct
- ex) '무릎이' -> '무르피' ('무'는 맞았으므로 ㄹ 이후부터 비교의 대상)
- 1.과 2.의 결과를 통해 accuracy 반환
pip install scipy
pip install librosa
pip install hangul-utils
pip install jamo
python -m pip install speechrecognition