-
Notifications
You must be signed in to change notification settings - Fork 156
Add /upload_sample route to allow upload new speakers using Web API #80
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
98845ca
9f783f6
1e7a025
47d3568
571c4f2
f10207f
5e310e0
65dfd1c
f720b33
0e9f827
e7faea6
c9e67cf
f1e8c39
c388e1d
38f8dfa
2570806
dd9c688
19a1f69
c5de028
1d412ea
5c1a35f
241dd37
ae57177
bf46de0
f51038b
0218c48
b8a1ca0
05b5812
5cf3f7e
33efb27
8164e94
6f08109
9d47698
5897796
561e6f0
4662efc
3060a1c
df041b4
72770c6
4713e53
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,11 +1,10 @@ | ||
| dist | ||
| venv | ||
| speakers | ||
| output | ||
| test | ||
| models | ||
| xtts_api_server/models | ||
| *.pyc | ||
| xtts_api_server/RealtimeTTS/engines/coqui_engine_old.py | ||
| xtts_models | ||
| modules-xtts.txt | ||
| modules-xtts.txt |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,116 @@ | ||
| { | ||
| "nbformat": 4, | ||
| "nbformat_minor": 0, | ||
| "metadata": { | ||
| "colab": { | ||
| "provenance": [], | ||
| "gpuType": "T4" | ||
| }, | ||
| "kernelspec": { | ||
| "name": "python3", | ||
| "display_name": "Python 3" | ||
| }, | ||
| "language_info": { | ||
| "name": "python" | ||
| }, | ||
| "accelerator": "GPU" | ||
| }, | ||
| "cells": [ | ||
| { | ||
| "cell_type": "markdown", | ||
| "source": [ | ||
| "**Run next block, restart session when asked and run same block until everything installs.**\n", | ||
| "\n", | ||
| "Last message should be like this (yes, ignore ERROR)\n", | ||
| "\n", | ||
| "\n", | ||
| "```\n", | ||
| "ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n", | ||
| "torchvision 0.19.0+cu121 requires torch==2.4.0, but you have torch 2.1.1+cu121 which is incompatible\n", | ||
| "Successfully installed torch-2.1.1+cu121 torchaudio-2.1.1+cu121 triton-2.1.0\n", | ||
| "\n", | ||
| "```\n", | ||
| "\n" | ||
| ], | ||
| "metadata": { | ||
| "id": "FmMMJppi2-Gh" | ||
| } | ||
| }, | ||
| { | ||
| "cell_type": "code", | ||
| "execution_count": null, | ||
| "metadata": { | ||
| "id": "lT4ieCTnr_L7" | ||
| }, | ||
| "outputs": [], | ||
| "source": [ | ||
| "!apt-get update && apt-get install --no-install-recommends -y sox libsox-fmt-all curl wget gcc git git-lfs build-essential libaio-dev libsndfile1 ssh ffmpeg sshpass portaudio19-dev libportaudio2\n", | ||
| "!git clone https://github.com/abeiro/xtts-api-server\n", | ||
| "%cd xtts-api-server\n", | ||
| "!python3 -m pip install --upgrade pip wheel ninja virtualenv\n", | ||
| "!pip install setuptools==68.1.2\n", | ||
| "!pip install deepspeed\n", | ||
| "!pip install -r requirements.txt\n", | ||
| "!pip install torch==2.1.1+cu121 torchaudio==2.1.1+cu121 --index-url https://download.pytorch.org/whl/cu121" | ||
| ] | ||
| }, | ||
| { | ||
| "cell_type": "markdown", | ||
| "source": [ | ||
| "**Run this once to get model downloaded and deepspeed compiled. Once uvicorn starts, stop and proceed to next block**\n", | ||
| "\n", | ||
| "\n", | ||
| "\n" | ||
| ], | ||
| "metadata": { | ||
| "id": "u1Ir_s5U3ZcT" | ||
| } | ||
| }, | ||
| { | ||
| "cell_type": "code", | ||
| "source": [ | ||
| "!python3 -m xtts_api_server --listen --deepspeed" | ||
| ], | ||
| "metadata": { | ||
| "id": "Xs5dXNL43VFB" | ||
| }, | ||
| "execution_count": null, | ||
| "outputs": [] | ||
| }, | ||
| { | ||
| "cell_type": "markdown", | ||
| "source": [ | ||
| "**Run and note cloudflare address. Wait for message:**\n", | ||
| "\n", | ||
| "```\n", | ||
| "INFO: Uvicorn running on http://0.0.0.0:8020 (Press CTRL+C to quit)\n", | ||
| "\n", | ||
| "```\n", | ||
| "\n", | ||
| "Use http://generated-domain-name:80 in AI-FF conf.\n", | ||
| "\n" | ||
| ], | ||
| "metadata": { | ||
| "id": "xOowr61z3nT2" | ||
| } | ||
| }, | ||
| { | ||
| "cell_type": "code", | ||
| "source": [ | ||
| "#Run\n", | ||
| "!rm nohup.out\n", | ||
| "!wget -c https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 -O cloudflared-linux-amd64\n", | ||
| "!chmod +x cloudflared-linux-amd64\n", | ||
| "!nohup ./cloudflared-linux-amd64 tunnel --url http://localhost:8020 &\n", | ||
| "!sleep 8\n", | ||
| "!cat nohup.out\n", | ||
| "!python3 -m xtts_api_server --listen --deepspeed" | ||
| ], | ||
| "metadata": { | ||
| "id": "xuLmVnEW2PYM" | ||
| }, | ||
| "execution_count": null, | ||
| "outputs": [] | ||
| } | ||
| ] | ||
| } |
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,67 @@ | ||||||||||||||||||||||||||||||||||||||||||||
| #!/bin/bash | ||||||||||||||||||||||||||||||||||||||||||||
| clear | ||||||||||||||||||||||||||||||||||||||||||||
| cat << EOF | ||||||||||||||||||||||||||||||||||||||||||||
| CHIM XTTS | ||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
| This will install CHIM XTTS. This is a high quality TTS service that works with Skyrim voices. | ||||||||||||||||||||||||||||||||||||||||||||
| You can also generate your own voices. | ||||||||||||||||||||||||||||||||||||||||||||
| However it will require around 4GB of VRAM! | ||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
| Options: | ||||||||||||||||||||||||||||||||||||||||||||
| * deepseed = Uses more VRAM but it is faster. Needs cuda13 for 50xx series GPUs. | ||||||||||||||||||||||||||||||||||||||||||||
| * lowvram = Uses less VRAM but it is slower. | ||||||||||||||||||||||||||||||||||||||||||||
| * regular = Middle ground of both options above. RECOMMENDED! | ||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
| If you are not sure use lowvram. | ||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
| EOF | ||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
| if [ ! -d /home/dwemer/python-tts ]; then | ||||||||||||||||||||||||||||||||||||||||||||
| exit "XTTSv2 not installed" | ||||||||||||||||||||||||||||||||||||||||||||
| fi | ||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
| mapfile -t files < <(find /home/dwemer/xtts-api-server/ -name "start-*.sh") | ||||||||||||||||||||||||||||||||||||||||||||
| # Check if any files were found | ||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
| if [ ${#files[@]} -eq 0 ]; then | ||||||||||||||||||||||||||||||||||||||||||||
| echo "No files found matching the pattern." | ||||||||||||||||||||||||||||||||||||||||||||
| exit 1 | ||||||||||||||||||||||||||||||||||||||||||||
| fi | ||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
| # Display the files in a numbered list | ||||||||||||||||||||||||||||||||||||||||||||
| echo -e "Select a an option from the list:\n\n" | ||||||||||||||||||||||||||||||||||||||||||||
| for i in "${!files[@]}"; do | ||||||||||||||||||||||||||||||||||||||||||||
| echo "$((i+1)). ${files[$i]}" | ||||||||||||||||||||||||||||||||||||||||||||
| done | ||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
| echo "0. Disable service"; | ||||||||||||||||||||||||||||||||||||||||||||
| echo | ||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+31
to
+39
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Fix typos in user-facing text (“deepseed” → “deepspeed”; “Select a an” → “Select an”). User-visible messages should be correct and professional. -echo -e "Select a an option from the list:\n\n"
+echo -e "Select an option from the list:\n\n"
@@
-* deepseed = Uses more VRAM but faster
+* deepspeed = Uses more VRAM but faster📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||
| # Prompt the user to make a selection | ||||||||||||||||||||||||||||||||||||||||||||
| read -p "Select an option by picking the matching number: " selection | ||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
| # Validate the input | ||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
| if [ "$selection" -eq "0" ]; then | ||||||||||||||||||||||||||||||||||||||||||||
| echo "Disabling service. Run this again to enable" | ||||||||||||||||||||||||||||||||||||||||||||
| rm /home/dwemer/xtts-api-server/start.sh &>/dev/null | ||||||||||||||||||||||||||||||||||||||||||||
| exit 0 | ||||||||||||||||||||||||||||||||||||||||||||
| fi | ||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
| if ! [[ "$selection" =~ ^[0-9]+$ ]] || [ "$selection" -lt 1 ] || [ "$selection" -gt ${#files[@]} ]; then | ||||||||||||||||||||||||||||||||||||||||||||
| echo "Invalid selection." | ||||||||||||||||||||||||||||||||||||||||||||
| exit 1 | ||||||||||||||||||||||||||||||||||||||||||||
| fi | ||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+45
to
+54
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Reorder input validation to prevent comparison errors - if [ "$selection" -eq "0" ]; then
+ # Check for zero before numeric comparison
+ if [ "$selection" = "0" ]; then
echo "Disabling service. Run this again to enable"
rm /home/dwemer/xtts-api-server/start.sh &>/dev/null
exit 0
fi
- if ! [[ "$selection" =~ ^[0-9]+$ ]] || [ "$selection" -lt 1 ] || [ "$selection" -gt ${#files[@]} ]; then
+ if ! [[ "$selection" =~ ^[0-9]+$ ]] || [ "$selection" -lt 1 ] || [ "$selection" -gt ${#files[@]} ]; then
echo "Invalid selection."
exit 1
fi📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
| # Get the selected file | ||||||||||||||||||||||||||||||||||||||||||||
| selected_file="${files[$((selection-1))]}" | ||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
| echo "You selected: $selected_file" | ||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
| ln -sf $selected_file /home/dwemer/xtts-api-server/start.sh | ||||||||||||||||||||||||||||||||||||||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Quote path variables in - ln -sf $selected_file /home/dwemer/xtts-api-server/start.sh
+ ln -sf "$selected_file" "/home/dwemer/xtts-api-server/start.sh"📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
| # Ensure all start scripts are executable | ||||||||||||||||||||||||||||||||||||||||||||
| chmod +x /home/dwemer/xtts-api-server/start-*.sh 2>/dev/null || true | ||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,128 @@ | ||||||||||||||||||||||||||||||||||||||||||||
| #!/bin/bash | ||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
| echo "=== CHIM XTTS Installation ===" | ||||||||||||||||||||||||||||||||||||||||||||
| echo "" | ||||||||||||||||||||||||||||||||||||||||||||
| echo "NOTE: CHIM XTTS and Chatterbox use the same port (8020)." | ||||||||||||||||||||||||||||||||||||||||||||
| echo " Only one can be enabled at a time." | ||||||||||||||||||||||||||||||||||||||||||||
| echo "" | ||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
| cd /home/dwemer/xtts-api-server | ||||||||||||||||||||||||||||||||||||||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Ensure - cd /home/dwemer/xtts-api-server
+ cd /home/dwemer/xtts-api-server || { echo "Error: cannot cd to xtts-api-server"; exit 1; }📝 Committable suggestion
Suggested change
🧰 Tools🪛 Shellcheck (0.10.0)[warning] 2-2: Use 'cd ... || exit' or 'cd ... || return' in case cd fails. (SC2164)
Comment on lines
+2
to
+9
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Add shebang and strict error handling. + #!/bin/bash
+ set -euo pipefail🧰 Tools🪛 Shellcheck (0.10.0)[error] 1-1: Tips depend on target shell and yours is unknown. Add a shebang or a 'shell' directive. (SC2148) [warning] 2-2: Use 'cd ... || exit' or 'cd ... || return' in case cd fails. (SC2164) |
||||||||||||||||||||||||||||||||||||||||||||
| python3 -m venv /home/dwemer/python-tts | ||||||||||||||||||||||||||||||||||||||||||||
| source /home/dwemer/python-tts/bin/activate | ||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+9
to
+11
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Add error handling and avoid hardcoded paths. Multiple critical issues:
If 🛡️ Recommended fixes-cd /home/dwemer/xtts-api-server
-python3 -m venv /home/dwemer/python-tts
-source /home/dwemer/python-tts/bin/activate
+# Determine script directory and use relative paths
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" || { echo "Failed to determine script directory"; exit 1; }
+cd "$SCRIPT_DIR" || { echo "Failed to navigate to $SCRIPT_DIR"; exit 1; }
+
+# Allow user to configure paths or use defaults
+VENV_PATH="${VENV_PATH:-$HOME/python-tts}"
+python3 -m venv "$VENV_PATH" || { echo "Failed to create virtual environment at $VENV_PATH"; exit 1; }
+source "$VENV_PATH/bin/activate" || { echo "Failed to activate virtual environment"; exit 1; }Additionally, consider adding 📝 Committable suggestion
Suggested change
🧰 Tools🪛 Shellcheck (0.11.0)[warning] 9-9: Use 'cd ... || exit' or 'cd ... || return' in case cd fails. (SC2164) 🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
| PIDS=$(lsof -ti:8020) | ||||||||||||||||||||||||||||||||||||||||||||
| if [ -n "$PIDS" ]; then | ||||||||||||||||||||||||||||||||||||||||||||
| echo "Killing processes listening on port 8020: $PIDS" | ||||||||||||||||||||||||||||||||||||||||||||
| kill -9 $PIDS | ||||||||||||||||||||||||||||||||||||||||||||
| fi | ||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+14
to
+18
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Use graceful shutdown before SIGKILL. Using ♻️ Recommended approach for graceful shutdown PIDS=$(lsof -ti:8020)
if [ -n "$PIDS" ]; then
echo "Killing processes listening on port 8020: $PIDS"
- kill -9 $PIDS
+ # Try graceful shutdown first
+ kill $PIDS 2>/dev/null || true
+ sleep 2
+ # Force kill if still running
+ REMAINING=$(lsof -ti:8020)
+ if [ -n "$REMAINING" ]; then
+ echo "Force killing remaining processes: $REMAINING"
+ kill -9 $REMAINING
+ fi
fi📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
| echo "This will take a while so please wait." | ||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
| read -p "Do you want to perform a clean install? (yes/no): " clean_install | ||||||||||||||||||||||||||||||||||||||||||||
| if [[ "$clean_install" =~ ^[Yy][Ee][Ss]$ || "$clean_install" =~ ^[Yy]$ ]]; then | ||||||||||||||||||||||||||||||||||||||||||||
| rm -fr /home/dwemer/python-tts/* | ||||||||||||||||||||||||||||||||||||||||||||
| python3 -m venv /home/dwemer/python-tts | ||||||||||||||||||||||||||||||||||||||||||||
| source /home/dwemer/python-tts/bin/activate | ||||||||||||||||||||||||||||||||||||||||||||
| fi | ||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+23
to
+28
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion | 🟠 Major Update hard-coded paths to use environment variables. Once parameterization is applied (from the previous comment), update this block: read -p "Do you want to perform a clean install? (yes/no): " clean_install
if [[ "$clean_install" =~ ^[Yy][Ee][Ss]$ || "$clean_install" =~ ^[Yy]$ ]]; then
- rm -fr /home/dwemer/python-tts/*
- python3 -m venv /home/dwemer/python-tts
- source /home/dwemer/python-tts/bin/activate
+ rm -fr "$VENV_DIR"/*
+ python3 -m venv "$VENV_DIR"
+ source "$VENV_DIR/bin/activate"
fi🤖 Prompt for AI Agents
Comment on lines
+21
to
+28
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Add safeguards for destructive operations. The 🛡️ Recommended safeguards read -p "Do you want to perform a clean install? (yes/no): " clean_install
if [[ "$clean_install" =~ ^[Yy][Ee][Ss]$ || "$clean_install" =~ ^[Yy]$ ]]; then
- rm -fr /home/dwemer/python-tts/*
+ # Verify path before deletion
+ if [ -d "$VENV_PATH" ] && [[ "$VENV_PATH" == *"python-tts"* ]]; then
+ echo "WARNING: About to delete $VENV_PATH"
+ read -p "Are you absolutely sure? Type 'DELETE' to confirm: " confirm
+ if [ "$confirm" = "DELETE" ]; then
+ rm -fr "$VENV_PATH"
+ else
+ echo "Clean install cancelled"
+ exit 0
+ fi
+ fi
python3 -m venv /home/dwemer/python-tts
source /home/dwemer/python-tts/bin/activate
fi
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
| # Clean previous deepspeed stuff | ||||||||||||||||||||||||||||||||||||||||||||
| rm /home/dwemer/.cache/torch_extensions/py311_cu130/transformer_inference/* | ||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+30
to
+31
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Add error handling for cache cleanup. The cache cleanup operation on Line 31 will fail silently if the path doesn't exist, if there are permission issues, or if the wildcard doesn't match any files. ♻️ Recommended fix # Clean previous deepspeed stuff
-rm /home/dwemer/.cache/torch_extensions/py311_cu130/transformer_inference/*
+CACHE_DIR="$HOME/.cache/torch_extensions/py311_cu130/transformer_inference"
+if [ -d "$CACHE_DIR" ]; then
+ echo "Cleaning deepspeed cache at $CACHE_DIR"
+ rm -f "$CACHE_DIR"/* || echo "Warning: Failed to clean some cache files"
+fi📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||
| # Ask user about GPU | ||||||||||||||||||||||||||||||||||||||||||||
| read -p "Are you using a GT10XX series GPU? (yes/no): " gpu_answer | ||||||||||||||||||||||||||||||||||||||||||||
| if [[ "$gpu_answer" =~ ^[Yy][Ee][Ss]$ || "$gpu_answer" =~ ^[Yy]$ ]]; then | ||||||||||||||||||||||||||||||||||||||||||||
| cu_tag="cu118" | ||||||||||||||||||||||||||||||||||||||||||||
| torch_url="https://download.pytorch.org/whl/${cu_tag}" | ||||||||||||||||||||||||||||||||||||||||||||
| torch_ver="2.2.2" | ||||||||||||||||||||||||||||||||||||||||||||
| torchaudio_ver="2.2.2" | ||||||||||||||||||||||||||||||||||||||||||||
| python3 -m pip install --upgrade pip wheel ninja virtualenv | ||||||||||||||||||||||||||||||||||||||||||||
| pip install setuptools==68.1.2 | ||||||||||||||||||||||||||||||||||||||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion | 🟠 Major Consistently use Mixing bare For consistency and portability, replace all bare Also applies to: 36-36, 39-39, 53-53, 56-56, 78-78, 80-80, 85-85 🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||
| # Install app requirements without auto-pulling torch/torchaudio from deps | ||||||||||||||||||||||||||||||||||||||||||||
| pip install --no-deps -r requirements.txt | ||||||||||||||||||||||||||||||||||||||||||||
| # Pin to stable, CUDA-tagged PyTorch/Torchaudio that do not require TorchCodec | ||||||||||||||||||||||||||||||||||||||||||||
| pip cache purge || true | ||||||||||||||||||||||||||||||||||||||||||||
| pip uninstall -y torch torchaudio torchcodec torchvision || true | ||||||||||||||||||||||||||||||||||||||||||||
| pip install --no-deps --no-cache-dir --index-url "$torch_url" "torch==${torch_ver}+${cu_tag}" "torchaudio==${torchaudio_ver}+${cu_tag}" | ||||||||||||||||||||||||||||||||||||||||||||
| pip check || true | ||||||||||||||||||||||||||||||||||||||||||||
| # Ensure fallback audio loader is available | ||||||||||||||||||||||||||||||||||||||||||||
| pip install --no-cache-dir soundfile | ||||||||||||||||||||||||||||||||||||||||||||
| sed -i 's/checkpoint = load_fsspec(model_path, map_location=torch.device("cpu"))\["model"\]/checkpoint = load_fsspec(model_path, map_location=torch.device("cpu"), weights_only=False)["model"]/' /home/dwemer/python-tts/lib/python3.11/site-packages/TTS/tts/models/xtts.py | ||||||||||||||||||||||||||||||||||||||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Avoid directly patching installed packages. Directly modifying installed package files with
Additionally, this disables PyTorch's 🔧 Recommended alternativesOption 1 (preferred): Use a proper patch file that can be validated: # Create a patch file: xtts_weights_only.patch
# Then apply it with verification:
XTTS_FILE="$VENV_PATH/lib/python3.11/site-packages/TTS/tts/models/xtts.py"
if [ -f "$XTTS_FILE" ]; then
patch --dry-run "$XTTS_FILE" < xtts_weights_only.patch && \
patch "$XTTS_FILE" < xtts_weights_only.patch || \
echo "ERROR: Failed to apply xtts patch. Manual intervention required."
else
echo "ERROR: XTTS file not found at expected location"
exit 1
fiOption 2: Fork the TTS package or submit a PR upstream to add a configuration option for Option 3: Document this as a known limitation and provide manual patching instructions in the README. 🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
| else | ||||||||||||||||||||||||||||||||||||||||||||
| read -p "New: Use CUDA13. Needs windows updated drivers. RTX 50XX should use this. Usey cuda13? (yes/no): " gpu5_answer | ||||||||||||||||||||||||||||||||||||||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Fix typo in user prompt. "Usey cuda13?" should be "Use cuda13?" 📝 Fix- read -p "New: Use CUDA13. Needs windows updated drivers. RTX 50XX should use this. Usey cuda13? (yes/no): " gpu5_answer
+ read -p "New: Use CUDA13. Needs updated drivers. RTX 50XX should use this. Use cuda13? (yes/no): " gpu5_answer🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||
| if [[ "$gpu5_answer" =~ ^[Yy][Ee][Ss]$ || "$gpu5_answer" =~ ^[Yy]$ ]]; then | ||||||||||||||||||||||||||||||||||||||||||||
| cu_tag="cu130" | ||||||||||||||||||||||||||||||||||||||||||||
| torch_url="https://download.pytorch.org/whl/${cu_tag}" | ||||||||||||||||||||||||||||||||||||||||||||
| echo "Using torch: $torch_url" | ||||||||||||||||||||||||||||||||||||||||||||
| python3 -m pip install --upgrade pip wheel ninja virtualenv | ||||||||||||||||||||||||||||||||||||||||||||
| pip install setuptools==68.1.2 | ||||||||||||||||||||||||||||||||||||||||||||
| # Install app requirements without auto-pulling torch/torchaudio from deps | ||||||||||||||||||||||||||||||||||||||||||||
| #pip install --no-deps -r requirements5.txt --index-url=$torch_url | ||||||||||||||||||||||||||||||||||||||||||||
| pip install -r requirements5.txt --extra-index-url=https://download.pytorch.org/whl/cu130 | ||||||||||||||||||||||||||||||||||||||||||||
| # Pin to stable, CUDA-tagged PyTorch/Torchaudio that do not require TorchCodec | ||||||||||||||||||||||||||||||||||||||||||||
| pip check || true | ||||||||||||||||||||||||||||||||||||||||||||
| # Ensure fallback audio loader is available | ||||||||||||||||||||||||||||||||||||||||||||
| pip install --no-cache-dir soundfile | ||||||||||||||||||||||||||||||||||||||||||||
| # Fix symlinks | ||||||||||||||||||||||||||||||||||||||||||||
| LIBDIR=$(python3 -c 'import site; print(site.getsitepackages()[0])')/nvidia/cu13/lib | ||||||||||||||||||||||||||||||||||||||||||||
| for f in "$LIBDIR"/lib*.so.*; do | ||||||||||||||||||||||||||||||||||||||||||||
| base=$(basename "$f") | ||||||||||||||||||||||||||||||||||||||||||||
| link="${f%%.so.*}.so" | ||||||||||||||||||||||||||||||||||||||||||||
| if [ ! -e "$link" ]; then | ||||||||||||||||||||||||||||||||||||||||||||
| echo "Creating symlink: $(basename "$link") -> $base" | ||||||||||||||||||||||||||||||||||||||||||||
| ln -s "$base" "$link" | ||||||||||||||||||||||||||||||||||||||||||||
| fi | ||||||||||||||||||||||||||||||||||||||||||||
| done | ||||||||||||||||||||||||||||||||||||||||||||
| #pip install xtts-api-server #Fails | ||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
| else | ||||||||||||||||||||||||||||||||||||||||||||
| cu_tag="cu128" | ||||||||||||||||||||||||||||||||||||||||||||
| torch_url="https://download.pytorch.org/whl/${cu_tag}" | ||||||||||||||||||||||||||||||||||||||||||||
| echo "Using torch: $torch_url" | ||||||||||||||||||||||||||||||||||||||||||||
| python3 -m pip install --upgrade pip wheel ninja virtualenv | ||||||||||||||||||||||||||||||||||||||||||||
| pip install setuptools==68.1.2 | ||||||||||||||||||||||||||||||||||||||||||||
| # Install app requirements without auto-pulling torch/torchaudio from deps | ||||||||||||||||||||||||||||||||||||||||||||
| pip install --no-deps -r requirements.txt | ||||||||||||||||||||||||||||||||||||||||||||
| # Pin to stable, CUDA-tagged PyTorch/Torchaudio that do not require TorchCodec | ||||||||||||||||||||||||||||||||||||||||||||
| pip cache purge || true | ||||||||||||||||||||||||||||||||||||||||||||
| pip uninstall -y torch torchaudio torchcodec torchvision || true | ||||||||||||||||||||||||||||||||||||||||||||
| #pip install --index-url "$torch_url" torch torchaudio torchcodec torchvision | ||||||||||||||||||||||||||||||||||||||||||||
| pip install torch==2.7.0+cu128 torchaudio==2.7.0+cu128 torchvision==0.22.0+cu128 --index-url=https://download.pytorch.org/whl/ | ||||||||||||||||||||||||||||||||||||||||||||
| pip check || true | ||||||||||||||||||||||||||||||||||||||||||||
| # Ensure fallback audio loader is available | ||||||||||||||||||||||||||||||||||||||||||||
| pip install --no-cache-dir soundfile | ||||||||||||||||||||||||||||||||||||||||||||
| #pip install xtts-api-server #Fails | ||||||||||||||||||||||||||||||||||||||||||||
| sed -i 's/checkpoint = load_fsspec(model_path, map_location=torch.device("cpu"))\["model"\]/checkpoint = load_fsspec(model_path, map_location=torch.device("cpu"), weights_only=False)["model"]/' /home/dwemer/python-tts/lib/python3.11/site-packages/TTS/tts/models/xtts.py | ||||||||||||||||||||||||||||||||||||||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Inconsistent patching across installation paths. This line has the same critical Either:
Refer to the review comment on Line 50 for recommended fixes to the patching approach. 🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
| fi | ||||||||||||||||||||||||||||||||||||||||||||
| fi | ||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
| cp /home/dwemer/TheNarrator.wav speakers/TheNarrator.wav | ||||||||||||||||||||||||||||||||||||||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Check file existence before copying speaker sample. Copying if [[ ! -f "$SAMPLE_PATH" ]]; then
echo "Error: sample file not found at $SAMPLE_PATH"
exit 1
fi
cp "$SAMPLE_PATH" "${BASE_DIR}/speakers/" |
||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
| source /home/dwemer/python-tts/bin/activate | ||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
| ./conf.sh | ||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+102
to
+106
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Validate file existence before operations. Both the ♻️ Recommended validation+# Copy speaker sample if available
+NARRATOR_SOURCE="/home/dwemer/TheNarrator.wav" # TODO: Make configurable
+if [ -f "$NARRATOR_SOURCE" ]; then
-cp /home/dwemer/TheNarrator.wav speakers/TheNarrator.wav
+ cp "$NARRATOR_SOURCE" speakers/TheNarrator.wav
+else
+ echo "Warning: TheNarrator.wav not found at $NARRATOR_SOURCE"
+fi
source /home/dwemer/python-tts/bin/activate
-./conf.sh
+if [ -x ./conf.sh ]; then
+ ./conf.sh
+else
+ echo "ERROR: conf.sh not found or not executable"
+ exit 1
+fi📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
| echo | ||||||||||||||||||||||||||||||||||||||||||||
| echo "This will start CHIM XTTS to download the selected model" | ||||||||||||||||||||||||||||||||||||||||||||
| echo "Wait for the message 'Uvicorn running on http://0.0.0.0:8020 (Press CTRL+C to quit)'" | ||||||||||||||||||||||||||||||||||||||||||||
| echo "Then close this window. Press ENTER to continue" | ||||||||||||||||||||||||||||||||||||||||||||
| read | ||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
| echo "please wait...." | ||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
| # Add CUDA to PATH if the directory exists | ||||||||||||||||||||||||||||||||||||||||||||
| if [ -d "/home/dwemer/python-tts/lib/python3.11/site-packages/nvidia/cu13/lib/" ]; | ||||||||||||||||||||||||||||||||||||||||||||
| then | ||||||||||||||||||||||||||||||||||||||||||||
| export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/dwemer/python-tts/lib/python3.11/site-packages/nvidia/cu13/lib/ | ||||||||||||||||||||||||||||||||||||||||||||
| export PATH=/home/dwemer/python-tts/lib/python3.11/site-packages/nvidia/cu13/bin:$PATH | ||||||||||||||||||||||||||||||||||||||||||||
| export CUDA_HOME=/home/dwemer/python-tts/lib/python3.11/site-packages/nvidia/cu13 | ||||||||||||||||||||||||||||||||||||||||||||
| fi | ||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+117
to
+122
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Use runtime path resolution for CUDA libraries instead of hard-coded python3.11. The conditional path and environment variables hard-code -if [ -d "/home/dwemer/python-tts/lib/python3.11/site-packages/nvidia/cu13/lib/" ];
+CUDA_LIB_PATH="$(/home/dwemer/python-tts/bin/python -c 'import sysconfig, pathlib; p = pathlib.Path(sysconfig.get_path("purelib")) / "nvidia/cu13/lib"; print(p if p.exists() else "")')"
+if [ -n "$CUDA_LIB_PATH" ] && [ -d "$CUDA_LIB_PATH" ];
then
- export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/dwemer/python-tts/lib/python3.11/site-packages/nvidia/cu13/lib/
- export PATH=/home/dwemer/python-tts/lib/python3.11/site-packages/nvidia/cu13/bin:$PATH
- export CUDA_HOME=/home/dwemer/python-tts/lib/python3.11/site-packages/nvidia/cu13
+ export LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${CUDA_LIB_PATH}"
+ export PATH="$(dirname "$CUDA_LIB_PATH")/bin:$PATH"
+ export CUDA_HOME="$(dirname "$CUDA_LIB_PATH")/.."
fi
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
| readlink start.sh | grep -q '/home/dwemer/xtts-api-server/start-deepspeed.sh' && export DEEPSPEED="--deepspeed" || export DEEPSPEED="" | ||||||||||||||||||||||||||||||||||||||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Simplify and add error handling for deepspeed detection. The command using
♻️ Recommended approach-readlink start.sh | grep -q '/home/dwemer/xtts-api-server/start-deepspeed.sh' && export DEEPSPEED="--deepspeed" || export DEEPSPEED=""
+# Check if deepspeed should be enabled
+if [ -L start.sh ]; then
+ TARGET=$(readlink start.sh)
+ if [[ "$TARGET" == *"start-deepspeed.sh"* ]]; then
+ export DEEPSPEED="--deepspeed"
+ echo "Deepspeed mode enabled"
+ else
+ export DEEPSPEED=""
+ fi
+else
+ export DEEPSPEED=""
+ echo "Note: start.sh is not a symlink, deepspeed mode not auto-detected"
+fi📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
| python -m xtts_api_server --listen $DEEPSPEED | ||||||||||||||||||||||||||||||||||||||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Verify installation before starting the server. The server is started without verifying that the installation succeeded or that the ✅ Recommended validation+# Verify installation succeeded
+if ! python -c "import xtts_api_server" 2>/dev/null; then
+ echo "ERROR: xtts_api_server module not found. Installation may have failed."
+ echo "Check the output above for errors."
+ exit 1
+fi
+
+echo "Starting XTTS API server..."
python -m xtts_api_server --listen $DEEPSPEED📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
| echo "Press Enter" | ||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+1
to
+128
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion | 🟠 Major Add overall error handling and improve script robustness. The script lacks a comprehensive error handling strategy, which makes it difficult to debug when things go wrong and creates a poor user experience. Additionally, the extensive use of hardcoded paths makes the script non-portable. Recommended improvements:
#!/bin/bash
set -euo pipefail # Exit on error, undefined variables, and pipe failures
# Trap errors and provide helpful messages
trap 'echo "ERROR: Installation failed at line $LINENO. Check output above for details." >&2' ERR
# Configuration section at top of file
BASE_DIR="${BASE_DIR:-$HOME/xtts-api-server}"
VENV_PATH="${VENV_PATH:-$HOME/python-tts}"
NARRATOR_PATH="${NARRATOR_PATH:-$HOME/TheNarrator.wav}"
check_command() {
if ! command -v "$1" &> /dev/null; then
echo "ERROR: Required command '$1' not found. Please install it first."
exit 1
fi
}
check_command python3
check_command lsof
check_command pip
LOG_FILE="./install_$(date +%Y%m%d_%H%M%S).log"
exec > >(tee -a "$LOG_FILE") 2>&1
echo "Installation log: $LOG_FILE"
🧰 Tools🪛 Shellcheck (0.11.0)[warning] 9-9: Use 'cd ... || exit' or 'cd ... || return' in case cd fails. (SC2164) 🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fix invalid use of
exitwith a string.exitonly accepts numeric status codes. Useechoto print the message and thenexit 1.📝 Committable suggestion
🧰 Tools
🪛 Shellcheck (0.10.0)
[error] 21-21: Can only exit with status 0-255. Other data should be written to stdout/stderr.
(SC2242)