Skip to main content

Troubleshooting

Contents:

Where to Look First

  • Main log: user/logs/sapphire.log (rotates daily). Most problems leave a line here — search for ERROR or the feature name.
  • Browser console (F12) for web UI problems — JS errors and failed requests show up there, not in the server log.
  • Running as a systemd service? journalctl --user -u sapphire -f
  • Sapphire Launcher users: the launcher's Troubleshoot tab checks whether Sapphire responds, verifies package versions and dependency health, scans voice features (STT/TTS/wake word), and detects your GPU — with fix buttons for common issues.
  • Settings > System has a core install integrity check — it verifies every shipped file against the manifest and can restore modified ones (git installs).

Reset Procedures

Ordered lightest to heaviest. Start at the top.

Light Reset (settings + password only)

Resets all settings to defaults and clears the login password. Keeps everything else — chats, memories, prompts, personas, knowledge, and your API keys (those live in a separate credentials file outside settings.json). The setup wizard runs again on next start.

Stop Sapphire first, then from the sapphire/ folder:

Linux:

rm user/settings.json
rm ~/.config/sapphire/secret_key
python main.py

macOS:

rm user/settings.json
rm ~/Library/Application\ Support/Sapphire/secret_key
python main.py

Windows (PowerShell):

Remove-Item user\settings.json
Remove-Item "$env:APPDATA\Sapphire\secret_key"
python main.py

Docker:

docker exec sapphire rm /home/sapphire/.config/sapphire/secret_key
docker compose down
rm ~/sapphire/user/settings.json
docker compose up -d

If only your prompts are broken, you don't need this — see Prompt issues for the prompt-only reset.

Reinstall Packages (conda env only)

Nuke the conda environment and reinstall from scratch. App files and your user/ data are untouched. Use this if your pip packages are messed up — it just reinstalls the packages, doesn't touch Sapphire.

conda deactivate && conda remove -n sapphire --all -y && conda create -n sapphire python=3.11 -y && conda activate sapphire && pip install -r requirements.txt && python main.py

Nuclear Reset (full reinstall, data preserved)

Full app reinstall: fresh clone, fresh conda environment. Your user/ directory is moved aside and restored — never deleted. Stop Sapphire first, then run from the directory containing sapphire/:

Linux/macOS:

mv sapphire/user ~/sapphire-user-backup
rm -rf sapphire
conda deactivate && conda remove -n sapphire --all -y
conda create -n sapphire python=3.11 -y && conda activate sapphire
git clone https://github.com/ddxfish/sapphire.git
mv ~/sapphire-user-backup sapphire/user
cd sapphire && pip install -r requirements.txt
python main.py

Windows (PowerShell):

Move-Item sapphire\user "$env:USERPROFILE\sapphire-user-backup"
Remove-Item -Recurse -Force sapphire
conda deactivate; conda remove -n sapphire --all -y
conda create -n sapphire python=3.11 -y; conda activate sapphire
git clone https://github.com/ddxfish/sapphire.git
Move-Item "$env:USERPROFILE\sapphire-user-backup" sapphire\user
cd sapphire; pip install -r requirements.txt
python main.py

Notes:

  • Your password is not reset by this — it lives outside the app folder. Add the secret_key line from Light Reset if you want that too.
  • Want fresh data as well? That's Reset Everything below — don't just skip the mv/Move-Item lines, back up first.
  • Sapphire Launcher can do this without a terminal — its Uninstall tab removes the env or the whole install, then Go reinstalls.
  • Docker installs: recreating the container is the equivalent — see DOCKER.md. Your data lives in the mounted user/ dir and the config volume.

Reset Password

If you still know the current one, you don't need any of this: change it in Settings › System › Login Password. That tab stays logged in and every other device is logged out once — sign back in there with the new password.

Genuinely forgotten? Delete the password hash file and restart Sapphire. This resets your login — you'll set a new password on next visit. Your chats, settings, and user data are untouched.

Linux:

rm ~/.config/sapphire/secret_key

macOS:

rm ~/Library/Application\ Support/Sapphire/secret_key

Windows (PowerShell):

Remove-Item "$env:APPDATA\Sapphire\secret_key"

Docker:

docker exec sapphire rm /home/sapphire/.config/sapphire/secret_key
docker restart sapphire

Then restart Sapphire (or just the container for Docker).

Reset Everything (Delete data)

Nuclear option - fresh start. Deletes all user data including chats, settings, and password.

Linux:

pkill -f "python main.py"
rm -rf user/
rm ~/.config/sapphire/secret_key
python main.py

macOS:

pkill -f "python main.py"
rm -rf user/
rm ~/Library/Application\ Support/Sapphire/secret_key
python main.py

Windows (PowerShell):

# Stop Sapphire first (close the terminal or Ctrl+C)
Remove-Item -Recurse -Force user\
Remove-Item "$env:APPDATA\Sapphire\secret_key"
python main.py

Docker:

docker compose down
rm -rf ~/sapphire/user/
docker compose up -d

The config dir is a persistent volume (sapphire-config → /home/sapphire/.config/sapphire), so recreating the container does NOT reset the password. To reset it, delete the secret_key (the Docker command above) or remove the sapphire-config volume.

You'll need to re-run setup and reconfigure settings.

Startup Issues

"Connection refused" or "No LLM endpoints available"

  • LLM server not running. Start LM Studio/llama-server first.
  • Wrong port in settings. Default expects http://127.0.0.1:1234/v1
  • Check LM Studio has "Start Server" enabled and "Allow LAN" if needed.

"Failed to load module" warnings on startup

  • Usually harmless to core functionality. Missing optional dependencies for optional features.
  • If a specific feature is broken, check logs for the actual error.

Port 8073 already in use / web UI never comes up

  • Another Sapphire instance (or another app) holds the port. Linux: ss -tlnp | grep 8073. Windows: netstat -ano | findstr 8073
  • Stop the other process, or change WEB_UI_PORT in user/settings.json and restart.

Crash at boot with malloc(): invalid size (Linux, multi-GPU)

Update Issues

git pull fails with "your local changes would be overwritten"

  • You (or a tool) modified core files. git status shows what changed; git stash sets the changes aside, then pull again.

Boot log shows [INTEGRITY] warnings / files don't match the manifest

  • Core files drifted from the shipped set (edits, a partial update, disk corruption). Settings > System → integrity check shows per-file status, and Repair (git installs) restores only the offending files.
  • Repair refuses files with uncommitted work-in-progress changes on dev trees — deliberate. It fixes drift, it doesn't eat your edits.

Updated but the UI looks broken or old

  • Hard-refresh the browser (Ctrl+Shift+R). Browsers cache the JS even when asked not to.

Errors about missing packages after an update

  • Run pip install -r requirements.txt after every pull. Major version jumps may need a fresh env — see Reinstall Packages.
  • Launcher users: the Update button does the pull and the pip install together.

Claude (or MCP) stopped working right after you upgraded packages by hand

  • requirements.txt caps openai<3, anthropic<1 and mcp<2 — majors Sapphire has not been ported to. anthropic 1.0 removed the temperature/top_p/top_k arguments, so every call through the Claude and Anthropic-compatible providers fails; mcp 2.0 dropped the HTTP client the MCP plugin uses.
  • pip install --upgrade openai anthropic mcp steps over the caps. Put it back with pip install -r requirements.txt — it reinstalls inside the bounds.
  • Installs you haven't touched are fine: neither the pip line above nor the in-app update upgrades a package that already satisfies the file.

Web UI Issues

403 Forbidden

  • Try http:// and https://
  • Delete cookies for this site
  • Test in private browsing window
  • Reset password (see Reset Password above)
  • Restart Sapphire app

Blank page or "Unauthorized"

  • Clear browser cookies for localhost:8073
  • Try incognito window
  • Reset password (see Reset Password above) and restart

Certificate warning on first visit

  • Expected with self-signed certs. Accept once (Advanced → Proceed) and the browser remembers it.
  • Cert is persistent (valid 10 years), stored in user/ssl/. Not regenerated on restart.

UI loads but chat doesn't respond

  • Check browser console (F12) for errors
  • Verify LLM server is responding: curl http://127.0.0.1:1234/v1/models

My reply vanished when the phone locked / the tab slept

  • It didn't. Turns run on the server, so a browser losing its connection never cancels one — only Stop does.
  • Wake the tab: it says "Connection dropped — she's still working, reconnecting…" and rejoins the live reply on its own, picking up where it stopped.
  • If it can't reconnect (roughly a minute of tries), the reply still finishes and lands in the chat — reload the page and it's there.
  • Audio isn't replayed for the part you missed; with TTS on the finished reply is spoken once when it arrives.

"Sapphire is still replying in this chat"

  • One turn per chat, on purpose — a second send (Enter past the Stop button, or another tab on the same chat) is refused so two interleaved turns can't corrupt the transcript.
  • Press Stop, then send. Other tabs on that chat show Stop while a turn is live.

Audio Issues

Sample rate detection error on speakers

  • Cheap USB speakers may not support certain sample rates, so choose "auto detect" or "default"
  • Auto detect will route through OS audio defaults, which can resample the audio to be compatible

Default audio seems to not work via TTS

  • Settings > Audio - then change your device to auto-detect
  • Selecting specific audio devices like default or a specific mic can work too
  • Auto-detect sometimes fails test due to it being open, but it may actually work so try it

Wakeword recorder does not detect when to stop recording (webcam mic)

  • Change your Recorder Background Percentile in STT settings higher
  • This is VAD voice activity detection thinking your BG noise is speech so it keeps recording
  • Lapel/lav and headsets mics may be ~10-20, but with webcam or other weak mics, raise to ~40

No TTS audio output

  • Verify TTS is enabled in Settings > TTS
  • Check TTS server started: grep "kokoro" user/logs/
  • Test system audio: aplay /usr/share/sounds/alsa/Front_Center.wav
  • Check PulseAudio/PipeWire is running

Boot toast says "Local audio unavailable" / Settings > Audio shows no devices (headless box, VM, server)

  • PortAudio needs a running PulseAudio/PipeWire server, and Ubuntu 26.04's PortAudio refuses to start without one
  • Sapphire still boots and browser voice works. This only affects a speaker/mic plugged into the Sapphire machine itself
  • To give her local audio: sudo apt install pipewire-audio, then systemctl --user enable --now pipewire.socket pipewire-pulse.socket wireplumber.service
  • Add your user to the audio group (sudo usermod -aG audio $USER, then log out and in). A lingering session with no console login has no device access otherwise
  • No restart needed once the server is up: open Settings > Audio and the devices re-detect
  • Bluetooth speaker on a headless box: WirePlumber only enables Bluetooth for an active seat by default. Put wireplumber.profiles = { main = { monitor.bluez.seat-monitoring = disabled } } in a file under ~/.config/wireplumber/wireplumber.conf.d/ and restart wireplumber

STT not transcribing

  • Check STT is enabled in Settings > STT
  • For GPU: verify CUDA is working (nvidia-smi)
  • Try CPU mode: set faster whisper device to cpu in settings
  • Turn up your mic volume to 70% or 100%
  • Check your OS/system default mic - it tries to read from this
  • If Web UI, check browser mic permissions AND windows mic permissions

Wake word not triggering

  • Check which wakeword you are using in settings
  • Make sure you pip installed install/requirements-wakeword.txt
  • Wake word is enabled in settings (the model setting now hot-reloads — no restart needed)
  • Turn your mic volume up to 70-100%
  • Set system mic to the mic you want wakeword on
  • Try using Hey Mycroft as a wakeword instead of Hey Sapphire
  • Reduce sensitivity threshold to 0.5
  • Test a different mic

Switching to a different built-in wake word (hey_mycroft, hey_jarvis, alexa, etc.) didn't take effect

  • Older Sapphire versions required a full app restart after changing WAKEWORD_MODEL — the running detector didn't reload. Fixed: the model now hot-swaps when you save the setting.
  • If you're on a build from before the fix, restart Sapphire once after the model change.
  • First time you select a new built-in, OpenWakeWord downloads the model (hey_mycroft_v0.1.onnx etc.) into its package directory — give it a few seconds before testing.

Adding a custom wake word

  • Drop your .onnx or .tflite model into user/wakeword/models/ and select it from the wakeword dropdown in settings.
  • The dropdown name is the filename stem — my_word.onnx shows up as my_word.
  • Built-in OpenWakeWord set: alexa, hey_mycroft, hey_jarvis, hey_rhasspy, timer, weather. Sapphire ships with hey_sapphire.

Training your own wake word

  • OpenWakeWord (the engine Sapphire uses) supports custom-trained models. Project + training instructions: https://github.com/dscripka/openWakeWord
  • Fastest path is the official Colab notebook in that repo — generates a model from a phrase in ~1 hour, no audio recording required (it synthesizes training data with TTS).
  • Output is a .onnx file. Drop it into user/wakeword/models/ and pick it from the dropdown.
  • For phrase quality tips and threshold tuning, see the openWakeWord docs and issues — the Sapphire side is just a thin loader.

Voice & Conversation Issues

Full voice triage lives in VOICE.md's Quick Troubleshooting. The two hottest ones:

She hears herself / echoes in conversation mode

  • Use headphones, or let the duplex echo-cancel tier engage (see VOICE.md — echo tiers)

Conversation mode connects but she is silent

  • Conversation audio requires streaming TTS: Settings > TTS > streaming enabled AND a streaming-capable provider (Kokoro or Piper). Cloud TTS providers render on screen only.

Phone call problems — see PHONE-CALLS.md's Quick Troubleshooting (403 on register, one-way audio, hangup issues).

Prompt issues

If you broke your default prompts

  • Settings > System tab
  • You can reset all prompts to default, or merge the defaults back into yours

Vault / private chat issues

A chat vanished from the dropdown

  • The vault locked (idle timeout, or someone clicked the eyeball). Private chats are hidden while sealed — that's the design, nothing is lost.
  • Click the 👁 eyeball and unlock. Everything comes back.
  • Raise the timeout in Settings > Privacy (VAULT_IDLE_MINUTES, default 30).

A chat became private and I didn't ask for it

  • Talking in a chat while the vault is unlocked marks it private. Lock the vault when you don't want that.
  • To release one: Chat Manager > its row > 🔓. It decrypts back to normal storage.

"Provider is not marked local/private-safe"

  • The chat is private, so only providers ticked Local / private server are allowed.
  • Either pick a local provider, or release the chat in Chat Manager.
  • Same rule applies to compressing a private chat, and to cloud STT/TTS (voice goes quiet with a notice instead of speaking).

Export or compress fails on a private chat

  • Bulk export and export-zip skip private chats on purpose. Use the row's ⬇️ to export one at a time.
  • Both need the vault unlocked. If it locked while the dialog was open, unlock and retry.

Forgot the vault passphrase

  • There is no recovery. The key is derived from the passphrase alone.
  • Restore user/prompts/prompt_vault.enc and user/history/sapphire_history.db together from a backup taken when you still knew it.

"Vault file was corrupt — quarantined"

  • The bad file is renamed prompt_vault.enc.bad-<timestamp> beside itself, never deleted.
  • Restore the vault file from a backup, paired with the chat database from the same backup.

Chat Database Issues

A chat shows "⚠ degraded" and became read-only

  • Some of its messages could not be read (corruption, or a vault key mismatch). The chat latches read-only so nothing else gets damaged.
  • Chat Manager → the chat's row → 🔧 Repair. Unreadable messages move to a quarantine (kept verbatim — recoverable if, say, the matching vault backup returns) and the rest of the chat becomes writable again.
  • The repair preview shows how many messages it keeps vs. quarantines before you commit.

Database acting strange / checking health

  • Sapphire backs up your data on a schedule — see BACKUPS.md for what's covered and how to restore.
  • Manual integrity check (needs the sqlite3 CLI, Sapphire stopped): sqlite3 user/history/sapphire_history.db "PRAGMA quick_check;" — should print ok.

Chat opens but is read-only ("degraded")

  • Some stored rows couldn't be read; repair it: Chat Manager -> the chat's 🔧 Repair button (see CHATS.md — degraded chats)

LLM issues

Send refused: "Sapphire is still replying in this chat"

  • One turn per chat: a stream is live (maybe another tab). Press Stop, then send (see CHATS.md)

LM Studio (simple) test failing

  • Open LM studio, click Developer in lower left to show advanced options, click green Developer tab, toggle server on, load a model
  • Go back to Sapphire: Settings > LLM > LM Studio > test button

Anthropic Claude not responding

  • conda activate sapphire && pip install anthropic
  • Check API key (some are for Claude Code only)
  • Put new API key in Settings > LLM > Claude

No thinking/reasoning visible

  • Not all models support thinking. Check provider supports it.
  • Claude: Enable "Extended Thinking" in LLM settings
  • GPT-5.x: Uses Responses API, set reasoning_summary to "detailed"
  • Gemini: Set reasoning_effort (low/medium/high) on thinking-enabled models (Gemini 2.5 Flash/Pro)
  • Local models via LM Studio: May need specific model that outputs <think> tags

Thinking breaks when switching providers

  • Thinking should transfer between chats
  • Note, models cannot see their past think tags in some cases (Claude)
  • Check if the model you are on supports thinking

Claude prompt caching not working (always MISS)

  • Spice and datetime are NOT the cause — both ride the ghost rail and are cache-safe (see GHOST_MESSAGES.md)
  • Real cache breakers: switching prompts/personas mid-conversation, editing prompt pieces, anything that rewrites the actual system prompt between turns
  • Check logs for [CACHE] Dynamic content detected - tools only, system prompt not cached

Claude caching enabled but costs seem high

  • First request is always a MISS (writing to cache costs 25% more)
  • Cache expires after TTL (5m default, can set to 1h)
  • If prompts change often, cache never gets reused

Network / Proxy Issues

Full proxy triage lives in NETWORK.md's Quick Troubleshooting. Fail-closed reminder: with SOCKS on, a dead proxy means loud errors everywhere — nothing silently falls back to direct.

Everything network fails right after enabling SOCKS — proxy down or wrong host/port (see NETWORK.md) Every request dies "host unreachable" with SOCKS on — your proxy has no server-side DNS; turn off "DNS via proxy" (NETWORK.md) LLM works, web tools fail (or vice versa) — the LLM lane is exempt by default; check the "What rides the proxy" strip in Settings > Network

Tool/Function Issues

"No executor found for function"

  • Function exists in toolset but Python file missing or has errors
  • Check functions/ (core tools) or the owning plugin's directory for the module
  • Look for import errors in logs

Web search returns no results

  • Rate limited by DuckDuckGo. Wait and retry.
  • If using the SOCKS proxy, verify it's working (see NETWORK.md)
  • Enable verbose tool debugging in settings for more logging

Plugin Issues

Plugin is enabled but its tools/features are missing

  • Almost always a signature failure — plugins are signed, and a modified or unsigned plugin is blocked at boot. Sapphire still starts fine, so it looks silent.
  • Check the boot log for [PLUGINS] Enabled but blocked (intent preserved, retry next restart): [...] — blocked plugins are listed there, and each verified plugin logs signature verified.
  • If you edited a plugin on purpose: re-sign it (see SIGNING.md), or set ALLOW_UNSIGNED_PLUGINS to true — dev machines only, it turns off tamper protection.
  • A plugin whose signature file itself was tampered with is always blocked, regardless of that setting.

Plugin acting stale after an update

  • Plugins load at boot only — restart Sapphire, then hard-refresh the browser (Ctrl+Shift+R) if the plugin has UI.

Settings > Plugins shows a "Missing: …" strip on a plugin

  • That plugin needs extra pip packages. Click Install — Sapphire installs them into its own conda environment or venv and reloads the plugin, no restart needed.
  • Running on plain system Python (Docker, or a distro Python)? Auto-install is refused on purpose; the strip shows the exact command to run yourself. It's quoted so it pastes into PowerShell, cmd or bash unchanged.
  • Discord needs Git on your PATH — its py-cord dependency installs from a pinned git commit. Windows: winget install Git.Git, then reopen the terminal. If discord.py is installed, pip uninstall discord.py first: it owns the same discord import name and conflicts.

Continuity Issues

Task not running at scheduled time

  • Check enabled toggle is on (green) in the Tasks tab
  • Verify cron syntax is correct (minute hour day month weekday)
  • Check cooldown hasn't blocked it (see Activity tab for "skipped - cooldown")
  • Low chance % may have rolled unfavorably (see Activity tab for "skipped - chance")

Tasks fire at the wrong hour / her clock is off (often Windows)

  • Timezone is auto-detected at first start. Linux/macOS read /etc/localtime; Windows needs the tzlocal package (it's in requirements.txt and the minimal set). Without it the log warns and USER_TIMEZONE stays UTC — schedules and the clock in her prompt run in UTC.
  • Fix: pick your timezone in the setup wizard's Identity step, or set USER_TIMEZONE in user/settings.json, then restart. pip install tzlocal makes detection work next boot.
  • Docker: set TZ in docker-compose.yml.

"Invalid cron schedule" error

  • Cron format: minute hour day month weekday
  • Use * for any, */N for every N, 1-5 for ranges
  • Example: 0 9 * * * = 9:00 AM daily
  • Weekday: 0 or 7 = Sunday, 1-6 = Mon-Sat

Task runs but no TTS audio

  • Check "Enable TTS" is checked in task editor
  • Verify TTS is working for regular chat first
  • Background tasks still use TTS if enabled

croniter not installed

  • Run: pip install croniter
  • Continuity requires this package for cron parsing

Home Assistant Issues

Connection test failing

  • Verify URL includes port (e.g., http://192.168.1.50:8123)
  • Check Home Assistant is running and accessible from this machine
  • Try the URL in a browser first

"401 Unauthorized" error

  • Token is invalid or expired
  • Create a new Long-Lived Access Token in HA profile
  • Make sure you copied the full token (~180+ characters)

Token shows "too short" warning

  • HA tokens are typically 180+ characters
  • If shorter, you may have copied it incorrectly
  • Create a new token and copy the entire string

Entity not found

  • Check exact spelling (entity_id or friendly name)
  • Entity may be blacklisted - check blacklist patterns
  • Use ha_list_lights_and_switches to see available entities

Notifications not sending

  • Find your service in HA: Developer Tools → Actions → search "notify"
  • Enter just the service name without "notify." prefix
  • Example: mobile_app_pixel_7 not notify.mobile_app_pixel_7
  • Make sure HA companion app is installed on your phone

HA tools not available

  • Add Home Assistant functions to your active toolset
  • Check Settings → Plugins → Home Assistant is configured
  • Test connection before trying to use tools

Performance Issues

Slow responses

  • LLM is the bottleneck. Use a 4B or smaller model to test
  • Reduce LLM_MAX_HISTORY to send less context, it gets slower over time
  • Kokoro is slow(er) on my i5-8250u. Nvidia is way faster, or faster CPU too.

High memory usage

  • Large LLM models need RAM. 4B model needs ~7GB after KV cache.
  • Use quantized models in Q4_K_M to reduce memory
  • STT with base Whisper models uses ~2-3GB.
  • TTS (Kokoro) uses ~2-3GB.

Troubleshoot Nvidia 5000 series on Linux

Try Sapphire first. Most won't need this. Only do this if STT and TTS are not using your GPU. It's a nightly build of torch with cuda 12.8 that may work better with the Linux open-kernel drivers if you get stuck. Don't use this if you don't need it.

pip install torch torchaudio --index-url https://download.pytorch.org/whl/nightly/cu128

Boot crash with malloc(): invalid size on Linux (multi-GPU systems)

Symptom: Sapphire crashes immediately at startup on a fresh install. Last log lines show wakeword model loading successfully, then:

Wakeword hot-started successfully
malloc(): invalid size (unsorted)
Fatal Python error: Aborted

The crash is in C-extension code (no Python traceback), and it's deterministic — happens every boot. Manually toggling wake word ON after boot works fine.

Cause: Two separate audio libraries both default to GPU 0 and initialize at the same time:

  • Kokoro (TTS) loads as a subprocess, picks cuda:0 by default
  • Whisper (STT) loads in the main process, defaults to cuda:0

When both grab the same GPU during the boot init storm, their CUDA contexts conflict and corrupt the heap. The next allocation (often inside the wakeword model's first audio buffer) trips glibc's malloc integrity check and the process aborts.

After boot, manually toggling features works because only one library initializes at a time — no concurrent grab.

Fix on multi-GPU systems: put TTS and STT on different cards.

In your settings (user/settings.json or via the Settings UI):

{
  "FASTER_WHISPER_CUDA_DEVICE": 0,
  "KOKORO_CUDA_DEVICE": "1"
}

KOKORO_CUDA_DEVICE accepts the device index as a string. It sets CUDA_VISIBLE_DEVICES on the Kokoro subprocess at the OS level, so Kokoro physically can't see the other GPU. Whisper uses FASTER_WHISPER_CUDA_DEVICE directly via PyTorch.

Restart Sapphire after changing these. Verify in user/logs/sapphire.log:

Kokoro subprocess pinned to CUDA_VISIBLE_DEVICES=1
Using CUDA device 0 (NVIDIA ...)   ← whisper

Single-GPU systems: leave both at default (empty KOKORO_CUDA_DEVICE, FASTER_WHISPER_CUDA_DEVICE=0). The race is less common with deferred-action sequencing (already in place for the boot init order), and there's no second GPU to escape to. If you still hit the crash, disable wake word at boot and toggle it on manually after Sapphire is up — that bypasses the concurrent-init window entirely.

Edit this page on GitHub · docs/TROUBLESHOOTING.md @ c2e3170 · synced