services: stt: build: context: ./stt dockerfile: Dockerfile args: STT_MODEL: ${STT_MODEL:-small} STT_DEVICE: ${STT_DEVICE:-cpu} STT_COMPUTE_TYPE: ${STT_COMPUTE_TYPE:-int8} container_name: polytalk-stt restart: unless-stopped ports: - "127.0.0.1:8000:8000" environment: - LOG_LEVEL=${LOG_LEVEL:-INFO} - STT_MODEL=${STT_MODEL:-small} - STT_DEVICE=${STT_DEVICE:-cpu} - STT_COMPUTE_TYPE=${STT_COMPUTE_TYPE:-int8} - STT_STREAM_CHUNK_SECONDS=${STT_STREAM_CHUNK_SECONDS:-1.2} - STT_CHUNK_OVERLAP_SECONDS=${STT_CHUNK_OVERLAP_SECONDS:-0.25} - STT_TRANSCRIBE_WORKERS=${STT_TRANSCRIBE_WORKERS:-2} - STT_TRANSCRIBE_QUEUE_SIZE=${STT_TRANSCRIBE_QUEUE_SIZE:-8} - STT_MODEL_WORKERS=${STT_MODEL_WORKERS:-2} - STT_PRELOAD_MODEL=${STT_PRELOAD_MODEL:-true} - STT_EMIT_MIN_CHARS=${STT_EMIT_MIN_CHARS:-40} - STT_EMIT_INTERVAL_SECONDS=${STT_EMIT_INTERVAL_SECONDS:-2.0} - STT_PAUSE_FLUSH_SECONDS=${STT_PAUSE_FLUSH_SECONDS:-1.0} - STT_IDLE_FLUSH_SECONDS=${STT_IDLE_FLUSH_SECONDS:-3.0} - STT_LEADING_SILENCE_PREROLL_SECONDS=${STT_LEADING_SILENCE_PREROLL_SECONDS:-0.2} - STT_SILENCE_RMS_THRESHOLD=${STT_SILENCE_RMS_THRESHOLD:-0.003} - STT_NO_SPEECH_PROB_THRESHOLD=${STT_NO_SPEECH_PROB_THRESHOLD:-0.50} - STT_LOG_PROB_THRESHOLD=${STT_LOG_PROB_THRESHOLD:--1.0} - STT_MAX_CROSS_DELTA_WORD_REPEATS=${STT_MAX_CROSS_DELTA_WORD_REPEATS:-6} - STT_VAD_FILTER=${STT_VAD_FILTER:-true} - STT_VAD_MIN_SILENCE_MS=${STT_VAD_MIN_SILENCE_MS:-500} - STT_VAD_SPEECH_PAD_MS=${STT_VAD_SPEECH_PAD_MS:-200} - STT_WORD_TIMESTAMPS=${STT_WORD_TIMESTAMPS:-true} - STT_CONDITION_ON_PREVIOUS_TEXT=${STT_CONDITION_ON_PREVIOUS_TEXT:-false} - STT_TEMPERATURE=${STT_TEMPERATURE:-0.0} - STT_INITIAL_PROMPT=${STT_INITIAL_PROMPT:-} - STT_WORKERS=${STT_WORKERS:-1} - STORAGE_DIR=/data - MAX_UPLOAD_MB=${STT_MAX_UPLOAD_MB:-200} volumes: - stt_data:/data # Mount STT app source for development (remove for production) - ./stt/app:/app/app:ro networks: - polytalk-network # deploy: # resources: # reservations: # devices: # - driver: nvidia # count: 1 # capabilities: [gpu] tts: build: context: ./tts dockerfile: Dockerfile image: polytalk-tts:latest container_name: polytalk-tts restart: unless-stopped ports: - "127.0.0.1:5000:5000" environment: - PIPER_MODEL=${TTS_MODEL:-en_GB-jenny_dioco-medium} - PIPER_DATA_DIR=/data - TTS_WORKERS=${TTS_WORKERS:-4} volumes: - ./tts/wsgi.py:/app/wsgi.py:ro - ./tts/voices:/data:ro networks: - polytalk-network supertonic-tts: build: context: ./supertonic_tts dockerfile: Dockerfile image: polytalk-supertonic-tts:latest container_name: polytalk-supertonic-tts restart: unless-stopped ports: - "127.0.0.1:7788:7788" environment: - XDG_CACHE_HOME=/data/cache volumes: - supertonic_data:/data networks: - polytalk-network polytalk: build: context: . dockerfile: Dockerfile container_name: polytalk ports: - "9000:8000" environment: # STT service (local faster-whisper) - WHISPER_BASE_URL=${WHISPER_BASE_URL:-http://stt:8000} - WHISPER_API_KEY=${WHISPER_API_KEY:-} - WHISPER_WS_ENDPOINT=${WHISPER_WS_ENDPOINT:-/v1/stream/transcriptions} # Translation service - TRANSLATION_API_FORMAT=${TRANSLATION_API_FORMAT:-openai_chat} - TRANSLATION_BASE_URL=${TRANSLATION_BASE_URL:-https://api.openai.com} - TRANSLATION_ENDPOINT=${TRANSLATION_ENDPOINT:-/v1/chat/completions} - TRANSLATION_API_KEY=${TRANSLATION_API_KEY:-} - TRANSLATION_MODEL=${TRANSLATION_MODEL:-gpt-4o-mini} - TRANSLATION_MAX_TOKENS=${TRANSLATION_MAX_TOKENS:-160} - TRANSLATEGAMMA_API_FORMAT=${TRANSLATEGAMMA_API_FORMAT:-${TRANSLATION_API_FORMAT:-openai_chat}} - TRANSLATEGAMMA_BASE_URL=${TRANSLATEGAMMA_BASE_URL:-${TRANSLATION_BASE_URL:-https://api.openai.com}} - TRANSLATEGAMMA_ENDPOINT=${TRANSLATEGAMMA_ENDPOINT:-${TRANSLATION_ENDPOINT:-/v1/chat/completions}} - TRANSLATEGAMMA_API_KEY=${TRANSLATEGAMMA_API_KEY:-${TRANSLATION_API_KEY:-}} - TRANSLATEGAMMA_MODEL=${TRANSLATEGAMMA_MODEL:-${TRANSLATION_MODEL:-gpt-4o-mini}} # Visual context service - VISUAL_CONTEXT_ENABLED=${VISUAL_CONTEXT_ENABLED:-false} - VISUAL_CONTEXT_MOCK_MODE=${VISUAL_CONTEXT_MOCK_MODE:-true} - VISUAL_CONTEXT_API_FORMAT=${VISUAL_CONTEXT_API_FORMAT:-openai_chat} - VISUAL_CONTEXT_BASE_URL=${VISUAL_CONTEXT_BASE_URL:-${TRANSLATION_BASE_URL:-https://api.openai.com}} - VISUAL_CONTEXT_ENDPOINT=${VISUAL_CONTEXT_ENDPOINT:-${TRANSLATION_ENDPOINT:-/v1/chat/completions}} - VISUAL_CONTEXT_API_KEY=${VISUAL_CONTEXT_API_KEY:-${TRANSLATION_API_KEY:-}} - VISUAL_CONTEXT_MODEL=${VISUAL_CONTEXT_MODEL:-${TRANSLATION_MODEL:-gpt-4o-mini}} - VISUAL_CONTEXT_MAX_TOKENS=${VISUAL_CONTEXT_MAX_TOKENS:-240} # TTS services - TTS_BASE_URL=${TTS_BASE_URL:-http://tts:5000} - SUPERTONIC_TTS_BASE_URL=${SUPERTONIC_TTS_BASE_URL:-http://supertonic-tts:7788} - SUPERTONIC_TTS_VOICE=${SUPERTONIC_TTS_VOICE:-M1} - SUPERTONIC_TTS_JA_VOICE=${SUPERTONIC_TTS_JA_VOICE:-M1} - SUPERTONIC_TTS_KO_VOICE=${SUPERTONIC_TTS_KO_VOICE:-M1} - SUPERTONIC_TTS_STEPS=${SUPERTONIC_TTS_STEPS:-8} - SUPERTONIC_TTS_SPEED=${SUPERTONIC_TTS_SPEED:-1.05} # Application - APP_HOST=0.0.0.0 - APP_PORT=8000 - APP_WORKERS=${APP_WORKERS:-3} - APP_DEBUG=${APP_DEBUG:-false} - ALLOWED_ORIGINS=${ALLOWED_ORIGINS:-http://localhost:9000,http://127.0.0.1:9000} - LOG_LEVEL=${LOG_LEVEL:-INFO} - TRANSLATION_FLUSH_CHARS=${TRANSLATION_FLUSH_CHARS:-120} - TRANSLATION_FLUSH_SECONDS=${TRANSLATION_FLUSH_SECONDS:-2.0} - TRANSLATION_FLUSH_MIN_CHARS=${TRANSLATION_FLUSH_MIN_CHARS:-40} - CUSTOM_INSTRUCTION_MAX_CHARS=${CUSTOM_INSTRUCTION_MAX_CHARS:-250} volumes: # Mount app source for development (remove for production) - ./app:/app/app:ro # Mount config files - ./config:/app/config:ro # Persist generated media files - ./media/output:/app/media/output restart: unless-stopped extra_hosts: - "host.docker.internal:host-gateway" depends_on: - stt - tts - supertonic-tts networks: - polytalk-network volumes: stt_data: supertonic_data: networks: polytalk-network: driver: bridge