룸톤 Roomtone TIL 1
파는 물건이 파일이라 보호가 먼저였다
룸톤이 파는 것은 곡 파일이다. 매장이 돈을 내고 듣는 것도, 남이 공짜로 가져갈 수 있는 것도 같은 파일이다. 그래서 첫날 정할 것은 어떻게 재생하느냐가 아니라 어떻게 아무나 못 받아가게 하느냐였다.
정리하면 층이 셋이었다.
- 저장소를 열어 두고 주소만 알면 받게 두기. 가장 싸지만 주소 하나가 새면 끝이다.
- 저장소는 잠가 두고 우리 서버를 거쳐서만 내보내기. 곡을 틀 때마다 잠깐만 살아 있는 주소를 새로 만들어 준다.
- 파일 자체를 암호로 잠가서 앱만 풀 수 있게 하기. 가장 단단하지만 만드는 일도 많다.
가운데를 먼저 골랐다. 주소가 새어도 금방 죽고, 곡 하나씩 발급하니 한 번에 카탈로그 전체가 털리지도 않는다. 파일 자체를 잠그는 일은 외부 고객을 받기 전에 하기로 미뤘다.
여기서 확실히 해 둔 게 하나 있다. 스피커로 나온 소리를 녹음하는 건 어떤 방법으로도 못 막는다. 그러니 목표는 「못 가져가게 한다」가 아니라 「그냥 파일을 복사해 가는 것보다 번거롭게 만든다」다. 막을 수 없는 것을 목표로 잡으면 아무리 만들어도 부족해 보인다.
보호를 택하면 편의를 잃는다
곡 주소가 몇 분이면 죽게 해 두니 바로 대가가 나왔다. 재생 라이브러리에는 곡 여러 개를 미리 담아 두고 알아서 이어 트는 기능이 있는데, 그걸 쓸 수 없다. 뒤쪽 곡의 주소가 실제로 재생될 때쯤엔 이미 죽어 있기 때문이다.
그래서 곡이 끝나는 것을 지켜보다가 그때 다음 곡의 주소를 새로 받아 잇는 방식으로 만들었다. 기성 기능 하나를 못 쓰고 직접 이어 붙인 셈이다.
보호를 한 단계 올리면 기성품이 맞물리지 않는 자리가 생긴다. 그 비용을 미리 세어 두면 「이만큼 막기 위해 이만큼 직접 만든다」는 교환이 되고, 안 세어 두면 나중에 왜 이게 이렇게 복잡한지 모르게 된다.
매장은 화면을 켜 두지 않는다
앱을 만들면서 확인해야 할 게 있었다. 매장 기기는 화면을 끈 채로 하루 종일 음악만 트는 상태가 정상이다.
그런데 요즘 휴대기기 운영체제는 화면이 꺼지면 앱을 재운다. 계속 소리를 내려면 시스템에 「지금 음악을 틀고 있다」고 신고하고 알림을 띄워 둬야 한다. 그 대가로 시스템이 앱을 함부로 끄지 않는다.
이건 기능이 아니라 사용 환경에서 나온 요구였다. 만들기 전에 「이 앱이 실제로 놓이는 상태는 무엇인가」를 물었기 때문에 첫날 걸렸다. 나중에 이 장치가 슬쩍 풀려 재생이 끊기는 일이 다시 생기는데, 그때 원인을 빨리 찾은 것도 여기서 한 번 짚어 뒀기 때문이다.
음량을 어디서 맞출지 정했다
생성 도구로 뽑은 곡은 음량이 제각각이라 이어 틀면 소리가 튄다. 맞출 자리가 둘이었다.
재생할 때 앱이 곡마다 볼륨을 조절하거나, 올릴 때 파일 자체를 같은 음량으로 구워 두거나. 앞엣것은 원본을 안 건드려서 깔끔해 보이지만, 재생하는 쪽마다 같은 계산을 넣어야 하고 기기에 따라 소리를 키우는 쪽이 막히기도 한다.
올릴 때 굽는 쪽으로 정했다. 재생하는 쪽을 여러 개 만들 생각이라면, 공통으로 거치는 앞단에서 한 번 해결하는 게 전체가 단순해진다.
같은 자리에서 하나 더 정했다. 음량을 맞추는 폭에 위아래 한계를 두는 것이다. 측정이 잘못된 곡 하나가 크게 보정돼 매장에서 갑자기 커지면, 그 사고 한 번이 서비스 전체의 인상을 정한다. 자동으로 손보는 장치에는 「최악의 경우 얼마나 어긋날 수 있나」를 먼저 묶어 둔다.
재생 한 번을 어디서 셀지 정했다
인기 곡 순서를 만들려면 재생을 세야 하는데 기준이 애매했다. 끝까지 들은 것만 셀지, 튼 순간을 셀지.
끝까지 들은 것만 세면 정확하지만 건너뛴 곡은 안 세어지고, 그걸 알아내려면 장치가 하나 더 필요하다. 곡을 틀려면 반드시 주소를 받아 가야 하니, 그 지점에서 세기로 했다. 이건 「재생을 시작했다」이지 「끝까지 들었다」가 아니다.
편성에 참고하려는 숫자니까 이 정도면 충분하다고 봤다. 완청률이 필요해지는 날이 오면 그때 따로 만들면 된다.
지금 필요한 정확도가 어디까지인지 먼저 정하면, 그보다 정확한 것을 만드느라 쓰는 시간을 아낄 수 있다. 다만 이 정의가 나중에 다른 일의 조건이 된다는 것도 같이 알아 두는 게 좋다.
자동 분류의 한계는 도구가 아니라 입력에 있었다
프롬프트에서 장르를 자동으로 뽑아 태그 초안을 채우게 했다. 트로피컬 하우스 곡에 「기타」가 장르로 붙었다. 프롬프트에 기타가 쓰여 있으니 걸린 것인데, 거기서 기타는 여러 악기 중 하나지 장르가 아니다. 정작 첫머리에 적힌 진짜 장르는 사전에 없어서 놓쳤다.
단어가 있는지만 보고 그 단어가 문장에서 무슨 역할인지는 못 보는 게 이 방식의 한계다. 더 똑똑한 방법으로 갈 수도 있었지만, 반대편을 보니 답이 달랐다. 「집 편안」 두 단어짜리 프롬프트에서는 어떤 방법을 써도 장르를 뽑을 수 없다.
그래서 도구를 정교하게 만들기 전에 프롬프트를 충실히 쓰는 쪽을 먼저 하기로 했다. 자동 분류의 성능은 분류기보다 입력의 질에 더 크게 걸려 있다.
요약
- 막을 수 없는 것(스피커 녹음)을 목표로 잡지 않는다. 목표는 「그냥 복사하는 것보다 번거롭게」다.
- 보호를 올리면 기성품이 안 맞물리는 자리가 생긴다. 그 비용을 미리 세어 두면 교환이 되고, 안 세면 복잡함만 남는다.
- 만들기 전에 「이 물건이 실제로 놓이는 상태」를 묻는다. 매장 기기는 화면이 꺼진 채 하루 종일 돈다.
- 여러 재생기가 생길 일이면 공통으로 거치는 앞단에서 한 번 해결한다. 자동 보정에는 최악의 어긋남을 묶어 둔다.
- 지금 필요한 정확도를 먼저 정한다. 다만 그 정의가 나중 일의 조건이 된다.
- 자동 분류의 성능은 분류기보다 입력의 질에 더 걸려 있다.