주간 다이어리 - 13주차
활동 기록
팀 활동
- 5월 27일(월) 14:00 ~ 19:20 (오프라인 개발)
- 5월 28일(화) 13:00 ~ 19:30 (오프라인 개발)
- 5월 29일(수) 10:00 ~ 18:40 (오프라인 개발)
- 5월 30일(목) 10:30 ~ 21:00 (오프라인 개발)
→ 총 31시간 진행
진행 상황
1) 추가 데이터셋 제작
단어 & 짧은 문장의 발음평가에 특화된 모델을 제작하기 위하여 팀 내에서 데이터셋을 새로 만들기로 하였다. 데이터 셋의 종류 및 조건들은 다음과 같다
- 단어, 짧은 문장 포함 35~40개
- 단어, 문장 5:5비율로
- 문장의 길이 5초 미만
녹음한 데이터셋 + TTS 기준음성 데이터셋 + 외국인 녹음 데이터셋을 이용하여 추가 학습을 진행 할 예정이다.
2) 전처리 방법 통일
기존의 모델 학습, 데이터셋 전처리, 녹음 등 각종 과정에 있어서 결과에 영향을 미칠 가능성이 있는 변수들에 대한 통제가 제대로 이루어지지 않았다는 사실을 발견하였다. 따라서 이러한 변수들을 모두 통제를 하여 추론을 다시 진행시킬 예정이다. 예상되는 변수와 1차 데이터셋 통일안은 다음과 같다.
통제가 필요한 변수들
- 녹음
- 샘플링 레이트
- 소리의 크기
- 파일 형식 (확장자)
- TTS
- 샘플링 레이트 (Hz)
- 소리의 크기
- 발화 속도
- 남/여 성별
- 발화자 선택 (남/녀 2명씩)
- 파일 형식
- VAD
- 기준 데시벨 (어느 데시벨 아래를 짜를건지…)
- 노이즈 필터
- 패턴 파악 시간
- mel spectrogram
- 컬러 (RGB) vs 흑백 (GrayScale)
- 샘플링 레이트
- n_fft(퓨리에 변환 윈도우 크기)
- 그 외의 입력 파라미터
- 이미지 비율 (여러 비율로 테스트)
1차 전처리 세팅
- 녹음
- 샘플링 레이트 : 22,050 Hz
- 파일 형식 : .wav
- TTS
- 샘플링 레이트 : 22,050 Hz
- 파일 형식 : .wav
- 발화 속도 : 0.85
- (남/ 녀 구분 O)
- VAD 적용
- 노이즈 필터 적용
- mel spectrogram
- GrayScale (X) → 컬러(RGB)로 하기
- n_fft : 512
- 이미지 비율 : 1:1
→ siamese_net_r1.pt 생성
3) 1차 전처리 모델 테스트 과정 & 결과 정리 (5.28 화)
- 실험 모델
- siamese_net_r1 (50 epoch)
- siamese_net_r1 (100 epoch)
- siamese_net_r1 (200 epoch)
- 실험 결과
-
한국인 “도자기”
- r1(200) : 78.8점
- r1(100) : 84점 (기존테스트 78.5점)
- r1 : 79점 (기존테스트 83점)
-
발음 좋은 외국인 “도자기”
- r1(200) : 37점
- r1(100) : 15점
- r1 : 8.4점
-
발음 안 좋은 외국인 “이것 좀 주세요”
- r1(200) : 67점
- r1(100) : 24점
- r1 : 41점
-
한국인 “이것 좀 주세요”
- r1(200) : 58점
- r1(100) : 31점 (기존 테스트 81점)
- r1 : 23점 (기존 테스트 83점)
-
발음 좋은 외국인 “야구”
- r1(200) : 32점
- r1(100) : 69점
- r1 : 88점
-
발음 애매한 외국인 “심심하다”
- r1(200) : 24점
- r1 : 40점
- r1(100) : 34점
-
한국인 “심심하다”
- r1(200) : 91점
- r1(100) : 89점 (기존테스트 81점)
- r1 : 69점 (기존테스트 68점)
-
한국인 이상한 발음 “심심하다”
- r1(200) : 89점
- r1(100) : 25점
- r1 : 30점
-
발음 애매한 외국인 “농어”
- r1(200) : 54점
- r1(100) : 73점
- r1 : 76점
-
발음 안좋은 외국인 “짓누르다”
- r1(200) : 2.38점 (마이너스…)
- r1(100) : 3점
- r1 : 3점
-
발음 안좋은 외국인 “여기 물하고 반찬 좀 더 주시겠어요?” (ETRI API 문제?)
- r1(200) : 88점
- r1(100) : 36.9점 → 성능 더 정확
- r1 : 67.9점
-
발음 애매한 외국인 “열심히”
- r1(200) : 61점
- r1(100) : 69점
- r1 : 74점
-
발음 애매한 외국인 “타요”
- r1(200) : 16점
- r1(100) : 34점
- r1 : 62점
-
발음 안좋은 외국인 “문안”
- r1(200) : 29점
- r1(100) : 9점
- r1 : 38점
-
발음 애매한 외국인 “깨끗이”
- r1(200) : 15점
- r1(100) : 58점
- r1 : 29점
-
발음 애매한 외국인 “노력”
- r1(200) : 17점
- r1(100) : 23점
- r1 : 31점
-
- 학습 결과 피드백
- 200 epoch 모델의 경우, 결과의 편차가 他 모델 대비 크다는 결과가 나왔다. 원인을 생각해 보았을 때 이는 과적합으로 인한 문제라 추측된다. 따라서 학습 진행 시 epoch은 200을 넘기지 않는 선에서 진행하도록 한다.
- 50, 100 epoch의 경우, 점수의 분포가 서로 비슷한 경향이 있고, 아직까지 어느 모델이 더 정확한지 판별이 힘들기 때문에 추가 실험을 통하여 비교를 계속 해 나갈 예정이다.
- ‘r1’ 모델은 대체적으로 발음의 유사도를 잘 평가해주는 것으로 나타났지만, 외국인의 목소리에 너무 엄격한 평가를 내리는 경향이 있는 것으로 나타났다. 해당 원인을 찾아서 해결을 해 나가야 할 것이다.
4) 2차 전처리 모델 테스트 과정 & 결과 정리 (5.29 수)
- 실험 모델
- siamese_net_r1_gray (50 epoch)
- siamese_net_r1_gray (100 epoch)
- 실험결과
-
한국인 “도자기”
- r1_gray : 70점
- r1_gray(100) : 71점
-
발음 좋은 외국인 “도자기”
- r1_gray : 17점
- r1_gray100 : 39점
-
발음 안 좋은 외국인 “이것 좀 주세요”
- r1_gray : 65점
- r1_gray100 : 76점
-
한국인 “이것 좀 주세요”
- r1_gray : 84점
- r1_gray100 : 73점
-
발음 좋은 외국인 “야구”
- r1_gray : 79점
- r1_gray100 : 80점
-
발음 애매한 외국인 “심심하다”
- r1_gray : 13점
- r1_gray100 : 65점
- 파형이 많이 다름(한 20~30점 정도?)
-
한국인 “심심하다”
- r1_gray : 86점
- r1_gray100 : 89점
-
한국인 이상한 발음 “심심하다”
- r1_gray : 81점
- r1_gray100 : 94점
- 파형이 많이 다름
-
발음 애매한 외국인 “농어”
- r1_gray : 57점
- r1_gray100 : 50점
-
발음 안좋은 외국인 “짓누르다”
- r1_gray : 13점
- r1_gray100 : -86점
- 파형이 많이 다름
-
발음 안좋은 외국인 “여기 물하고 반찬 좀 더 주시겠어요?”
- r1_gray : 78점
- r1_gray100 : 75점
- 파형이 많이 다름
-
발음 애매한 외국인 “열심히”
- r1_gray : 65점
- r1_gray100 : 32점
- 파형이 많이 다름
-
발음 애매한 외국인 “타요”
- r1_gray : 33점
- r1_gray100 : 31점
-
발음 안좋은 외국인 “문안”
- r1_gray : 19점
- r1_gray100 : 13점
-
발음 애매한 외국인 “깨끗이”
- r1_gray : -13점
- r1_gray100 : 52점
- 파형이 비슷함
-
발음 애매한 외국인 “노력”
- r1_gray : 19점
- r1_gray100 : 41점
- 파형이 비슷함
-
- 학습 결과 피드백
- gray 50, 100의 경우는 점수를 비슷하게 주는 경우가 많았다. 서로 점수를 다르게 줄 경우 점수 편차가 큰 편이였는데, 이에 파형을 확인 해 보면 2가지 경우로 나뉘었다
-
파형이 다른 경우
→ gray50에 비해서 gray100이 점수를 조금 더 높게 주는 경향이 있다(점수 편차는 크지않음)
-
파형이 비슷한 경우
→ gray100에 비해서 gray50이 점수를 많이 낮게 주는 경향이 있다(점수 편차 큼)
-
- 기존 r1에서 보였던 외국인에게 점수를 낮게 주는 모습들이 gray50에서 많이 발견되었다. 그에반해 gray100에 경우는 애매한 발음의 외국인 점수를 적당량 측정하는 모습도 발견되었고 전체적으로 점수의 분포도가 다양해서 정확도가 높은 모습을 보였다
- 하지만 발음이 안좋은 외국인 or 한국인에게 높은 점수를 주는 부분들이 발견되었다. 컬러에 비해서 정확도가 많이 떨어지는 모습을 보였다.
- gray 50, 100의 경우는 점수를 비슷하게 주는 경우가 많았다. 서로 점수를 다르게 줄 경우 점수 편차가 큰 편이였는데, 이에 파형을 확인 해 보면 2가지 경우로 나뉘었다
5) 3차 전처리 모델 테스트 과정 & 결과 정리 (5.29 수)
epoch 기본값: 50
- 실험 모델
- siamese_net_r1
- siamese_net_r2 (epoch 30)
- siamese_net_r2
- siamese_net_r3
- 실험 결과
-
발음이 좋은 외국인 “도자기”
- r1 : 8점
- r2_30 : -9점
- r2 : 71점
- r3 : 14점
-
발음이 좋은 한국인 “도자기”
- r1 : 79점
- r2_30 : 78점
- r2 : 85점
- r3 : 81점
-
발음이 애매한 외국인 “이것 좀 주세요”
- r1 : 41점
- r2_30 : 75점
- r2 : 74점
- r3 : 80점
-
발음이 좋은 한국인 “이것 좀 주세요”
- r1 : -2점
- r2_30 : 94점
- r2 : 34점
- r3 : 33점
-
발음이 안좋은 외국인 “여기 물 하고 반찬 좀 더 주시겠어요?”
- r1 : 67점
- r2_30 : 98점
- r2 : 90점
- r3 : 57점
-
발음이 애매한 외국인 “깨끗이”
- r1 : 29점
- r2_30 : 2점
- r2 : 37점
- r3 : 35점
-
발음이 애매한 외국인 “라면”
- r1 : 66점
- r2_30 : 78점
- r2 : 33점
- r3 : 21점
-
- 실험 결과 피드백
- r2_30 vs r2_50 → r2_50이 정확도 더 높았음 → epoch > 30 으로 학습
- r2_30 < r1 ≤ r2_50 ≤ r3_50 → 모델의 출력 파라미터의 개수는 성능에 크게 영향 X
6) 발음 평가 지표 정리
새로운 평가 지표
점수 분포
범위 : 1 ~ 5점
1 ~ 2 / 3 / 4 ~ 5
| 평가 내용 | 평가 점수 | |
|---|---|---|
| 정확성 | 침묵 or 발음 많이 이상 / 부분적으로 정확한 발음 / 거의 정확한 발음 | 1 2 3 4 5 |
| 유창성 | (발화 속도 평가 및 단어와 문장 내의 멈춤, 머뭇거림 등의 휴지 평가) | |
| 발화가 매우 매끄럽지 못함 / 발화가 비교적 매끄러움 / 발음이 매우 자연스럽고 막힘X | 1 2 3 4 5 | |
| 이해성 | 이해 불가 or 이해 어려운 발음 / 조금 시간이 걸려서 이해한 발음 / 바로 이해 가능한 발음 | 1 2 3 4 5 |
7) 발음 평가 지표 정리 05/30(목)
유창성 - 사람마다 기준이 다름, 이로 인한 평가 점수의 차이 발생
→ 데이터의 길이를 기준으로 점수 측정 및 가중치 부여.
ERTI 점수 측정 결과 - 짧은 단어의 경우 측정이 잘 되지 않음.
→ 단어의 길이를 4글자 이상으로 설정 or 가중치를 적게 부여.
8) 유창성 판별 알고리즘
적절값을 찾기 위한 테스트
- “타요”
-
기준 데이터 : 557ms
-
외국인 : 627ms (사람 평가 5점만점에 3점) (13%정도 느림)
-
- “물하고 반찬”
-
기준 데이터 : 3088ms
-
외국인 : 4807ms (사람 평가 5점만점에 2점) (56%정도 느림)
-
- “이것 좀 주세요”
-
기준 데이터 : 1393ms 395
-
외국인 : 1788ms (사람 평가 5점만점에 평균 1.75) (28%정도 느림)
-
- “문어”
-
기준 데이터 : 534ms
-
한국인 : 395ms (26%정도 빠름)
-
구현 코드
from pydub import AudioSegment
#input : 두 음성데이터의 길이
#output : 1~5점
def get_fluency(base, target):
score = 1
distance = base - target
ratio = abs((distance/base)*100)
if distance >= 0:
if ratio <= 25:
score = 5
elif ratio <= 35:
score = 4
elif ratio <= 50:
score = 3
elif ratio <= 60:
score = 2
else:
score = 1
else:
if ratio <= 10:
score = 5
elif ratio <= 15:
score = 4
elif ratio <= 20:
score = 3
elif ratio <= 30:
score = 2
else:
score = 1
return score
# 두 음성 파일의 경로를 지정
base = "VAD_TTS_타요.wav"
voice = "VAD_타요.wav"
# 오디오 파일 load
base_audio = AudioSegment.from_file(base)
voice_audio = AudioSegment.from_file(voice)
#단위 : ms
base_length = len(base_audio)
voice_length = len(voice_audio)
print(get_fluency(base_length,voice_length))
메인코드에서 사용할 수 있도록 수정 및 적용 코드
def get_length_change(base,voice):
# input : 두 음성데이터의 길이
# output : 1~5점
def get_fluency(base, target):
score = 1
distance = base - target
ratio = abs((distance / base) * 100)
if distance >= 0:
if ratio <= 25:
score = 5
elif ratio <= 35:
score = 4
elif ratio <= 50:
score = 3
elif ratio <= 60:
score = 2
else:
score = 1
else:
if ratio <= 10:
score = 5
elif ratio <= 15:
score = 4
elif ratio <= 20:
score = 3
elif ratio <= 25:
score = 2
else:
score = 1
if score == 5:
return 1
elif score == 4:
return 0.8
elif score == 3:
return 0.6
elif score == 2:
return 0.4
elif score == 2:
return 0.2
else:
return 0.1
9) 부정확한 결과가 나온 데이터 비교 및 분석
좌)기준데이터. 우)녹음 데이터
- “짓누르다” (3, 3점)
- “깨끗이” (29, 58점)
- “노력” (31, 23점)
- “보자기” (8, 15점)
- “무난” (38, 9점)
결과가 잘 나온 데이터
- “심심하다” (70, 90점)
이유 파악
- Mel-spectrogram으로 변환된 파형을 눈으로 비교했을 때 비슷하게 느낌에도 불구하고 너무 낮은 점수를 기록하고있는 모습을 보여 그 이유를 파악을 하고자함
이유
- 데이터셋 오버피팅
- 위에 쓰인 낮은 점수를 기록한 단어들의 공통점은 Simese Network 모델을 학습시킬 때 쓰이는 트레이닝 데이터 셋과 테스트를 하기 위해서 쓰인 테스트 데이터셋에 모두 포함되어있다는 것을 발견
- 모델이 학습 데이터에 맞춰져있기 때문에 테스트셋이 동일한 파일이라면 모델이 과도하게 학습된 패턴을 적용하려고 하기 때문에 정확도가 떨어질 가능성이 있음
- 위에 쓰인 낮은 점수를 기록한 단어들의 공통점은 Simese Network 모델을 학습시킬 때 쓰이는 트레이닝 데이터 셋과 테스트를 하기 위해서 쓰인 테스트 데이터셋에 모두 포함되어있다는 것을 발견
10) OpenCV 유사도 추론
가중치 추가를 위하여 OpenCV를 사용한 유사도 추론 방법 탐색
OpenCV 적용 코드
import cv2
# 이미지 로드
def load_image(image_path):
img = cv2.imread(image_path)
if img is None:
raise ValueError(f"이미지가 존재하지 않습니다: {image_path}")
return img
# 이미지 비교
def compare_image(img1, img2):
# 템플릿 매칭 (정규화된 방법 사용)
result = cv2.matchTemplate(img2, img1, cv2.TM_CCOEFF_NORMED)
_, max_val, _, _ = cv2.minMaxLoc(result)
return max_val
# 이미지 파일 경로
img1_path = 'Mel_VAD_record.jpg'
img2_path = 'Mel_VAD_TTS_record.jpg'
# 이미지 로드
img1 = load_image(img1_path)
img2 = load_image(img2_path)
# 이미지 파일 비교
simlarity = compare_image(img1, img2)
simlarity_percentage = simlarity * 100 #percentage 계산
print(f"Similarty: {simlarity} ({simlarity_percentage:.2f}%)")
테스트 결과
테스트에 쓰인 템플릿 매칭 방법은 다음과 같다
cv2.TM_CCOEFF_NORMED: 값이 1에 가까울수록 유사도가 높음- 정규화된 상관계수를 이용한 매칭 방법
cv2.TM_SQDIFF_NORMED: 값이 0에 가까울수록 유사도가 높음- 정규화된 제곱계수를 이용한 매칭 방법
-
발음 좋은 외국인 “도자기”
cv2.TM_CCOEFF_NORMED: 61점cv2.TM_SQDIFF_NORMED: 63점- 평가지표에 의한 총점 평균: 84점
-
발음 안 좋은 외국인 “이것 좀 주세요”
cv2.TM_CCOEFF_NORMED: 41점cv2.TM_SQDIFF_NORMED: 31점- 평가지표에 의한 총점 평균: 44점
-
발음 좋은 외국인 “야구”
cv2.TM_CCOEFF_NORMED: 70점cv2.TM_SQDIFF_NORMED: 71점- 평가지표에 의한 총점 평균: 100점
-
발음 애매한 외국인 “심심하다”
cv2.TM_CCOEFF_NORMED: 60점cv2.TM_SQDIFF_NORMED: 70점- 평가지표에 의한 총점 평균: 60점
-
발음 애매한 외국인 “농어”
cv2.TM_CCOEFF_NORMED: 68점cv2.TM_SQDIFF_NORMED: 67점- 평가지표에 의한 총점 평균: 50점
-
발음 안좋은 외국인 “짓누르다”
cv2.TM_CCOEFF_NORMED: 50점cv2.TM_SQDIFF_NORMED: 68점- 평가지표에 의한 총점 평균: 53점
-
발음 안좋은 외국인 “여기 물하고 반찬 좀 더 주시겠어요?”
cv2.TM_CCOEFF_NORMED: 23점cv2.TM_SQDIFF_NORMED: 9점- 평가지표에 의한 총점 평균: 50점
-
발음 애매한 외국인 “열심히”
cv2.TM_CCOEFF_NORMED: 50점cv2.TM_SQDIFF_NORMED: 54점- 평가지표에 의한 총점 평균: 74점
-
발음 애매한 외국인 “타요”
cv2.TM_CCOEFF_NORMED: 65점cv2.TM_SQDIFF_NORMED: 74점- 평가지표에 의한 총점 평균: 77점
-
발음 안좋은 외국인 “문안”
cv2.TM_CCOEFF_NORMED: 71점cv2.TM_SQDIFF_NORMED: 70점- 평가지표에 의한 총점 평균: 57점
-
발음 애매한 외국인 “깨끗이”
cv2.TM_CCOEFF_NORMED: 52점cv2.TM_SQDIFF_NORMED: 56점- 평가지표에 의한 총점 평균: 70점
-
발음 애매한 외국인 “노력”
cv2.TM_CCOEFF_NORMED: 75점cv2.TM_SQDIFF_NORMED: 80점- 평가지표에 의한 총점 평균: 77점
실험 결과 피드백
-
CCOEFF, SQDIFF 2개의 템플릿 매칭 방법 모두 평가지표에 의한 총점과 비슷한 정확도를 보임 기존 Simese Network 모델과 비교했을때도 특정 단어가 많이 낮은 점수로 계산되는 상황도 적음 하지만, 긴 문장의 유사도를 비교했을때는 매우 낮은 정확도를 보임
→ 기존 모델에 비해서는 조금 더 일관성있고 높은 정확도를 보이지만 문장에서는 많이 약한편
-
SQDIFF는 평가지표가 낮은 점수인데도 불구하고 점수가 높은 경우가 있음 CCODEFF는 대부분 평가지표와 비슷한 정확도를 가지고있음
→ CCOEFF, SQDIFF 2개의 템플릿 매칭 방법중 CCOEFF가 조금 더 높은 정확성을 보이고있음
11) 평가 방법론 조사
필수 평가지표 요소 3가지
- 정확성 : 분절음 & 초분절음
- 분절적 방식 = 자음과 모음, 받침 등을 알맞게 발음하였는지?
- 비분절적 방식 = 말의 강세, 높낮이 등이 알맞은지? (억양 등)
- 유창성 (= 발화 속도) : 말하는 속도가 적당한지?
- 이해성 (명료성 + 가능성) : 발음을 듣는 사람이 이해했는지?
보다 직관적으로 이해가 가능하도록 평가지표를 정리
| 정확성 | 침묵 or 발음 많이 이상 / 부분적으로 정확한 발음 / 거의 정확한 발음 |
|---|---|
| 유창성 | (발화 속도 평가 및 단어와 문장 내의 멈춤, 머뭇거림 등의 휴지 평가) |
| 발화가 매우 매끄럽지 못함 / 발화가 비교적 매끄러움 / 발음이 매우 자연스럽고 막힘X | |
| 이해성 | 이해 불가 or 이해 어려운 발음 / 조금 시간이 걸려서 이해한 발음 / 바로 이해 가능한 발음 |
관련 논문의 발음 평가 기준 예시
출처 : 한국어 말하기 평가-발음의 비중에 대한 연구 - earticle
- 각 발음데이터마다 새로 정립한 평가 지표의 요소를 하나씩 평가
- 1점부터 5점까지 점수 부여
- 5점 : 이해 가능. 실수 0개
- 4점 : 이해 가능. 실수 1~2개
- 3점 : 이해 가능. 전체적으로 부자연스러움
- 2점 : 한번 들어서 이해 불가. 단, 반복해서 들으면 이해 가능
- 1점 : 이해 불가
- 1점부터 5점까지 점수 부여
- 세 항목의 평가된 점수를 전부 더하고, 총점으로 평균(%)을 구함
평가 방법 예시
11) 평가지표를 이용한 평가 진행
테스트 내용
- 평가방법을 숙지한 사람들로 외국인 발음을 평가
- 각자 외국인 발음 데이터를 듣고 평가 지표의 정확성, 유창성, 이해성 세 요소마다 1점부터 5점까지 기준을 따라서 점수 부여
- 부여한 점수를 표로 정리 후 평균을 내고, 이를 기존 “r1” 모델과 ETRI 평가 점수와 비교
진행 & 결과
외국인 발음 데이터를 조원들이 듣고, 평가 지표의 요소에 따라 각자 점수 부여
12개의 외국인 발음데이터 평가 결과
평가 결과 비교
→ ETRI 평가점수는 전체적으로 낮았으며, r1은 특정 케이스를 제외하면 사람이 평가한 결과와 비슷한 경향을 보였음
→ ETRI 평가점수는 단어나 짧은 문장에서 성능이 많이 낮았음.
→ “r1”모델에서는 편차가 매우 큰 케이스 존재
ex) “도자기”, “짓누르다”, “깨끗이” 등…
r1모델에서 부정확한 결과가 나온 데이터 분석
좌)기준데이터 / 우)녹음 데이터
특정 발음에서 평가지표의 결과와 매우 큰 편차를 보였음
ex) “도자기”, “짓누르다”, “깨끗이”, “노력” 등…
→ 테스트 데이터 때 사용했던 발음과 동일한 발음을 훈련데이터로 사용하여 이상한 결과가 도출됨
최종적인 정확도 차이
상용 서비스 ETRI 평가시스템 → 정확도가 사람평가 대비 전체 평균 약 33% 차이
기존 사용하던 모델(r1) → 정확도가 사람평가 대비 전체 평균 약 14% 차이