Merge pull request #10 from teddybear082/upgrade_to_pocket_2_0_0
Browse files- .env.example +8 -0
- AGENTS.md +19 -10
- app/__init__.py +10 -3
- app/config.py +2 -0
- app/services/tts.py +15 -4
- docker-compose.yml +5 -0
- pyproject.toml +2 -2
- requirements.txt +1 -1
- run_pocket_tts_server.bat +14 -2
- run_pocket_tts_server.sh +134 -0
- run_pocket_tts_server_exe.bat +14 -2
- server.py +29 -4
.env.example
CHANGED
|
@@ -6,6 +6,14 @@ POCKET_TTS_PORT=49112
|
|
| 6 |
POCKET_TTS_LOG_LEVEL=INFO
|
| 7 |
POCKET_TTS_STREAM_DEFAULT=true
|
| 8 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 9 |
# Custom voices directory (mounted to container)
|
| 10 |
# POCKET_TTS_VOICES_DIR=./my_custom_voices
|
| 11 |
|
|
|
|
| 6 |
POCKET_TTS_LOG_LEVEL=INFO
|
| 7 |
POCKET_TTS_STREAM_DEFAULT=true
|
| 8 |
|
| 9 |
+
# Model language (requires pocket-tts>=2.0.0)
|
| 10 |
+
# Options: english, french_24l, german_24l, portuguese, italian, spanish_24l
|
| 11 |
+
# Mutually exclusive with POCKET_TTS_MODEL_PATH
|
| 12 |
+
# POCKET_TTS_LANGUAGE=english
|
| 13 |
+
|
| 14 |
+
# Enable int8 quantization for lower memory usage and improved speed
|
| 15 |
+
# POCKET_TTS_QUANTIZE=false
|
| 16 |
+
|
| 17 |
# Custom voices directory (mounted to container)
|
| 18 |
# POCKET_TTS_VOICES_DIR=./my_custom_voices
|
| 19 |
|
AGENTS.md
CHANGED
|
@@ -53,15 +53,21 @@ server.py # Entry point, CLI, starts Waitress
|
|
| 53 |
}
|
| 54 |
```
|
| 55 |
|
| 56 |
-
##
|
| 57 |
-
|
| 58 |
-
| Variable
|
| 59 |
-
| --------------------------- | -------
|
| 60 |
-
| `POCKET_TTS_HOST`
|
| 61 |
-
| `POCKET_TTS_PORT`
|
| 62 |
-
| `
|
| 63 |
-
| `
|
| 64 |
-
| `
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 65 |
|
| 66 |
## Voice Resolution Order
|
| 67 |
|
|
@@ -79,9 +85,12 @@ server.py # Entry point, CLI, starts Waitress
|
|
| 79 |
# Install
|
| 80 |
pip install -r requirements.txt
|
| 81 |
|
| 82 |
-
# Run
|
| 83 |
python server.py --log-level DEBUG
|
| 84 |
|
|
|
|
|
|
|
|
|
|
| 85 |
# Test
|
| 86 |
curl http://localhost:49112/health
|
| 87 |
curl -X POST http://localhost:49112/v1/audio/speech \
|
|
|
|
| 53 |
}
|
| 54 |
```
|
| 55 |
|
| 56 |
+
## CLI Arguments
|
| 57 |
+
|
| 58 |
+
| Argument | Env Variable | Default | Purpose |
|
| 59 |
+
| --------------------- | --------------------------- | ------- | ------------------ |
|
| 60 |
+
| `--host` | `POCKET_TTS_HOST` | `0.0.0.0` | Bind address |
|
| 61 |
+
| `--port` | `POCKET_TTS_PORT` | `49112` | Port |
|
| 62 |
+
| `--model-path` | `POCKET_TTS_MODEL_PATH` | None | Path to model config file (.yaml) or variant |
|
| 63 |
+
| `--language` | `POCKET_TTS_LANGUAGE` | None | Model language (english, french_24l, etc.) |
|
| 64 |
+
| `--quantize` | `POCKET_TTS_QUANTIZE` | `false` | Enable int8 quantization for lower memory usage |
|
| 65 |
+
| `--voices-dir` | `POCKET_TTS_VOICES_DIR` | None | Custom voices directory |
|
| 66 |
+
| `--stream` | `POCKET_TTS_STREAM_DEFAULT`| `false` | Enable streaming by default |
|
| 67 |
+
| `--text-preprocess` | `POCKET_TTS_TEXT_PREPROCESS_DEFAULT` | `false` | Enable text preprocessing by default |
|
| 68 |
+
| `--log-level` | `POCKET_TTS_LOG_LEVEL` | `INFO` | Log verbosity |
|
| 69 |
+
|
| 70 |
+
**Note**: `--language` and `--model-path` are mutually exclusive. Use `--language` to select a built-in language model (requires pocket-tts>=2.0.0).
|
| 71 |
|
| 72 |
## Voice Resolution Order
|
| 73 |
|
|
|
|
| 85 |
# Install
|
| 86 |
pip install -r requirements.txt
|
| 87 |
|
| 88 |
+
# Run with defaults (English model)
|
| 89 |
python server.py --log-level DEBUG
|
| 90 |
|
| 91 |
+
# Run with French model and quantization
|
| 92 |
+
python server.py --language french_24l --quantize --log-level DEBUG
|
| 93 |
+
|
| 94 |
# Test
|
| 95 |
curl http://localhost:49112/health
|
| 96 |
curl -X POST http://localhost:49112/v1/audio/speech \
|
app/__init__.py
CHANGED
|
@@ -48,13 +48,20 @@ def create_app(config_overrides: dict = None) -> Flask:
|
|
| 48 |
return app
|
| 49 |
|
| 50 |
|
| 51 |
-
def init_tts_service(
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 52 |
"""
|
| 53 |
Initialize the TTS service with model and voices.
|
| 54 |
|
| 55 |
Args:
|
| 56 |
-
model_path: Optional path to model file
|
| 57 |
voices_dir: Optional path to voices directory
|
|
|
|
|
|
|
| 58 |
"""
|
| 59 |
from app.services.tts import get_tts_service
|
| 60 |
|
|
@@ -62,7 +69,7 @@ def init_tts_service(model_path: str = None, voices_dir: str = None) -> None:
|
|
| 62 |
tts = get_tts_service()
|
| 63 |
|
| 64 |
# Load model
|
| 65 |
-
tts.load_model(model_path)
|
| 66 |
|
| 67 |
# Set voices directory
|
| 68 |
if voices_dir:
|
|
|
|
| 48 |
return app
|
| 49 |
|
| 50 |
|
| 51 |
+
def init_tts_service(
|
| 52 |
+
model_path: str = None,
|
| 53 |
+
voices_dir: str = None,
|
| 54 |
+
language: str = None,
|
| 55 |
+
quantize: bool = False,
|
| 56 |
+
) -> None:
|
| 57 |
"""
|
| 58 |
Initialize the TTS service with model and voices.
|
| 59 |
|
| 60 |
Args:
|
| 61 |
+
model_path: Optional path to model config file
|
| 62 |
voices_dir: Optional path to voices directory
|
| 63 |
+
language: Optional language identifier (e.g., english, french_24l)
|
| 64 |
+
quantize: Whether to apply dynamic int8 quantization
|
| 65 |
"""
|
| 66 |
from app.services.tts import get_tts_service
|
| 67 |
|
|
|
|
| 69 |
tts = get_tts_service()
|
| 70 |
|
| 71 |
# Load model
|
| 72 |
+
tts.load_model(model_path=model_path, language=language, quantize=quantize)
|
| 73 |
|
| 74 |
# Set voices directory
|
| 75 |
if voices_dir:
|
app/config.py
CHANGED
|
@@ -33,6 +33,8 @@ class Config:
|
|
| 33 |
|
| 34 |
# Model settings
|
| 35 |
MODEL_PATH = os.environ.get('POCKET_TTS_MODEL_PATH', None)
|
|
|
|
|
|
|
| 36 |
DEFAULT_VOICE = os.environ.get(
|
| 37 |
'POCKET_TTS_DEFAULT_VOICE', 'hf://kyutai/tts-voices/alba-mackenna/casual.wav'
|
| 38 |
)
|
|
|
|
| 33 |
|
| 34 |
# Model settings
|
| 35 |
MODEL_PATH = os.environ.get('POCKET_TTS_MODEL_PATH', None)
|
| 36 |
+
LANGUAGE = os.environ.get('POCKET_TTS_LANGUAGE', None)
|
| 37 |
+
QUANTIZE = os.environ.get('POCKET_TTS_QUANTIZE', 'false').lower() == 'true'
|
| 38 |
DEFAULT_VOICE = os.environ.get(
|
| 39 |
'POCKET_TTS_DEFAULT_VOICE', 'hf://kyutai/tts-voices/alba-mackenna/casual.wav'
|
| 40 |
)
|
app/services/tts.py
CHANGED
|
@@ -61,12 +61,20 @@ class TTSService:
|
|
| 61 |
return str(self.model.device)
|
| 62 |
return 'unknown'
|
| 63 |
|
| 64 |
-
def load_model(
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 65 |
"""
|
| 66 |
Load the TTS model.
|
| 67 |
|
| 68 |
Args:
|
| 69 |
-
model_path: Optional path to model file
|
|
|
|
|
|
|
|
|
|
| 70 |
"""
|
| 71 |
_ensure_pocket_tts()
|
| 72 |
|
|
@@ -86,10 +94,13 @@ class TTSService:
|
|
| 86 |
try:
|
| 87 |
if effective_path:
|
| 88 |
logger.info(f'Loading model from: {effective_path}')
|
| 89 |
-
self.model = TTSModel.load_model(config=effective_path)
|
|
|
|
|
|
|
|
|
|
| 90 |
else:
|
| 91 |
logger.info('Loading default model from HuggingFace...')
|
| 92 |
-
self.model = TTSModel.load_model()
|
| 93 |
|
| 94 |
self._model_loaded = True
|
| 95 |
load_time = time.time() - t0
|
|
|
|
| 61 |
return str(self.model.device)
|
| 62 |
return 'unknown'
|
| 63 |
|
| 64 |
+
def load_model(
|
| 65 |
+
self,
|
| 66 |
+
model_path: str | None = None,
|
| 67 |
+
language: str | None = None,
|
| 68 |
+
quantize: bool = False,
|
| 69 |
+
) -> None:
|
| 70 |
"""
|
| 71 |
Load the TTS model.
|
| 72 |
|
| 73 |
Args:
|
| 74 |
+
model_path: Optional path to model config file (.yaml)
|
| 75 |
+
language: Optional language identifier (e.g., english, french_24l).
|
| 76 |
+
Incompatible with model_path.
|
| 77 |
+
quantize: If True, apply dynamic int8 quantization to reduce memory.
|
| 78 |
"""
|
| 79 |
_ensure_pocket_tts()
|
| 80 |
|
|
|
|
| 94 |
try:
|
| 95 |
if effective_path:
|
| 96 |
logger.info(f'Loading model from: {effective_path}')
|
| 97 |
+
self.model = TTSModel.load_model(config=effective_path, quantize=quantize)
|
| 98 |
+
elif language:
|
| 99 |
+
logger.info(f'Loading model with language: {language}')
|
| 100 |
+
self.model = TTSModel.load_model(language=language, quantize=quantize)
|
| 101 |
else:
|
| 102 |
logger.info('Loading default model from HuggingFace...')
|
| 103 |
+
self.model = TTSModel.load_model(quantize=quantize)
|
| 104 |
|
| 105 |
self._model_loaded = True
|
| 106 |
load_time = time.time() - t0
|
docker-compose.yml
CHANGED
|
@@ -25,6 +25,11 @@ services:
|
|
| 25 |
- POCKET_TTS_VOICES_DIR=/app/voices
|
| 26 |
- POCKET_TTS_LOG_LEVEL=${POCKET_TTS_LOG_LEVEL:-INFO}
|
| 27 |
- POCKET_TTS_STREAM_DEFAULT=${POCKET_TTS_STREAM_DEFAULT:-true}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 28 |
# Hugging Face token for voice cloning (optional)
|
| 29 |
- HF_TOKEN=${HF_TOKEN:-}
|
| 30 |
|
|
|
|
| 25 |
- POCKET_TTS_VOICES_DIR=/app/voices
|
| 26 |
- POCKET_TTS_LOG_LEVEL=${POCKET_TTS_LOG_LEVEL:-INFO}
|
| 27 |
- POCKET_TTS_STREAM_DEFAULT=${POCKET_TTS_STREAM_DEFAULT:-true}
|
| 28 |
+
# Model language (e.g., english, french_24l, german_24l, portuguese, italian, spanish_24l)
|
| 29 |
+
# Mutually exclusive with POCKET_TTS_MODEL_PATH. Requires pocket-tts>=2.0.0.
|
| 30 |
+
- POCKET_TTS_LANGUAGE=${POCKET_TTS_LANGUAGE:-}
|
| 31 |
+
# Enable int8 quantization for lower memory usage and improved speed
|
| 32 |
+
- POCKET_TTS_QUANTIZE=${POCKET_TTS_QUANTIZE:-false}
|
| 33 |
# Hugging Face token for voice cloning (optional)
|
| 34 |
- HF_TOKEN=${HF_TOKEN:-}
|
| 35 |
|
pyproject.toml
CHANGED
|
@@ -4,12 +4,12 @@ license = {text = "MIT"}
|
|
| 4 |
name = "pocket-tts-openai-server"
|
| 5 |
readme = "README.md"
|
| 6 |
requires-python = ">=3.10"
|
| 7 |
-
version = "2.
|
| 8 |
|
| 9 |
dependencies = [
|
| 10 |
"flask>=3.0.0",
|
| 11 |
"waitress>=3.0.0",
|
| 12 |
-
"pocket-tts>=
|
| 13 |
"torch>=2.0.0,<=2.8.0",
|
| 14 |
"torchaudio>=2.0.0,<=2.8.0",
|
| 15 |
"scipy>=1.10.0",
|
|
|
|
| 4 |
name = "pocket-tts-openai-server"
|
| 5 |
readme = "README.md"
|
| 6 |
requires-python = ">=3.10"
|
| 7 |
+
version = "2.5.1"
|
| 8 |
|
| 9 |
dependencies = [
|
| 10 |
"flask>=3.0.0",
|
| 11 |
"waitress>=3.0.0",
|
| 12 |
+
"pocket-tts>=2.0.0",
|
| 13 |
"torch>=2.0.0,<=2.8.0",
|
| 14 |
"torchaudio>=2.0.0,<=2.8.0",
|
| 15 |
"scipy>=1.10.0",
|
requirements.txt
CHANGED
|
@@ -4,7 +4,7 @@
|
|
| 4 |
# Core dependencies
|
| 5 |
flask>=3.0.0
|
| 6 |
waitress>=3.0.0
|
| 7 |
-
pocket-tts>=
|
| 8 |
|
| 9 |
# Audio processing
|
| 10 |
torch>=2.0.0,<=2.8.0
|
|
|
|
| 4 |
# Core dependencies
|
| 5 |
flask>=3.0.0
|
| 6 |
waitress>=3.0.0
|
| 7 |
+
pocket-tts>=2.0.0
|
| 8 |
|
| 9 |
# Audio processing
|
| 10 |
torch>=2.0.0,<=2.8.0
|
run_pocket_tts_server.bat
CHANGED
|
@@ -68,6 +68,16 @@ set "TEXT_PREPROCESS_ARG=--text-preprocess"
|
|
| 68 |
set /p "INPUT_PREPROCESS=Enable Text Preprocessing? (Y/N) [Y]: "
|
| 69 |
if /i "%INPUT_PREPROCESS%"=="N" set "TEXT_PREPROCESS_ARG="
|
| 70 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 71 |
echo.
|
| 72 |
echo ========================================================
|
| 73 |
echo Starting Pocket TTS Server...
|
|
@@ -77,11 +87,13 @@ if defined MODEL_PATH echo Model: %MODEL_PATH%
|
|
| 77 |
if defined VOICES_DIR echo Voices: %VOICES_DIR%
|
| 78 |
if defined STREAM_ARG echo Streaming: Enabled
|
| 79 |
if defined TEXT_PREPROCESS_ARG echo Text Preprocessing: Enabled
|
|
|
|
|
|
|
| 80 |
echo ========================================================
|
| 81 |
echo.
|
| 82 |
|
| 83 |
-
::
|
| 84 |
-
python server.py --host %HOST% --port %PORT% %MODEL_PATH% %VOICES_DIR_ARG% %STREAM_ARG% %TEXT_PREPROCESS_ARG%
|
| 85 |
|
| 86 |
if %ERRORLEVEL% NEQ 0 (
|
| 87 |
echo.
|
|
|
|
| 68 |
set /p "INPUT_PREPROCESS=Enable Text Preprocessing? (Y/N) [Y]: "
|
| 69 |
if /i "%INPUT_PREPROCESS%"=="N" set "TEXT_PREPROCESS_ARG="
|
| 70 |
|
| 71 |
+
:: 8. Language
|
| 72 |
+
set "LANGUAGE_ARG="
|
| 73 |
+
set /p "INPUT_LANGUAGE=Language (english, french_24l, german_24l, portuguese, italian, spanish_24l - leave blank for default): "
|
| 74 |
+
if not "%INPUT_LANGUAGE%"=="" set "LANGUAGE_ARG=--language %INPUT_LANGUAGE%"
|
| 75 |
+
|
| 76 |
+
:: 9. Quantization
|
| 77 |
+
set "QUANTIZE_ARG="
|
| 78 |
+
set /p "INPUT_QUANTIZE=Enable int8 Quantization? (Y/N) [N]: "
|
| 79 |
+
if /i "%INPUT_QUANTIZE%"=="Y" set "QUANTIZE_ARG=--quantize"
|
| 80 |
+
|
| 81 |
echo.
|
| 82 |
echo ========================================================
|
| 83 |
echo Starting Pocket TTS Server...
|
|
|
|
| 87 |
if defined VOICES_DIR echo Voices: %VOICES_DIR%
|
| 88 |
if defined STREAM_ARG echo Streaming: Enabled
|
| 89 |
if defined TEXT_PREPROCESS_ARG echo Text Preprocessing: Enabled
|
| 90 |
+
if defined LANGUAGE_ARG echo Language: %INPUT_LANGUAGE%
|
| 91 |
+
if defined QUANTIZE_ARG echo Quantization: Enabled
|
| 92 |
echo ========================================================
|
| 93 |
echo.
|
| 94 |
|
| 95 |
+
:: 10. Run Command
|
| 96 |
+
python server.py --host %HOST% --port %PORT% %MODEL_PATH% %VOICES_DIR_ARG% %STREAM_ARG% %TEXT_PREPROCESS_ARG% %LANGUAGE_ARG% %QUANTIZE_ARG%
|
| 97 |
|
| 98 |
if %ERRORLEVEL% NEQ 0 (
|
| 99 |
echo.
|
run_pocket_tts_server.sh
ADDED
|
@@ -0,0 +1,134 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env bash
|
| 2 |
+
# Pocket TTS Server Launcher (Linux/macOS)
|
| 3 |
+
# This script provides an interactive configuration menu before starting the server.
|
| 4 |
+
|
| 5 |
+
set -euo pipefail
|
| 6 |
+
|
| 7 |
+
# Resolve the script directory (handles symlinks)
|
| 8 |
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
| 9 |
+
cd "$SCRIPT_DIR"
|
| 10 |
+
|
| 11 |
+
# Banner
|
| 12 |
+
echo ""
|
| 13 |
+
echo "========================================"
|
| 14 |
+
echo " Pocket TTS OpenAI Streaming Server"
|
| 15 |
+
echo "========================================"
|
| 16 |
+
echo ""
|
| 17 |
+
|
| 18 |
+
# --- 0. Hugging Face Token ---
|
| 19 |
+
HF_TOKEN="${HF_TOKEN:-}"
|
| 20 |
+
if [ -z "$HF_TOKEN" ]; then
|
| 21 |
+
read -r -p "Hugging Face Token (leave blank if already logged in): " INPUT_HF
|
| 22 |
+
if [ -n "$INPUT_HF" ]; then
|
| 23 |
+
HF_TOKEN="$INPUT_HF"
|
| 24 |
+
export HF_TOKEN
|
| 25 |
+
echo "[INFO] Hugging Face Token set."
|
| 26 |
+
fi
|
| 27 |
+
fi
|
| 28 |
+
|
| 29 |
+
# --- 1. Activate Virtual Environment ---
|
| 30 |
+
if [ -d "venv" ]; then
|
| 31 |
+
echo "[INFO] Activating virtual environment..."
|
| 32 |
+
source venv/bin/activate
|
| 33 |
+
else
|
| 34 |
+
echo "[WARNING] 'venv' not found. Using system Python..."
|
| 35 |
+
fi
|
| 36 |
+
|
| 37 |
+
echo ""
|
| 38 |
+
echo "Configure the server (press Enter to accept defaults):"
|
| 39 |
+
echo ""
|
| 40 |
+
|
| 41 |
+
# --- 2. Host ---
|
| 42 |
+
read -r -p "Host IP [0.0.0.0]: " INPUT_HOST
|
| 43 |
+
HOST="${INPUT_HOST:-0.0.0.0}"
|
| 44 |
+
|
| 45 |
+
# --- 3. Port ---
|
| 46 |
+
read -r -p "Port [49112]: " INPUT_PORT
|
| 47 |
+
PORT="${INPUT_PORT:-49112}"
|
| 48 |
+
|
| 49 |
+
# --- 4. Model Path ---
|
| 50 |
+
echo "Model Config Path (.yaml) or variant name (leave blank for built-in):"
|
| 51 |
+
read -r INPUT_MODEL
|
| 52 |
+
MODEL_ARG=()
|
| 53 |
+
if [ -n "$INPUT_MODEL" ]; then
|
| 54 |
+
MODEL_ARG+=("--model-path" "$INPUT_MODEL")
|
| 55 |
+
fi
|
| 56 |
+
|
| 57 |
+
# --- 5. Voices Directory ---
|
| 58 |
+
DEFAULT_VOICES="$SCRIPT_DIR/voices"
|
| 59 |
+
if [ ! -d "$DEFAULT_VOICES" ]; then
|
| 60 |
+
DEFAULT_VOICES=""
|
| 61 |
+
fi
|
| 62 |
+
PROMPT_VOICES=""
|
| 63 |
+
if [ -n "$DEFAULT_VOICES" ]; then
|
| 64 |
+
PROMPT_VOICES="$DEFAULT_VOICES"
|
| 65 |
+
fi
|
| 66 |
+
[ -n "$DEFAULT_VOICES" ] && PROMPT_VOICES="$DEFAULT_VOICES"
|
| 67 |
+
read -r -p "Voices Directory [$(if [ -n "$DEFAULT_VOICES" ]; then echo "$DEFAULT_VOICES"; else echo "None"; fi)]: " INPUT_VOICES
|
| 68 |
+
VOICES_ARG=()
|
| 69 |
+
if [ -n "$INPUT_VOICES" ]; then
|
| 70 |
+
VOICES_ARG+=("--voices-dir" "$INPUT_VOICES")
|
| 71 |
+
fi
|
| 72 |
+
|
| 73 |
+
# --- 6. Streaming ---
|
| 74 |
+
read -r -p "Enable Streaming? (y/n) [Y]: " INPUT_STREAM
|
| 75 |
+
STREAM_ARG=()
|
| 76 |
+
if [ "${INPUT_STREAM,,}" != "n" ]; then
|
| 77 |
+
STREAM_ARG+=("--stream")
|
| 78 |
+
fi
|
| 79 |
+
|
| 80 |
+
# --- 7. Text Preprocessing ---
|
| 81 |
+
read -r -p "Enable Text Preprocessing? (y/n) [Y]: " INPUT_PREPROCESS
|
| 82 |
+
PREPROCESS_ARG=()
|
| 83 |
+
if [ "${INPUT_PREPROCESS,,}" != "n" ]; then
|
| 84 |
+
PREPROCESS_ARG+=("--text-preprocess")
|
| 85 |
+
fi
|
| 86 |
+
|
| 87 |
+
# --- 8. Language ---
|
| 88 |
+
echo "Language (english, french_24l, german_24l, portuguese, italian, spanish_24l - leave blank for default):"
|
| 89 |
+
read -r INPUT_LANGUAGE
|
| 90 |
+
LANGUAGE_ARG=()
|
| 91 |
+
if [ -n "$INPUT_LANGUAGE" ]; then
|
| 92 |
+
LANGUAGE_ARG+=("--language" "$INPUT_LANGUAGE")
|
| 93 |
+
fi
|
| 94 |
+
|
| 95 |
+
# --- 9. Quantization ---
|
| 96 |
+
read -r -p "Enable int8 Quantization? (y/n) [N]: " INPUT_QUANTIZE
|
| 97 |
+
QUANTIZE_ARG=()
|
| 98 |
+
if [ "${INPUT_QUANTIZE,,}" = "y" ]; then
|
| 99 |
+
QUANTIZE_ARG+=("--quantize")
|
| 100 |
+
fi
|
| 101 |
+
|
| 102 |
+
# --- Summary ---
|
| 103 |
+
echo ""
|
| 104 |
+
echo "========================================"
|
| 105 |
+
echo "Starting Pocket TTS Server..."
|
| 106 |
+
echo " Host : $HOST"
|
| 107 |
+
echo " Port : $PORT"
|
| 108 |
+
[ -n "$INPUT_MODEL" ] && echo " Model : $INPUT_MODEL"
|
| 109 |
+
[ -n "$INPUT_VOICES" ] && echo " Voices : $INPUT_VOICES"
|
| 110 |
+
echo " Streaming : $([ "${INPUT_STREAM,,}" = "n" ] && echo "Disabled" || echo "Enabled")"
|
| 111 |
+
echo " Preprocessing: $([ "${INPUT_PREPROCESS,,}" = "n" ] && echo "Disabled" || echo "Enabled")"
|
| 112 |
+
[ -n "$INPUT_LANGUAGE" ] && echo " Language : $INPUT_LANGUAGE"
|
| 113 |
+
[ "${INPUT_QUANTIZE,,}" = "y" ] && echo " Quantization : Enabled"
|
| 114 |
+
echo "========================================"
|
| 115 |
+
echo ""
|
| 116 |
+
|
| 117 |
+
# --- Run ---
|
| 118 |
+
python server.py \
|
| 119 |
+
--host "$HOST" \
|
| 120 |
+
--port "$PORT" \
|
| 121 |
+
"${MODEL_ARG[@]+"${MODEL_ARG[@]}"}" \
|
| 122 |
+
"${VOICES_ARG[@]+"${VOICES_ARG[@]}"}" \
|
| 123 |
+
"${STREAM_ARG[@]+"${STREAM_ARG[@]}"}" \
|
| 124 |
+
"${PREPROCESS_ARG[@]+"${PREPROCESS_ARG[@]}"}" \
|
| 125 |
+
"${LANGUAGE_ARG[@]+"${LANGUAGE_ARG[@]}"}" \
|
| 126 |
+
"${QUANTIZE_ARG[@]+"${QUANTIZE_ARG[@]}"}"
|
| 127 |
+
|
| 128 |
+
EXIT_CODE=$?
|
| 129 |
+
|
| 130 |
+
if [ $EXIT_CODE -ne 0 ]; then
|
| 131 |
+
echo ""
|
| 132 |
+
echo "[ERROR] Server exited with error code $EXIT_CODE."
|
| 133 |
+
fi
|
| 134 |
+
exit $EXIT_CODE
|
run_pocket_tts_server_exe.bat
CHANGED
|
@@ -61,6 +61,16 @@ set "TEXT_PREPROCESS_ARG=--text-preprocess"
|
|
| 61 |
set /p "INPUT_PREPROCESS=Enable Text Preprocessing? (Y/N) [Y]: "
|
| 62 |
if /i "%INPUT_PREPROCESS%"=="N" set "TEXT_PREPROCESS_ARG="
|
| 63 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 64 |
echo.
|
| 65 |
echo ========================================================
|
| 66 |
echo Starting Pocket TTS Server (EXE)...
|
|
@@ -70,12 +80,14 @@ if defined MODEL_PATH echo Model: %MODEL_PATH%
|
|
| 70 |
if defined VOICES_DIR (echo Voices: %VOICES_DIR%) else (echo Voices: Default/None)
|
| 71 |
if defined STREAM_ARG (echo Streaming: Enabled) else (echo Streaming: Disabled)
|
| 72 |
if defined TEXT_PREPROCESS_ARG (echo Text Preprocessing: Enabled) else (echo Text Preprocessing: Disabled)
|
|
|
|
|
|
|
| 73 |
echo ========================================================
|
| 74 |
echo.
|
| 75 |
|
| 76 |
-
::
|
| 77 |
if exist "%~dp0PocketTTS-Server.exe" (
|
| 78 |
-
"%~dp0PocketTTS-Server.exe" --host %HOST% --port %PORT% %MODEL_PATH% %VOICES_DIR% %STREAM_ARG% %TEXT_PREPROCESS_ARG%
|
| 79 |
) else (
|
| 80 |
echo [ERROR] PocketTTS-Server.exe not found in the current directory.
|
| 81 |
echo Please make sure the executable is located in: %~dp0
|
|
|
|
| 61 |
set /p "INPUT_PREPROCESS=Enable Text Preprocessing? (Y/N) [Y]: "
|
| 62 |
if /i "%INPUT_PREPROCESS%"=="N" set "TEXT_PREPROCESS_ARG="
|
| 63 |
|
| 64 |
+
:: 7. Language
|
| 65 |
+
set "LANGUAGE_ARG="
|
| 66 |
+
set /p "INPUT_LANGUAGE=Language (english, french_24l, german_24l, portuguese, italian, spanish_24l - leave blank for default): "
|
| 67 |
+
if not "%INPUT_LANGUAGE%"=="" set "LANGUAGE_ARG=--language %INPUT_LANGUAGE%"
|
| 68 |
+
|
| 69 |
+
:: 8. Quantization
|
| 70 |
+
set "QUANTIZE_ARG="
|
| 71 |
+
set /p "INPUT_QUANTIZE=Enable int8 Quantization? (Y/N) [N]: "
|
| 72 |
+
if /i "%INPUT_QUANTIZE%"=="Y" set "QUANTIZE_ARG=--quantize"
|
| 73 |
+
|
| 74 |
echo.
|
| 75 |
echo ========================================================
|
| 76 |
echo Starting Pocket TTS Server (EXE)...
|
|
|
|
| 80 |
if defined VOICES_DIR (echo Voices: %VOICES_DIR%) else (echo Voices: Default/None)
|
| 81 |
if defined STREAM_ARG (echo Streaming: Enabled) else (echo Streaming: Disabled)
|
| 82 |
if defined TEXT_PREPROCESS_ARG (echo Text Preprocessing: Enabled) else (echo Text Preprocessing: Disabled)
|
| 83 |
+
if defined LANGUAGE_ARG echo Language: %INPUT_LANGUAGE%
|
| 84 |
+
if defined QUANTIZE_ARG echo Quantization: Enabled
|
| 85 |
echo ========================================================
|
| 86 |
echo.
|
| 87 |
|
| 88 |
+
:: 9. Run Command
|
| 89 |
if exist "%~dp0PocketTTS-Server.exe" (
|
| 90 |
+
"%~dp0PocketTTS-Server.exe" --host %HOST% --port %PORT% %MODEL_PATH% %VOICES_DIR% %STREAM_ARG% %TEXT_PREPROCESS_ARG% %LANGUAGE_ARG% %QUANTIZE_ARG%
|
| 91 |
) else (
|
| 92 |
echo [ERROR] PocketTTS-Server.exe not found in the current directory.
|
| 93 |
echo Please make sure the executable is located in: %~dp0
|
server.py
CHANGED
|
@@ -34,13 +34,15 @@ Examples:
|
|
| 34 |
# Custom port and voices directory
|
| 35 |
python server.py --port 8080 --voices-dir ./my_voices
|
| 36 |
|
| 37 |
-
#
|
| 38 |
-
python server.py --
|
| 39 |
|
| 40 |
Environment Variables:
|
| 41 |
POCKET_TTS_HOST Server host (default: 0.0.0.0)
|
| 42 |
POCKET_TTS_PORT Server port (default: 49112)
|
| 43 |
-
POCKET_TTS_MODEL_PATH Path to model file
|
|
|
|
|
|
|
| 44 |
POCKET_TTS_VOICES_DIR Path to voices directory
|
| 45 |
POCKET_TTS_STREAM_DEFAULT Enable streaming by default
|
| 46 |
POCKET_TTS_TEXT_PREPROCESS_DEFAULT Enable text preprocessing by default
|
|
@@ -80,6 +82,19 @@ Environment Variables:
|
|
| 80 |
default=Config.TEXT_PREPROCESS_DEFAULT,
|
| 81 |
help='Enable text preprocessing for all requests',
|
| 82 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 83 |
parser.add_argument(
|
| 84 |
'--log-level',
|
| 85 |
type=str,
|
|
@@ -106,9 +121,19 @@ def main():
|
|
| 106 |
|
| 107 |
logger = get_logger()
|
| 108 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 109 |
# Initialize TTS service
|
| 110 |
try:
|
| 111 |
-
init_tts_service(
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 112 |
except Exception as e:
|
| 113 |
logger.error(f'Failed to initialize TTS service: {e}')
|
| 114 |
sys.exit(1)
|
|
|
|
| 34 |
# Custom port and voices directory
|
| 35 |
python server.py --port 8080 --voices-dir ./my_voices
|
| 36 |
|
| 37 |
+
# Load French model with quantization
|
| 38 |
+
python server.py --language french_24l --quantize
|
| 39 |
|
| 40 |
Environment Variables:
|
| 41 |
POCKET_TTS_HOST Server host (default: 0.0.0.0)
|
| 42 |
POCKET_TTS_PORT Server port (default: 49112)
|
| 43 |
+
POCKET_TTS_MODEL_PATH Path to model config file
|
| 44 |
+
POCKET_TTS_LANGUAGE Model language (e.g., english, french_24l)
|
| 45 |
+
POCKET_TTS_QUANTIZE Enable int8 quantization (default: false)
|
| 46 |
POCKET_TTS_VOICES_DIR Path to voices directory
|
| 47 |
POCKET_TTS_STREAM_DEFAULT Enable streaming by default
|
| 48 |
POCKET_TTS_TEXT_PREPROCESS_DEFAULT Enable text preprocessing by default
|
|
|
|
| 82 |
default=Config.TEXT_PREPROCESS_DEFAULT,
|
| 83 |
help='Enable text preprocessing for all requests',
|
| 84 |
)
|
| 85 |
+
parser.add_argument(
|
| 86 |
+
'--language',
|
| 87 |
+
type=str,
|
| 88 |
+
default=Config.LANGUAGE,
|
| 89 |
+
dest='language',
|
| 90 |
+
help='Model language (e.g., english, french_24l, german_24l, portuguese, italian, spanish_24l). Incompatible with --model-path.',
|
| 91 |
+
)
|
| 92 |
+
parser.add_argument(
|
| 93 |
+
'--quantize',
|
| 94 |
+
action='store_true',
|
| 95 |
+
default=Config.QUANTIZE,
|
| 96 |
+
help='Apply dynamic int8 quantization to reduce memory usage and improve speed.',
|
| 97 |
+
)
|
| 98 |
parser.add_argument(
|
| 99 |
'--log-level',
|
| 100 |
type=str,
|
|
|
|
| 121 |
|
| 122 |
logger = get_logger()
|
| 123 |
|
| 124 |
+
# Validate mutually exclusive options
|
| 125 |
+
if args.language and args.model_path:
|
| 126 |
+
logger.error('--language and --model-path are mutually exclusive. Use one or the other.')
|
| 127 |
+
sys.exit(1)
|
| 128 |
+
|
| 129 |
# Initialize TTS service
|
| 130 |
try:
|
| 131 |
+
init_tts_service(
|
| 132 |
+
model_path=args.model_path,
|
| 133 |
+
voices_dir=args.voices_dir,
|
| 134 |
+
language=args.language,
|
| 135 |
+
quantize=args.quantize,
|
| 136 |
+
)
|
| 137 |
except Exception as e:
|
| 138 |
logger.error(f'Failed to initialize TTS service: {e}')
|
| 139 |
sys.exit(1)
|