diff --git a/.gitignore b/.gitignore index 1c4e411..f0e5c63 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ voices/ .env speech.env +vars.sh config/pre_process_map.yaml config/voice_to_speaker.yaml diff --git a/Makefile b/Makefile index caccbfb..eb514cd 100644 --- a/Makefile +++ b/Makefile @@ -1,10 +1,18 @@ # Raccoon Mission: OpenedAI Speech Development Makefile -# Deploy to ai.foxhop.net server with ease +# Deploy to remote server with ease +# Configuration is loaded from vars.sh (copy vars.sh.example to vars.sh) -REMOTE_HOST = ai.foxhop.net -REMOTE_USER = fox -REMOTE_PATH = ~/openedai-speech-fresh -CONTAINER_NAME = openedai-speech-fresh-server-1 +# Load configuration from vars.sh if it exists +ifneq (,$(wildcard vars.sh)) + include vars.sh + export +endif + +# Fallback defaults if vars.sh is not found +REMOTE_HOST ?= localhost +REMOTE_USER ?= $(USER) +REMOTE_PATH ?= ~/openedai-speech-fresh +CONTAINER_NAME ?= openedai-speech-fresh-server-1 .PHONY: help deploy sync restart logs test clean stop start voices @@ -36,8 +44,8 @@ deploy: sync restart @echo "✅ Deployment complete!" restart: - @echo "🔄 Restarting container on $(REMOTE_HOST)..." - ssh $(REMOTE_USER)@$(REMOTE_HOST) "cd $(REMOTE_PATH) && docker compose restart" + @echo "🔄 Rebuilding and restarting container on $(REMOTE_HOST)..." + ssh $(REMOTE_USER)@$(REMOTE_HOST) "cd $(REMOTE_PATH) && docker compose up -d --build" stop: @echo "🛑 Stopping container on $(REMOTE_HOST)..." diff --git a/speech.py b/speech.py index e412e8b..6092d84 100755 --- a/speech.py +++ b/speech.py @@ -223,16 +223,33 @@ async def generate_speech(request: GenerateSpeechRequest): speaker = voice_map.get('speaker', None) - tts_args = ["piper", "--model", str(piper_model), "--data-dir", "voices", "--download-dir", "voices", "--output-raw"] + # Use absolute path without data-dir when model path is absolute + if os.path.isabs(piper_model): + tts_args = ["piper", "--model", str(piper_model), "--output-raw"] + else: + tts_args = ["piper", "--model", str(piper_model), "--data-dir", "voices", "--download-dir", "voices", "--output-raw"] if speaker: tts_args.extend(["--speaker", str(speaker)]) if speed != 1.0: tts_args.extend(["--length-scale", f"{1.0/speed}"]) - tts_proc = subprocess.Popen(tts_args, stdin=subprocess.PIPE, stdout=subprocess.PIPE) + # Debug logging + logger.info(f"Piper command: {' '.join(tts_args)}") + logger.info(f"Model file exists: {os.path.exists(piper_model)}") + + tts_proc = subprocess.Popen(tts_args, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) tts_proc.stdin.write(bytearray(input_text.encode('utf-8'))) tts_proc.stdin.close() + # Log any stderr output from Piper + if tts_proc.stderr: + import threading + def log_stderr(): + stderr_output = tts_proc.stderr.read().decode('utf-8', errors='replace') + if stderr_output.strip(): + logger.error(f"Piper stderr: {stderr_output}") + threading.Thread(target=log_stderr, daemon=True).start() + try: with open(f"{piper_model}.json", 'r') as pvc_f: conf = json.load(pvc_f) diff --git a/vars.sh.example b/vars.sh.example new file mode 100644 index 0000000..b1ec82d --- /dev/null +++ b/vars.sh.example @@ -0,0 +1,8 @@ +#!/bin/bash +# Copy this file to vars.sh and fill in your values +# vars.sh is gitignored for security + +export REMOTE_HOST="your.server.hostname" +export REMOTE_USER="your_username" +export REMOTE_PATH="~/openedai-speech-fresh" +export CONTAINER_NAME="openedai-speech-fresh-server-1"