안녕하세요, まさきん입니다.
학원 체험 설명을 녹음해서 Whisper로 받아쓰기를 했습니다. 문장은 그럴듯하게 읽히는데 금액 숫자만 달랐습니다. 녹음을 가계의 판단 재료로 삼는 사람에게는 관계가 있는 이야기라고 생각해서, 공식 정보와 함께 정리해 둡니다.
※ 글 공개 시점의 정보입니다. 최신 조건은 공식 사이트에서 확인해 주세요.
- 약 11분짜리 설명 녹음을 faster-whisper로 받아쓰니, small에서는 금액이 전부 달랐다
- medium에서도 요금 숫자는 다른 숫자인 채였고, large-v3에서 겨우 전단지와 일치했다
- initial_prompt에 힌트를 넣었더니 조용한 구간에서 프롬프트 자체가 반복 출력되었다
- 금액 확인은 해당 부분만 잘라 내서 large-v3에 돌리는 것이 안전하다고 생각한다
- 설정은 prompt 없음과 condition_on_previous_text=False를 기본으로 하고, 마지막에는 종이와 대조한다
받아쓰기는 금액 숫자를 잘못 듣는다
어느 학원의 체험 설명을 약 11분 녹음했습니다. 나중에 월 회비 등을 차분하게 비교하고 싶었기 때문입니다.
받아쓰기에는 faster-whisper를 썼습니다. 나온 문장은 이야기의 흐름으로서는 자연스럽게 읽힙니다. 다만 나눠 받은 전단지와 나란히 놓아 보니 금액이 맞지 않았습니다.
예를 들어 수천 엔대인 월 회비의 천의 자리가 다른 숫자로 되어 있었습니다. 문장으로서는 성립하기 때문에 전단지가 없었다면 알아채지 못했을 것 같습니다.
small과 medium에서는 숫자가 달랐다
처음에 쓴 것은 small입니다. 금액으로 나온 숫자는 전부 전단지와 달랐습니다.
다음으로 medium으로 다시 받아썼습니다. 여기에서도 요금 숫자는 다른 숫자로 되어 있었습니다. 크기를 한 단계 올리면 고쳐진다는 이야기가 아니었던 거죠.
까다로운 것은 틀린 것이 틀려 보이지 않는다는 점입니다. “월 회비는 ○천 엔입니다”라는 형태는 유지됩니다. 숫자만 바뀌어 있어서 읽으면서 걸리는 데가 없습니다.
large-v3로 잘라 낸 구간은 전단지와 일치했다
마지막으로 금액을 말하는 부분만 잘라 냈습니다. 그 짧은 음성을 large-v3로 받아쓰니 전단지의 금액과 일치했습니다.
그래서 제 환경에서는 “숫자 확인은 large-v3”라는 결과가 되었습니다. 그렇다고는 해도 이것은 녹음 하나에서의 이야기입니다. large-v3라면 반드시 맞는다고까지는 말할 수 없다고 생각합니다.
확인할 수 있었던 것은 종이 전단지가 손에 있었기 때문입니다. 받아쓰기만으로 금액을 확정하지 않았던 것은 결과적으로 잘한 일이었을지도 모릅니다.
모델 크기 비교(공식 README의 수치)
OpenAI의 Whisper 공식 저장소에는 모델 크기 목록이 실려 있습니다. README의 표를 그대로 정리했습니다.
| 크기 | 파라미터 수 | 필요 VRAM 기준 | 상대 속도 |
|---|---|---|---|
| tiny | 39 M | 약 1GB | 약 10배 |
| base | 74 M | 약 1GB | 약 7배 |
| small | 244 M | 약 2GB | 약 4배 |
| medium | 769 M | 약 5GB | 약 2배 |
| large | 1550 M | 약 10GB | 1배 |
| turbo | 809 M | 약 6GB | 약 8배 |
상대 속도는 large를 1로 했을 때의 기준입니다. README에는 A100이라는 GPU로 영어 음성을 받아써서 잰 값이라고 적혀 있습니다. 언어나 말하는 속도나 장비에 따라 실제 속도는 크게 달라진다는 주의도 있었습니다.
표의 large에는 버전이 있습니다. 모델 카드에 따르면 2022년 12월에 large-v2가 나왔습니다. large-v3는 2023년 11월에 공개되었습니다.
turbo는 2024년 9월에 추가되었습니다. README에서는 large-v3를 최적화한 버전이라고 설명합니다. 정확도 저하는 최소한이고 속도가 올라간다고 합니다. 참고로 turbo의 파라미터 수는 README에서는 809 M이지만 모델 카드에서는 798 M이었습니다.
faster-whisper는 무엇이 다른가
faster-whisper는 Whisper를 다른 추론 엔진으로 돌리는 재구현입니다. 공식 README에서는 CTranslate2라는 고속 추론 엔진을 쓴다고 설명합니다.
같은 README에는 원본과 같은 정확도로 최대 4배 빠르다고 적혀 있었습니다. 메모리 사용량도 적다고 합니다. 8비트 양자화로 효율을 더 올릴 수 있다고도 되어 있습니다.
모델 이름은 WhisperModel("large-v3")처럼 지정합니다. 이 형태로 쓰면 변환이 끝난 모델이 자동으로 다운로드된다고 합니다.
initial_prompt와 condition_on_previous_text의 의미
이번에 관계된 설정은 두 가지입니다. 둘 다 원본과 faster-whisper 양쪽에 있는 것입니다.
initial_prompt는 첫 번째 윈도에 넘기는 힌트 문장입니다. 원본 소스의 설명에서는 고유 명사나 독자적인 어휘를 맞히기 쉽게 하는 사용법이 예로 올라 있습니다.
condition_on_previous_text는 직전의 출력을 다음 구간의 힌트로 돌릴지 여부입니다. 기본값은 True로 되어 있습니다. 설명문에는 끄면 구간마다 표기가 들쭉날쭉해질 수 있다고 되어 있습니다. 한편 같은 문장의 반복 같은 실패 루프에 빠지기 어려워진다고도 적혀 있었습니다.
| 설정 | 의미(공식 설명) | 금액 확인 시의 추천 |
|---|---|---|
| 모델 크기 | 클수록 느리고 필요한 메모리도 늘어난다 | 해당 부분만 large-v3 |
| initial_prompt | 첫 번째 윈도에 넘기는 힌트 문장 | 넣지 않는다 |
| condition_on_previous_text | 직전의 출력을 다음 구간의 힌트로 삼는다(기본값은 True) | False로 한다 |
| vad_filter | 목소리가 없는 부분을 제거한다(faster-whisper) | True로 한다 |
| language | 말하고 있는 언어를 지정한다 | ja를 지정한다 |
오른쪽 열은 공식 설명과 이번 경험을 바탕으로 제가 고른 것입니다. 공식이 이 조합을 권하고 있다는 뜻은 아닙니다.
누르면 라쿠텐 로그인 페이지가 열립니다. 로그인하면 캠페인 내용이 표시됩니다.
프롬프트를 넘겼더니 프롬프트 자체가 반복되었다
숫자를 맞혀 주었으면 해서 initial_prompt에 힌트를 넘겨 보았습니다. 그러자 조용한 클립에서 프롬프트 자체를 반복하는 출력이 나왔습니다.
말하지 않은 단어가 글자로 늘어서 있었던 셈입니다. 금액을 확인하고 싶은데 힌트의 문구가 그대로 돌아온다. 이래서는 확인이 되지 않습니다.
그래서 금액을 확인할 때는 프롬프트를 넣지 않는 편이 안전하다고 생각하고 있습니다. 힌트에 숫자를 적으면 그것이 출력에 섞일 우려도 있다고 생각합니다.
할루시네이션에 관한 공식 기술
말하지 않은 단어가 나오는 현상은 공식 모델 카드에도 적혀 있습니다. 할루시네이션이라고 불리는 것입니다.
모델 카드에 따르면 Whisper는 대량의 잡음 섞인 데이터로 학습했습니다. 그 때문에 음성에서 실제로는 말하지 않은 문장이 출력에 포함되는 경우가 있다고 합니다.
반복에 대해서도 기술이 있었습니다. 모델의 구조상 같은 문장을 반복해서 생성하기 쉽다고 합니다. 빔 서치 등으로 어느 정도는 억제할 수 있지만 완전하지는 않다고 되어 있습니다.
받아쓰기의 오류는 그럴듯한 문장의 형태로 나옵니다. 숫자가 달라도 문장으로서 읽혀 버리는 것이 가장 큰 함정이라고 느끼고 있습니다.
무음 구간은 vad_filter로 제거할 수 있다
faster-whisper에는 VAD 필터라는 기능이 있습니다. 목소리가 들어 있지 않은 부분을 받아쓰기 전에 제거하는 구조입니다. 공식 README에서는 Silero VAD라는 모델을 내장하고 있다고 설명합니다.
사용법은 vad_filter=True를 더하기만 하면 됩니다. 기본 동작은 소극적이어서 2초보다 긴 무음만 제거한다고 적혀 있었습니다. 세세한 조정은 vad_parameters로 할 수 있습니다.
또 하나, hallucination_silence_threshold라는 설정도 있습니다. 단어 단위의 타임스탬프를 켰을 때 쓸 수 있는 것입니다. 할루시네이션이 의심되는 장면에서 지정한 초 수보다 긴 무음을 건너뛴다고 설명되어 있었습니다.
일본어의 정확도에 관한 공식 기술
공식 README에는 정확도가 언어에 따라 크게 달라진다고 적혀 있습니다. large-v3와 large-v2의 언어별 성적은 그림으로 나타나 있었습니다.
모델 카드에는 학습 데이터의 내역도 있습니다. 68만 시간 가운데 65%가 영어 음성과 영어 전사입니다. 영어 이외의 음성과 그 언어의 전사는 17%라고 되어 있습니다.
데이터가 적은 언어에서는 정확도가 떨어진다는 기술도 있었습니다. 할루시네이션이나 반복도 그런 언어에서는 악화될 가능성이 높다고 합니다. 일본어가 어느 정도인지를 나타내는 숫자는 이 글에서는 들지 않았습니다.
용도별 구분 사용
전부를 large-v3로 받아쓸 필요는 아마 없습니다. 이야기의 흐름을 파악하는 것뿐이라면 가벼운 모델로도 충분한 장면이 많다고 생각합니다.
| 용도 | 모델 | 범위 | 확인 방법 |
|---|---|---|---|
| 전체 흐름을 파악한다·요약한다 | 가벼운 모델 | 녹음 전체 | 세부는 너무 믿지 않는다 |
| 금액·날짜·횟수를 확인한다 | large-v3 | 해당 부분만 | 종이나 공식 자료와 대조한다 |
| 계약에 관한 조건을 확인한다 | large-v3 | 해당 부분만 | 마지막에는 자기 귀로 다시 듣는다 |
핵심은 숫자가 나오는 부분만을 따로 다루는 것입니다. 전체 받아쓰기는 “어디에서 금액 이야기를 했는가”를 찾는 지도로 쓸 수 있습니다.
금액만 확인하는 순서
제가 한 흐름을 순서의 형태로 만들면 이렇게 됩니다.
- 가벼운 모델로 전체를 받아쓰고, 금액 이야기가 나오는 시각을 메모한다
- ffmpeg로 그 구간만 잘라 낸다
- 잘라 낸 음성을 large-v3로 받아쓴다
- 프롬프트는 넘기지 않고, condition_on_previous_text는 False로 한다
- 나온 숫자를 전단지나 서면과 대조한다
잘라 내기는 ffmpeg로 한 줄입니다. 공식 문서에 따르면 -i 앞에 둔 -ss는 시작 위치를 가리킵니다. 마찬가지로 -t는 읽어 들일 길이입니다. 아래 예는 5분 30초 위치에서 60초 분량을 꺼냅니다.
ffmpeg -ss 00:05:30 -t 60 -i recording.m4a clip.wav
받아쓰는 쪽은 공식 README의 작성법을 바탕으로 하면 이렇게 됩니다. GPU가 없는 경우의 작성법도 README에 있어서 그쪽에 맞췄습니다.
from faster_whisper import WhisperModel
model = WhisperModel("large-v3", device="cpu", compute_type="int8")
segments, info = model.transcribe(
"clip.wav",
language="ja",
condition_on_previous_text=False,
vad_filter=True,
)
for segment in segments:
print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))
README에는 주의 사항이 하나 있었습니다. segments는 제너레이터이므로 루프로 돌렸을 때 비로소 처리가 실행된다고 합니다.
흔한 실수·함정
이번 일을 돌아보면 걸려 넘어지기 쉬운 점은 이 정도라고 생각합니다.
- 문장이 자연스럽게 읽히니 숫자도 맞다고 믿어 버린다
- 모델을 한 단계 올리면 고쳐진다고 생각해서 small에서 medium으로만 바꾼다
- 숫자를 맞히고 싶어서 프롬프트에 금액 힌트를 적는다
- 무음이 많은 음성을 그대로 전부 돌려 버린다
- 대조할 종이나 자료를 그 자리에서 받는 것을 잊는다
저에게 해당된 것은 위의 세 가지입니다. 마지막 하나는 전단지를 나눠 주었기 때문에 살았습니다.
구두 설명뿐이고 자료가 없는 장면도 있다고 생각합니다. 그 경우에는 금액만 그 자리에서 메모해 두는 것이 확실할 수 있습니다. 녹음은 어디까지나 다시 듣기 위한 재료네요.
시작하기 전에 확인할 것
설명 녹음을 받아쓰기로 확인하고 싶은 분을 위해 정리했습니다.
- 녹음해도 되는지 그 자리에서 확인했다
- 금액이 적힌 종이나 자료를 받았다
- 금액 이야기가 나오는 시각을 메모했다
- 해당 부분만 잘라 내서 large-v3로 받아썼다
- 프롬프트를 넘기지 않고 받아썼다
- 나온 숫자를 종이와 대조했다
특히 두 번째가 중요하다고 생각합니다. 대조할 상대가 있는 것만으로 받아쓰기의 사용법이 훨씬 편해집니다.
받아쓰기를 가계의 판단에 쓸 때의 거리감
설명회나 계약 설명은 정보가 많아서 다 기억할 수 없습니다. 녹음해서 글자로 만들면 나중에 차분하게 비교할 수 있습니다. 이것은 매우 편리하다고 생각합니다.
다만 가계의 판단에서 효과를 내는 것은 금액과 날짜입니다. 거기가 가장 틀리기 쉽다는 것이 이번의 발견이었습니다. 편리한 부분과 믿을 수 있는 부분은 같지 않았던 거죠.
업무에서도 숫자는 원래 데이터를 찾아서 확인합니다. 요약은 흐름을 파악하는 데 쓰고, 숫자는 원본에서 본다. 집 안에서도 같은 선 긋기로 괜찮은 것일지도 모릅니다.
종이 정보를 다루는 이야기는 학교 가정통신문을 캘린더에 등록하는 구조에서도 썼습니다. AI에 맡기는 범위의 선 긋기는 로그인이 필수인 예약을 AI에 부탁한 이야기가 가깝다고 생각합니다. 통화 내용을 정리하는 기능에 대해서는 Rakuten Link의 AI 통화 요약 기능 글도 있습니다.
- 전체 흐름: 가벼운 모델로 받아써서 요약이나 검색에 쓴다
- 금액과 날짜: 해당 부분을 잘라 내서 large-v3로 받아쓴다
- 최종 확인: 종이나 공식 자료와 나란히 놓는다. 없으면 자기 귀로 다시 듣는다
자주 묻는 질문
Q. Whisper는 왜 숫자를 틀리나요?
이유를 분명하게 적은 공식 기술은 찾지 못했습니다. 모델 카드에는 말하지 않은 문장이 출력에 포함되는 경우가 있다고 적혀 있습니다. 숫자에 한정된 설명이 아니므로 원인은 단정하지 않겠습니다.
Q. small과 medium 중 어느 쪽이 정확한가요?
공식 README에서는 크기마다 속도와 정확도의 트레이드오프가 있다고 합니다. 제 녹음에서는 둘 다 금액 숫자가 달랐습니다. 숫자 확인이 목적이라면 크기 비교보다 대조를 우선하는 것이 좋아 보입니다.
Q. large-v3라면 금액은 반드시 맞나요?
반드시 맞는다고는 말할 수 없다고 생각합니다. 저의 경우에는 잘라 낸 구간에서 전단지와 일치했습니다. 그렇다고는 해도 녹음 하나에서의 결과이므로 종이와의 대조는 생략하지 않는 편이 안전합니다.
Q. turbo와 large-v3는 어떻게 다른가요?
공식 README에서는 turbo가 large-v3를 최적화한 버전이라고 합니다. 정확도 저하는 최소한이고 상대 속도는 약 8배라는 기준입니다. 저는 turbo로는 시험하지 않았기 때문에 숫자 듣기에 대해서는 알 수 없습니다.
Q. initial_prompt는 쓰지 않는 편이 좋나요?
고유 명사를 맞히기 쉽게 하는 사용법은 공식 설명에도 실려 있습니다. 그러니 쓰는 것 자체가 나쁜 것은 아니라고 생각합니다. 다만 저는 조용한 클립에서 프롬프트의 반복이 나왔습니다. 그래서 금액 확인에서는 빼고 있습니다.
Q. condition_on_previous_text를 False로 하면 무엇이 달라지나요?
직전의 출력을 다음 구간의 힌트로 쓰지 않게 됩니다. 공식 설명에서는 구간마다 표기가 들쭉날쭉해질 가능성이 있다고 합니다. 대신 반복 루프에는 빠지기 어려워진다고 되어 있습니다.
Q. vad_filter는 처음부터 켜져 있나요?
일반 transcribe에서는 기본값이 False입니다. 그러니 쓸 때는 직접 True를 지정합니다. README에 따르면 배치 처리 쪽에서는 기본으로 켜져 있다고 합니다.
Q. faster-whisper를 쓰는 데 ffmpeg가 필요한가요?
faster-whisper의 README에서는 ffmpeg를 따로 설치할 필요가 없다고 합니다. 음성을 읽어 들이는 데 쓰는 라이브러리에 포함되어 있기 때문입니다. 다만 구간 잘라 내기를 명령어로 한다면 ffmpeg 본체가 필요합니다.
참고한 공식 정보
- openai/whisper README(OpenAI 공식 저장소)
- Model Card: Whisper(OpenAI 공식 저장소)
- whisper/transcribe.py(OpenAI 공식 저장소)
- faster-whisper README(SYSTRAN 공식 저장소)
- faster_whisper/transcribe.py(SYSTRAN 공식 저장소)
- ffmpeg Documentation(FFmpeg 공식 사이트)
정리
받아쓰기는 이야기의 흐름을 남기는 데 큰 도움이 되는 도구입니다. 다만 금액 숫자는 small에서도 medium에서도 달랐습니다. large-v3로 잘라 낸 구간을 받아써서 겨우 전단지와 일치했습니다.
그래서 전체는 가벼운 모델로 받아쓰기로 했습니다. 숫자 부분만 따로 확인하는 형태입니다. 프롬프트는 넘기지 않고, 마지막에는 종이와 나란히 놓습니다.
설명 녹음을 가지고 계신 분은 금액 부분만이라도 자료와 비교해 보시면 어떨까요?
누르면 라쿠텐 로그인 페이지가 열립니다. 로그인하면 캠페인 내용이 표시됩니다.
이 글에는 제휴 광고가 포함되어 있습니다. 이 사이트의 링크를 통해 상품·서비스에 신청하시면 제휴사로부터 보상을 받을 수 있습니다. 또한 운영자는 라쿠텐 그룹 소속 직원으로, 사원 추천 프로그램을 통해 보상을 받는 경우가 있습니다. 기사 내용과 평가는 광고 유무와 관계없이 운영자의 실제 경험과 조사를 바탕으로 작성했지만, 위 관계를 이해하신 후 읽어 주시기 바랍니다. 자세한 내용은 면책조항·제휴 링크 안내를 참고해 주세요. 면책조항·제휴 링크 안내
이 글에는 기계 번역이 포함되어 있습니다. 정확한 조건은 라쿠텐 모바일 공식 사이트의 다국어 페이지에서 확인해 주세요.
라쿠텐 모바일의 통신 지역·전파 상황이 궁금하신 분은, 공식 전파 개선·조사 요청 양식 을 통해 문의하실 수 있습니다.