모바일/Termux/ARM 기반 환경에서 Vosk 구동중 발생한 트러블 슈팅 정리했습니다.
모든 트러블은 pip install vosk 설치가 안되는것으로 시작되었습니다.
ERROR: Could not find a version that satisfies the requirement vosk (from versions: none)
ERROR: No matching distribution found for vosk

발단 : pip install vosk
원인 : Vosk가 PyPI(파이썬 패키지 저장소)에 "안드로이드용" 빌드를 안 올려놔서 생기는 문제..
일반적인 pip install은 리눅스(glibc) 환경을 예상하는데, 터뮤즈는 안드로이드 커널(Bionic)이라서 "어? 너 뭐야? 나랑 안 맞아!" 하고 거절하는 거죠.
시도 1.
# 1. 터뮤즈 유저 저장소(TUR) 추가
pkg install tur-repo
# 2. 패키지 목록 업데이트
pkg update
# 3. TUR에서 빌드된 python-vosk 설치 (이건 pip이 아니라 pkg로 설치합니다)
pkg install python-vosk
혹시 누군가가 터뮤즈환경에 올렸나 기대해보기 > 실패
시도 2.
pip install wheel
pip install vosk
휠을 먼저 다시 설치하고 보스크로 돌려보기
➜ models git:(master) ✗ pip install wheel
pip install vosk
Collecting wheel
Downloading wheel-0.47.0-py3-none-any.whl.metadata (2.3 kB)
Requirement already satisfied: packaging>=24.0 in /data/data/com.termux/files/usr/lib/python3.13/site-packages (from wheel) (26.1)
Downloading wheel-0.47.0-py3-none-any.whl (32 kB)
Installing collected packages: wheel
Successfully installed wheel-0.47.0
ERROR: Could not find a version that satisfies the requirement vosk (from versions: none)
ERROR: No matching distribution found for vosk
➜ models git:(master) ✗
실패
시도 3.
보스크 공식 안드로이드 라이브러리를 직접 가져와서 터뮤즈 파이썬에 꽂아버리는 방식
먼저 파이썬이 Vosk의 C++ 엔진과 대화할 수 있게 도와주는 '통역사'들을 먼저 설치
pkg update
pkg install python python-numpy libffi cffi binutils ffmpeg -y
안드로이드 앱용으로 배포된 라이브러리 파일에서 엑시노스(arm64)용 엔진만 쏙 빼옵니다.
mkdir -p ~/projects/vosk_test && cd ~/projects/vosk_test
# 안드로이드용 Vosk AAR 파일 다운로드
wget https://repo1.maven.org/maven2/com/alphacephei/vosk-android/0.3.38/vosk-android-0.3.38.aar
# AAR 안에서 arm64용 공유 라이브러리(libvosk.so)만 압축 해제
unzip -j vosk-android-0.3.38.aar jni/arm64-v8a/libvosk.so -d .
바이너리는 우리가 직접 구했으니, 파이썬 코드 부분만 깔아줍니다.
# 바이너리 체크 없이 파이썬 코드만 설치
pip install vosk --no-binary :all:

실패
시도 4.
pip이 못 가져오면 우리가 직접 소스를 클론해서 엑시노스 1380로 만들자.
그냥 Vosk 소스 코드 직접 조립해서 만들어보자는겁니다. 보스크깃을 그냥 가져와서 해봅시다. 아래 명령어치면 깃아이디 패스워드 입력창이 뜹니다. 계정에 토큰하나 만들어서 진행합니다.
cd ~/projects/vosk_test
# 1. 완벽히 치우기
rm -rf vosk-api* vosk-src.zip
# 2. '진짜' 올바른 주소로 클론 (alphacep 입니다!)
git clone https://github.com/alphacep/vosk-api
# 3. 파이썬 폴더 진입
cd vosk-api/python
# 4. 엑시노스의 화력으로 패키지 설치!
pip install .

파이썬은 소스 코드를 받아서 CFFI 바인딩 코드를 성공적으로 만들었습니다! (generating cffi module...)
그런데 이걸 설치용 'Wheel(.whl) 압축 파일'로 포장하려다 보니, 포장 담당자(bdist_wheel)가 거절했다.
설치가 안 된 게 아니라, '포장'을 못해서 에러를 뿜은 것;
이에 대한 또 처리방법
Wheel 패키징 빌드 실패
- 현상: 로컬 폴더에서 pip install . 명령으로 설치를 시도했으나, CFFI 바인딩 모듈 생성 직후 TypeError: Unknown build environment 에러를 뱉으며 설치 중단.
- 원인: 파이썬 패키징 도구인 bdist_wheel이 Termux의 특수한 안드로이드 환경(android-24-arm64_v8a)을 표준 OS로 인식하지 못해 .whl 압축 파일을 생성하지 못하고 빌드 프로세스를 강제 종료함.
- 시도방법: 패키지 매니저(pip)의 자동 설치 방식을 폐기함. CFFI 바인딩 스크립트(vosk_builder.py)를 수동으로 격발하여 C++ 엔진과 연결될 파이썬 래퍼 코드를 강제로 생성한 뒤, 알맹이(vosk 폴더)만 추출하여 작업 디렉토리에 이식하는 '무설치 포터블' 방식을 채택함.
- 결과: OS 환경 제약을 우회하여 파이썬 래퍼(Wrapper) 수동 생성 및 프로젝트 루트로 이식 완료.
# bdist_wheel을 우회하여 수동으로 CFFI 바인딩 코드 생성
python vosk_builder.py
# 생성된 vosk 순정 폴더를 프로젝트 루트로 복사 (이식)
cp -r vosk ~/projects/vosk_test/
# 누락된 잔여 파이썬 의존성만 별도 설치
cd ~/projects/vosk_test
pip install srt websockets
# 1. 방금 받은 소스코드 폴더로 진입
cd ~/projects/vosk_test/vosk-api/python
# 2. pip의 휠 포장을 무시하고, 수동으로 CFFI 바인딩(vosk_cffi.py)만 강제 생성!
python vosk_builder.py
# 3. 생성된 '순정 vosk 폴더'를 통째로 테스트 폴더(프로젝트 루트)로 복사!
# (이게 pip install을 완벽히 수동으로 대체하는 행위입니다)
cp -r vosk ~/projects/vosk_test/
cat << 'EOF' > run_vosk.py
import sys
import wave
import json
import os
from vosk import Model, SpkModel, KaldiRecognizer
# 테스트할 오디오 파일 경로 (위스퍼 검증때 쓰신 그 파일)
AUDIO_FILE = "/data/data/com.termux/files/home/projects/stt_benchmark/samples/test_cut_2.wav"
print("🔥 [Vosk 단독 모드] 모델 로딩 중... (Exynos 1380)")
if not os.path.exists("models/ko-model") or not os.path.exists("models/spk-model"):
print("❌ 모델 폴더가 없습니다! 아까 다운받은 models 폴더가 현재 디렉토리에 있어야 합니다.")
sys.exit(1)
# 모델 로드 (STT 모델 + 화자 식별 모델)
model = Model("models/ko-model")
spk_model = SpkModel("models/spk-model")
# 오디오 파일 열기
if not os.path.exists(AUDIO_FILE):
print(f"❌ 오디오 파일이 없습니다: {AUDIO_FILE}")
sys.exit(1)
wf = wave.open(AUDIO_FILE, "rb")
if wf.getnchannels() != 1 or wf.getsampwidth() != 2 or wf.getframerate() not in [8000, 16000, 32000, 44100, 48000]:
print("❌ 오디오 포맷 에러! 모노(Mono) WAV 파일이어야 합니다.")
sys.exit(1)
# 인식기 세팅
rec = KaldiRecognizer(model, wf.getframerate(), spk_model)
rec.SetWords(True)
print("🎧 음성 분석 시작...\n")
# 오디오 처리
while True:
data = wf.readframes(4000)
if len(data) == 0:
break
if rec.AcceptWaveform(data):
res = json.loads(rec.Result())
if 'text' in res and res['text']:
spk_id = str(res.get('spk', [0.0])[0])[:5]
print(f"[화자 지문: {spk_id}] 텍스트: {res['text']}")
# 마지막 결과 출력
res = json.loads(rec.FinalResult())
if 'text' in res and res['text']:
spk_id = str(res.get('spk', [0.0])[0])[:5]
print(f"[화자 지문: {spk_id}] 텍스트: {res['text']}")
print("\n✅ 분석 완료!")
EOF
# 4. 테스트 폴더로 복귀
cd ~/projects/vosk_test
# 5. 아까 pip이 뻗으면서 못 깐 잔여 의존성만 마저 깔아줍니다.
pip install srt websockets
# 6. (중요) 이 자리에 아까 추출했던 libvosk.so 가 잘 있는지 눈으로 확인!
ls -l libvosk.so
# 7. 대망의 시작
LD_LIBRARY_PATH=. python run_vosk.py
파이썬 실행 이후 : TypeError: Unsupported platform

- 현상: 실행 스크립트(run_vosk.py)를 가동하자 TypeError: Unsupported platform 에러 발생.
- 원인: 수동 이식한 Vosk 파이썬 래퍼(vosk/__init__.py) 내부의 운영체제 검증 로직이 sys.platform을 검사할 때, win32, linux, darwin만을 허용하고 안드로이드(android) 환경을 예외 처리하여 실행을 차단함.
- 시도방법: 라이브러리 내부 코드를 수정하는 대신, 런타임(실행) 시점에 파이썬 인터프리터의 OS 환경 변수를 강제로 linux로 덮어쓰는(Spoofing) 기법을 사용하여 OS 검열 로직을 우회함.
- 결과: 파이썬 인터프리터가 현재 환경을 표준 리눅스로 오인하게 만들어, 차단 로직 통과 성공.
# run_vosk.py 스크립트 최상단에 아래 코드 주입
import sys
# 파이썬 실행 환경을 linux로 위장 (안드로이드 차단 로직 우회)
sys.platform = 'linux'
# ... (이하 vosk 패키지 임포트 진행)
플랫폼의 차별을 부수다: Python Wrapper 강제 뇌수술

뭔가 진행은되는것같습니다...
이것으로 모바일/Termux/ARM 기반 환경에서 Vosk 패키지를 설치할 수 없는 트러블슈팅을 정리해보았습니다.
감사합니다. 이번 트러블슈팅을 잘정리해서 패키징까지 한다음 배포해서 저를 비롯한 많은 사람들이 같은 실수를 반복하지 않으셨으면 해서 다음엔 패키징과정을 포스팅해보겠습니다.
긴글 읽어주셔서 감사합니다.
댓글