「100% 로컬」 은 미디어 파일 얘기다 — Whisper 와 ffmpeg 를 WASM 으로 밀어 넣은 대가
브라우저 로컬 영상 편집기 rescript 를 직접 돌려 보고 확인한 것
「100% 로컬」 이라는 말은 미디어 파일이 밖으로 안 나간다는 뜻이다. 아무 데이터도 안 나간다는 뜻은 아니다. 그리고 로컬로 돌리는 대가는 첫 실행 때 모델 다운로드와, 서버 설정이 필요한 SharedArrayBuffer 로 돌아온다. 이 글을 읽으면 「로컬 우선」 도구를 고를 때 무엇을 확인할지, 비슷한 걸 직접 만들 때 무엇을 각오할지 알 수 있다.
돌려 본 것
Threads 에서 rescript(github.com/wassgha/rescript)가 공유됐다. 「전사된 텍스트를 지우면 영상 · 오디오가 그 구간만큼 잘리는, 100% 브라우저 로컬 편집기」 다. 클론해서 직접 돌려 봤다(2026-08-24).
npm install 741 packages / node_modules 1.3GB
기동 Next.js 16, Ready in 273ms
전사 샘플 영상(11.5초) 정확히 전사. 화자 구분 · 단어별 타임라인까지
직접 만든 세 문장짜리 샘플이 오타 없이 그대로 나왔다. 전사 품질은 좋았다.
로컬의 실체
서버가 없는 게 아니라, 모델과 ffmpeg 를 통째로 브라우저에 밀어 넣은 구조다. README 기준으로 전사는 transformers.js 로 Whisper(base · small 의 timestamped 판)를 돌리고, 구간 자르기와 내보내기는 멀티스레드판 ffmpeg.wasm(WebAssembly 로 컴파일한 ffmpeg)이 한다. WebGPU 가 있으면 추론에 쓰고, 없으면 WASM 으로 돌아간다.
대가 1 — 실행 조건
README 는 Chromium 계열 브라우저를 권하고, 웹판은 SharedArrayBuffer 가 필요하다고 적는다. 멀티스레드 ffmpeg 가 스레드끼리 메모리를 나누는 데 쓰는 것이다. 문제는 이게 crossOriginIsolated 상태에서만 열린다는 점이다. 그러려면 페이지를 내주는 서버가 헤더 두 개를 보내야 한다.
Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp
로컬 처리를 하려고 서버 설정을 만져야 하는 셈이다. require-corp 를 켜면 CORP · CORS 헤더 없는 외부 이미지 · 스크립트가 막히니, 기존 서비스에 붙일 때는 외부 리소스부터 점검해야 한다.
대가 2 — 첫 실행
파일을 올리자마자 「음성 모델 다운로드 중… 4%」 가 떴다. 모델을 브라우저로 받아 온다. 용량과 걸리는 시간은 아직 재지 못했다. 서버 전사라면 사용자가 겪지 않을 기다림이다.
그런데 텔레메트리는 기본 ON
README 에 따르면 익명 사용 통계와 크래시 리포트(Sentry 로 감)가 기본으로 켜져 있다. 설정 → Privacy 에서 끌 수 있다. 끈 뒤에 네트워크 요청이 실제로 사라지는지는 아직 확인 안 했다.
나쁜 일이라는 게 아니다. README 에 정직하게 적혀 있다. 다만 「로컬」 이라는 말을 들으면 무엇이 로컬인지 따로 확인해야 한다는 얘기다.
라이선스도 MIT 가 아니다. PolyForm Noncommercial 1.0.0 이고, 예전 릴리스만 MIT 로 남아 있다. 평가 · 학습은 괜찮지만 코드를 상업 서비스에 가져다 쓰면 안 된다. 개념만 참고해 직접 만드는 건 상관없다.
「로컬」 을 볼 때 확인할 것
| 질문 | 클라우드 전사 서비스 | rescript 같은 브라우저 로컬 |
|---|---|---|
| 미디어 파일이 나가나 | 나간다 (업로드) | 안 나간다 |
| 그 밖에 나가는 것 | 서비스마다 | 사용 통계 · 크래시 리포트 (기본 ON) |
| 첫 실행 | 바로 | 모델 다운로드 |
| 서버 쪽 요건 | 없음 (남의 서버) | COOP/COEP 헤더 |
| 처리 속도 | 서버 성능 | 사용자 기기 · WebGPU 유무 |
회사 영상처럼 파일 자체가 밖으로 나가면 안 되는 경우라면 로컬 쪽이 맞다. 저사양 기기 사용자가 많거나 첫 화면을 빨리 띄워야 하면 서버 쪽이 낫다.
아직 못 가린 게 하나 있다. 비디오 프리뷰가 검은 화면이었다(video.readyState = 0). 오디오는 디코딩돼서 전사가 됐으니 오디오 트랙은 읽혔다. 합성 테스트 영상(testsrc2) 탓인지 앱 문제인지는 실제 촬영 영상으로 다시 봐야 한다.
브라우저 안에서 AI 모델이나 WASM 을 돌리는 기능을 검토하고 있다면 negabaro 에 상담해도 된다. 이 글처럼 직접 돌려 보고 어디서 막히는지부터 같이 본다.
핵심 포인트
「로컬」 은 미디어 파일이 안 나간다는 뜻 — 텔레메트리 · 크래시 리포트는 따로 확인
멀티스레드 ffmpeg.wasm 은 SharedArrayBuffer 가 필요하고, 서버가 COOP/COEP 헤더를 보내야 한다
첫 실행 때 모델 다운로드 대기가 생긴다
라이선스를 본다 — rescript 는 PolyForm Noncommercial, 상업 이용 불가