ufpalign / Makefile.ufpalign
marcosremar2's picture
Add UFPAlign Docker implementation - Fix MFA Portuguese model names in original Dockerfile - Add comprehensive UFPAlign Docker setup with Kaldi toolkit - Include Docker Compose configuration for multi-container deployment - Add Makefile with convenient commands for container management - Support for interactive shell, API service, and batch processing - Complete documentation for UFPAlign Brazilian Portuguese alignment
a80c875
# UFPAlign Docker Management Makefile
# Inspired by Docker containerizing test tooling best practices
# Variables
IMAGE_NAME := ufpalign
HUB_NAMESPACE := your-namespace
VERSION := $(shell date +'%Y%m%d')
CONTAINER_NAME := ufpalign-container
API_CONTAINER_NAME := ufpalign-api-container
# Docker Compose files
COMPOSE_FILE := docker-compose.ufpalign.yml
# Color output
RED := \033[31m
GREEN := \033[32m
YELLOW := \033[33m
BLUE := \033[34m
RESET := \033[0m
.PHONY: help version-check clean-image image push test-container run-interactive run-api stop clean setup-dirs
help: ## Show this help message
@echo "$(BLUE)UFPAlign Docker Management$(RESET)"
@echo ""
@echo "$(GREEN)Available targets:$(RESET)"
@awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf " $(YELLOW)%-20s$(RESET) %s\n", $$1, $$2}' $(MAKEFILE_LIST)
version-check: ## Check current version and image status
@echo "$(BLUE)Current version: $(VERSION)$(RESET)"
@echo "$(BLUE)Checking for existing images:$(RESET)"
@docker images | grep $(IMAGE_NAME) || echo "$(YELLOW)No existing images found$(RESET)"
setup-dirs: ## Create necessary local directories
@echo "$(GREEN)Creating local directories...$(RESET)"
@mkdir -p audio_input text_input output textgrid logs
@echo "$(GREEN)Directories created successfully$(RESET)"
clean-image: version-check ## Remove existing Docker images
@echo "$(RED)Removing existing images...$(RESET)"
@docker rmi $(IMAGE_NAME):latest 2>/dev/null || true
@docker rmi $(IMAGE_NAME):$(VERSION) 2>/dev/null || true
@docker rmi $(HUB_NAMESPACE)/$(IMAGE_NAME):latest 2>/dev/null || true
@docker rmi $(HUB_NAMESPACE)/$(IMAGE_NAME):$(VERSION) 2>/dev/null || true
image: version-check ## Build the Docker image
@echo "$(GREEN)Building UFPAlign Docker image...$(RESET)"
@docker build -t $(IMAGE_NAME):$(VERSION) -f Dockerfile.ufpalign .
@docker tag $(IMAGE_NAME):$(VERSION) $(IMAGE_NAME):latest
@docker tag $(IMAGE_NAME):$(VERSION) $(HUB_NAMESPACE)/$(IMAGE_NAME):$(VERSION)
@docker tag $(IMAGE_NAME):$(VERSION) $(HUB_NAMESPACE)/$(IMAGE_NAME):latest
@echo "$(GREEN)Image built successfully$(RESET)"
@docker images | grep $(IMAGE_NAME)
push: clean-image image ## Build and push image to registry
@echo "$(BLUE)Pushing images to registry...$(RESET)"
@docker push $(HUB_NAMESPACE)/$(IMAGE_NAME):$(VERSION)
@docker push $(HUB_NAMESPACE)/$(IMAGE_NAME):latest
@echo "$(GREEN)Images pushed successfully$(RESET)"
test-container: image ## Run UFPAlign tests in container
@echo "$(GREEN)Running UFPAlign tests...$(RESET)"
@docker run --rm --name ufpalign-test \
-v $(PWD)/temp_ufpalign/demo:/opt/UFPAlign/test_data:ro \
$(IMAGE_NAME):latest \
bash -c "cd /opt/UFPAlign && KALDI_ROOT=/opt/kaldi bash ufpalign.sh test_data/ex.wav test_data/ex.txt mono"
run-interactive: setup-dirs image ## Run UFPAlign container interactively
@echo "$(GREEN)Starting UFPAlign container in interactive mode...$(RESET)"
@docker run -it --rm \
--name $(CONTAINER_NAME) \
-v $(PWD)/audio_input:/opt/UFPAlign/audio_input:ro \
-v $(PWD)/text_input:/opt/UFPAlign/text_input:ro \
-v $(PWD)/output:/opt/UFPAlign/output:rw \
-v $(PWD)/textgrid:/opt/UFPAlign/textgrid:rw \
-v $(PWD)/logs:/root/logs:rw \
$(IMAGE_NAME):latest bash
run-api: setup-dirs image ## Run UFPAlign with API service
@echo "$(GREEN)Starting UFPAlign API service...$(RESET)"
@docker run -d \
--name $(API_CONTAINER_NAME) \
-p 7860:7860 \
-v $(PWD)/audio_input:/opt/UFPAlign/audio_input:ro \
-v $(PWD)/text_input:/opt/UFPAlign/text_input:ro \
-v $(PWD)/output:/opt/UFPAlign/output:rw \
-v $(PWD)/textgrid:/opt/UFPAlign/textgrid:rw \
-v $(PWD)/logs:/root/logs:rw \
-v $(PWD)/app.py:/opt/UFPAlign/app.py:ro \
$(IMAGE_NAME):latest \
uvicorn app:app --host 0.0.0.0 --port 7860
@echo "$(GREEN)API service started at http://localhost:7860$(RESET)"
compose-up: setup-dirs ## Start services using Docker Compose
@echo "$(GREEN)Starting UFPAlign services with Docker Compose...$(RESET)"
@docker-compose -f $(COMPOSE_FILE) up -d
@echo "$(GREEN)Services started$(RESET)"
compose-down: ## Stop Docker Compose services
@echo "$(RED)Stopping Docker Compose services...$(RESET)"
@docker-compose -f $(COMPOSE_FILE) down
@echo "$(GREEN)Services stopped$(RESET)"
compose-logs: ## Show Docker Compose logs
@docker-compose -f $(COMPOSE_FILE) logs -f
stop: ## Stop running containers
@echo "$(RED)Stopping UFPAlign containers...$(RESET)"
@docker stop $(CONTAINER_NAME) 2>/dev/null || true
@docker stop $(API_CONTAINER_NAME) 2>/dev/null || true
@docker rm $(CONTAINER_NAME) 2>/dev/null || true
@docker rm $(API_CONTAINER_NAME) 2>/dev/null || true
@echo "$(GREEN)Containers stopped$(RESET)"
clean: stop clean-image ## Clean up containers and images
@echo "$(RED)Cleaning up Docker resources...$(RESET)"
@docker system prune -f
@echo "$(GREEN)Cleanup completed$(RESET)"
demo: image ## Run a demo with provided sample files
@echo "$(GREEN)Running UFPAlign demo...$(RESET)"
@cp temp_ufpalign/demo/ex.wav audio_input/ 2>/dev/null || true
@cp temp_ufpalign/demo/ex.txt text_input/ 2>/dev/null || true
@docker run --rm \
--name ufpalign-demo \
-v $(PWD)/audio_input:/opt/UFPAlign/audio_input:ro \
-v $(PWD)/text_input:/opt/UFPAlign/text_input:ro \
-v $(PWD)/output:/opt/UFPAlign/output:rw \
-v $(PWD)/textgrid:/opt/UFPAlign/textgrid:rw \
$(IMAGE_NAME):latest \
bash -c "cd /opt/UFPAlign && KALDI_ROOT=/opt/kaldi bash ufpalign.sh audio_input/ex.wav text_input/ex.txt mono"
@echo "$(GREEN)Demo completed. Check output/ and textgrid/ directories$(RESET)"
shell: image ## Get a shell in the UFPAlign container
@echo "$(GREEN)Opening shell in UFPAlign container...$(RESET)"
@docker run -it --rm \
--name ufpalign-shell \
-v $(PWD)/audio_input:/opt/UFPAlign/audio_input:ro \
-v $(PWD)/text_input:/opt/UFPAlign/text_input:ro \
-v $(PWD)/output:/opt/UFPAlign/output:rw \
-v $(PWD)/textgrid:/opt/UFPAlign/textgrid:rw \
$(IMAGE_NAME):latest bash
install-models: image ## Download and install UFPAlign models
@echo "$(GREEN)Installing UFPAlign models...$(RESET)"
@docker run --rm \
--name ufpalign-install-models \
-v $(PWD)/models:/opt/UFPAlign/models:rw \
$(IMAGE_NAME):latest \
bash -c "cd /opt/UFPAlign && \
utils/download_model.sh data /opt/UFPAlign && \
utils/download_model.sh mono /opt/UFPAlign && \
utils/download_model.sh tri1 /opt/UFPAlign && \
utils/download_model.sh tri2b /opt/UFPAlign && \
utils/download_model.sh tri3b /opt/UFPAlign && \
utils/download_model.sh tdnn /opt/UFPAlign && \
utils/download_model.sh ie /opt/UFPAlign"
@echo "$(GREEN)Models installed successfully$(RESET)"