#!/usr/bin/env bash # S2S server with Kokoro TTS (its own voice set) backed by the local vLLM. # Needs espeak-ng on the host: sudo apt install espeak-ng set -euo pipefail VLLM_PORT=50000 # must match vLLM --port VLLM_URL="http://127.0.0.1:${VLLM_PORT}/v1" MODEL="qwen3.5-9b" # must match vLLM --served-model-name VENV="$HOME/.venvs/s2s" WS_PORT=8765 # where the robot connects API_KEY="" # vLLM doesn't check it; set if your endpoint does [ -d "$VENV" ] || python3 -m venv "$VENV" source "$VENV/bin/activate" pip install -qU pip # CPU torch first, so nothing pulls the CUDA build in pip install -q torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu pip install -q "kokoro>=0.9.2" soundfile speech-to-speech curl -fsS "$VLLM_URL/models" >/dev/null || { echo "vLLM not reachable at $VLLM_URL" >&2; exit 1; } # VAD loosened for the robot's quiet mic; 0.45 keeps its own echo from barging in exec speech-to-speech \ --mode realtime \ --ws_port "$WS_PORT" \ --thresh 0.45 --min_speech_ms 256 --min_speech_continuation_ms 128 \ --device cpu \ --stt parakeet-tdt \ --llm_backend responses-api \ --tts kokoro \ --kokoro_device cpu \ --model_name "$MODEL" \ --responses_api_base_url "$VLLM_URL" \ --responses_api_api_key "$API_KEY" \ --responses_api_stream