100 lines
4.8 KiB
Bash
Executable File
100 lines
4.8 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# SYNOPSIS
|
|
# HUTAMS 프로젝트 최초 설정 스크립트 (Linux Bash 버전)
|
|
#
|
|
# DESCRIPTION
|
|
# 1. uv 동기화 (의존성 라이브러리 설치)
|
|
# 2. llm_weights, whisper_weights 폴더 생성
|
|
# 3. 대용량 언어모델 (.gguf) 다운로드 (존재하지 않을 경우)
|
|
# 4. Whisper STT 모델 다운로드 (존재하지 않을 경우)
|
|
|
|
set -e # 오류 발생 시 중단
|
|
|
|
# 색상 정의
|
|
CYAN='\033[0;36m'
|
|
YELLOW='\033[1;33m'
|
|
GREEN='\033[0;32m'
|
|
RED='\033[0;31m'
|
|
NC='\033[0m'
|
|
|
|
echo -e "${CYAN}=====================================================${NC}"
|
|
echo -e "${CYAN} HUTAMS STT 프로젝트 초기화 스크립트 (setup.sh) ${NC}"
|
|
echo -e "${CYAN}=====================================================${NC}"
|
|
|
|
# ── 1. uv 패키지 설치 ────────────────────────────────────────────────────────
|
|
echo -e "\n${YELLOW}[1/4] uv sync로 파이썬 패키지 설치 중...${NC}"
|
|
if command -v uv &> /dev/null; then
|
|
uv sync
|
|
echo -e "${GREEN}패키지 설치 완료!${NC}"
|
|
else
|
|
echo -e "${RED}uv 실행 실패. https://docs.astral.sh/uv/ 에서 uv를 설치 후 재시도해주세요.${NC}"
|
|
exit 1
|
|
fi
|
|
|
|
# ── 2. 폴더 생성 ─────────────────────────────────────────────────────────────
|
|
echo -e "\n${YELLOW}[2/4] 모델 폴더 생성 중...${NC}"
|
|
mkdir -p llm_weights whisper_weights data/audio data/samples
|
|
echo -e "${GREEN}폴더 생성 완료!${NC}"
|
|
|
|
# ── 3. LLM 모델(.gguf) 다운로드 ──────────────────────────────────────────────
|
|
LlmModelName="Qwen3.5-0.8B-Q4_K_M.gguf"
|
|
LlmModelPath="llm_weights/$LlmModelName"
|
|
LlmDownloadUrl="https://huggingface.co/unsloth/Qwen3.5-0.8B-GGUF/resolve/main/Qwen3.5-0.8B-Q4_K_M.gguf?download=true"
|
|
|
|
echo -e "\n${YELLOW}[3/4] LLM 모델($LlmModelName) 확인 중...${NC}"
|
|
if [ -f "$LlmModelPath" ]; then
|
|
echo -e "${GREEN}이미 존재합니다. 다운로드를 건너뜁니다.${NC}"
|
|
else
|
|
echo -e "${YELLOW}다운로드 시작 (용량이 크므로 시간이 걸릴 수 있습니다)...${NC}"
|
|
if command -v curl &> /dev/null; then
|
|
curl -L -o "$LlmModelPath" "$LlmDownloadUrl"
|
|
elif command -v wget &> /dev/null; then
|
|
wget -O "$LlmModelPath" "$LlmDownloadUrl"
|
|
else
|
|
echo -e "${RED}[오류] curl 또는 wget이 설치되어 있지 않습니다.${NC}"
|
|
echo -e "${RED}아래 URL에서 수동으로 받아 'llm_weights/' 폴더에 배치하세요:${NC}"
|
|
echo -e "${YELLOW} → $LlmDownloadUrl${NC}"
|
|
fi
|
|
|
|
if [ $? -eq 0 ] && [ -f "$LlmModelPath" ]; then
|
|
echo -e "${GREEN}LLM 모델 다운로드 완료!${NC}"
|
|
else
|
|
echo -e "${RED}[오류] LLM 모델 다운로드 실패.${NC}"
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
# ── 4. Whisper STT 모델 다운로드 ─────────────────────────────────────────────
|
|
WhisperDir="whisper_weights"
|
|
WhisperModelName="large-v3-turbo"
|
|
|
|
echo -e "\n${YELLOW}[4/4] Whisper STT 모델($WhisperModelName) 다운로드 중...${NC}"
|
|
# whisper_weights/ 안에 이미 파일이 있으면 건너뜀 (ls -A 사용)
|
|
if [ -d "$WhisperDir" ] && [ "$(ls -A "$WhisperDir")" ]; then
|
|
echo -e "${GREEN}이미 whisper_weights 폴더에 파일이 존재합니다. 건너뜁니다.${NC}"
|
|
else
|
|
echo -e "${YELLOW}uv run을 통해 Whisper 모델을 프로젝트 내부 캐시로 다운로드합니다 (최초 1회)...${NC}"
|
|
|
|
# 절대 경로 확보
|
|
ABS_WHISPER_PATH=$(pwd)/$WhisperDir
|
|
|
|
export WHISPER_MODEL_PATH="$ABS_WHISPER_PATH"
|
|
|
|
uv run python -c "
|
|
from faster_whisper import WhisperModel
|
|
import os
|
|
model_path = os.environ.get('WHISPER_MODEL_PATH', './whisper_weights')
|
|
print(f'Whisper 모델 다운로드 위치: {model_path}')
|
|
m = WhisperModel('$WhisperModelName', device='cpu', compute_type='int8', download_root=model_path)
|
|
print('다운로드 완료!')
|
|
" && echo -e "${GREEN}Whisper STT 모델 다운로드 완료!${NC}" || echo -e "${RED}[오류] Whisper 모델 다운로드 실패. 서버 첫 기동 시 자동으로 다운로드를 시도합니다.${NC}"
|
|
fi
|
|
|
|
# ── 완료 ──────────────────────────────────────────────────────────────────────
|
|
echo -e ""
|
|
echo -e "${CYAN}=====================================================${NC}"
|
|
echo -e "${CYAN} 모든 설정이 완료되었습니다! ${NC}"
|
|
echo -e "${CYAN} bash run_server.sh(또는 python app/main.py)로 시작하세요. ${NC}"
|
|
echo -e "${CYAN}=====================================================${NC}"
|