주간 다이어리 - 14주차
활동 기록
팀 활동
- 6월 3일(월) 11:30 ~ 19:30 (오프라인 개발)
- 6월 4일(화) 11:10 ~ 18:50 (오프라인 개발)
- 6월 5일(수) 12:00 ~ 20:00 (오프라인 개발)
- 6월 6일(목) 11:20 ~ 16:00 (오프라인 개발)
- 6월 7일(금) 11:30 ~ 19:30 (오프라인 개발)
→ 총 36시간 20분 진행
진행 상황
1) batch size에 따른 성능 변화 테스트
batch size에 의해서도 모델의 성능이 변할 수 있다는 정보를 얻어, batch size를 조정하여 모델 성능변화의 테스트를 진행하였다.
대상 모델 : Siamese_net_r1.pt ( batch size : 64, epoch : 50)
→ batch size를 32, 16으로 변경 후 재 학습시켜 r1_32batch, r1_16batch 생성
- 테스트 내용
- 외국인 발음 녹음 데이터를 평가지표를 이용하여 사람이 직접 평가
- r1, r1_32batch, r1_16batch 각 모델들을 통하여 평가
- 사람평가, 모델평가의 차이를 계산
- 차이값을 비교하여 성능을 비교
- 결과
- 음성 데이터 : “10만원만 빌려줄 수 있어요?”
- 평가지표 점수 : 53점
- r1 점수 : 45 → 8점 차이
- 필터링 2번 : 39 → 14점 차이
- r1 (32batch) : 21 → 32점 차이
- 필터링 2번 : 54 → 1점 차이
- r1 (16batch) : 38 → 15점 차이
- 필터링 2번 : 73 → 20점 차이
- openCV : 0.25
→ r1 > r1_16 > r1_32
- 음성 데이터 : “질문”
- 평가지표 점수 : 46점
- r1 점수: 39 → 7점 차이
- r1 (32batch) : 43 → 3점 차이
- r1 (16batch) : 56 → 10점 차이
- etri → 2.91
- openCV : 0.74
→ r1(32) > r1 > r1(16)
- 음성 데이터 “중국”
- 평가지표 점수 : 52점
- r1 점수 : 0 → 52점 차이
- 필터링 2번 : 33 → 19점 차이
- r1 (32batch) : 44 → 8점 차이
- 필터링 2번 : 66 → 14점 차이
- r1 (16batch) : 44 → 8점 차이
- 필터링 2번 : 53 → 1점 차이
- etri : 2.66점
- opencv - 0.72
→ r1(32)=r1(16) > r1
- 음성 데이터 “한국어”
- 평가지표 점수 : 66점
- r1 점수 : 72 → 6점 차이.
- 필터링 2번 : 68 → 2점 차이
- r1 (32batch) : 78 → 12점 차이
- 필터링 2번 : 86 → 20점 차이
- r1 (16batch) : 28 → 38점 차이
- 필터링 2번 : 46 → 20점 차이
- opencv : 0.44
- etri : 2.8
→ r1 > r1(32) > r1(16)
-
쉴 거에요
- 평가지표 점수 : 40점
- r1 점수 : 42 → 2점 차이
- 필터링 2번 : 85 → 45점 차이
- r1 (32batch) : 57 → 17점 차이
- 필터링 2번 : 67 → 27점 차이
- r1 (16batch) : 45 → 5점 차이
- 필터링 2번 : 83 → 43점 차이
- etri : 2.98
- openCV : 0.44
→ 모델 자체가 가볍고 학습 데이터 셋도 많지 않기 때문에 batch size에 따른 성능의 차이는 크게 존재하지 않았다.
2) 메인 프로그램 디버깅 진행
사용자의 편의성을 비롯하여 메인 프로그램의 완성도를 높이기 위하여, 많은 테스트를 통하여 예외 케이스나 버그를 찾는 작업을 진행하였다. 다음의 요소들은 디버깅 작업을 통해서 발견된 문제들이다.
- 결과 추론시간동안 표시되는 다이얼의 표시시간이 추론시간과 동기화가 되지 않고 고정시간동안 돌아가도록 설계되어, 실제 추론이 일찍 끝났음에도 다이얼이 계속 돌아가 처리속도가 늦어지는 것 처럼 보이는 문제
- → 멀티스레드가 원활하게 이루어지지 않아 임시로 설계한 것이 원인. 다이얼이 돌아가는 이미지를 제거하고 안내문구만으로 표시하여 추론이 끝나는 대로 화면이 넘어갈 수 있도록 수정 예정
- 유사도 안내결과(점수)만 봐서는 자신의 발음 실력을 객관적으로 판단할 수 없는 문제
- → 각 점수대 별 실력을 별도의 텍스트를 통하여 안내해줄 수 있도록 수정 예정. 구체적인 점수와 그에 따른 실력표는 다음과 같음.
- 0 ~ 30 : 발음이 많이 미숙 (빨강)
- 30 ~ 50 : 외국인(주황)
- 50 : 70 : 발음 꽤 하는 외국인(노랑)
- 70 ~ 100 : 한국인(초록)
- → 각 점수대 별 실력을 별도의 텍스트를 통하여 안내해줄 수 있도록 수정 예정. 구체적인 점수와 그에 따른 실력표는 다음과 같음.
- 학습 시작버튼이 너무 작아 터치스크린으로 이용 시 클릭이 제대로 되지 않는 문제 & 성별 선택 창에서 성별을 선택하지 않아도 다음단계로 넘어가지는 문제
- → 학습 시작버튼을 제거 & 성별을 선택하면 다음 단계로 바로 진행되도록 수정 예정
- 사용자가 성별을 잘못 선택해도 결과에 영향을 미칠수도 있다는 정보를 별도로 안내해주지 않는 문제
- → 성별 선택창에서 해당 안내를 추가하도록 수정 예정
- 소음 측정과 녹음시작 간의 시간차가 생길 경우 소음 측정결과가 동기화되지 않는 문제
- → 녹음을 시작할 경우 측정을 다시 진행하여 측정결과 동기화 되도록 수정 예정
- 소음 측정 결과의 직관성이 떨어지는 문제
- → 기존의 텍스트에서 초록,주황,빨강의 신호등을 연상시키는 이미지로 변환하여 직관성 높일 예정
- 기준이 되는 단어와 다른 단어를 녹음 하여도 평가가 진행되는 문제
- → 평가 진행 전 단계에 사용자가 녹음한 단어와 기준데이터의 단어의 매칭도를 판단하는 단계를 추가하여 기준 단어와 다른 단어가 녹음되었을 경우 추론이 진행되지 않도록 수정 예정
수정 완료
- openCV의 추론 값이 1.0으로 나올 경우( 녹음이 제대로 진행되지 않았을 경우) 에도 점수를 추론하는 문제
- → 녹음이 제대로 이루어지지 않는 경우에는 측정이 이루어지지 않도록 결과 문구를 수정하였다.
- 재 녹음을 여러번 진행할 시 녹음파일이 쌓이게 되는 문제
- 재녹음 버튼을 누르면 추론에 사용되었던 기존의 녹음 데이터들을 지우게하여 해당 문제를 수정하였다.
3) 외국인 발음 테스트 진행 - 0
테스트 모델 : siamese_net_r1.pt
-
괴물
원본
노이즈필터 한 번
score : 62
VAD_record.wav
VAD_TTS_girl.wav
노이즈필터 두 번
score : 67
VAD_record.wav
VAD_TTS_girl.wav
-
이야기
원본
노이즈필터 한 번
score : 76
VAD_record.wav
VAD_TTS_girl.wav
노이즈필터 두 번
score : 77
VAD_record.wav
VAD_TTS_girl.wav
-
가족이 몇 명이에요?
원본
노이즈필터 한 번
score : 74
VAD_record.wav
VAD_TTS_girl.wav
노이즈필터 두 번
score : 75
VAD_record.wav
VAD_TTS_girl.wav
-
얼굴 안 좋은데 무슨 일 있어요?
원본
노이즈필터 한 번
score : 73
VAD_record.wav
VAD_TTS_girl.wav
노이즈필터 두 번
score : 68
VAD_record.wav
VAD_TTS_girl.wav
-
더워요
원본
노이즈필터 한 번
score : 49
VAD_record.wav
VAD_TTS_girl.wav
노이즈필터 두 번
score : 63
VAD_record.wav
VAD_TTS_girl.wav
-
다치다
원본
노이즈필터 한 번
score : 65
VAD_record.wav
VAD_TTS_man.wav
노이즈필터 두 번
score : 79
VAD_record.wav
VAD_TTS_girl.wav
-
라면
원본
노이즈필터 한 번
score : 42
VAD_record.wav
VAD_TTS_girl.wav
노이즈필터 두 번
score : 50
VAD_record.wav
VAD_TTS_girl.wav
-
내일 몇 시까지 오면 될까요?
원본
노이즈필터 한 번
score : 64
VAD_record.wav
VAD_TTS_girl.wav
노이즈필터 두 번
score : 58
VAD_record.wav
VAD_TTS_girl.wav
-
그거 내가 한 거 아니야
원본
노이즈필터 한 번
score : 81
VAD_record.wav
VAD_TTS_girl.wav
노이즈필터 두 번
score : 63
VAD_record.wav
VAD_TTS_girl.wav
-
바쁘다
원본
노이즈필터 한 번
score : 77
VAD_record.wav
VAD_TTS_girl.wav
노이즈필터 두 번
score : 77
VAD_record.wav
VAD_TTS_girl.wav
-
옛날
원본
노이즈필터 한 번
score : 41
VAD_record.wav
VAD_TTS_girl.wav
노이즈필터 두 번
score : 65
VAD_record.wav
VAD_TTS_girl.wav
-
이따 전화할게
원본
노이즈필터 한 번
score : 64
VAD_record.wav
VAD_TTS_girl.wav
노이즈필터 두 번
score : 78
VAD_record.wav
VAD_TTS_girl.wav
4) 테스트 결과를 OpenCV를 통해 측정 & 비교
-
괴물
OpenCV 필터1 결과 : 62
OpenCV 필터2 결과 : 58
-
이야기
OpenCV 필터1 결과 : 70
OpenCV 필터2 결과 : 70
-
가족이 몇 명이에요?
OpenCV 필터1 결과 : 62
OpenCV 필터2 결과 : 60
-
얼굴 안 좋은데 무슨 일 있어요?
OpenCV 필터1 결과 : 52
OpenCV 필터2 결과 : 50
-
더워요
OpenCV 필터1 결과 : 70
OpenCV 필터2 결과 : 65
-
다치다
OpenCV 필터1 결과 : 60
OpenCV 필터2 결과 : 58
-
라면
OpenCV 필터1 결과 : 40
OpenCV 필터2 결과 : 31
-
내일 몇 시까지 오면 될까요?
OpenCV 필터1 결과 : 38
OpenCV 필터2 결과 : 40
-
그거 내가 한 거 아니야
OpenCV 필터1 결과 : 47
OpenCV 필터2 결과 : 41
-
바쁘다
OpenCV 필터1 결과 : 29
OpenCV 필터2 결과 : 27
-
옛날
OpenCV 필터1 결과 : 63
OpenCV 필터2 결과 : 65
-
이따 전화할게
OpenCV 필터1 결과 : 46
OpenCV 필터2 결과 : 45
5) UI 수정 사항
수정 예정 사항 및 완료
- 결과 추론시간동안 표시되는 다이얼의 표시시간이 추론시간과 동기화가 되지 않고 고정시간동안 돌아가도록 설계되어, 실제 추론이 일찍 끝났음에도 다이얼이 계속 돌아가 처리속도가 늦어지는 것 처럼 보이는 문제
- → 멀티스레드가 원활하게 이루어지지 않아 임시로 설계한 것이 원인. 다이얼이 돌아가는 이미지를 제거하고 안내문구만으로 표시하여 추론이 끝나는 대로 화면이 넘어갈 수 있도록 수정 예정
문구 간단하게 작성 완료
→ 결과 측정중입니다 문구 제시로 수정
- 유사도 안내결과(점수)만 봐서는 자신의 발음 실력을 객관적으로 판단할 수 없는 문제
- → 각 점수대 별 실력을 별도의 텍스트를 통하여 안내해줄 수 있도록 수정 예정. 구체적인 점수와 그에 따른 실력표는 다음과 같음.
- 0 ~ 30 : 발음이 많이 미숙 (빨강)
- 30 ~ 50 : 외국인(주황)
- 50 : 70 : 발음 꽤 하는 외국인(노랑)
- 70 ~ 100 : 한국인(초록)
- → 해당 이미지 혹은 텍스트를 넣을 수 있는 공간 생성 완료 및 제작 완료
- → 각 점수대 별 실력을 별도의 텍스트를 통하여 안내해줄 수 있도록 수정 예정. 구체적인 점수와 그에 따른 실력표는 다음과 같음.
- 학습 시작버튼이 너무 작아 터치스크린으로 이용 시 클릭이 제대로 되지 않는 문제 & 성별 선택 창에서 성별을 선택하지 않아도 다음단계로 넘어가지는 문제
- → 학습 시작버튼을 제거 & 성별을 선택하면 다음 단계로 바로 진행되도록 수정 예정
→ 성별 선택 시 바로 진행.
- 사용자가 성별을 잘못 선택해도 결과에 영향을 미칠수도 있다는 정보를 별도로 안내해주지 않는 문제
- → 성별 선택창에서 해당 안내를 추가하도록 수정 예정
→ 빨간색 문구로 주의 문구 작성 완료
- 소음 측정과 녹음시작 간의 시간차가 생길 경우 소음 측정결과가 동기화되지 않는 문제
- → 녹음을 시작할 경우 측정을 다시 진행하여 측정결과 동기화 되도록 수정 예정
→ 코드 상 이미 구현 되어 있음 이미지 추가해서 수정하면 완료
→소음 측정 기능 각 부분 별로 추가 완료
- 소음 측정 결과의 직관성이 떨어지는 문제
- → 기존의 텍스트에서 초록,주황,빨강의 신호등을 연상시키는 이미지로 변환하여 직관성 높일 예정
→ 이미지 추가 완료 → 신호등 형식으로 이미지 변경 위치또한 오른쪽 상단으로 변경
- 기준이 되는 단어와 다른 단어를 녹음 하여도 평가가 진행되는 문제
- → 평가 진행 전 단계에 사용자가 녹음한 단어와 기준데이터의 단어의 매칭도를 판단하는 단계를 추가하여 기준 단어와 다른 단어가 녹음되었을 경우 추론이 진행되지 않도록 수정 예정
- STT를 사용해서 사용자의 발음과 제시된 단어를 비교해서 평가가 가능하도록 설정
stt코드
import io from google.cloud import speech_v1p1beta1 as speech from google.oauth2 import service_account from pydub import AudioSegment #-------------------------------------------------- def transcribe_audio(audio_file_path): credentials = service_account.Credentials.from_service_account_file('speech-to-text-425408-a797567b8e72.json') client = speech.SpeechClient(credentials=credentials) # pydub를 사용하여 오디오 파일을 불러오고 WAV 형식으로 변환 audio = AudioSegment.from_file(audio_file_path) audio = audio.set_channels(1) # Mono 채널로 변환 audio = audio.set_frame_rate(22050) # 샘플 레이트를 16000Hz로 설정 (필요에 따라 변경 가능) # 메모리 내에서 바이너리 데이터로 변환 audio_buffer = io.BytesIO() audio.export(audio_buffer, format="wav") audio_buffer.seek(0) content = audio_buffer.read() recognition_audio = speech.RecognitionAudio(content=content) config = speech.RecognitionConfig( encoding=speech.RecognitionConfig.AudioEncoding.LINEAR16, sample_rate_hertz=22050, language_code="ko-KR", ) response = client.recognize(config=config, audio=recognition_audio) for result in response.results: print("Transcript: {}".format(result.alternatives[0].transcript)) return format(result.alternatives[0].transcript) # 예제로 사용할 오디오 파일의 경로 # audio_file_path = "record.wav" # # transcribe_audio(audio_file_path)출력 값을 비교하여 결과 수정
if opencv_score == 1 or opencv_score < 0.2 or global_TTS_sentence != global_selected_sentence: 터무니 없이 소음이 들어가거나 혹은 해당 발음을 발음하지 않 else: 평가 진행.
7) 외국인 발음 테스트 - 1
학교 외국인 학생을 섭외하여 발음 테스트를 진행하였음.
테스트 모델 : siamese_net_r1.pt
-
이야기
원본
노이즈필터 한 번
score : 14
CCOEFF : 30
VAD_record.wav
VAD_TTS_girl.wav
-
바쁘다 → 녹음 에러
원본
노이즈필터 한 번
score : 0
CCOEFF : 32
VAD_record.wav
VAD_TTS_girl.wav
-
짓누르다
원본
노이즈필터 한 번
score : 24
CCOEFF : 61
VAD_record.wav
VAD_TTS_girl.wav
-
노력
원본
노이즈필터 한 번
score : 75
CCOEFF : 54
VAD_record.wav
VAD_TTS_girl.wav
-
라면
원본
노이즈필터 한 번
score : 27
CCOEFF : 58
VAD_record.wav
VAD_TTS_girl.wav
-
옛날
원본
노이즈필터 한 번
score : 23
CCOEFF : 70
VAD_record.wav
VAD_TTS_girl.wav
-
가족이 몇 명이에요?
원본
노이즈필터 한 번
score : 77
CCOEFF : 30
VAD_record.wav
VAD_TTS_girl.wav
-
내일 몇 시까지 오면 될까?
원본
노이즈필터 한 번
score : 62
CCOEFF : 21
VAD_record.wav
VAD_TTS_girl.wav
-
열심히
원본
노이즈필터 한 번
score : 42
CCOEFF : 57
VAD_record.wav
VAD_TTS_girl.wav
-
이것 좀 주세요
원본
노이즈필터 한 번
score : 43
CCOEFF : 35
VAD_record.wav
VAD_TTS_girl.wav
8) 실제 외국인 발음 테스트 - 2
1번의 테스트와 조건 동일
테스트 모델 : siamese_net_r1.pt
-
이야기
원본
노이즈필터 한 번
노이즈 제거 전
score : 32
CCOEFF : 62
노이즈 제거 후
score : 62
CCOEFF : 60
VAD_record.wav
VAD_TTS_girl.wav
-
바쁘다 → 테스트 1에선 삭제했었음
원본
노이즈필터 한 번
노이즈 제거 전
score : 43
CCOEFF : 47
노이즈 제거 후
score : 5
CCOEFF : 46
VAD_record.wav
VAD_TTS_girl.wav
-
짓누르다
원본
노이즈필터 한 번
노이즈 제거 전
score : 53
CCOEFF : 42
노이즈 제거 후
score : 18
CCOEFF : 39
VAD_record.wav
VAD_TTS_girl.wav
-
노력
원본
노이즈필터 한 번
노이즈 제거 전
score : 48
CCOEFF : 57
노이즈 제거 후
score : 62
CCOEFF : 55
VAD_record.wav
VAD_TTS_girl.wav
-
라면 → 마지막에 주변 잡음까지 잡힘…
원본
노이즈필터 한 번
노이즈 제거 전
score : 0
CCOEFF : 0
노이즈 제거 후
score : 0
CCOEFF : 0
VAD_record.wav
VAD_TTS_girl.wav
-
옛날
원본
노이즈필터 한 번
노이즈 제거 전
score : 0
CCOEFF : 67
노이즈 제거 후
score : 19
CCOEFF : 65
VAD_record.wav
VAD_TTS_girl.wav
-
가족이 몇 명이에요?
원본
노이즈필터 한 번
노이즈 제거 전
score : 74
CCOEFF : 50
노이즈 제거 후
score : 52
CCOEFF : 50
VAD_record.wav
VAD_TTS_girl.wav
-
내일 몇 시까지 오면 될까?
원본
노이즈필터 한 번
노이즈 제거 전
score : 65
CCOEFF : 50
노이즈 제거 후
score : 44
CCOEFF : 47
VAD_record.wav
VAD_TTS_girl.wav
-
열심히
원본
노이즈필터 한 번
노이즈 제거 전
score : 39
CCOEFF : 60
노이즈 제거 후
score : 64
CCOEFF : 57
VAD_record.wav
VAD_TTS_girl.wav
-
이것 좀 주세요
원본
노이즈필터 한 번
노이즈 제거 전
score : 10
CCOEFF : 42
노이즈 제거 후
score : 29
CCOEFF : 41
VAD_record.wav
VAD_TTS_girl.wav
- 마이크의 성능이슈로 인해 녹음이 제대로 이루어지지 않았던 문장들이 다수 존재하였음.
9) 한국 단어 비교
한국어 발음 평가 할 때 다른 단어 발음을 하였을 경우 평가가 진행되지 않도록 하기 위함.
from jamo import h2j, j2hcj
import unicodedata
def decompose_korean_word(word):
"""
주어진 한국어 단어를 음소 단위로 분해합니다.
"""
decomposed = []
for char in word:
if '가' <= char <= '힣': # 한글 완성자 범위
jamos = h2j(char)
decomposed.append(j2hcj(jamos))
else:
decomposed.append(char)
return ''.join(decomposed)
def remove_spaces(text):
"""
주어진 텍스트에서 띄어쓰기를 제거합니다.
"""
return text.replace(" ", "")
def compare_korean_words(word1, word2):
"""
두 한국어 단어를 음소 단위로 분해한 후 비교합니다.
"""
word1 = remove_spaces(word1)
word2 = remove_spaces(word2)
decomposed_word1 = decompose_korean_word(word1)
decomposed_word2 = decompose_korean_word(word2)
len1 = len(decomposed_word1)
len2 = len(decomposed_word2)
min_len = min(len1, len2)
match_count = 0
for i in range(min_len):
if decomposed_word1[i] == decomposed_word2[i]:
match_count += 1
accuracy = match_count / max(len1, len2)
return accuracy, decomposed_word1, decomposed_word2
#예제 사용
word1 = "학 교"
word2 = "학꾜"
accuracy, decomp_word1, decomp_word2 = compare_korean_words(word1, word2)
print(f"단어 1 ({word1})의 음소 분해: {decomp_word1}")
print(f"단어 2 ({word2})의 음소 분해: {decomp_word2}")
print(f"정확도: {accuracy:.2f}")
제시된 단어와 발음한 단어를 음소 단위로 구분하여 비교 후 정확도를 측정해주는 코드.
정확도가 일정 점수 이상이 아닐 경우 평가 불가, 일정 점수 이상일 경우 평가 진행.
10) siamese score & OpenCV score → final score
가중치 : final_score = opencv_score0.4 + siames_score 0.6
-
주사
원본
노이즈필터 한 번
VAD_record.wav
VAD_TTS_girl.wav
opencv : 51
siamese score : 81
final score : 69
-
사이
원본
노이즈필터 한 번
VAD_record.wav
VAD_TTS_man.wav
opencv : 66
siamese score : 47
final score : 55
-
기다리다
원본
노이즈필터 한 번
VAD_record.wav
VAD_TTS_girl.wav
opencv : 60
siamese score : 96
final score : 82
-
후추
원본
노이즈필터 한 번
VAD_record.wav
VAD_TTS_girl.wav
opencv : 46
siamese score : 88
final score : 71
-
운항
원본
노이즈필터 한 번
VAD_record.wav
VAD_TTS_girl.wav
opencv : 58
siamese score : 52
final score : 54
-
소리
원본
노이즈필터 한 번
VAD_record.wav
VAD_TTS_girl.wav
opencv : 70
siamese score : 52
final score : 59
11) 노이즈 제거 과정 추가 & 모델 재학습
기존의 음성데이터에서 보다 정밀하게 발음의 특징 정보를 추출하기 위하여 기존의 mel-spectrogram 이미지에서 노이즈를 더 제거해주는 전처리 과정을 추가하였다.
방법론으로서는, mel-spectrogram의 밝기가 높은 부분 ( 각 음소들의 발음에 대한 정보를 갖고있는 핵심 부분)만을 따로 추출해서 이를 추론에 이용하는 것이다. 아래의 mel-spectrogram에서 밝기가 상대적으로 높은 부분이 발음에 따라 변하는 고유한 형태이다.
“집을가다”라는 문장에 대한 mel-spectrogram”
해당 형태를 제외한 부분을 모두 필터를 거쳐 제거함으로써 음성의 발음만을 비교할 수 있도록 전처리를 거치는 것이다. 추가 처리가 이루어진 최종 mel 이미지는 아래와 같다.
해당 전처리 과정을 추가하여 데이터셋을 재생산, 모델의 재학습을 거쳐 최종적으로 siamese_net_r5.pt모델을 완성하였다.