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

[비교/검증-5] #7. Edge Agent AI 음성처리 : Vosk / Pyannote / Sherpa-ONNX / Whisper.cpp 결과 비교

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

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

안녕하세요~~~!!! 

이번에 포스팅을 할 주제는!

Vosk / Pyannote / Sherpa-ONNX / Whisper.cpp 결과 비교

입니다. 제가 직접 경험하고 구동하고 성능까지 직접 테스트해본 결과입니다. 재미있게 봐주세요!


1. 테스트 개요 및 전제 조건

본 평가는 모바일 단말 단독 구동을 목표로 진행했다.
테스트환경 갤럭시 A35Exynos 1380, RAM 6GB이며 일반적으로 3GB 내외만 가용 가능한 조건
실행기반 Android + Termux + ARM 환경, 일부 항목은 PRoot Ubuntu 및 Conda를 추가로 사용
평가대상 Whisper.cpp, Sherpa-ONNX, pyannote.audio, Vosk

평가 기준은 다음 세 축으로 구성했다.

  1. STT 성능(정확도 중심)
  2. 화자 분리 성능(구간 분할 정교함, 겹침 구간 대응, 실패 여부)
  3. 설치 및 구동 난이도(의존성, 빌드/런타임 우회 필요성, OOM 리스크, 재현성)
점수는 10점 만점이며, 높을수록 좋다 로 통일했다. 설치 및 구동 난이도 점수는 높을수록 쉽다로 정의했다.

2. 엔진별 결과 요약 점수(10점 만점)

Whisper.cpp

총점 : 6/10

가장 안정적이고 정확한 STT 성능을 보여주었으나, 화자 분리 기능의 부재로 인해 점수가 깎였다.

평가 항목 점수 (10점 만점) 산정 이유 및 근거
STT 성능 9 거대 언어 모델 기반으로 문맥을 파악하며, 비교 대상 중 한국어 텍스트 인식률이 가장 압도적이고 정확하다.
처리 속도 7 모바일 환경에서 단일 STT 추론 시 무난하고 수용 가능한 수준의 속도를 보여준다.
화자 분리 0 원천적으로 화자 분리(Diarization) 기능이 존재하지 않으며, 한국어 지원 모델도 전무하다.
시스템 안정성 8 안드로이드 메모리 한계 내에서 강제 종료(OOM) 없이 안정적으로 연산을 완주한다.
설치 편의성 8 치명적인 억까(오류)나 복잡한 우회 과정 없이 Termux 순정 환경에서 원활하게 빌드된다.

 

Whisper.cpp는 화자 분리 기능이 사실상 부재하여 STT 단독으로만 평가했다. 
1분짜리 오디오를 small/base/medium 등 4개로 처리했으며, 출력 문장에 오탈자 및 단어 붕괴가 다수 확인된다. 예를 들어 코스피저, 출시자, 상실 50% 등 의미가 어긋난 토큰이 반복된다. 그럼에도 일부 구간은 대화 흐름이 유지되고 핵심 키워드(코스피 등)가 간헐적으로 유지되어 완전 붕괴 수준은 아니다.
성능 로그에서 총 처리 시간은 약 52.7초로 기록되었다. 이는 60초 오디오 대비 실시간보다 빠른 수준으로 측정되며(대략 RTF 0.88 수준), 모바일 CPU 환경에서 속도만 놓고 보면 경쟁력이 확인되었다. 다만 이 평가는 정확도를 중심으로 점수를 부여했으므로, 오탈자 빈도가 점수를 깎았다.

제공된 로그에서는 GPU가 탐지되지 않았고(CPU only), 스레드 4로 실행되었다. 그럼에도 실행 자체는 안정적으로 완료되었고, 별도의 PRoot/Conda/대형 프레임워크 적재 없이 단일 바이너리 형태로 처리된 흐름이 확인되었다.

따라서 STT 단독 성능은 비교 대상 중 가장 우수하다. 거대 언어 모델 기반이라 문맥 파악이 가능해 준수한 텍스트 인식률을 보여준다. 다만 화자 분리 기능이 원천적으로 없고, 한국어 학습 모델이 부재하여 단일 화자의 단순 받아쓰기 용도로만 활용할 수 있다.

그리고 다른 환경 대비 치명적인 오류나 복잡한 우회 과정 없이, 터뮤즈 환경에서 상대적으로 수월하게 빌드 및 구동을 완료한점이 가장 높은 점수를 줄 수 있었다.


Sherpa-ONNX

총점 5/10

C++ 기반의 훌륭한 화자 분리 능력을 갖췄으나, STT 결합 시 발생하는 심각한 인식률 저하와 파이썬 래퍼의 비효율이 한계로 작용했다.

평가 항목 점수 (10점 만점) 산정 이유 및 근거
STT 성능 3 양자화 모델의 한계로 "LS 증권"을 "에르 건"으로 표기하는 등 고유명사 및 문맥 파괴가 심각하다.
처리 속도 4 화자 분리 단독 구동 시 빠르나(RTF 1.6), STT와 결합하여 파이썬으로 구동 시 처리 속도가 처참하게 지연된다(RTF 5.9).
화자 분리 9 두 사람의 목소리가 겹치는 구간(Overlap)까지 정밀하게 인지하고 세밀하게 분리해낸다.
시스템 안정성 4 파이썬 환경에서 모델 3개를 동시 구동 시 램 점유율이 95%까지 치솟으며 시스템이 얼어붙는 불안정을 보인다.
설치 편의성 3 공식 CMake가 안드로이드 환경을 미지원하여 빌드에 실패하며, PRoot 우분투 셋업 등 복잡한 우회 과정이 강제된다.
Sherpa-ONNX의 C++ 오프라인 화자 분리 바이너리는 성공적으로 동작했다. 
69.974초 오디오를 112.268초에 처리했고 RTF 1.604로 기록되었다. PRoot 기반 가상화 환경이라는 불리한 조건에서도 이 정도 속도면 오프라인 배치 처리로 충분히 실용 범위에 들어간다.
화자 분리 품질은 겹치는 구간까지 분리가 관찰되었으며, 특정 구간에서 speaker_00과 speaker_01이 교차로 잡히는 정교한 세그먼트가 제시되어 있다. 나의 관찰 기준으로 세밀하게 나뉜다는 결론이 명확하고, Killed/OOM 없이 완주했다는 점에서 안정성도 확인된다. 따라서 화자 분리만 놓고 보면 본 테스트 중 최상급으로 평가된다.
문제는 통합 파이프라인이다. Sherpa-ONNX는 STT 바이너리와 diarization 바이너리가 분리되어 있어, 텍스트 형태의 최종 대화록을 만들려면 Python으로 결합해야 했다. 고유명사 파괴(LS 증권 > 에르 건), 문맥 붕괴(인생 그럼 행정)가 치명적이라고 생각했다.
속도는 더 큰 문제로 작용헀다. 결합 시 RTF 5.9로 언급되어 1분 오디오에 6분 가까이 소요되는 양상이다. 이는 모바일 AP에서 Python 환경 + 다중 모델 동시 로딩으로 인한 메모리 관리/컨텍스트 스위칭 비용이 커졌다. 화자 분리 자체는 유일한 위안으로 평가되었다.
그리고 Termux 순정 환경에서 CMake 단계가 안드로이드 지원 미비로 실패, ONNXRuntime을 수동 지정하는 우회도 실패. 결국 PRoot Ubuntu로 들어가 빌드를 진행해 성공... 이후 모델 다운로드, 실행 옵션 구성, 그리고 최종 통합을 위해 Conda 환경에서 torch/torchaudio/sherpa-onnx를 추가 설치했다.
이 과정은 가벼운 C++ 장점을 포기하고 무거운 Python 생태계로 진입하는 구조적 딜레마가 동반된다. 또한 램 점유율 95% 수준으로 OOM Kill 위기가 있어 구현 안정성도 낮았다.
성공은 했지만 난이도는 높다고 판단했다.

Pyannote

총점 : 1/10

업계 표준의 강력한 모델이나, 모바일의 물리적 한계(메모리 부족)를 넘지 못해 실사용이 불가능하다.

평가 항목 점수 (10점 만점) 산정 이유 및 근거
STT 성능 N/A (0) 자체적인 음성 텍스트 변환(STT) 받아쓰기 기능이 포함되어 있지 않다.
처리 속도 1 무거운 파이토치 기반으로, 모바일 엣지 환경에서는 연산 속도를 논하기 어려울 정도로 무겁다.
화자 분리 N/A (0) PC 서버 기준으로는 완벽한 파이프라인이나, 모바일에서는 메모리 폭발로 결과를 끝까지 도출하지 못한다.
시스템 안정성 0 연산 과정에서 메모리 한계를 초과하여 안드로이드 OS 정책에 의해 100% 프로세스 강제 종료(Killed)가 발생한다.
설치 편의성 1 torchaudio 버전 충돌, 보안 정책 우회(weights_only), torchcodec 의존성 강제 수정 등 극악의 트러블슈팅이 필요하다.
설치와 호환성 문제를 다 처리하고 오디오 분석 단계까지는 진입했다. 그런데 추론이 시작되자마자 안드로이드 메모리 정책에 걸려 Killed 한 줄만 남기고 프로세스가 종료됐다. 에러 로그도 없어서 전형적인 OOM 강제 종료로 판단했다. 스레드를 1개로 고정했고 taskset으로 저전력 코어에 묶는 시도까지 했지만 결과는 동일했다.
실사용은 불가능하다고 결론냈고, 다만 추론 직전 단계까지 올려 둔 작업량이 있어 0점 대신 1점을 줬다.
그리고 PRoot + Conda를 기본으로 깔고, torch/torchaudio/pyannote.audio 버전을 핀 고정했으며 numpy 버전 제한까지 걸었다. ffmpeg, libsndfile 같은 시스템 패키지도 추가로 필요했다. 진행 중 torchaudio API 변경으로 에러가 났고, PyTorch 보안 정책 때문에 모델 로딩이 막혀 weights_only 우회 코드를 넣었다. 또 torchcodec이 없는 NVIDIA 계열 라이브러리를 찾는 문제까지 터져서 해당 경로를 제거하고 soundfile로 오디오 로딩을 강제로 대체했다.
여기까지 다 뚫어도 마지막에 Killed로 끝났기 때문에, 설치-구동 난이도 마저도  최하위권이라고 판단했다.

Vosk

총점 : 3/10
극한의 경량화에는 성공했으나, 처참한 STT 품질과 모바일 환경에서의 극심한 병목 현상으로 실효성이 없다.
평가 항목 점수 (10점 만점) 산정 이유 및 근거
STT 성능 1 언어 모델(LM)의 부재로 인해 "문 듀라셀 결시생" 등 문맥과 무관한 워드 샐러드(외계어) 현상이 발생한다.
처리 속도 1 극심한 병목 현상이 발생하여, 약 1분짜리 오디오 파일을 분석하는 데 30분 이상이 소요된다.
화자 분리 4 특정 화자(Speaker 0, 1)로 묶어주지 못하고 주파수 벡터 값(-1.11 등)만 단순 추출하는 한계를 보인다.
시스템 안정성 6 속도는 매우 느리지만, 엔진 자체가 가벼워 시스템 메모리 부족으로 인한 강제 종료는 발생하지 않는다.
설치 편의성 0 모바일(안드로이드) 파이썬 구동을 아예 차단해두어, OS 환경 변수를 'linux'로 강제 뇌수술(Spoofing)해야만 구동된다.

단 50MB라는 극단적인 가벼움은 모바일 환경에서 분명 매력적인 장점이었지만, 실제 구동 시 여러 치명적인 한계를 드러냈다. 

가장 큰 문제는 STT 성능이 사실상 붕괴되었다는 점인데, 언어 모델의 부재로 인해 자연어의 맥락을 전혀 파악하지 못했고, '문 듀라셀 결시생 풀어갈지' 처럼 원문과 전혀 대응되지 않는 워드 샐러드 현상이 발생했다. 일부 구간에서 첫 두세 단어는 맞추더라도 뒤로 갈수록 급격히 무너지며 문장 단위의 신뢰도를 상실학도 했고 화자 분리 기능 역시 기대했던 명확한 레이블링이나 군집화 대신 "-1.11, 0.730"과 같은 임베딩 벡터 실수 값만 출력하는 데 그쳤다.

다만, 이 특징 벡터를 뽑아내는 과정 자체는 동작했기에 분리를 시도했다는 점에서는 일말의 가능성을 엿볼 수 있었다. 더불어 처리 속도 측면에서도 모바일 파이썬 환경 기준 약 1분짜리 오디오 분석에 30분이 넘게 소요되는 심각한 병목 현상이 발생해 실사용이 불가능한 수준이었다.

가장 험난했던 부분은 설치 과정이며 이는 단순한 설치 난이도를 넘어선 사실상의 '생존 게임'에 가까웠다. 

PyPI에 안드로이드용 배포판이 없어 시작부터 가로막혔고, TUR 저장소나 wheel 패키징 재시도도 모두 실패했습니다. 결국 안드로이드 AAR 파일에서 arm64-v8a용 라이브러리(libvosk.so)를 직접 추출해 수동으로 연결하고, 소스 코드를 클론하여 vosk_builder.py를 통해 CFFI 바인딩을 강제로 생성하는 우회로를 거쳐야만 했다.

게다가 마지막 실행 단계에서는 sys.platform 체크 로직에 막혀, 런타임 환경 변수를 linux 속이는 짓까지 감행하고 나서야 간신히 구동시킬 수 있었다. 이러한 극한의 트러블슈팅 과정을 고려할 때, 설치 편의성은 끔찍헀다.

결과적으로, 가벼운 용량 덕분에 램 점유율 문제는 없었지만, 처참한 인식률과 최악의 이식 난이도로 인해 모바일 오프라인 환경에는 단독으로 사용하긴 어렵고 부적합하다는 결론이 도출되는 것 같다.


종합 점수 비교표

각 항목의 점수를 한눈에 비교할 수 있는 총점 비교표이다.

평가 모델 STT 성능 처리 속도 화자 분리 시스템 안정성 설치 편의성 최종 평가 총점 (환산)
Whisper.cpp 9 7 0 8 8 6 / 10
Sherpa-ONNX 3 4 9 4 3 5 / 10
Vosk 1 1 4 6 0 3 / 10
Pyannote 0 1 0 0 1 0 / 10
 

3. 엔진별 종합 평가 및 경험 공유

Whisper.cpp

누가 말했는지 구분하는 화자 분리 기능이 없어서 아쉬웠지만, 텍스트 받아쓰기 자체는 가장 정확하고 듬직했어요ㅎㅎ복잡한 에러 없이 모바일 환경에서 묵묵하게 돌아가 주는 모습이 정말 마음에 들었습니다.

회의록이나 대화 분류가 굳이 필요 없는 단순 음성 메모용이라면 무조건 이 녀석을 기용해야할듯합니다.

Sherpa-ONNX

C++의 깡패 같은 속도로 겹치는 목소리까지 정밀하게 나누는 걸 보고 모바일 AI의 희망인 줄 알았어요ㅋㅋㅋㅋ

그런데 막상 STT 모델이랑 합쳐서 결과를 뽑아내려고 파이썬을 끼얹는 순간, 속도도 처참해지고 알아듣는 수준도 술 취한 비서처럼 변해서 너무 실망했네요;; 화자는 기가 막히게 나누는데 본문 내용을 다 틀려버리니 반쪽짜리 성공 같아서 아쉬움이 많이 남는 녀석;

Pyannote

버전 충돌부터 라이브러리 에러까지 온갖 파이썬 오류를 밤새워 고치며 간신히 오디오를 밀어 넣었는데 결국 램 부족으로 안드로이드가 가차 없이 강제 종료시켜버렸을 때는 정말 허무했어요;;

스마트폰의 3GB 남짓한 가용 램으로는 도저히 이 무거운 녀석을 품을 수 없다는 걸 뼈저리게 느꼈고, 이런 작업은 좋은 PC나 외부 서버에 던져주는 게 맞다는 걸 깨닿게 해준 녀석ㅎㅎ

Vosk

정말 설치하는 내내 저를 제일 괴롭혔던 애증의 엔진

모바일 환경을 아예 배제해놓은 구조라 소스코드까지 뜯어고치며 억지로 구동시켰는데, 결과물이 듀라셀 결시생 같은 외계어라서 헛웃음이 났어요. 게다가 분석 속도까지 30분이나 걸려서, 짧은 단어 명령어가 아니라면 자연어 대화 프로젝트에는 절대 쓸 수 없겠다는 확신이 들었어요. 그래도 화자분리가 가능하단 점에서 우선 조금 고려할 수 있을 것 같아요.


Whisper.cpp, Sherpa-ONNX, Vosk는 험난한 우여곡절 끝에 모바일(엑시노스 1380, 가용 RAM 3GB) 환경에서 구동하는 데 성공했지만, 모바일 단독 환경에서 STT와 화자 분리를 완벽하게 동시에 처리해 주는 만능 엔진은 없으며, 목적에 맞춰 구동 가능한 엔진을 타협해서 사용해야만 하는것같다.

이번 뼈저린 검증을 통해 완벽한 단일 엔진을 찾는 것은 무리라는 것을 깨달았네여.

그래서 앞으로는 각 엔진의 확실한 장점들만 쏙쏙 뽑아내어 하이브리드 파이프라인을 구축해 볼 계획이에요!!!

긴글 읽어주셔서 감사합니다!!!!

다음 포스팅은 하이브리드 파이프라인 구축과정과 검증을 해보고 이제 이친구들과 비교를 최종적으로 해봐야겠어요 ㅎㅎ

 

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

 

728x90
LIST

댓글