본문 바로가기
AI Project/Edge AI Agent - 음성처리(연구,분석,검증))

[Whisper.cpp] #2. Edge Agent AI 음성처리 : 한국어를 STT로 변환 비교(4종 비교)

by 으노으뇨 2026. 4. 27.
728x90
SMALL

제 포스팅은 AI가 작성한게 아닌 한글자 한글자 타자를 쳐서 작성한 포스팅입니다. 구독 좋아요 댓글은 힘이됩니다.

안녕하세요! 지난번 포스팅으로 존F케네디의 명연설을 Tiny와 Base로 STT로 음성을 텍스트로 추출해봤습니다.!

[Whisper.cpp] #1. Edge Agent AI 음성처리 : whisper.cpp를 이용한 음성처리(Base, Tiny 비교)

 

[Whisper.cpp] #1. Edge Agent AI 음성처리 : whisper.cpp를 이용한 음성처리(Base, Tiny 비교)

안녕하세요, 이번엔 whisper.cpp를 이용해서 on device, edge agent AI의 청각의 능력을 한번 분석/검증해보겠습니다.이번 포스팅 계획은안드로이드 + 엑시노스1380 환경에서 whisper.cpp는 잘 동작하는가?성

uno-kim.tistory.com

[오디오추출] 안드로이드 환경에서 유튜브 특정 구간 오디오 추출하는방법

 

[오디오추출] 안드로이드 환경에서 유튜브 특정 구간 오디오 추출하는방법

한글의 음성 파일들이 필요하다, 그렇다고 무턱대고 내 발음을 가지고 테스트하기에는 시간이 촉박하고 급하다.이럴때일 수록 지천에 널린 소스로 이용하면 될것같아서 유투브 영상을 가져와

uno-kim.tistory.com

이번 포스팅에서는 과연 한국어로 혼자 떠드는 영상 또는 오디오에서 텍스트를 잘 추출하는지 비교 분석해보겠습니다!


4단계 체급 비교 테스트

우선 아직 안 받으신 모델(tiny, base)이 있을 수 있으니 확실하게 전부 다운로드합니다.

(이미 받은 파일은 알아서 건너뛰거나 덮어씁니다.)

반드시 whisper.cpp 폴더 내에서 해야합니다~!

# tiny (약 75MB)
bash ./models/download-ggml-model.sh tiny

# base (약 142MB)
bash ./models/download-ggml-model.sh base

# small (약 466MB)
bash ./models/download-ggml-model.sh small

# medium (약 1.5GB)
bash ./models/download-ggml-model.sh medium

모델이 다 받아졌는지 확인~! (4개의 모델 파일이 용량에 맞게 잘 들어있다면 준비 완료입니다!)

ls -lh models/ggml-*.bin

대망의 4체급 검증

준비가 끝났다면 아까 추출한 test_cut.wav 파일의 경로를 정확히 확인하고 명령에 넣고 진행해 주세요!!!

은근히 오래걸립니다잉

find ~ -name "test_cut.wav"


Whisper 4개 체급 벤치마크

# 1. Tiny 모델 격발 (약 75MB)
./build/bin/whisper-cli -m models/ggml-tiny.bin -f /data/data/com.termux/files/home/samples/test_cut.wav -l ko -t 4

# 2. Base 모델 격발 (약 142MB)
./build/bin/whisper-cli -m models/ggml-base.bin -f /data/data/com.termux/files/home/samples/test_cut.wav -l ko -t 4

# 3. Small 모델 격발 (약 466MB)
./build/bin/whisper-cli -m models/ggml-small.bin -f /data/data/com.termux/files/home/samples/test_cut.wav -l ko -t 4

# 4. Medium 모델 격발 (약 1.5GB)
./build/bin/whisper-cli -m models/ggml-medium.bin -f /data/data/com.termux/files/home/samples/test_cut.wav -l ko -t 4

1. 타이니 버전 : 나오지도 않았다...!!

whisper_init_from_file_with_params_no_state: loading model from 'models/ggml-tiny.bin'
whisper_init_with_params_no_state: use gpu    = 1
whisper_init_with_params_no_state: flash attn = 1
whisper_init_with_params_no_state: gpu_device = 0
whisper_init_with_params_no_state: dtw        = 0
whisper_init_with_params_no_state: devices    = 1
whisper_init_with_params_no_state: backends   = 1
whisper_model_load: loading model
whisper_model_load: n_vocab       = 51865
whisper_model_load: n_audio_ctx   = 1500
whisper_model_load: n_audio_state = 384
whisper_model_load: n_audio_head  = 6
whisper_model_load: n_audio_layer = 4
whisper_model_load: n_text_ctx    = 448
whisper_model_load: n_text_state  = 384
whisper_model_load: n_text_head   = 6
whisper_model_load: n_text_layer  = 4
whisper_model_load: n_mels        = 80
whisper_model_load: ftype         = 1
whisper_model_load: qntvr         = 0
whisper_model_load: type          = 1 (tiny)
whisper_model_load: adding 1608 extra tokens
whisper_model_load: n_langs       = 99
whisper_model_load:          CPU total size =    77.11 MB
whisper_model_load: model size    =   77.11 MB
whisper_backend_init_gpu: device 0: CPU (type: 0)
whisper_backend_init_gpu: no GPU found
whisper_init_state: kv self size  =    3.15 MB
whisper_init_state: kv cross size =    9.44 MB
whisper_init_state: kv pad  size  =    2.36 MB
whisper_init_state: compute buffer (conv)   =   13.21 MB
whisper_init_state: compute buffer (encode) =   17.72 MB
whisper_init_state: compute buffer (cross)  =    3.89 MB
whisper_init_state: compute buffer (decode) =   95.91 MB

system_info: n_threads = 4 / 8 | WHISPER : COREML = 0 | OPENVINO = 0 | CPU : NEON = 1 | ARM_FMA = 1 | FP16_VA = 1 | DOTPROD = 1 | OPENMP = 1 | REPACK = 1 |

main: processing '/data/data/com.termux/files/home/samples/test_cut.wav' (960216 samples, 60.0 sec), 4 threads, 1 processors, 5 beams + best of 5, lang = ko, task = transcribe, timestamps = 1 ...

2. Base 모델 : 그럭저럭 나왔으나 좀 이상하다????

[00:00:00.000 --> 00:00:11.160]   마지막 주제는 3개의 1위 출시자, 뭐 얘기 안 하셨죠?
[00:00:11.160 --> 00:00:12.720]   3개의 1위 출시자이 어디냐?
[00:00:12.720 --> 00:00:14.320]   당연히?
[00:00:14.320 --> 00:00:15.880]   대한민국의 코스피저.
[00:00:15.880 --> 00:00:21.000]   왜냐하면 연초 4천 2배, 3월 초 6천 3백 47, 2000 백 포인트로 올렸죠?
[00:00:21.000 --> 00:00:24.240]   연초의 상실 50%, 앞두적인 3개의 1위?
[00:00:24.240 --> 00:00:25.600]   코스피이 좋습니다.
[00:00:25.600 --> 00:00:28.240]   3개의 출시자은 당연히 코스피고요.
[00:00:28.240 --> 00:00:29.640]   또 1위 하도 있어요.
[00:00:29.640 --> 00:00:31.120]   그거 뭐냐?
[00:00:31.120 --> 00:00:37.560]   이틀간 떨어진 거, 7천 2사 브로우 11프로 합쳐서 대충 20프로, 하랑임도 앞두적인?
[00:00:37.560 --> 00:00:39.280]   여기서 하면 안 된구나.
[00:00:39.280 --> 00:00:43.280]   자, 하랑임도, 하랑임도.
[00:00:43.280 --> 00:00:48.520]   이 11% 수를 빠진 날.
[00:00:48.520 --> 00:00:52.200]   저 2일간 빠진 게 1,150%가 빠졌거든요?
[00:00:52.200 --> 00:00:57.400]   3월 4일 수를 680%가 빠졌어요.
[00:00:57.400 --> 00:00:59.860]   무슨 기소가 심해 보호가 빠져오지?

whisper_print_timings:     load time =   474.16 ms
whisper_print_timings:     fallbacks =   0 p /   0 h
whisper_print_timings:      mel time =   335.32 ms
whisper_print_timings:   sample time = 10102.69 ms /  1321 runs (     7.65 ms per run)
whisper_print_timings:   encode time = 18160.21 ms /     3 runs (  6053.40 ms per run)
whisper_print_timings:   decode time =    47.77 ms /     2 runs (    23.89 ms per run)
whisper_print_timings:   batchd time = 22072.74 ms /  1310 runs (    16.85 ms per run)
whisper_print_timings:   prompt time =  1348.27 ms /   145 runs (     9.30 ms per run)
whisper_print_timings:    total time = 52726.05 ms
whisper_init_from_file_with_params_no_state: loading model from 'models/ggml-base.bin'
whisper_init_with_params_no_state: use gpu    = 1
whisper_init_with_params_no_state: flash attn = 1
whisper_init_with_params_no_state: gpu_device = 0
whisper_init_with_params_no_state: dtw        = 0
whisper_init_with_params_no_state: devices    = 1
whisper_init_with_params_no_state: backends   = 1
whisper_model_load: loading model
whisper_model_load: n_vocab       = 51865
whisper_model_load: n_audio_ctx   = 1500
whisper_model_load: n_audio_state = 512
whisper_model_load: n_audio_head  = 8
whisper_model_load: n_audio_layer = 6
whisper_model_load: n_text_ctx    = 448
whisper_model_load: n_text_state  = 512
whisper_model_load: n_text_head   = 8
whisper_model_load: n_text_layer  = 6
whisper_model_load: n_mels        = 80
whisper_model_load: ftype         = 1
whisper_model_load: qntvr         = 0
whisper_model_load: type          = 2 (base)
whisper_model_load: adding 1608 extra tokens
whisper_model_load: n_langs       = 99
whisper_model_load:          CPU total size =   147.37 MB
whisper_model_load: model size    =  147.37 MB
whisper_backend_init_gpu: device 0: CPU (type: 0)
whisper_backend_init_gpu: no GPU found
whisper_init_state: kv self size  =    6.29 MB
whisper_init_state: kv cross size =   18.87 MB
whisper_init_state: kv pad  size  =    3.15 MB
whisper_init_state: compute buffer (conv)   =   16.28 MB
whisper_init_state: compute buffer (encode) =   23.09 MB
whisper_init_state: compute buffer (cross)  =    4.66 MB
whisper_init_state: compute buffer (decode) =   96.37 MB

system_info: n_threads = 4 / 8 | WHISPER : COREML = 0 | OPENVINO = 0 | CPU : NEON = 1 | ARM_FMA = 1 | FP16_VA = 1 | DOTPROD = 1 | OPENMP = 1 | REPACK = 1 |

3. Small 모델 : 조금 보통의 속도로 나왔으나 괜찮다. 퀄리티 대신 수정할게 조금잇어보인다.

[00:00:00.000 --> 00:00:05.340]   [이번 영상에서 구독과 좋아요를 눌러주세요]
[00:00:05.340 --> 00:00:10.980]   마지막 주제는 세계 1위 주위기장 뭐 얘기 안 할 수 없죠?
[00:00:10.980 --> 00:00:13.680]   세계 1위 주위기장이예느냐? 당연히?
[00:00:13.680 --> 00:00:15.660]   내가 몇 명 뒤에 코스피죠?
[00:00:15.660 --> 00:00:20.860]   왜냐면 연초 4,200, 3월 6,347,200 포인트를 올렸죠?
[00:00:20.860 --> 00:00:25.520]   연초의 상태를 50% 압도적인 세계 1위 코스피 좋습니다.
[00:00:25.520 --> 00:00:28.060]   세계 주위기장은 당연히 코스피고요.
[00:00:28.060 --> 00:00:29.800]   또 1위 하나 또 있어요.
[00:00:29.800 --> 00:00:30.840]   그거 뭐냐?
[00:00:30.840 --> 00:00:35.620]   이틀간 떨어진 거 7.24% 12% 합쳐서 대충 20%
[00:00:35.620 --> 00:00:37.440]   하락률도 압도적인?
[00:00:37.440 --> 00:00:39.280]   여기 이렇게 하면 안 되구나.
[00:00:39.280 --> 00:00:41.440]   하락률 드시죠. 하락률 드시죠.
[00:00:41.440 --> 00:00:47.320]   이 12% 수현랄 빠진 날
[00:00:47.320 --> 00:00:52.080]   저 1간 빠진 게 1,150%가 빠졌거든요.
[00:00:52.080 --> 00:00:55.920]   3월 4일 수현랄 698%가 빠졌어요.
[00:00:57.220 --> 00:00:59.820]   무슨 지수가 심해 보여가지고~

whisper_print_timings:     load time =   895.95 ms
whisper_print_timings:     fallbacks =   1 p /   0 h
whisper_print_timings:      mel time =   491.24 ms
whisper_print_timings:   sample time = 10661.78 ms /  1285 runs (     8.30 ms per run)
whisper_print_timings:   encode time = 37686.23 ms /     3 runs ( 12562.08 ms per run)
whisper_print_timings:   decode time =   456.30 ms /     7 runs (    65.19 ms per run)
whisper_print_timings:   batchd time = 44728.88 ms /  1267 runs (    35.30 ms per run)
whisper_print_timings:   prompt time =  2435.54 ms /   134 runs (    18.18 ms per run)
whisper_print_timings:    total time = 97656.24 ms
whisper_init_from_file_with_params_no_state: loading model from 'models/ggml-small.bin'
whisper_init_with_params_no_state: use gpu    = 1
whisper_init_with_params_no_state: flash attn = 1
whisper_init_with_params_no_state: gpu_device = 0
whisper_init_with_params_no_state: dtw        = 0
whisper_init_with_params_no_state: devices    = 1
whisper_init_with_params_no_state: backends   = 1
whisper_model_load: loading model
whisper_model_load: n_vocab       = 51865
whisper_model_load: n_audio_ctx   = 1500
whisper_model_load: n_audio_state = 768
whisper_model_load: n_audio_head  = 12
whisper_model_load: n_audio_layer = 12
whisper_model_load: n_text_ctx    = 448
whisper_model_load: n_text_state  = 768
whisper_model_load: n_text_head   = 12
whisper_model_load: n_text_layer  = 12
whisper_model_load: n_mels        = 80
whisper_model_load: ftype         = 1
whisper_model_load: qntvr         = 0
whisper_model_load: type          = 3 (small)
whisper_model_load: adding 1608 extra tokens
whisper_model_load: n_langs       = 99
whisper_model_load:          CPU total size =   487.01 MB
whisper_model_load: model size    =  487.01 MB
whisper_backend_init_gpu: device 0: CPU (type: 0)
whisper_backend_init_gpu: no GPU found
whisper_init_state: kv self size  =   18.87 MB
whisper_init_state: kv cross size =   56.62 MB
whisper_init_state: kv pad  size  =    4.72 MB
whisper_init_state: compute buffer (conv)   =   22.42 MB
whisper_init_state: compute buffer (encode) =   33.85 MB
whisper_init_state: compute buffer (cross)  =    6.20 MB
whisper_init_state: compute buffer (decode) =   97.28 MB

system_info: n_threads = 4 / 8 | WHISPER : COREML = 0 | OPENVINO = 0 | CPU : NEON = 1 | ARM_FMA = 1 | FP16_VA = 1 | DOTPROD = 1 | OPENMP = 1 | REPACK = 1 |

main: processing '/data/data/com.termux/files/home/samples/test_cut.wav' (960216 samples, 60.0 sec), 4 threads, 1 processors, 5 beams + best of 5, lang = ko, task = transcribe, timestamps = 1 ...

4. 미디엄모델 : 진짜 오래걸렸다. 1분이라면 거의 10분이상 기다린것같다. 퀄리티도 조금좋아졌다 조금

[00:00:00.000 --> 00:00:03.420]   마지막 주제는 3개의 1위 주익시장! 뭐 얘기 안 할 수 없죠?
[00:00:03.420 --> 00:00:08.220]   3개의 1위 주익시장이 어딨냐? 당연히 대한민국의 코스피죠!
[00:00:08.220 --> 00:00:13.420]   왜냐하면 연초 4200, 3월 초 6347, 2100포인트를 올렸죠?
[00:00:13.420 --> 00:00:18.220]   연초의 상승을 50%! 압도적인 3개의 1위 코스피 좋습니다.
[00:00:18.220 --> 00:00:20.720]   3개의 주익장은 당연히 코스피이고요.
[00:00:20.720 --> 00:00:23.420]   또 1위 하나 또 있어요. 그거 뭐냐?
[00:00:23.420 --> 00:00:26.500]   연초 1위 주익시장은 당연히 코스피입니다.
[00:00:26.500 --> 00:00:31.120]   당연히 코스피이고요. 또 1위 하나 또 있어요. 그거 뭐냐?
[00:00:31.120 --> 00:00:35.540]   이틀간 떨어진 거 7.24%, 12% 합쳐서 대충 20%
[00:00:35.540 --> 00:00:37.740]   하락률도 압도적인...
[00:00:37.740 --> 00:00:39.460]   아, 이거 하면 안 되구나.
[00:00:39.460 --> 00:00:43.260]   야, 하락률도 진짜 하락률도...
[00:00:43.260 --> 00:00:47.980]   이 12% 수요일 날 빠진 날...
[00:00:47.980 --> 00:00:52.260]   저 2일간 빠진 게 1150%가 빠졌거든요?
[00:00:52.260 --> 00:00:55.860]   3월 4일 수요일 날 698%가 빠졌어요.
[00:00:56.500 --> 00:00:59.860]   무슨 지수가 11%가 빠져

whisper_print_timings:     load time =  3181.43 ms
whisper_print_timings:     fallbacks =   0 p /   0 h
whisper_print_timings:      mel time =   638.53 ms
whisper_print_timings:   sample time = 10923.87 ms /  1463 runs (     7.47 ms per run)
whisper_print_timings:   encode time = 129847.90 ms /     3 runs ( 43282.63 ms per run)
whisper_print_timings:   decode time =  2787.62 ms /    15 runs (   185.84 ms per run)
whisper_print_timings:   batchd time = 154962.50 ms /  1439 runs (   107.69 ms per run)
whisper_print_timings:   prompt time =  6273.13 ms /   159 runs (    39.45 ms per run)
whisper_print_timings:    total time = 309589.03 ms
whisper_init_from_file_with_params_no_state: loading model from 'models/ggml-medium.bin'
whisper_init_with_params_no_state: use gpu    = 1
whisper_init_with_params_no_state: flash attn = 1
whisper_init_with_params_no_state: gpu_device = 0
whisper_init_with_params_no_state: dtw        = 0
whisper_init_with_params_no_state: devices    = 1
whisper_init_with_params_no_state: backends   = 1
whisper_model_load: loading model
whisper_model_load: n_vocab       = 51865
whisper_model_load: n_audio_ctx   = 1500
whisper_model_load: n_audio_state = 1024
whisper_model_load: n_audio_head  = 16
whisper_model_load: n_audio_layer = 24
whisper_model_load: n_text_ctx    = 448
whisper_model_load: n_text_state  = 1024
whisper_model_load: n_text_head   = 16
whisper_model_load: n_text_layer  = 24
whisper_model_load: n_mels        = 80
whisper_model_load: ftype         = 1
whisper_model_load: qntvr         = 0
whisper_model_load: type          = 4 (medium)
whisper_model_load: adding 1608 extra tokens
whisper_model_load: n_langs       = 99
whisper_model_load:          CPU total size =  1533.14 MB
whisper_model_load: model size    = 1533.14 MB
whisper_backend_init_gpu: device 0: CPU (type: 0)
whisper_backend_init_gpu: no GPU found
whisper_init_state: kv self size  =   50.33 MB
whisper_init_state: kv cross size =  150.99 MB
whisper_init_state: kv pad  size  =    6.29 MB
whisper_init_state: compute buffer (conv)   =   28.57 MB
whisper_init_state: compute buffer (encode) =   44.60 MB
whisper_init_state: compute buffer (cross)  =    7.73 MB
whisper_init_state: compute buffer (decode) =   98.20 MB

system_info: n_threads = 4 / 8 | WHISPER : COREML = 0 | OPENVINO = 0 | CPU : NEON = 1 | ARM_FMA = 1 | FP16_VA = 1 | DOTPROD = 1 | OPENMP = 1 | REPACK = 1 |

main: processing '/data/data/com.termux/files/home/samples/test_cut.wav' (960216 samples, 60.0 sec), 4 threads, 1 processors, 5 beams + best of 5, lang = ko, task = transcribe, timestamps = 1 ...

기술보고서 

1. 벤치마크 환경 및 조건

  • 테스트 기기: Samsung Galaxy A35 (Exynos 1380 / ARM64)
  • 운영 체제: Termux (Android Native Linux Environment)
  • 사용 엔진: whisper.cpp (C++ 기반, NEON & ARM_FMA 하드웨어 가속 활성화)
  • 입력 데이터: 60초 길이의 한국어 유튜브 추출 음성 (16kHz, Mono WAV)
  • 테스트 조건: 스레드 4개 할당 (-t 4), Greedy Search (Beam Search 미적용)
체급 모델 크기 처리 시간 (Total) RTF
(Real-Time Factor)*
한국어 인식 품질 (주관적 평가)
Tiny 77.11 MB - - 무응답..
Base 147.37 MB 52,726 ms
(약 52.7초)
0.88 문맥 파악이 부족하고, 조사/어미 오류가 다수 존재함
("코스피저", "하랑임도").
Small 487.01 MB 97,656 ms
(약 1분 37초)
1.62 [추천] 실생활 대화 수준의 인식 가능.
유튜브 화자의 의도와 고유명사("코스피")를 제법 잘 잡아냄.
Medium 1533.14 MB 309,589 ms
(약 5분 9초)
5.15 완벽에 가까운 정확도.
"아, 이거 하면 안 되구나" 같은 감탄사 및 맥락까지 정확히 캐치. 하지만 극악의 속도.

 

빔서치라는 알고리즘을 쓰면 정확도가 더 올라간다고 한다. 그만큼 연산이 더 추가되어 오래걸린다고 합니다.

빔이란 ?

AI 모델이 문장을 생성할 때, '다음에 올 가장 확률 높은 단어'를 하나만 고르지 않고, 여러 개의 후보를 동시에 추적하며 최적의 문장을 찾아내는 알고리즘

그런데 제 로그를 잘보면

main: processing '/data/data/com.termux/files/home/samples/test_cut.wav' (960216 samples, 60.0 sec), 4 threads, 1 processors, 5 beams + best of 5, lang = ko, task = transcribe, timestamps = 1 ...

이미 빔즈가 먹었다고 합니다. 

이건 자동으로 어? 이상한데??? 하면서 이미 5개 후보중 하나를 돌렸다는 이야기입니다.

그래서 궂이 따로 빔즈를 넣지 않아도되었으며, 빠르게 대강대강 훝어가려면 오히려 빔 옵션을 1로 주면되겠습니다.

이것으로 모델 4개의 체급에 대해서 알아보았고 모두 검증/분석 해보았습니다.

감사합니다.

다음 포스팅은 화자분리에 대해서 알아보겠습니다!

 

728x90
LIST

댓글