HUTAMS_AUDIO/setup.sh

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}"