안녕하세요. まさきん입니다.
저희 집에서는 Sonos로 음악을 트는 일이 많습니다. 그런데 J-POP을 같이 따라 부르려고 하면 가사를 모르겠더라고요. 그래서 오늘 아침, 가사를 화면에 띄워 주는 앱을 만들어 봤습니다. Claude와 상의하면서 진행한 작업입니다.
※ 글 게시 시점의 정보입니다. 최신 조건은 공식 사이트에서 확인해 주세요.
- Sonos에서 재생 중인 곡에 맞춰, 지금 부르는 줄이 스마트폰에서 빛나는 앱을 만들었습니다
- Sonos 정보는 집에 있는 Mac에서 직접 읽어 옵니다
- 가사는 무료 공개 데이터베이스 ‘LRCLIB’에서 가져옵니다
- 가족에게 배포하는 건 Tailscale로 했고, 추가 비용은 0원이었습니다
- 상담을 시작해서 아내의 iPhone에서 돌아가기까지 아침 약 2시간이 걸렸습니다
만든 것
스마트폰으로 열면 Sonos에서 나오는 곡의 가사가 표시됩니다. 지금 부르는 줄이 하얗게 빛나고, 화면이 자동으로 스크롤되면서 현재 줄을 가운데에 맞춰 줍니다.
써 보니 편리했던 기능도 몇 가지 있습니다.
- 줄을 탭하면 Sonos가 그 줄의 처음부터 다시 재생
- 싱크가 어긋나는 곡은 ‘빠르게/느리게’로 0.3초씩 조정할 수 있고, 곡마다 기억
- ‘후보’에서 다른 버전의 가사로 바꿀 수 있음
- 방마다 다른 곡을 틀고 있어도 방을 고를 수 있음
- 홈 화면에 추가할 수 있고, 표시 중에는 화면이 꺼지지 않음
줄 탭 기능은 생각보다 훨씬 편했습니다. ‘후렴만 한 번 더’가 바로 됩니다. 노래 연습에도 쓸 수 있을 것 같아요.
시작은 “만들 수 있을까?” 한마디
아침 6시 40분쯤 Claude에게 “만들 수 있을까?” 하고 물어본 게 시작이었습니다. 가장 먼저 확인받은 건 음악을 어디서 재생하느냐였습니다.
답은 Sonos였습니다. 집 안에서만 쓸 거라는 점, 그리고 Mac이 항상 켜져 있다는 점도 전했습니다. 이 두 가지로 구조의 틀이 거의 정해졌습니다.
주로 듣는 게 J-POP이라는 이야기도 했습니다. 이게 가사를 어디서 가져올지 고르는 결정적인 기준이 됐습니다. 처음에 ‘어디서’와 ‘무엇을’을 정해 두면 이야기가 빨리 진행된다고 느꼈습니다.
전체 구조
구조는 세 가지 부품으로 이루어져 있습니다.
- Sonos 본체(집 네트워크 안)
- 집 Mac에서 돌아가는 작은 중계 서버
- 스마트폰으로 여는 화면(PWA)
Mac의 중계 서버가 Sonos에서 곡명과 재생 위치를 읽어 옵니다. 동시에 가사 데이터베이스에서 타임스탬프가 붙은 가사를 가져옵니다. 스마트폰은 Mac에 1초마다 “지금 어디야?” 하고 물어서 빛낼 줄을 정합니다.
중계 서버는 외부 패키지 없이 짜 달라고 했습니다. Mac 쪽에 새로 설치한 건 없습니다. 집에서 돌릴 거라면 부품이 적을수록 안심이 되는 것 같아요.
Sonos는 집 안에서 직접 읽는다
Sonos에는 공식 클라우드 API도 있습니다. 다만 개발자 등록이나 로그인 연동 같은 준비가 필요합니다.
| 읽는 방법 | 준비 | 동작 위치 | 어울리는 사용법 |
|---|---|---|---|
| 공식 클라우드 API | 개발자 등록·로그인 연동 | 어디서든 | 외출 중에도 조작하고 싶을 때 |
| 집 안에서 직접 | 거의 필요 없음 | 집 네트워크 안 | 집 안에서만 쓸 때 |
이번에는 집 안에서 쓸 거라 직접 읽는 방식을 택했습니다. Sonos는 집 네트워크 안에서 곡명과 재생 위치를 알려 줍니다. 집에 5대가 있는데 자동으로 찾아 주었습니다.
여러 방을 묶어서 재생하는 ‘그룹’도 그대로 읽을 수 있습니다. 그래서 방마다 다른 곡을 틀고 있어도 고를 수 있습니다.
가사는 LRCLIB에서 가져온다
가사는 시간 정보가 붙어 있는 것이 필요합니다. ‘이 줄은 1분 23초부터’ 같은 정보죠. 이런 형식을 LRC라고 부릅니다.
후보 몇 가지를 비교해 봤습니다.
| 가져올 곳 | 비용 | J-POP 타임스탬프 가사 | 사용 편의성 |
|---|---|---|---|
| LRCLIB | 무료 | 유명한 곡은 꽤 많음 | API 키 없이 조회 가능 |
| 음악 스트리밍 서비스의 가사 | 계약에 따라 다름 | 풍부함 | 개인용 창구가 없음 |
| 일본 가사 사이트 | 무료로 볼 수 있음 | 풍부함 | 개인용 창구가 없음 |
LRCLIB은 자원봉사자들이 모으는 공개 데이터베이스입니다. J-POP이 얼마나 있는지 실제로 몇 곡 시험해 봤습니다.
- 요네즈 켄시(米津玄師), YOASOBI, Official髭男dism, Vaundy, Mrs. GREEN APPLE은 타임스탬프 가사가 있었음
- 스피츠, 유우리(優里), Creepy Nuts도 타임스탬프 가사가 있었음
- 곡명 완전 일치로 안 나오는 곡도 유사 검색으로 찾을 수 있었음
- 동요는 못 찾는 것도 있었음
가족이 함께 듣는 유명한 곡이라면 상당 부분 커버될 것 같습니다. 못 찾는 곡은 직접 LRC 파일을 넣어 두면 쓸 수 있게 만들어 달라고 했습니다.
로마자 곡명에서 막혔다
만들자마자 곤란한 일이 생겼습니다. 표시된 가사가 로마자였던 겁니다.
원인은 재생하던 YouTube Music의 곡 정보였습니다. 아티스트명이 ‘Aimyon’이나 ‘Kenshi Yonezu’처럼 로마자로 들어옵니다. 그대로 검색하니 로마자 가사가 선택되어 버렸습니다.
그래서 가사 속 일본어 비율을 점수에 반영하도록 했습니다. 가나나 한자가 많은 버전을 우선하는 방식입니다. 아티스트명이 로마자냐 일본어냐의 차이는 감점하지 않도록 했습니다.
곡명 쪽에도 궁리한 점이 있습니다. ‘타다 코에 히토츠 - One Voice’처럼 영어 부제가 붙는 곡이 있기 때문입니다. 부제나 괄호를 뗀 이름으로도 검색하도록 했습니다.
- 일본어 버전에 번역 가사가 섞여 있으면 로마자 버전이 선택되는 경우가 있습니다
- 요네즈 켄시의 ‘Lemon’이 바로 이 경우였습니다
- 그럴 때는 화면의 ‘후보’에서 다른 버전으로 바꿀 수 있습니다
1초 미만으로 맞추는 요령
또 하나의 과제는 타이밍 어긋남이었습니다. Sonos가 알려 주는 재생 위치는 초 단위에서 버림한 숫자입니다. 그대로 쓰면 최대 1초가 어긋납니다.
가사에서 1초는 의외로 큽니다. 줄이 늦게 바뀌면 노래 첫 소절을 놓치게 됩니다.
그래서 조금 궁리를 더해 달라고 했습니다. 실제 위치는 ‘돌아온 초’와 ‘그 1초 뒤’ 사이에 있을 겁니다. 화면 쪽에서 진행시키고 있는 예측값을 계속 그 범위 안에 붙잡아 둡니다.
1초마다 물어보는 사이에 범위가 점점 좁혀집니다. 테스트에서는 어긋남이 0.5초 이내로 들어왔습니다. 원리를 이해한 순간은 좀 짜릿했습니다.
스마트폰에서 쓰려면 HTTPS가 필요하다
처음에는 집 네트워크 안에서 그냥 열어서 썼습니다. 동작은 했지만 곤란한 점이 두 가지 있었습니다.
- 홈 화면에 추가해도 앱처럼 열리지 않음
- 노래하는 도중에 화면이 어두워짐
둘 다 HTTPS로 연 페이지에서만 쓸 수 있는 기능이었습니다. 화면을 꺼지지 않게 하는 기능(Wake Lock)은 보안 연결이 전제입니다.
여기서 도움이 된 게 원래 설치해 두었던 Tailscale입니다. Tailscale의 ‘serve’ 기능으로 Mac 서버에 정식 인증서가 붙은 URL이 생겼습니다. IP 주소를 고정할 필요도 없어집니다.
집 안의 이런 장치들은 늘 통신 위에서 돌아갑니다. 가족 스마트폰으로 쓰는 장치가 늘어날수록 회선 내용도 신경 쓰이게 되네요.
가족에게 배포한다면 Tailscale
아내도 쓸 수 있게 하고 싶어서 배포 방법을 고민했습니다.
| 배포 방법 | 상대가 할 일 | 사용감 | 신경 쓰이는 점 |
|---|---|---|---|
| 집 Wi-Fi에서 직접 열기 | 없음 | 화면이 꺼짐·앱처럼 안 됨 | 집 밖에서는 못 씀 |
| Tailscale에 초대 | 앱 설치 후 로그인 | 앱처럼 쓸 수 있음 | VPN 앱이 하나 늘어남 |
| 공개 URL에 로그인 걸기 | 처음에 이메일 인증 | 앱처럼 쓸 수 있음 | 설정 수고가 늘어남 |
아내는 다른 앱도 Tailscale을 통해 쓸 예정이라 초대하는 방식으로 했습니다. Tailscale의 개인용 무료 플랜은 최대 6명까지 쓸 수 있습니다. 가족이 쓰기에는 충분하죠.
아내 iPhone에서의 절차는 다음 네 가지뿐이었습니다.
- 초대 링크를 열고 계정을 만든다
- App Store에서 Tailscale을 설치하고 같은 계정으로 로그인한다
- ‘VPN 구성 추가’를 허용한다
- Safari에서 URL을 열고 홈 화면에 추가한다
아내 iPhone에서 보이지 않았던 이유
절차대로 진행했는데도 아내 iPhone에서 Mac이 보이지 않았습니다. Tailscale 앱은 ‘연결됨’ 상태였습니다. 그런데 보이는 기기가 자기 한 대뿐이었습니다.
관리 화면을 보니 기기 상태에 ‘Owner needs approval’이라고 떠 있었습니다. 기기가 아니라 사용자 승인 대기였던 겁니다.
공식 설명에 따르면 2025년 5월 22일 이후에 만든 tailnet은 사용자 승인이 처음부터 켜져 있습니다. 승인 전의 사용자는 Tailscale에 접속은 됩니다. 하지만 다른 기기와는 통신할 수 없습니다.
관리 화면의 ‘Users’에서 승인하자 바로 보이게 됐습니다. 가족을 초대할 때는 이 부분을 기억해 두면 좋겠습니다.
Mac에서 계속 돌리기 위한 소소한 팁
중계 서버는 Mac의 상주 실행 구조(launchd)로 돌리고 있습니다. 죽어도 자동으로 다시 뜨도록 설정했습니다.
저희 집만의 규칙이 하나 있습니다. launchd로 프로그램을 직접 실행하면 문서 폴더를 읽지 못해 죽는 경우가 있습니다. 그래서 셸을 거쳐 실행하는 형태로 통일하고 있습니다.
이번에도 Claude가 처음에는 직접 실행하는 형태로 작성했습니다. 저희 집 체크 장치가 이를 잡아내서 바로 고쳐 받을 수 있었습니다. 집의 규칙을 문서로 정리해 두면 AI와 작업할 때도 효과가 있다고 느낍니다.
들어간 비용과 시간
| 항목 | 내용 |
|---|---|
| 추가 비용 | 0원 |
| Sonos 읽기 | 집 안에서 직접(등록 불필요) |
| 가사 | LRCLIB(무료) |
| 가족 배포 | Tailscale 무료 플랜 |
| 소요 시간 | 아침 6시 40분에 상담 시작→9시쯤 아내 iPhone에서 동작 |
Mac은 원래 항상 켜 두던 것을 쓰고 있습니다. 새로 산 건 없습니다.
잘 맞는 사람·안 맞는 사람
잘 맞을 것 같은 건 이런 가정입니다.
- Sonos로 음악을 틀고, 가족이 함께 노래하는 일이 많다
- 집에 항상 켜져 있는 Mac이나 PC가 있다
- Tailscale을 쓰고 있거나 써 보고 싶다
반면 안 맞는 경우도 있습니다.
- 집에 항상 켜져 있는 컴퓨터가 없다
- TV나 외부 입력 소리를 Sonos로 트는 일이 많다(곡명이 전달되지 않아 가사가 안 나옴)
- 동요나 별로 알려지지 않은 곡을 자주 듣는다
- 집에 항상 켜져 있는 Mac이나 PC가 있다
- Sonos로 음악 스트리밍 서비스의 곡을 틀고 있다
- 가족 스마트폰에 앱을 하나 설치해 달라고 할 수 있다
- 가사를 못 찾는 곡은 직접 준비할 각오가 되어 있다
자주 묻는 질문
Q. 프로그래밍 지식이 필요한가요?
이번에는 코드를 전부 Claude가 작성해 주었습니다. 다만 Mac의 터미널이나 launchd 개념을 알면 안심이 됩니다. 막혔을 때 어디가 문제인지 함께 생각하기가 쉬워집니다.
Q. Spotify나 Apple Music에서도 쓸 수 있나요?
Sonos로 재생하고 있다면 곡명과 재생 위치는 Sonos에서 가져올 수 있습니다. 그래서 스트리밍 서비스 종류는 크게 상관없을 겁니다. 제가 시험해 본 건 YouTube Music뿐입니다.
Q. 가사를 못 찾는 곡은 어떻게 되나요?
화면에 ‘가사를 찾지 못했습니다’라고 나옵니다. ‘후보’에서 다른 버전을 다시 찾아볼 수 있습니다. 그래도 없으면 직접 LRC 파일을 넣어 두면 다음부터 쓸 수 있습니다.
Q. 집 밖에서도 쓸 수 있나요?
Tailscale을 거치면 외출 중에도 열 수 있습니다. 다만 표시되는 건 집 Sonos에서 흐르는 곡입니다. 밖에서 듣고 있는 곡의 가사가 나오는 건 아닙니다.
Q. 가사 타이밍이 어긋날 때는요?
화면 아래의 ‘빠르게/느리게’로 0.3초씩 조정할 수 있습니다. 조정한 값은 곡마다 기억하므로 다음부터는 그대로 적용됩니다.
Q. iPhone에서도 화면이 꺼지지 않게 되나요?
HTTPS로 열었다면 최근 iOS에서는 작동할 겁니다. 오래된 iOS에서는 홈 화면에서 열었을 때 작동하지 않는 경우가 있습니다. iOS를 최신으로 유지해 두면 안심입니다.
Q. 월 비용이 드나요?
저희 집의 경우 0원이었습니다. LRCLIB은 무료이고, Tailscale은 개인용 무료 플랜 범위 안입니다. Mac 전기료 정도일 것 같아요.
참고한 공식 정보
- LRCLIB(타임스탬프 가사 공개 데이터베이스)
- LRCLIB API 문서
- Tailscale serve(tailnet 안에 서비스를 공개하는 기능)
- Tailscale HTTPS 인증서 활성화
- Tailscale 사용자 승인
- Tailscale 요금제
- MDN Screen Wake Lock API
- Sonos 개발자 문서
집 자동화 이야기는 다른 글에도 썼습니다. Cloudflare Workers 무료 플랜에서 Cron이 부족해졌을 때와 학교 안내문을 집 사이니지에 띄우는 구조도 함께 읽어 보세요.
마무리
“만들 수 있을까?”로 시작해서 아침 2시간 만에 가족이 쓸 수 있는 데까지 왔습니다. 어려웠던 건 로마자 곡명과 타이밍 어긋남 정도였습니다. 둘 다 실제 곡으로 시험하면서 고칠 수 있었습니다.
가사를 따라가며 가족과 함께 노래하는 건 생각보다 훨씬 즐겁습니다. Sonos가 있는 집이라면 한번 시도해 볼 가치가 있을지도 모릅니다.
이 글에는 제휴 광고가 포함되어 있습니다. 이 사이트의 링크를 통해 상품·서비스에 신청하시면 제휴사로부터 보상을 받을 수 있습니다. 또한 운영자는 라쿠텐 그룹 소속 직원으로, 사원 추천 프로그램을 통해 보상을 받는 경우가 있습니다. 기사 내용과 평가는 광고 유무와 관계없이 운영자의 실제 경험과 조사를 바탕으로 작성했지만, 위 관계를 이해하신 후 읽어 주시기 바랍니다. 자세한 내용은 면책조항·제휴 링크 안내를 참고해 주세요. 면책조항·제휴 링크 안내
이 글에는 기계 번역이 포함되어 있습니다. 정확한 조건은 라쿠텐 모바일 공식 사이트의 다국어 페이지에서 확인해 주세요.
라쿠텐 모바일의 통신 지역·전파 상황이 궁금하신 분은, 공식 전파 개선·조사 요청 양식 을 통해 문의하실 수 있습니다.