From d80d3c545c3b7571f29e703c3fe8599dffa43eb3 Mon Sep 17 00:00:00 2001 From: ben Date: Thu, 21 Aug 2025 21:53:39 +0200 Subject: [PATCH] Update TTS component --- docker-compose.yml | 59 ++++++++++++++++--------- src/nginx/nginx.conf | 5 ++- src/speaches-ai_provision/Dockerfile | 9 ++++ src/speaches-ai_provision/entrypoint.sh | 14 ++++++ src/tts/Dockerfile | 49 -------------------- src/tts/download_voices_tts-1.sh | 8 ---- src/tts/voice_to_speaker.default.yaml | 36 --------------- tools/speech.sh | 24 +++++++--- 8 files changed, 82 insertions(+), 122 deletions(-) create mode 100644 src/speaches-ai_provision/Dockerfile create mode 100644 src/speaches-ai_provision/entrypoint.sh delete mode 100644 src/tts/Dockerfile delete mode 100644 src/tts/download_voices_tts-1.sh delete mode 100644 src/tts/voice_to_speaker.default.yaml diff --git a/docker-compose.yml b/docker-compose.yml index 2fb0586..54d31b8 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -20,15 +20,28 @@ services: networks: - nointernet - openedai-speech: + ollama_provision: build: - dockerfile: src/tts/Dockerfile + dockerfile: src/ollama_provision/Dockerfile environment: - - TTS_HOME=voices + - MODELS=nomic-embed-text,llama3.1:8b,qwen2.5:7b,gemma3:12b-it-qat,gemma3:27b-it-qat,gpt-oss:20b volumes: - - voices:/app/voices - - speech-config:/app/config + - ollama:/root/.ollama + restart: no + depends_on: + ollama: + condition: service_healthy + restart: true + links: + - ollama + networks: + - internet + + speaches-ai: + image: ghcr.io/speaches-ai/speaches:latest-cuda restart: unless-stopped + volumes: + - hf-hub-cache:/home/ubuntu/.cache/huggingface/hub deploy: resources: reservations: @@ -45,20 +58,19 @@ services: networks: - nointernet - ollama_provision: + speaches-ai_provision: build: - dockerfile: src/ollama_provision/Dockerfile - environment: - - MODELS=qwen2.5:latest,qwen2.5-coder:32b,nomic-embed-text:latest,gemma2:latest,mistral:latest,deepseek-r1:7b,deepcoder:14b + dockerfile: src/speaches-ai_provision/Dockerfile volumes: - - ollama:/root/.ollama + - hf-hub-cache:/home/ubuntu/.cache/huggingface/hub + deploy: + resources: + reservations: + devices: + - driver: nvidia + count: all + capabilities: [gpu] restart: no - depends_on: - ollama: - condition: service_healthy - restart: true - links: - - ollama networks: - internet @@ -89,17 +101,23 @@ services: - NGINX_ENVSUBST_OUTPUT_DIR=/etc/nginx - API_KEY=${LLM_API_KEY} depends_on: - - openedai-speech - ollama + - speaches-ai - aichat links: - ollama - - openedai-speech + - speaches-ai - aichat ports: - - "127.0.0.1:11434:11434" + - "127.0.0.1:10434:10434" - "127.0.0.1:8000:8000" - "127.0.0.1:8001:8001" + healthcheck: + test: curl --fail http://localhost:11434 || exit 1 + interval: 10s + retries: 5 + start_period: 10s + timeout: 10s restart: unless-stopped networks: - internet @@ -107,8 +125,7 @@ services: volumes: ollama: - voices: - speech-config: + hf-hub-cache: networks: internet: diff --git a/src/nginx/nginx.conf b/src/nginx/nginx.conf index f07765a..098a608 100644 --- a/src/nginx/nginx.conf +++ b/src/nginx/nginx.conf @@ -30,7 +30,7 @@ http { return 403; } location / { - proxy_pass http://openedai-speech:8000; + proxy_pass http://speaches-ai:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; @@ -48,6 +48,9 @@ http { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; } } } diff --git a/src/speaches-ai_provision/Dockerfile b/src/speaches-ai_provision/Dockerfile new file mode 100644 index 0000000..fe3f3d0 --- /dev/null +++ b/src/speaches-ai_provision/Dockerfile @@ -0,0 +1,9 @@ +FROM ghcr.io/speaches-ai/speaches:latest-cuda + +USER root +ADD ./src/speaches-ai_provision/entrypoint.sh /entrypoint.sh +RUN chmod 755 /entrypoint.sh + +USER ubuntu + +ENTRYPOINT ["/entrypoint.sh"] diff --git a/src/speaches-ai_provision/entrypoint.sh b/src/speaches-ai_provision/entrypoint.sh new file mode 100644 index 0000000..88f4bc0 --- /dev/null +++ b/src/speaches-ai_provision/entrypoint.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash + +pkill -f uvicorn +source .venv/bin/activate +uvicorn --factory speaches.main:create_app & +sleep 5 +curl -s -X POST -d '' 'http://localhost:8000/v1/models/speaches-ai/Kokoro-82M-v1.0-ONNX-int8' +curl -s -X POST -d '' 'http://localhost:8000/v1/models/speaches-ai/piper-fr_FR-tom-medium' +curl -s -X POST -d '' 'http://localhost:8000/v1/models/speaches-ai/piper-fr_FR-upmc-medium' +curl -s -X POST -d '' 'http://localhost:8000/v1/models/speaches-ai/piper-en_GB-alba-medium' +curl -s -X POST -d '' 'http://localhost:8000/v1/models/speaches-ai/piper-en_GB-northern_english_male-medium' +curl -s -X POST -d '' 'http://localhost:8000/v1/models/speaches-ai/piper-en_US-john-medium' +curl -s -X POST -d '' 'http://localhost:8000/v1/models/speaches-ai/piper-en_US-bryce-medium' +curl -s -X POST -d '' 'http://localhost:8000/v1/models/speaches-ai/piper-en_US-ryan-high' diff --git a/src/tts/Dockerfile b/src/tts/Dockerfile deleted file mode 100644 index 774fe4d..0000000 --- a/src/tts/Dockerfile +++ /dev/null @@ -1,49 +0,0 @@ -FROM python:3.11-slim - -RUN --mount=type=cache,target=/root/.cache/pip pip install -U pip - -ARG TARGETPLATFORM -RUN < /dev/null -for i in $models ; do - [ ! -e "voices/$i.onnx" ] && piper --data-dir voices --download-dir voices --model $i < /dev/null > /dev/null -done - diff --git a/src/tts/voice_to_speaker.default.yaml b/src/tts/voice_to_speaker.default.yaml deleted file mode 100644 index 53acda6..0000000 --- a/src/tts/voice_to_speaker.default.yaml +++ /dev/null @@ -1,36 +0,0 @@ -# Use https://rhasspy.github.io/piper-samples/ to configure -tts-1: - alloy: - model: voices/en_US-libritts_r-medium.onnx - speaker: 79 - siwis: - model: voices/fr_FR-siwis-medium.onnx - speaker: 0 - tom: - model: voices/fr_FR-tom-medium.onnx - speaker: 0 - pierre: - model: voices/fr_FR-upmc-medium.onnx - speaker: 1 - jessica: - model: voices/fr_FR-upmc-medium.onnx - speaker: 0 - alba: - model: voices/en_GB-alba-medium.onnx - speaker: 0 - jack: - model: voices/en_GB-northern_english_male-medium.onnx - speaker: 0 - john: - model: voices/en_US-john-medium.onnx - speaker: 0 - bryce: - model: voices/en_US-bryce-medium.onnx - speaker: 0 - ryan: - model: voices/en_US-ryan-high.onnx - speaker: 0 - echo: - model: voices/en_US-libritts_r-medium.onnx - speaker: 134 - diff --git a/tools/speech.sh b/tools/speech.sh index 8ad7de2..2062bfc 100755 --- a/tools/speech.sh +++ b/tools/speech.sh @@ -25,21 +25,30 @@ fi tts_host=${TTS_API_HOST:-"http://localhost:8000"} +declare -A voices_model=( + [ff_siwis]="speaches-ai/Kokoro-82M-v1.0-ONNX-int8" + [tom]="speaches-ai/piper-fr_FR-tom-medium" + [upmc]="speaches-ai/piper-fr_FR-upmc-medium" + [alba]="speaches-ai/piper-en_GB-alba-medium" + [northern_english_male]="speaches-ai/piper-en_GB-northern_english_male-medium" + [john]="speaches-ai/piper-en_US-john-medium" + [bryce]="speaches-ai/piper-en_US-bryce-medium" + [ryan]="speaches-ai/piper-en_US-ryan-high" +) + _choice_voice() { if [[ "${argc_lang}" == "fr" ]]; then - echo siwis + echo ff_siwis echo tom - echo pierre - echo jessica + echo upmc fi if [[ "${argc_lang}" == "en" ]]; then echo alba - echo jack + echo northern_english_male echo john echo bryce echo ryan - echo echo fi } @@ -52,10 +61,11 @@ _choice_voice() { # @arg text! Set the text synthesize() { - http_status_code=$(curl -s "${tts_host}/v1/audio/speech" -o "${argc_filename}" -w "%{http_code}" \ + model=$(echo ${voices_model[$argc_voice]}) + http_status_code=$(curl -s -X POST "${tts_host}/v1/audio/speech" -o "${argc_filename}" -w "%{http_code}" \ -H "Authorization: Bearer ${LLM_API_KEY}" \ -H "Content-Type: application/json" \ - -d "{\"model\": \"tts-1\",\"input\": \"${argc_text}\",\"voice\": \"${argc_voice}\",\"response_format\": \"wav\",\"speed\": ${argc_speed}}") + -d "{\"model\": \"${model}\",\"input\": \"${argc_text}\",\"voice\": \"${argc_voice}\",\"response_format\": \"wav\",\"speed\": ${argc_speed}}") # Check the response code for successful HTTP request if [[ "${http_status_code}" -ne 200 ]]; then