한 시간짜리 회의 녹음 파일을 받아쓰기 앱 업로드 칸에 올려놓고, ‘변환 시작’ 버튼 위에서 손이 멈춘 적 있는가. 그 회의에는 아직 공개 안 된 계획도, 누군가의 연봉 이야기도, 마음에 담아둔 뒷말도 섞여 있었다.
버튼을 누르면 편하다는 걸 안다. 그런데 손가락이 멈춘 건, 머릿속에 뜬 질문 하나 때문이다. “이 녹음, 지금 어느 회사 서버로 올라가는 거지?” 그리고 조금 더 불길한 질문. “약관 어딘가에 ‘이 오디오를 학습에 쓸 수 있음’이 적혀 있진 않았나?”
지난 호에서 우리는 클라우드 채팅창에 텍스트를 붙여넣었다. 오늘은 그보다 훨씬 사적인 걸 다룬다 — 목소리. 오늘 만들 도구는 그 녹음을 서버로 단 한 번도 올리지 않는다. 그리고 글의 마지막에 — 와이파이를 끊는다. 인터넷이 끊긴 노트북이 그대로 받아쓰기를 해내는 순간, “받아쓰기 AI = 남의 서버로 내 목소리 보내기”라는 등식은 눈앞의 사실로 무너진다.
시작하기 전에, 딱 한 가지만 떠올려 보세요 — 받아쓰기나 녹음을 AI에 맡기기 직전, 손이 멈칫했던 순간이 있었나요? 팀 회의, 1:1 면담, 병원 상담, 음성 일기… 지금은 답하지 않아도 됩니다. 이 장면을 기억해 두세요. 글 끝에서, 그 망설임이 어떻게 바뀌는지 함께 확인할 거예요.
받아쓰기를 ‘남한테 맡기지’ 않고, 내 방으로 데려온다
지금까지 받아쓰기 앱을 쓴다는 건, 내 녹음을 택배 상자에 담아 저 멀리 어느 회사의 ‘귀 밝은 속기사’에게 부치는 그림이었다. 편하지만, 그 며칠(혹은 몇 초) 동안 내 녹음은 남의 사무실 책상 위에 놓여 있다. 그런데 딱 하나를 바꾸면 그림이 통째로 달라진다. 그 속기사를, 내 회의실로 모셔오면? 녹음은 이 방을 떠날 일이 없다.
바로 그걸 해주는 도구가 있다. Whisper라는 받아쓰기 AI를, Transformers.js라는 기술이 당신의 브라우저 탭 안에서 직접 굴린다. 서버로 오디오를 보내는 게 아니라, 받아쓰기 엔진 자체가 당신의 브라우저 안에 들어와 계산한다.
여기서 1편(브라우저 챗봇)과 결정적으로 다른 점이 하나 있다. 1편 데모는 WebGPU라는 통로가 반드시 있어야 돌아갔다. 그런데 이 받아쓰기 도구는 WebGPU가 없어도 된다. 조금 느릴 뿐, 몇 년 된 노트북에서도, 오래된 브라우저에서도 그냥 돈다. 문턱이 그만큼 더 낮다 — “누구나”에게 유리하다.
지금 아래 “받아쓰기 도구 켜기” 버튼을 누르세요. 브라우저가 마이크 권한을 물으면 허용을 누르세요. (걱정 마세요. 이 권한은 소리를 당신의 브라우저가 듣기 위한 것이지, 어디로 보내기 위한 게 아닙니다. 곧 직접 증명합니다.) 다운로드 막대가 차오르기 시작하면 — 잠깐 손을 떼고, 이 글로 돌아오세요.
💡 더 깊이 — Transformers.js·WASM·WebGPU 개념
이 도구의 엔진은 Transformers.js가 ONNX Runtime Web을 통해 돌립니다. 핵심은 계산을 WASM(브라우저가 무거운 연산을 빠르게 처리하게 해주는 표준 기술)으로 한다는 점이에요. WebGPU가 있으면 더 빠르게 쓰고, 없으면 자동으로 WASM으로 내려앉아 그냥 동작합니다. WebGPU가 꼭 필요한 건 “말하는 즉시 자막이 뜨는” 실시간 버전(★★★)뿐입니다.
다운로드 막대가 차는 동안 — 왜 오디오는 안 나가는데 파일은 내려받나
막대가 차고 있나. 여기서 아주 자연스러운 오해가 하나 생긴다. “어? 뭔가 다운로드된다는 건, 내 목소리도 어디론가 오가고 있다는 거 아니야?” 아니다. 그리고 이 구분이 오늘 글의 심장이다. 지금 내려오는 건 당신의 목소리가 아니라, 받아쓰기 엔진이다.
앞에서 속기사를 내 회의실로 모셔온다고 했다. 지금 차오르는 이 막대가 바로 그것 — 속기사가 내 방으로 출근하는 중이다. 한 번 자리에 앉으면, 그다음부터 받아쓰기는 전부 이 방 안에서 벌어진다. 정리하면 방향이 정반대다. 내려오는 건 엔진(속기사)이고, 나가는 건 아무것도 없다.
지금 내려오는 파일은 대략 75MB 안팎이다(가장 작은 모델 기준. 기기·설정에 따라 다르다). 보통 1~3분. 그런데 딱 한 번이면 된다. 한 번 받아두면 브라우저 저장소에 남아, 두 번째부터는 그 저장본을 그대로 꺼내 쓴다. 그래서 — 짐작했겠지만 — 인터넷을 꺼도 돌아가는 것이다.
막대가 아직 차는 중인가요? 그렇다면 지금이 딱 좋은 타이밍입니다. 화면의 다운로드 진행 표시 옆에 이 문장을 걸어두세요 — “지금 내려오는 건 내 목소리가 아니라, 받아쓰기 엔진이다.” 막대가 다 차면, 이 도구는 남의 서버 없이 혼자 받아쓸 준비가 끝난 겁니다.
💡 더 깊이 — 모델은 Cache API에 저장된다 실무자용
모델 파일은 브라우저의 Cache API라는 저장 공간에 담깁니다. 그래서 두 번째 방문부터, 그리고 인터넷이 끊긴 상태에서도 재사용됩니다. 다만 이 저장본은 같은 사이트에서만 다시 쓰이고, 방문기록·캐시를 지우면 저장본도 사라져 다음엔 다시 받습니다.
이제, 녹음 버튼을 누르세요
여기가 이 기사의 절정이다. 막대가 다 찼는가. 그럼 [● 녹음]을 누르고, 한 문장만 말해 보자. 예를 들면 — “이건 내 기계 밖으로 안 나가는 받아쓰기 테스트.” 말이 끝나면 [■ 정지], 그리고 [변환]. 잠시 뒤, 방금 당신이 한 말이 화면에 글자로 뜬다.
여기까지도 충분히 신기하다. 하지만 회의적인 사람은 이렇게 말할 수 있다. “인터넷 켜져 있잖아. 그거 몰래 서버로 보낸 거 아니야?” 그 의심을, 지금 물리적으로 끝장내자. 탭을 그대로 둔 채, 노트북 와이파이를 끄세요. 인터넷이 완전히 끊긴 걸 확인하고 — 다시 녹음하고, 다시 변환해 보세요.
THE 절정. 내 목소리가 밖으로 안 나가는 받아쓰기 도구. 위 위젯에서 방금 그대로, 이번엔 인터넷을 끊고 녹음→변환하면 됩니다. 딱 하나만 주의 — 오프라인 상태에서 페이지를 새로고침하지 마세요. 오프라인에서도 변환이 완료되면 위젯이 “PRIVATE ✅ 0 UPLOADS — 내 목소리는 이 기기를 떠나지 않았습니다” 배지를 찍어줍니다. 와이파이 꺼진 표시와 변환된 텍스트가 한 화면에 잡히게 스크린샷을 남겨 #내오프라인도구로 공유해 보세요.
변환된 글자가, 떴는가. 방금 당신의 목소리는 어디로도 갈 수 없었다. 네트워크가 끊겨 있으니까. 그런데도 받아쓰기가 됐다. 그렇다면 그 일을 해낸 건 오직 하나뿐이다 — 당신 앞의 이 기계. 이게 “업로드 0건”의 가장 정직하고 우아한 증명이다. 복잡한 개발자도구를 열 필요도 없다. 나갈 길이 없는데 됐다는 건, 애초에 나가지 않았다는 뜻이니까.
💡 더 깊이 — 개발자도구로 ‘업로드 0건’ 눈으로 보기 실무자용
개발자도 이걸 눈으로 확인할 수 있습니다. F12 → Network 탭을 열고, (엔진 다운로드가 끝난 뒤) 녹음·변환을 실행해 보세요. 처음엔 huggingface.co로 향하는 모델 파일 다운로드가 보이는데 — 이건 “엔진이 오는 것”이라 정상입니다. 그 뒤 변환하는 순간엔 당신의 오디오를 실어 나르는 아웃바운드 요청이 0건이어야 합니다. 특히 수백 KB~MB짜리 오디오를 어딘가로 POST하는 요청이 없다면, 그게 곧 “업로드 0건”의 기술적 증거입니다.
마이크가 없거나, 안 잡히거나, 한국어가 엉뚱하게 나온다면
여기서 막히는 건 이상한 일이 아니다. 전부 우회로가 있다. 마이크 없이도 이 활동은 100% 완주된다.
- 마이크 권한을 실수로 막았거나, 마이크가 아예 없다면 — 폰 음성메모·저장해둔 회의 녹음 파일을 업로드하세요. 입구만 다를 뿐, “밖으로 안 나간다”는 결론은 똑같아요. (파일로도 와이파이 끄고 변환하면 동일하게 인증됩니다.)
- 녹음했는데 결과가 비어 있다면 — 대개 소리가 안 잡힌(무음) 경우입니다. 3~5초 이상 또렷하게 말해 보세요.
- 한국어가 엉뚱하게 받아써진다면 — 위젯의 언어를 Korean으로 바꾸세요. 그래도 가장 작은 모델은 한국어에 정직한 한계가 있으니, 짧고 또렷하게 말하는 게 요령입니다.
- 첫 변환이 유독 느리거나 뚝뚝 끊긴다면 — 정상입니다. 남의 초고속 서버가 아니라 당신의 노트북이 직접 계산하고 있다는, 오히려 반가운 증거예요.
방금, 당신은 소비자에서 제작자가 됐다
도입부에서 ‘변환 시작’ 버튼 위에 멈춰 있던 그 손가락, 기억하는가. 방금 당신은 그 망설임에 스스로 답했다. 회의도, 아이디어 메모도, 혼자 남긴 음성 일기도 — 맡기기 전에 멈칫할 이유가 사라진다. 그런데 여기서 한 걸음 더 갈 수 있다. 지금까지는 남이 만든 데모를 쓴 것이다. 이제 그걸 내 것으로 만들 차례다.
템플릿의 딱 한 줄을 바꿔 “내 도구”로. 샌드박스에는 받아쓰기 코드가 미리 다 채워져 있습니다. // 👇 이 한 줄만 바꿔보세요 표시된 곳에서 딱 하나만 바꾸세요 — 인식 언어를 한국어로 고정하거나, 화면 제목을 “○○의 비밀 받아쓰기”로 바꾸거나, 모델을 조금 더 똑똑한 것으로. 저장하면 그 미리보기 URL이 곧 ‘내 받아쓰기 도구’의 주소가 됩니다.
💡 더 깊이 — 영구히 내 것으로 남기기 ★★★
오늘 만든 도구를 영구히 내 것으로 남기고 싶다면, 오픈소스 원본 github.com/xenova/whisper-web(MIT 라이선스, 무료)를 복제(Fork)하거나 Hugging Face의 “Duplicate this Space”로 내 계정에 배포할 수 있습니다. 변환 결과를 .txt로 저장하거나(데모엔 이미 Export 기능이 있어 그걸 활용·확장하면 됩니다), 더 큰 모델(base, 대략 200MB)로 정확도를 올리거나, WebGPU 실시간 버전(Xenova/realtime-whisper-webgpu)으로 갈아탈 수도 있어요.
마치며 — 이제, 그 회의를 맡겨도 될까
한 가지 더. 도입부의 그 멈칫함은, 당신만 느낀 게 아니다. 받아쓰기 앱 앞에서 손이 멈춘 경험은, 생각보다 훨씬 많은 사람이 공유하는 순간이다.
“그 녹음, 나도 맡기기 망설였어.” 글 첫머리에서 떠올려 둔 그 장면, 이제 한 줄로 남겨 보세요. 아래 위젯이 묻습니다 — “받아쓰기·녹음을 AI에 맡기기 직전, 손이 멈칫했던 순간이 있나요?” 보기 중 하나를 클릭하면, 다른 독자들의 답이 막대그래프로 뜹니다. “나만 그런 게 아니었네” — 그 확인이, 방금의 물리적 안심을 마음의 안심으로 바꿔줍니다.
그래서, 처음의 질문으로 돌아가자. 그 민감한 회의, 이제 맡겨도 될까? 방금 당신은 와이파이를 껐는데도 받아쓰기가 되는 걸 두 눈으로 봤다. 나갈 통로가 없는데 됐다는 건, 애초에 밖으로 안 나갔다는 뜻이다. 이게 클라우드 받아쓰기 앱과 결정적으로 다른 점이고, 오늘 당신이 손으로 쥔 신뢰다.
목소리 하나를 내 안에 가뒀다면, 이런 생각이 자연스럽게 든다. “그럼 내 문서 전체를 밖으로 안 내보내고 검색할 순 없을까?” 다음 기사 my-private-librarian — 내 문서만 아는 사서 AI에서, 오늘 목소리에게 해준 걸 이번엔 내 지식창고 전체에 해준다. 이 호에서 가장 깊은 계단이자, “밖으로 안 나가는 내 것”의 정점이다.