얼쑤는 녹음에서 추정한 음높이를 악보와 맞춘 뒤 음표마다 판정을 내립니다. 처음에는 어느 프레임에서도 음높이를 찾지 못했을 때 NO_SOUND로 끝냈습니다. 잡음을 음높이로 잡으면 이 검사를 통과할 수 있었습니다. 그러면 악보의 모든 음표를 놓쳤는데도 분석이 완료돼 0점이 나왔습니다.
이 경우를 고정하려고 악보 길이에 맞춘 음높이 배열을 만들었습니다. 대부분을 무음으로 표시하고 다섯 프레임에만 음높이 값을 넣었습니다. 마이크로 잡음을 녹음하는 대신, 음높이 추정 단계가 몇 프레임을 소리로 넘긴 상황을 재현한 입력입니다. 기존에는 이 배열이 DONE과 0점을 냈습니다.
모든 음표가 MISSED면 NO_SOUND
채점기는 악보와 녹음을 맞춘 뒤 음표별로 소리가 있는 프레임을 셉니다. 그 수가 음표의 기준 길이를 프레임 수로 환산한 값의 30% 미만이면 MISSED입니다. 이 판정은 음높이가 맞는지를 보기 전에 일어납니다. 다섯 프레임에만 소리가 잡힌 사례에서는 끝까지 계산해도 모든 음표가 MISSED였습니다.
이미 계산한 판정을 사용해, 모든 음표가 MISSED이면 점수를 합산하기 전에 FAILED와 NO_SOUND를 반환하도록 바꿨습니다. 처음부터 음높이가 한 프레임도 없는 경우에는 기존의 빠른 판정을 유지했습니다.
if all(note.verdict == "MISSED" for note in results):
return ScoreResult("FAILED", "NO_SOUND")
회귀 검사에서는 같은 다섯 프레임 배열이 NO_SOUND가 되는 것을 확인했습니다. 정확한 음표 하나만 채운 배열은 DONE으로 남고 다른 음표만 MISSED였습니다. 음높이를 전부 한 옥타브 올린 별도 합성 배열은 음표 11개가 모두 PITCH로 남아도 DONE이었습니다. 이 검사는 소리가 부족해 채점할 수 없는 경우와 음정이 틀려 점수가 낮은 경우를 구분합니다.
무음 녹음의 업로드와 실패 저장 확인
분석 서비스는 NO_SOUND 같은 판정을 결과 본문에 담아 반환합니다. 백엔드는 이를 녹음에 대한 분석 실패로 기록하고, 앱은 다시 연주하는 흐름을 제시합니다. 다운로드 장애나 분석 서비스의 예외처럼 다시 실행할 수 있는 실패는 서버 오류로 따로 다룹니다.
별도의 운영 경로 검증에서는 1,450ms·1,336바이트짜리 합성 무음 AAC를 올렸습니다. 업로드가 202로 접수된 뒤 2.76초에 FAILED와 NO_SOUND를 확인했고, 평가와 음표 결과는 DB에 각각 0건이었습니다. 이 검증은 무음 AAC의 업로드부터 실패 저장까지를 확인했습니다. 잡음 다섯 프레임의 판정 전후는 앞의 고정 배열로 확인한 결과입니다.

댓글
댓글과 반응은 GitHub 계정으로 로그인해 남길 수 있어요.