Skip to content

engine-v0.3.0

Latest

Choose a tag to compare

@github-actions github-actions released this 04 Aug 07:14
· 8 commits to master since this release

everyric2 엔진 0.3.0

정렬기가 통째로 바뀌었어요. 상업적으로 쓸 수 없는 모델(MMS, CC-BY-NC)이 핵심 정렬을
맡고 있던 걸 걷어내고, 새 정렬 스택(OWSM-CTC v4 1B · omniASR-CTC 앵커 + BS-PolarFormer
분리기 + 2패스 정밀화)으로 갈아탔습니다. 정렬 품질이 올라갔고, 라이선스 구성도 훨씬
깨끗해졌어요.

자체 호스팅 중이시면 §업그레이드를 꼭 보고 올려 주세요 — 이번 버전부터 서버와 워커를
반드시 함께 재기동해야 합니다.


무엇이 달라졌나

정렬 스택 전면 교체

이전 지금
정렬 음향모델 facebook/mms-1b-all OWSM-CTC v4 1B + omniASR-CTC-300M
보컬 분리 htdemucs BS-PolarFormer(fp16)
2패스 정밀화 없음 omniASR 재사용

곡마다 세 단계 중 필요한 만큼만 씁니다 — 대부분은 fast(분리 없이 앵커만)에서 끝나고,
정렬 신뢰도가 낮으면 자동으로 medium/heavy로 올라가 분리·정밀화를 태웁니다. 사용자가
직접 「분석 깊이 올리기」로 요청할 수도 있어요.

분리를 함께 태운 조합은 앵커만 썼을 때보다 +26.7pp 좋아졌습니다. 그래서 medium/heavy
에서는 분리를 필수로 두고, 자산이 없으면 조용히 낮은 품질로 떨어지는 대신 명시적으로
실패하게 했어요.

속도

같은 엔진을 쓰는 두 번째 곡부터 모델을 다시 안 올립니다(웜 캐시). 짧은 곡에서는 이
적재 시간이 전체의 40%를 넘기도 했어요. 다만 heavy 깊이의 OWSM은 매번 별도 프로세스를
띄우는 구조라 이 혜택을 못 받습니다(§알려진 한계).

정직해진 표시

  • fast로 도는 곡에 「보컬 분리」 단계가 뜨던 것 — 실제로 안 하는 작업이었습니다. 이제
    실제로 분리할 때만 표시돼요.
  • 남은 시간(ETA)이 분석 깊이가 올라가는 순간 그에 맞게 다시 계산됩니다.
  • 저장 기록의 엔진 이름이 실제 사용 엔진으로 남습니다(예전엔 신 스택으로 돌아도 ctc
    적혔어요).

새 기능

  • 남은 횟수 API — 싱크 생성·초기화·커버 잇기·정렬 업그레이드 각각의 잔여와 회복
    시각. 정렬 업그레이드는 생성과 별도 예산(기본 10회/24시간)입니다.
  • 공지 다국어 — 공지에 언어별 본문을 실을 수 있고, 없으면 기본 언어로 표시됩니다.
  • 가사 출처 정확도 — 같은 곡의 롱/숏 버전을 영상 제목으로 가려내고, 동명이곡 오채택도
    줄였습니다.

라이선스

이번 교체의 직접 동기입니다. 이전 스택의 핵심 정렬 모델이 비상업 라이선스였어요.

구성요소 모델 라이선스 상업 사용
정렬 앵커(주력) facebook/omniASR-CTC-300M Apache-2.0 가능
정렬 앵커(heavy 전용) espnet/owsm_ctc_v4_1B CC-BY-4.0 판단 필요(아래)
보컬 분리 BS-PolarFormer fp16 (ZFTurbo MSST) MIT 가능
영어 발음 사전 CMU Pronouncing Dictionary(동봉) BSD 계열 (Carnegie Mellon) 가능
중국어 발음 pypinyin MIT 가능

이전 스택: 정렬 모델 facebook/mms-1b-allCC-BY-NC-4.0(상업 부적합), 분리기
htdemucs는 가중치 라이선스가 불명확한 상태였습니다.

솔직하게 적으면 — "이제 완전히 자유롭다"는 과장입니다. 가장 위험했던 MMS는 확실히
해소했고, 주력 앵커(omniASR)는 깨끗합니다. 다만 heavy 깊이에서만 쓰는 OWSM은 가중치
자체는 CC-BY-4.0으로 허여됐지만 훈련 데이터에 NC/ND 코퍼스가 섞여 있어(논문 부록에
명시) 「가중치가 데이터 제약을 물려받는가」라는 미확정 영역이 남습니다. 판단이 필요한
영역으로 남겨 둡니다.

멜로디 추출(RMVPE/FCPE)은 이번 교체 대상이 아니고, 가중치 출처 확인이 여전히 미해결로
남아 있습니다.

참고: 이 배치 중간에 영어 발음용으로 GPL-3.0 패키지가 잠깐 들어왔다가, 태그 전에
제거했습니다. CMU 사전 데이터 자체는 BSD 계열이고 GPL은 그걸 감싼 패키지만의
선택이라, 원본 데이터를 리포에 동봉하고 파서를 직접 구현하는 쪽으로 바꿨어요. 사전
전체 126,052개 표제어를 대조해 결과가 한 건도 달라지지 않은 것을 확인했습니다.


업그레이드

준비물부터 확인하세요

새 정렬 스택은 자산 세 가지가 서버에 있어야 합니다(자동으로 안 받아옵니다):

  1. BS-PolarFormer 체크포인트 + MSST 벤더 소스(핀 커밋 일치 필요)
  2. audio-separator + PoPE-pytorchuv sync --extra separator로 설치
  3. OWSM 전용 격리 환경(.venv-owsm) — ESPnet이 메인 환경과 버전 충돌

셋 다 없어도 fast 깊이(대부분의 곡)는 정상 동작하고, medium/heavy로 올라가는 곡만
명시적으로 실패합니다. 준비가 안 됐으면 환경변수로 구 스택 임시 운영도 가능해요
(EVERYRIC_ALIGNMENT_ENGINE=ctc + EVERYRIC_AUDIO_SEPARATOR_BACKEND=htdemucs).

순서

# 1. DB 백업 — 스키마 변경(공지 다국어 컬럼)이 서버 기동 시 자동 적용됩니다
cp everyric2.db everyric2.db.bak

# 2. 코드·의존성
git pull && uv sync --extra separator

# 3. 서버와 워커를 함께 재기동 (아래 주의)
sudo systemctl restart everyric2
sudo systemctl restart everyric2-worker

# 4. 확인
.venv/bin/python scripts/verify_deploy.py <서버URL>

롤백

새 필드는 전부 선택적이고 컬럼도 nullable이라, 구버전 코드로 되돌려도 DB는 되돌릴
필요가 없습니다
— 구코드는 새 컬럼을 그냥 무시해요. git checkout <이전 태그>
uv sync --extra separator를 다시 돌리고, 서버·워커를 함께 재기동하면 됩니다.

되돌리는 지점에 따라 두 가지가 딸려 옵니다: 발음 사전 동봉 이전으로 가면 GPL 패키지가
다시 설치되고
, 더 이전으로 가면 중국어 발음도 함께 빠집니다. 둘 다 롤백의 의도된
부작용이지 새 결함은 아닙니다. 자세한 절차는 deploy/DEPLOY.md §10을 보세요.


알려진 한계

  • heavy 깊이는 여전히 느립니다. OWSM은 호출마다 격리 환경을 새로 띄우는 구조라 웜
    캐시가 안 먹습니다(적재만 9초 남짓). 상주 프로세스로 바꾸는 건 별도 과제로 남겼어요.
  • OWSM 라이선스는 위에 적은 대로 판단이 필요한 영역입니다.
  • 중국어 발음 표기는 실제 곡으로 검증하지 못했습니다 — 중국어 원문 곡 싱크가 아직
    없어서, 유입되면 그때 확인합니다.
  • 정렬 세부 지표(전체 평균 처리 시간, 붕괴 곡 비율 등)는 인용할 수 있는 측정 기록이
    없어 적지 않았습니다.

함께 나간 변경

진행 표시 정직화 · 가사 출처 판별 개선 · 남은 횟수 API · 공지 다국어 · 발음 표기 의존성
정리 · 엔진 웜 캐시 · 소스 배포판 크기 정상화(3.6GB → 1.5MB).

크롬 확장 쪽 변화는 chrome-v1.6.0에 있습니다 — 그 노트에서 "서버
업데이트 필요"라고 적힌 항목들의 실제 내용이 이 문서예요.

Full Changelog: chrome-v1.6.0...engine-v0.3.0