이 글은 Today I Learn 시리즈의 151번째 기록입니다. (총 230개)

수백 곡을 다 들을 수는 없었다

생성 도구는 곡을 만들다가 6분이나 8분 언저리에서 그냥 잘라 버릴 때가 있다. 끝이 뚝 끊기는 곡이다. 매장에서 이게 나오면 바로 티가 난다.

문제는 수백 곡을 하나하나 끝까지 들을 수 없다는 것이었다. 그래서 사람 대신 소리로 판정하기로 했다. 제대로 끝나는 곡은 마지막에 소리가 잦아드는데, 잘린 곡은 맨 끝까지 소리가 그대로 크다. 끝부분 음량만 보면 갈릴 것 같았다.

사람이 못 하는 양을 기계로 거르는 것은 자동화의 정석이다. 다만 「사람이 듣는 것」을 그대로 흉내 내는 게 아니라, 사람이 듣고 판단하는 근거를 숫자 하나로 바꿀 수 있는지가 관건이었다.


처음 만든 기준으로는 절반이 걸렸다

첫 기준은 곡 전체의 평균 음량과 맨 끝을 비교하는 것이었다. 끝이 평균보다 크면 잘린 것으로 봤다. 돌려 보니 곡의 절반이 걸렸다.

배경음악은 원래 긴 페이드가 없다. 끝까지 비슷한 크기로 가다가 짧게 마무리되는 곡이 정상이다. 그러니 평균과 비교하면 멀쩡한 곡도 다 걸린다. 기준이 잘못된 게 아니라, 비교 대상이 우리 곡의 성격과 안 맞았다.

그래서 「끝 직전 몇 초」와 「맨 끝」을 비교하는 것으로 바꿨다. 곡마다 자기 자신과 비교하는 셈이라 장르나 편곡이 달라도 흔들리지 않고, 진짜 하드컷만 남았다.

자동 판정에서 어려운 건 판정하는 방법이 아니라 무엇과 비교할지를 정하는 일이다. 전체와 비교할지, 직전과 비교할지, 다른 곡과 비교할지에 따라 같은 방법이 전혀 다른 결과를 낸다.


걸린 곡을 지우지 않고 고치기로 했다

걸러 낸 곡을 어떻게 할지도 정해야 했다. 지우면 깨끗하지만, 곡 하나를 만드는 데 한 달 몫의 생성 한도가 들어간다. 끝만 어색한 곡을 통째로 버리는 건 아까웠다.

대신 끝에 4초 페이드를 걸어 스르륵 사라지게 마감했다. 원래 끝이 그랬던 것처럼 들린다.

고치면서 하나 챙긴 게 있다. 고친 파일을 새 곡으로 올리면 그 곡에 붙어 있던 분위기·장르 태그, 승인 상태, 재생목록 편성, 재생 기록이 전부 날아간다. 그래서 곡은 그 자리에 두고 소리만 갈아끼웠다.

파일을 고치는 일과 그 파일에 붙은 것들을 지키는 일은 별개다. 데이터를 갈아 끼울 때는 「무엇이 이것을 가리키고 있나」를 먼저 세어 본다. 가리키는 게 많을수록 새로 만들지 말고 제자리에서 고쳐야 한다.


검수 도구는 앱 밖에 따로 세웠다

이 검수를 앱의 관리자 화면에 넣을 수도 있었다. 그런데 이 일은 내 컴퓨터에 있는 원본 파일을 열어 소리를 재고, 고친 파일을 다시 올리는 일이다. 서비스 서버는 남의 클라우드에서 돌고 내 컴퓨터의 파일을 볼 수 없다.

그래서 검수 콘솔만은 내 컴퓨터에서 도는 작은 도구로 따로 세웠다. 앱은 매장이 쓰는 것이고, 이 도구는 내가 쓰는 것이라 굳이 한 몸일 이유도 없었다.

도구의 모양은 기능이 아니라 「그 일이 어디서 벌어지나」가 정한다. 손대야 할 것이 내 컴퓨터에 있으면 도구도 내 컴퓨터에 있어야 하고, 그러면 서비스에 짐을 지우지 않고 마음대로 고칠 수 있다.


「안 된다」가 고장이 아닌 경우가 있었다

같은 날 「필터가 안 걸린다」와 「재생목록이 안 만들어진다」를 짚었는데, 둘 다 기능은 멀쩡했다.

앞엣것은 조건을 바꿔도 저장을 눌러야 결과가 갱신되는 구조였다. 바꿔도 화면이 그대로니 안 걸리는 걸로 보였다. 뒤엣것은 운영자 권한으로 만들면 매장용이 아니라 운영자용으로 생겨서, 매장 화면에는 안 뜨는 것이었다.

증상은 같은 「안 된다」인데 하나는 화면이 늦게 따라온 것이고 하나는 만들어진 자리가 달랐던 것이다. 그래서 고치는 것도 기능이 아니라 각각 반영 시점과 만드는 규칙이었다.

안 된다고 느낄 때 기능부터 의심하면 대개 헛돈다. 먼저 물을 것은 「정말 없는가, 아니면 다른 데 있거나 아직 안 보이는가」다.


요약

  • 사람이 못 하는 양을 기계로 거를 때는, 사람이 판단하는 근거를 숫자 하나로 바꿀 수 있는지부터 본다.
  • 자동 판정의 어려움은 방법이 아니라 비교 대상에 있다. 전체와 비교할지 직전과 비교할지가 결과를 가른다.
  • 불량을 지울지 고칠지는 그것을 만드는 비용으로 정한다. 고칠 때는 제자리에서 고쳐 붙어 있던 것들을 지킨다.
  • 도구의 모양은 그 일이 어디서 벌어지는지가 정한다.
  • 「안 된다」는 없는 게 아니라 다른 데 있거나 아직 안 보이는 것일 수 있다.

Series: Today I Learn

1 C++ 자료형(Data Type) 2 MD5 vs pHash 3 C++에서 함수의 선언과 정의 4 Tkinter padx, pady 5 메모리와 포인터 변수 6 Call by Value, Call by Reference, Call by Pointer 비교 7 const 8 Gemfile — Jekyll 프로젝트의 의존성 파일 9 kramdown-parser-gfm — Jekyll의 GFM 파서 10 파서(Parser) 11 AHU vs OHU 12 I might try it vs I'll try it 뉘앙스 차이 13 SESSION_EXPIRE_AT_BROWSER_CLOSE=True 14 configuration key 15 Git stash vs discard 16 subprocess.Popen으로 Windows 탐색기에 명령어를 전달 17 Post 잔디 분석하기 18 Google Sheets Sync 최적화 19 DSL (Domain Specific Language)과 GPL (General Purpose Language) 20 마크다운 표 그리는 방법 21 쿼리 파라미터(Query Parameter). 기존 QR코드 재활용 22 Django 보안 취약점 점검 및 수정 23 OOP Object-Oriented Programming 객체 지향 프로그래밍 24 Fernet 대칭 암호화 25 Jekyll 코드블록 안의 Liquid 태그 26 습관만들기 Pawbit TIL 1 27 insertOnConflictUpdate vs DoUpdate(target) 28 세션 필터 29 아코디언(Accordiaon) UI를 펼친상태로 만들기 30 input의 step 31 습관만들기 Pawbit TIL 2 32 습관만들기 Pawbit TIL 3 33 Word Cloud 34 Google Sheets를 데이터 버스로(with AppSheet) 35 Django 모델 텍스트 필드 자동 수집 패턴 36 localStorage로 섹션 토글 상태 유지 37 순차 ID 생성(`select_for_update()` + `max()` 조합) 38 역참조 검색과 distinct() 39 xlsx 다운로드와 로딩 오버레이 충돌 40 Android 파일 공유 MIME 타입 41 AssetManifest — Flutter 빌드 타임 asset 목록 런타임 조회 42 크레센도 Phaser + TypeScript TIL 1 43 크레센도 Phaser + TypeScript TIL 2 44 크레센도 Phaser + TypeScript TIL 3 45 크레센도 Phaser + TypeScript TIL 4 46 크레센도 Phaser + TypeScript TIL 5 47 여둘까 Office Layout TIL 1 48 습관만들기 Pawbit TIL 4 49 여둘까 Office Layout TIL 2 50 여둘까 Office Layout TIL 3 51 크레센도 Phaser + TypeScript TIL 6 52 UTF-8 BOM과 PowerShell 파일 쓰기 53 소리꽃 KeyBloom TIL 1 54 습관만들기 Pawbit TIL 5 55 여둘까 Office Layout TIL 4 56 소리꽃 KeyBloom TIL 2 57 소리꽃 KeyBloom TIL 3 58 메트로놈 Simple Metronome TIL 1 59 소리꽃 KeyBloom TIL 4 60 메트로놈 Simple Metronome TIL 2 61 소리꽃 KeyBloom TIL 5 62 습관만들기 Pawbit TIL 6 63 크레센도 Phaser + TypeScript TIL 7 64 메트로놈 Simple Metronome TIL 3 65 소설 타임라인 관리 도구 Lumior TIL 1 66 습관만들기 Pawbit TIL 7 67 정적 블로그 SEO 정비와 Pagefind 검색 도입 68 크레센도 Phaser + TypeScript TIL 8 69 메트로놈 Simple Metronome TIL 4 70 습관만들기 Pawbit TIL 8 71 안드로이드 AudioTrack 연속 재생, 실측 피커 정렬, 카메라 토치 플래시 72 메트로놈 Simple Metronome TIL 5 73 모래게임 Sandrop TIL 1 74 습관만들기 Pawbit TIL 9 75 메트로놈 Simple Metronome TIL 6 76 모래게임 Sandrop TIL 2 77 모래게임 Sandrop TIL 3 78 습관만들기 Pawbit TIL 11 79 습관만들기 Pawbit TIL 10 80 메트로놈 Simple Metronome TIL 7 81 모래게임 Sandrop TIL 4 82 모래게임 Sandrop TIL 5 83 습관만들기 Pawbit TIL 12 84 모래게임 Sandrop TIL 6 85 소리꽃 KeyBloom TIL 6 86 모래게임 Sandrop TIL 7 87 모래게임 Sandrop TIL 8 88 소리꽃 KeyBloom TIL 7 89 모래게임 Sandrop TIL 9 90 소리꽃 KeyBloom TIL 8 91 모래게임 Sandrop TIL 10 92 소리꽃 KeyBloom TIL 9 93 콘티온 ContiOn TIL 1 94 소리꽃 KeyBloom TIL 10 95 콘티온 ContiOn TIL 2 96 습관만들기 Pawbit TIL 13 97 콘티온 ContiOn TIL 3 98 룸톤 Roomtone TIL 1 99 모래게임 Sandrop TIL 11 100 소리꽃 KeyBloom TIL 11 101 여둘까 Office Layout TIL 5 102 모래게임 Sandrop TIL 12 103 모래게임 Sandrop TIL 13 104 콘티온 ContiOn TIL 4 105 모래게임 Sandrop TIL 14 106 소리꽃 KeyBloom TIL 12 107 습관만들기 Pawbit TIL 14 108 모래게임 Sandrop TIL 15 109 모래게임 Sandrop TIL 16 110 소리꽃 KeyBloom TIL 13 111 온실 GreenHouse TIL 1 112 콘티온 ContiOn TIL 5 113 모래게임 Sandrop TIL 17 114 소리꽃 KeyBloom TIL 14 115 온실 GreenHouse TIL 2 116 콘티온 ContiOn TIL 6 117 모래게임 Sandrop TIL 18 118 콘티온 ContiOn TIL 7 119 모래게임 Sandrop TIL 19 120 소리꽃 KeyBloom TIL 15 121 룸톤 Roomtone TIL 2 122 모래게임 Sandrop TIL 20 123 모래게임 Sandrop TIL 21 124 소리꽃 KeyBloom TIL 16 125 소리꽃 KeyBloom TIL 17 126 소리꽃 KeyBloom TIL 18 127 여둘까 Office Layout TIL 6 128 소리꽃 KeyBloom TIL 19 129 소리꽃 KeyBloom TIL 20 130 콘티온 ContiOn TIL 8 131 콘티온 ContiOn TIL 9 132 로그스톤 상표 셀프 출원 TIL 1 133 소리꽃 KeyBloom TIL 21 134 로그스톤 샵 LogStone Shop TIL 1 135 소리꽃 KeyBloom TIL 22 136 로그스톤 샵 LogStone Shop TIL 2 137 룸톤 Roomtone TIL 3 138 소리꽃 KeyBloom TIL 23 139 모래게임 Sandrop TIL 22 140 모래게임 Sandrop TIL 23 141 소리꽃 KeyBloom TIL 24 142 로그스톤 샵 LogStone Shop TIL 3 143 모래게임 Sandrop TIL 24 144 소리꽃 KeyBloom TIL 25 145 모래게임 Sandrop TIL 25 146 MiniMacro TIL 1 147 룸톤 Roomtone TIL 4 148 모래게임 Sandrop TIL 26 149 콘티온 ContiOn TIL 10 150 Astro가 무엇인지, 왜 옮기는지 151 룸톤 Roomtone TIL 5 읽는 중 152 룸톤 Roomtone TIL 6 153 모래게임 Sandrop TIL 27 154 소리꽃 KeyBloom TIL 26 155 MiniMacro TIL 2 156 로그스톤 샵 LogStone Shop TIL 4 157 메트로놈 Simple Metronome TIL 8 158 모래게임 Sandrop TIL 28 159 여둘까 Office Layout TIL 7 160 룸톤 Roomtone TIL 7 161 메트로놈 Simple Metronome TIL 9 162 블로그 Astro 이관 TIL 163 여둘까 Office Layout TIL 8 164 로그스톤 샵 LogStone Shop TIL 5 165 모래게임 Sandrop TIL 29 166 오픈데이 Openday TIL 1 167 로그스톤 샵 LogStone Shop TIL 6 168 모래게임 Sandrop TIL 30 169 오픈데이 Openday TIL 2 170 모래게임 Sandrop TIL 31 171 Unreal Engine MCP TIL 1 172 모래게임 Sandrop TIL 32 173 소리꽃 KeyBloom TIL 27 174 콘티온 ContiOn TIL 11 175 오픈데이 Openday TIL 3 176 로그스톤 샵 LogStone Shop TIL 7 177 모래게임 Sandrop TIL 33 178 소리꽃 KeyBloom TIL 28 179 오픈데이 Openday TIL 4 180 여둘까 Office Layout TIL 9 181 오픈데이 Openday TIL 5 182 ScorePlayer TIL 1 183 모래게임 Sandrop TIL 34 184 BuildingHub TIL 1 185 ScorePlayer TIL 2 186 여둘까 Office Layout TIL 10 187 BuildingHub TIL 2 188 ScorePlayer TIL 3 189 Unreal Engine MCP TIL 2 190 궁 미로 PalaceMaze TIL 1 191 메트로놈 Simple Metronome TIL 10 192 메트로놈 Simple Metronome TIL 11 193 오픈데이 Openday TIL 6 194 BuildingHub TIL 3 195 Obsidian vault에서 코드만 빼기 — directory junction 196 ScorePlayer TIL 4 197 여둘까 Office Layout TIL 11 198 오픈데이 Openday TIL 7 199 URL은 바뀔 수 있는 것에 묶지 않는다 200 돌이키기 힘든 변경은 작게 먼저 확인한다 201 도구는 기능이 아니라 내 일에 맞는지로 고른다 202 궁 미로 PalaceMaze TIL 2 203 궁 미로 PalaceMaze TIL 3 204 소리꽃 KeyBloom TIL 29 205 오픈데이 Openday TIL 8 206 룸톤 Roomtone TIL 8 207 BuildingHub TIL 4 208 ScorePlayer TIL 5 209 로그스톤 샵 LogStone Shop TIL 8 210 여둘까 Office Layout TIL 12 211 오픈데이 Openday TIL 9 212 BuildingHub TIL 5 213 MiniMacro TIL 3 214 룸톤 Roomtone TIL 10 215 룸톤 Roomtone TIL 9 216 소리꽃 KeyBloom TIL 30 217 오픈데이 Openday TIL 10 218 여둘까 Office Layout TIL 13 219 룸톤 Roomtone TIL 11 220 소리꽃 KeyBloom TIL 31 221 궁 미로 PalaceMaze TIL 4 222 룸톤 Roomtone TIL 12 223 로그스톤 샵 LogStone Shop TIL 9 224 룸톤 Roomtone TIL 13 225 로그스톤 샵 LogStone Shop TIL 10 226 룸톤 Roomtone TIL 14 227 소리꽃 KeyBloom TIL 32 228 룸톤 Roomtone TIL 15 229 룸톤 Roomtone TIL 16 230 룸톤 Roomtone TIL 17