About

「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 으로 돌아간다.

Browser tab your video / audio file (stays here) Whispertransformers.js ffmpeg.wasmmulti-threaded needs SharedArrayBuffer WebGPU if present, WASM if not model downloadon first run usage stats, crash reportsON by default (README) COOP / COEP headersfrom the server that hosts the page

대가 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 에 상담해도 된다. 이 글처럼 직접 돌려 보고 어디서 막히는지부터 같이 본다.

핵심 포인트

1

「로컬」 은 미디어 파일이 안 나간다는 뜻 — 텔레메트리 · 크래시 리포트는 따로 확인

2

멀티스레드 ffmpeg.wasm 은 SharedArrayBuffer 가 필요하고, 서버가 COOP/COEP 헤더를 보내야 한다

3

첫 실행 때 모델 다운로드 대기가 생긴다

4

라이선스를 본다 — rescript 는 PolyForm Noncommercial, 상업 이용 불가

사용 사례

외부로 내보내면 안 되는 영상 · 음성의 전사와 컷 편집 「로컬 우선」 을 내세우는 도구 도입 전 점검
← Strudel 은 비트 스케치엔 최고, 곡 완성엔 약하다 — 그리고 lazy import 하면 이펙트가 조용히 빠진다 .blend 는 웹에서 안 열린다 — Blender → 웹은 변환이 아니라 「GPU 가 먹을 것만 남기는 번역」 →