UTAU-WebUI / Makefile
crlotwhite's picture
Add UTAU WebUI project with LFS support for voice files
1056960
.PHONY: help setup install compress run clean test dev check-deps status
# κΈ°λ³Έ μ„€μ •
PYTHON := uv run python
UV := uv
VOICEBANK_DIR := voice/hanseol CVC
COMPRESSED_FILE := voice/hanseol_CVC_compressed.h5
PORT := 7860
# κΈ°λ³Έ νƒ€κ²Ÿ
help: ## 도움말 좜λ ₯
@echo "🎡 UTAU WebUI - 개발 ν™˜κ²½ μžλ™ν™” 도ꡬ"
@echo ""
@echo "πŸ“‹ μ‚¬μš© κ°€λŠ₯ν•œ λͺ…λ Ήμ–΄:"
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf " \033[36m%-15s\033[0m %s\n", $$1, $$2}'
@echo ""
@echo "πŸš€ λΉ λ₯Έ μ‹œμž‘:"
@echo " 1. make setup # 개발 ν™˜κ²½ μ„€μ •"
@echo " 2. make compress # λ³΄μ΄μŠ€λ±…ν¬ μ••μΆ•"
@echo " 3. make run # μ›ΉUI μ‹€ν–‰"
@echo ""
setup: ## 개발 ν™˜κ²½ 초기 μ„€μ •
@echo "πŸ”§ 개발 ν™˜κ²½μ„ μ„€μ •ν•©λ‹ˆλ‹€..."
@if ! command -v uv >/dev/null 2>&1; then \
echo "❌ uvκ°€ μ„€μΉ˜λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. https://docs.astral.sh/uv/ μ—μ„œ μ„€μΉ˜ν•˜μ„Έμš”."; \
exit 1; \
fi
@echo "πŸ“¦ μ˜μ‘΄μ„±μ„ μ„€μΉ˜ν•©λ‹ˆλ‹€..."
$(UV) sync
@echo "πŸ“ ν•„μš”ν•œ 디렉토리λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€..."
@mkdir -p voice
@echo "βœ… 개발 ν™˜κ²½ μ„€μ • μ™„λ£Œ!"
install: setup ## setup의 별칭
check-deps: ## μ˜μ‘΄μ„± 및 ν™˜κ²½ 확인
@echo "πŸ” ν™˜κ²½μ„ ν™•μΈν•©λ‹ˆλ‹€..."
@echo "UV 버전: $$($(UV) --version 2>/dev/null || echo '❌ uv μ—†μŒ')"
@echo "Python 버전: $$($(PYTHON) --version 2>/dev/null || echo '❌ Python μ—†μŒ')"
@if [ -f "$(COMPRESSED_FILE)" ]; then \
echo "βœ… μ••μΆ•λœ λ³΄μ΄μŠ€λ±…ν¬: $(COMPRESSED_FILE)"; \
$(PYTHON) -c "import h5py; f=h5py.File('$(COMPRESSED_FILE)', 'r'); print(f'πŸ“Š 메타데이터: {dict(f[\"metadata\"].attrs)}')"; \
else \
echo "❌ μ••μΆ•λœ λ³΄μ΄μŠ€λ±…ν¬κ°€ μ—†μŒ: $(COMPRESSED_FILE)"; \
fi
@if [ -d "$(VOICEBANK_DIR)" ]; then \
echo "βœ… 원본 λ³΄μ΄μŠ€λ±…ν¬: $(VOICEBANK_DIR) ($$(find "$(VOICEBANK_DIR)" -name "*.wav" | wc -l)개 WAV 파일)"; \
else \
echo "❌ 원본 λ³΄μ΄μŠ€λ±…ν¬κ°€ μ—†μŒ: $(VOICEBANK_DIR)"; \
fi
compress: ## λ³΄μ΄μŠ€λ±…ν¬λ₯Ό HDF5 ν˜•νƒœλ‘œ μ••μΆ•
@echo "πŸ—œοΈ λ³΄μ΄μŠ€λ±…ν¬λ₯Ό μ••μΆ•ν•©λ‹ˆλ‹€..."
@if [ ! -d "$(VOICEBANK_DIR)" ]; then \
echo "❌ 원본 λ³΄μ΄μŠ€λ±…ν¬λ₯Ό 찾을 수 μ—†μŠ΅λ‹ˆλ‹€: $(VOICEBANK_DIR)"; \
echo "πŸ“‹ ν•΄κ²° 방법:"; \
echo " 1. hanseol CVC λ³΄μ΄μŠ€λ±…ν¬λ₯Ό $(VOICEBANK_DIR) 에 배치"; \
echo " 2. λ˜λŠ” λ‹€λ₯Έ λ³΄μ΄μŠ€λ±…ν¬λ₯Ό μ‚¬μš©ν•˜λ €λ©΄:"; \
echo " make compress VOICEBANK_DIR=your/voicebank/path"; \
exit 1; \
fi
@echo "πŸ“ 원본 μœ„μΉ˜: $(VOICEBANK_DIR)"
@echo "πŸ’Ύ μ••μΆ• 파일: $(COMPRESSED_FILE)"
$(PYTHON) -c "\
from voice_data_converter import convert_voicebank_to_compressed_format; \
success = convert_voicebank_to_compressed_format('$(VOICEBANK_DIR)', '$(COMPRESSED_FILE)'); \
print('βœ… μ••μΆ• μ™„λ£Œ!' if success else '❌ μ••μΆ• μ‹€νŒ¨')"
@echo "πŸŽ‰ λ³΄μ΄μŠ€λ±…ν¬ 압좕이 μ™„λ£Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€!"
run: ## μ›ΉUI μ‹€ν–‰
@echo "πŸš€ UTAU WebUIλ₯Ό μ‹œμž‘ν•©λ‹ˆλ‹€..."
@if [ ! -f "$(COMPRESSED_FILE)" ]; then \
echo "❌ μ••μΆ•λœ λ³΄μ΄μŠ€λ±…ν¬κ°€ μ—†μŠ΅λ‹ˆλ‹€."; \
echo "πŸ“‹ λ¨Όμ € λ‹€μŒ λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•˜μ„Έμš”: make compress"; \
exit 1; \
fi
@echo "🌐 μ›Ή λΈŒλΌμš°μ €μ—μ„œ http://localhost:$(PORT) 을 μ—΄μ–΄μ£Όμ„Έμš”"
$(PYTHON) webui.py
dev: ## 개발 λͺ¨λ“œλ‘œ μ‹€ν–‰ (auto-reload)
@echo "πŸ”§ 개발 λͺ¨λ“œλ‘œ UTAU WebUIλ₯Ό μ‹œμž‘ν•©λ‹ˆλ‹€..."
@if [ ! -f "$(COMPRESSED_FILE)" ]; then \
echo "❌ μ••μΆ•λœ λ³΄μ΄μŠ€λ±…ν¬κ°€ μ—†μŠ΅λ‹ˆλ‹€."; \
echo "πŸ“‹ λ¨Όμ € λ‹€μŒ λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•˜μ„Έμš”: make compress"; \
exit 1; \
fi
@echo "🌐 μ›Ή λΈŒλΌμš°μ €μ—μ„œ http://localhost:$(PORT) 을 μ—΄μ–΄μ£Όμ„Έμš”"
@echo "πŸ”„ 파일 λ³€κ²½ μ‹œ μžλ™μœΌλ‘œ μž¬μ‹œμž‘λ©λ‹ˆλ‹€"
$(UV) run --env GRADIO_AUTO_RELOAD=1 python webui.py
test: ## μ••μΆ•λœ λ³΄μ΄μŠ€λ±…ν¬ ν…ŒμŠ€νŠΈ
@echo "πŸ§ͺ μ••μΆ•λœ λ³΄μ΄μŠ€λ±…ν¬λ₯Ό ν…ŒμŠ€νŠΈν•©λ‹ˆλ‹€..."
@if [ ! -f "$(COMPRESSED_FILE)" ]; then \
echo "❌ μ••μΆ•λœ λ³΄μ΄μŠ€λ±…ν¬κ°€ μ—†μŠ΅λ‹ˆλ‹€: $(COMPRESSED_FILE)"; \
echo "πŸ“‹ λ¨Όμ € λ‹€μŒ λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•˜μ„Έμš”: make compress"; \
exit 1; \
fi
$(PYTHON) test_compressed_voicebank.py
status: ## ν˜„μž¬ μƒνƒœ 확인
@echo "πŸ“Š UTAU WebUI μƒνƒœ"
@echo "===================="
@make check-deps
@echo ""
@if [ -f "$(COMPRESSED_FILE)" ] && [ -d "$(VOICEBANK_DIR)" ]; then \
echo "πŸŽ‰ λͺ¨λ“  μ€€λΉ„κ°€ μ™„λ£Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€! 'make run'으둜 μ‹œμž‘ν•˜μ„Έμš”."; \
elif [ -f "$(COMPRESSED_FILE)" ]; then \
echo "βœ… μ••μΆ•λœ λ³΄μ΄μŠ€λ±…ν¬κ°€ μ€€λΉ„λ˜μ—ˆμŠ΅λ‹ˆλ‹€! 'make run'으둜 μ‹œμž‘ν•˜μ„Έμš”."; \
elif [ -d "$(VOICEBANK_DIR)" ]; then \
echo "⚠️ λ³΄μ΄μŠ€λ±…ν¬κ°€ μžˆμ§€λ§Œ μ••μΆ•λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. 'make compress'λ₯Ό μ‹€ν–‰ν•˜μ„Έμš”."; \
else \
echo "❌ λ³΄μ΄μŠ€λ±…ν¬κ°€ μ—†μŠ΅λ‹ˆλ‹€. λ¨Όμ € λ³΄μ΄μŠ€λ±…ν¬λ₯Ό μ€€λΉ„ν•˜κ³  'make compress'λ₯Ό μ‹€ν–‰ν•˜μ„Έμš”."; \
fi
clean: ## μž„μ‹œ 파일 및 μΊμ‹œ 정리
@echo "🧹 μž„μ‹œ νŒŒμΌμ„ μ •λ¦¬ν•©λ‹ˆλ‹€..."
@find . -type f -name "*.pyc" -delete 2>/dev/null || true
@find . -type d -name "__pycache__" -exec rm -rf {} + 2>/dev/null || true
@find . -type f -name "*.tmp" -delete 2>/dev/null || true
@find . -type f -name ".DS_Store" -delete 2>/dev/null || true
@rm -rf .pytest_cache 2>/dev/null || true
@echo "βœ… 정리 μ™„λ£Œ!"
clean-all: clean ## λͺ¨λ“  μƒμ„±λœ 파일 μ‚­μ œ (μ••μΆ• 파일 포함)
@echo "πŸ—‘οΈ λͺ¨λ“  μƒμ„±λœ νŒŒμΌμ„ μ‚­μ œν•©λ‹ˆλ‹€..."
@if [ -f "$(COMPRESSED_FILE)" ]; then \
echo "⚠️ μ••μΆ•λœ λ³΄μ΄μŠ€λ±…ν¬λ„ μ‚­μ œλ©λ‹ˆλ‹€: $(COMPRESSED_FILE)"; \
read -p "κ³„μ†ν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ? (y/N): " confirm; \
if [ "$$confirm" = "y" ] || [ "$$confirm" = "Y" ]; then \
rm -f "$(COMPRESSED_FILE)"; \
echo "βœ… λͺ¨λ“  파일이 μ‚­μ œλ˜μ—ˆμŠ΅λ‹ˆλ‹€."; \
else \
echo "❌ μ·¨μ†Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€."; \
fi \
else \
echo "βœ… 정리할 파일이 μ—†μŠ΅λ‹ˆλ‹€."; \
fi
# 개발자λ₯Ό μœ„ν•œ μΆ”κ°€ λͺ…λ Ήμ–΄
update: ## μ˜μ‘΄μ„± μ—…λ°μ΄νŠΈ
@echo "πŸ“¦ μ˜μ‘΄μ„±μ„ μ—…λ°μ΄νŠΈν•©λ‹ˆλ‹€..."
$(UV) sync --upgrade
@echo "βœ… μ—…λ°μ΄νŠΈ μ™„λ£Œ!"
shell: ## ν”„λ‘œμ νŠΈ μ‰˜ μ§„μž…
@echo "🐚 ν”„λ‘œμ νŠΈ μ‰˜μ— μ§„μž…ν•©λ‹ˆλ‹€..."
$(UV) shell
info: ## ν”„λ‘œμ νŠΈ 정보 좜λ ₯
@echo "πŸ“‹ UTAU WebUI ν”„λ‘œμ νŠΈ 정보"
@echo "============================"
@echo "ν”„λ‘œμ νŠΈ: UTAU WebUI"
@echo "μ„€λͺ…: ν•œκ΅­μ–΄ CVC λ³΄μ΄μŠ€λ±…ν¬λ₯Ό μ‚¬μš©ν•œ μ›Ή 기반 UTAU μŒμ„± ν•©μ„±κΈ°"
@echo "기술 μŠ€νƒ: Python, Gradio, HDF5, UV"
@echo "포트: $(PORT)"
@echo "λ³΄μ΄μŠ€λ±…ν¬: $(VOICEBANK_DIR)"
@echo "μ••μΆ• 파일: $(COMPRESSED_FILE)"
@echo ""
@echo "πŸ“ 디렉토리 ꡬ쑰:"
@find . -maxdepth 2 -type f -name "*.py" | head -10
@echo ""
# 전체 μ›Œν¬ν”Œλ‘œμš°
all: setup compress run ## 전체 μ„€μ • 및 μ‹€ν–‰ (setup β†’ compress β†’ run)
# κΈ°λ³Έ νƒ€κ²Ÿμ„ help둜 μ„€μ •
.DEFAULT_GOAL := help