Integrated professional-grade Piper TTS into installer and media tool

This commit is contained in:
2026-02-23 00:04:46 +00:00
parent 8da1780f6e
commit 31a909702e
2 changed files with 55 additions and 9 deletions

View File

@@ -100,7 +100,6 @@ if [[ $REPLY =~ ^[Yy]$ ]]; then
fi fi
# Update config to point to ComfyUI # Update config to point to ComfyUI
# We use a python one-liner to update the json config safely
python3 -c " python3 -c "
import json import json
import os import os
@@ -113,12 +112,49 @@ else:
config['comfy_url'] = 'http://127.0.0.1:8188' config['comfy_url'] = 'http://127.0.0.1:8188'
with open(config_path, 'w') as f: with open(config_path, 'w') as f:
json.dump(config, f, indent=2) json.dump(config, f, indent=2)
print('✅ Configured ollama-cli to use ComfyUI at http://127.0.0.1:8188')
" "
else else
echo "Skipping ComfyUI installation." echo "Skipping ComfyUI installation."
fi fi
# 6. Install Piper TTS
echo ""
echo "-------------------------------------------"
read -p "Do you want to install Piper TTS (High-Quality Voice)? (y/n) " -n 1 -r
echo ""
if [[ $REPLY =~ ^[Yy]$ ]]; then
PIPER_DIR="$HOME/.ollama-cli/piper"
mkdir -p "$PIPER_DIR"
cd "$PIPER_DIR"
if [ ! -f "piper" ]; then
echo "[*] Downloading Piper binary..."
# Detect architecture for Piper download
OS_TYPE=$(uname -s | tr '[:upper:]' '[:lower:]')
ARCH_TYPE=$(uname -m)
if [[ "$OS_TYPE" == "darwin" ]]; then
# macOS uses the apple silicon or intel build
curl -L "https://github.com/rhasspy/piper/releases/download/v1.2.0/piper_macos_x86_64.tar.gz" -o piper.tar.gz
else
curl -L "https://github.com/rhasspy/piper/releases/download/v1.2.0/piper_amd64.tar.gz" -o piper.tar.gz
fi
tar -xzf piper.tar.gz
# Move binary to top level
mv piper/piper .
mv piper/lib* . || true
rm -rf piper piper.tar.gz
fi
if [ ! -f "voice.onnx" ]; then
echo "[*] Downloading High-Quality Voice Model (en_US-lessac-medium)..."
curl -L "https://huggingface.co/rhasspy/piper-voices/resolve/main/en/en_US/lessac/medium/en_US-lessac-medium.onnx" -o voice.onnx
curl -L "https://huggingface.co/rhasspy/piper-voices/resolve/main/en/en_US/lessac/medium/en_US-lessac-medium.onnx.json" -o voice.onnx.json
fi
echo "✅ Piper TTS installed."
else
echo "Skipping Piper installation."
fi
echo "" echo ""
echo "===========================================" echo "==========================================="
echo " Installation Complete! 🚀 " echo " Installation Complete! 🚀 "

View File

@@ -89,23 +89,33 @@ def generate_image(prompt: str) -> str:
@tool( @tool(
name="speak_text", name="speak_text",
description="Convert text to speech using Piper TTS", description="Convert text to speech using Piper TTS (high quality)",
parameters={ parameters={
"text": {"type": "string", "description": "Text to speak"}, "text": {"type": "string", "description": "Text to speak"},
"output_file": {"type": "string", "description": "Output filename", "default": "output.wav"} "output_file": {"type": "string", "description": "Output filename", "default": "output.wav"}
} }
) )
def speak_text(text: str, output_file: str = "output.wav") -> str: def speak_text(text: str, output_file: str = "output.wav") -> str:
"""Uses local Piper installation if available""" """Uses the high-quality Piper TTS installed by the installer"""
piper_bin = os.path.expanduser("~/piper/piper") piper_dir = os.path.expanduser("~/.ollama-cli/piper")
model_path = os.path.expanduser("~/piper/models/en_US-lessac-medium.onnx") # Guessing model path based on common setup piper_bin = os.path.join(piper_dir, "piper")
model_path = os.path.join(piper_dir, "voice.onnx")
# Fallback to simple 'say' command on macOS if piper is tricky to locate without scanning if os.path.exists(piper_bin) and os.path.exists(model_path):
try:
# Piper reads from stdin and writes to file
cmd = f'echo "{text}" | {piper_bin} --model {model_path} --output_file {output_file}'
subprocess.run(cmd, shell=True, check=True, capture_output=True)
return f"Audio saved to {output_file} (using high-quality Piper TTS)"
except Exception as e:
return f"Error using Piper: {e}. Falling back to system TTS..."
# Fallback to simple 'say' command on macOS
if sys.platform == "darwin": if sys.platform == "darwin":
try: try:
subprocess.run(["say", "-o", output_file, text], check=True) subprocess.run(["say", "-o", output_file, text], check=True)
return f"Audio saved to {output_file} (using macOS 'say')" return f"Audio saved to {output_file} (using system 'say' fallback)"
except Exception as e: except Exception as e:
return f"Error using 'say': {e}" return f"Error using 'say': {e}"
return "TTS not configured for this platform yet." return "TTS engine not found. Please run the installer to set up Piper."