====== Hardware ======
{{ https://www.amd.com/content/dam/amd/en/images/blogs/migrated-blogs/753606-0.jpg?800|Unified vs traditional memory architecture}}
* [[youtube>nwIZ5VI3Eus|Apple M3 Ultra vs RTX 5090 – The Final Battle]] -- equivalent on small models, but M3 Ultra is better on big models like [[https://openrouter.ai/deepseek/deepseek-r1-distill-llama-70b:free|DeepSeek R1 Distill Llama 70B]]
* [[youtube>bAao58hXo9w&t=1193s|Comparison of M3 Ultra & RTX 5090 32GB & RTX Pro 6000 96GB]] has an outcome that it is better to build RTX Pro 6000 system rather than Apple M3 Ultra for $10000 (price of M3 Ultra wit 512GB of RAM)
* [[youtube>QJqKqxQR36Y|Wire eight DGX Sparks into a 1TB “VRAM” cluster]] -- one would need a 4400Gbps switch and [[aliexpress>1005008648510408|QSFP56 cables (~€65)]].
* [[youtube>wCBLMXgk3No|Running LLM on AMD "Strix Halo" AI Ryzen MAX+ 395 (HP Z2 G1a Mini Workstation)]] -- Linux tuning and software configuration
* [[youtube>c3v6R0IbnYs|Building a Framework Desktop cluster with AMD's Ryzen AI Max+ 395]]
* [[youtube>GBR6pHZ68Ho|M4 Mac Mini cluster]] connected via Thunderbolt.
* [[youtube>PhJnZnQuuT0|Comparison of Jetson Thor, DGX Spark, and Apple Silicon M4 Pro]] all having unified 128GB of RAM with 273GB/s memory bandwidth.
* [[youtube>QbtScohcdwI|Stress-testing the NVIDIA DGX Spark, Dell Pro Max GB10, ASUS Ascent GX10, and MSI Edge Expert]] all running the same Grace Blackwell (GB10) chip and 128GB of unified RAM.
* [[https://videocardz.com/newz/breaking-nvidia-n1-laptop-motherboard-has-been-pictured-features-128gb-lpddr5x-memory|NVIDIA upcoming N1 laptop SoC]] with 128GB LPDDR5X memory
* [[https://videocardz.com/newz/amd-announces-ryzen-ai-halo-mini-pc-platform-aimed-at-local-ai-positioned-against-nvidia-dgx-spark|Ryzen AI Halo is AMD’s take at Mini Workstation PC]]
===== AMD chipset =====
^ Name ^ Price ^ CPU ^ GPU ^ Memory ^ Storage ^ Display ports ^ Extension slots ^ Connectivity ^ Wireless ^ Dimensions ^ Max TFLOPS ^ Tokens/sec (120B Q4) ^ Tokens / € ^ Tokens / W ^ Clustering ^
| [[https://frame.work/nl/en/desktop?tab=specs|Framework Desktop]] | [[https://frame.work/nl/en/products/desktop-diy-amd-aimax300/configuration/new|€3591]] | AMD Ryzen™ AI Max+ 395, 3.0GHz, 16 cores | AMD Radeon™ 8060S, 2.9GHz, 20 compute units | 128GB LPDDR5x, 8000 MT/s | 1TB, 2× NVMe PCIe 4.0 ×4 M.2 2280, max 8TB each | 1× HDMI v2.1, 2× DisplayPort v1.4 (8K@60Hz) | 1× PCIe 4.0 ×4 slot (max 50GbE) | RJ45 5Gbit (Realtek RTL8126), 2× USB4-C, 2× USB-A 3.2 Gen 2 | WiFi 7 (AMD RZ717) | 123.7x123.1x54.6mm | ~50–60 FP16 | 12–15 | 0.0055–0.0075 | 0.10–0.14 | :HELP: Either Ethernet (bad), or adding [[https://www.ebay.com/sch/i.html?_nkw=qsfp28+pci&_from=R40&_sop=15|50GbE QSFP28 PCIe adapter]] + cables |
| [[https://www.notebookcheck.net/Bosgame-M5-AI-Mini-Desktop-Pricing-and-release-date-set-for-new-AMD-Ryzen-AI-Max-395-mini-PC.1024582.0.html|Bosgame M5 AI]] | [[https://www.bosgamepc.com/products/bosgame-m5-ai-mini-desktop-ryzen-ai-max-395?sku=18073504178329773749034095|€2080]] (pre-order $1699) | AMD Ryzen™ AI Max+ 395, 3.0GHz, 16 cores | AMD Radeon™ 8060S, 2.9GHz, 20 compute units | 128GB LPDDR5x, 8000 MT/s | 2TB, 2× NVMe PCIe 4.0 ×4 M.2 2280, max 8TB each | 1× HDMI v2.1, 1× DisplayPort v1.4 (8K@60Hz) | | RJ45 2.5Gbit, 2× USB4-C, 3× USB-A 3.2 Gen 2, 2× USB-A 2.0, SD card | WiFi 7, Bluetooth 5.2 (in M.2 2230 key-E PCIe 3.0 slot) | :HELP: | | | | | :DEL: |
| [[https://www.geekompc.com/geekom-a9-mega-ai-mini-pc/|GEEKOM A9 Mega AI Mini PC]] | $3200 / [[https://www.amazon.nl/-/en/GEEKOM-A9-Mega-Improved-Pre-installed/dp/B0GL7KF3LC|€3500]] ([[https://www.kickstarter.com/projects/1906688106/geekom-a9-mega-the-most-powerful-mini-pc-on-earth|kickstarter $1899]]) | AMD Ryzen™ AI Max+ 395, 3.0GHz, 16 cores | AMD Radeon™ 8060S, 2.9GHz, 20 compute units | 128GB LPDDR5x, 8000 MT/s | 2TB, 2× NVMe PCIe 4.0 ×4 M.2 2280, max 8TB each | 2× HDMI v2.1 (8K@60Hz) | | 2× RJ45 2.5Gbit, 2× USB4-C (support Display Port 2.1), 2× USB-C, 3× USB-A 3.2 Gen 2, SD card | WiFi 7, Bluetooth 5.4 (in M.2 2230 key-E PCIe 3.0 slot) | 171x171x71mm | | | | | :DEL: |
| [[https://de.gmktec.com/en/products/gmktec-evo-x2-amd-ryzen%E2%84%A2-ai-max-395-mini-pc-1|GMKtec EVO-X2]] | €3000 | AMD Ryzen™ AI Max+ 395, 3.0GHz, 16 cores | AMD Radeon™ 8060S, 2.9GHz, 20 compute units | 128GB LPDDR5x, 8000 MT/s | 2TB, 2× NVMe PCIe 4.0 ×4 M.2 2280, max 8TB each | 1× HDMI v2.1, 1× DisplayPort v1.4 (8K@60Hz) | | RJ45 2.5Gbit, 2× USB4-C, 3× USB-A 3.2 Gen 2, 2× USB-A 2.0, SD card | WiFi 7, Bluetooth 5.4 (in M.2 2230 key-E PCIe 3.0 slot) | 193x185.8x77mm | | | | | :DEL: |
| [[https://www.bee-link.com/products/beelink-gtr9-pro-amd-ryzen-ai-max-395?variant=47842426224882|Beelink GTR9 Pro]] | €3000 | AMD Ryzen™ AI Max+ 395, 3.0GHz, 16 cores | AMD Radeon™ 8060S, 2.9GHz, 20 compute units | 128GB LPDDR5x, 8000 MT/s | 2TB, 2× NVMe PCIe 4.0 ×4 M.2 2280, max 8TB each | 1× HDMI v2.1 (8K@60Hz) | | 2× RJ45 40Gbit, 3× USB4-C, 2× USB-A 3.2 Gen 2, 2× USB-A 2.0, SD card | WiFi 7 (MT7925), Bluetooth 5.4 (in M.2 2230 key-E PCIe 3.0 slot) | 180x180x90.8mm | | | | | :HELP: Maybe 2×40Gbit = 10MB/s |
| [[https://liliputing.com/fevm-fa-ex9-mini-pc-with-amd-strix-halo-coming-soon/|FEVM FA-EX9]] | [[aliexpress>1005010109359032|€2950]] | AMD Ryzen™ AI Max+ 395, 3.0GHz, 16 cores | AMD Radeon™ 8060S, 2.9GHz, 20 compute units | 128GB LPDDR5x, 8000 MT/s | 2TB, NVMe PCIe 4.0 ×4 + 1× M.2 2280, max 8TB each | 1× HDMI v2.1, 1× DisplayPort v1.4 (8K@60Hz) | OCuLink 64Gb/s | RJ45 2.5Gbit, 2× USB4-C, 3× USB-A 3.2 Gen 2, 2× USB-A 2.0, SD card | WiFi 7 (MT7925), Bluetooth 5.3 (in M.2 2230 key-E PCIe 3.0 slot) | 192x190x55mm | | | | | OCuLink |
| [[https://www.minisforum.com/products/ms-s1-max|MINISFORUM MS-S1 MAX]] | [[https://minisforumpc.eu/products/minisforum-ms-s1-max-mini-pc|€3120]] | AMD Ryzen™ AI Max+ 395, 3.0GHz, 16 cores | AMD Radeon™ 8060S, 2.9GHz, 20 compute units | 128GB LPDDR5x, 8000 MT/s | 2TB, NVMe PCIe 4.0 ×4 + 1× M.2 2280, max 8TB each | 1× HDMI v2.1 (8K@60Hz) | 1× PCIe 4.0 ×4 slot | 2× RJ45 10Gbit (Realtek RTL8127), 2× USB4v2-C (80Gb/s, Display Port 2.0, PD out 15W), 2× USB4-C (40Gb/s, Display Port 2.0, PD out 15W), 3× USB-A 3.2 Gen 2, 2× USB-A 2.0, SD card | WiFi 7 (MT7925), Bluetooth 5.4 (in M.2 2230 key-E PCIe 3.0 slot) | 192x190x55mm | | | | | See above using [[https://www.ebay.com/itm/144116491578|MCX416A-CCAT Mellanox ConnectX-4 2× 50Gbit/s QSFP28 ($146)]] |
| [[https://liliputing.com/minisforum-n5-max-is-a-5-bay-nas-with-amd-ryzen-ai-max-395-strix-halo/|MINISFORUM N5 Max]] | [[https://nascompares.com/news/minisforum-n5-max-update/|€?]] | AMD Ryzen™ AI Max+ 395, 3.0GHz, 16 cores | AMD Radeon™ 8060S, 2.9GHz, 20 compute units | 128GB LPDDR5x, 8000 MT/s | barebone, NVMe PCIe 4.0 ×4 + 3× M.2 2280 ×1, max 8TB each, 5× 3.5″/2.5″ SATA drives | 1× HDMI v2.1 (8K@60Hz) | 1× PCIe 4.0 ×4 slot | 2× RJ45 10Gbit, 2× USB4v2-C (80Gb/s), 1× USB4-C (40Gb/s), 2× USB-A 3.2 Gen 2, 1× USB-A 2.0, SD card | WiFi 7 (MT7925), Bluetooth 5.4 (in M.2 2230 key-E PCIe 3.0 slot) | 199x202x252mm | | | | | OCuLink (external PCIe 4.0 ×4) |
* [[https://liliputing.com/more-ryzen-ai-max-395-mini-pcs-with-128gb-are-now-available-if-you-can-afford-one/|More Ryzen AI Max+ 395 mini PCs with 128GB are now available… Check other models]]
* [[https://www.notebookcheck.net/Best-mini-PC-of-the-year-AMD-Strix-Halo-128-GB-RAM-Radeon-RX-8060S-reviewed-in-the-Bosgame-M5.1087793.0.html|BOSGAME M5 comparison with other AMD and Intel chipsets]]
* [[https://liliputing.com/minisforum-bd395i-max-is-a-mini-itx-motherboard-with-amd-ryzen-ai-max-395/|MINISFORUM BD395i MAX]] is a mini ITX motherboard featuring full-size PCIe ×16 slot
* [[https://www.notebookcheck.net/MSI-AI-Edge-mini-PC-based-on-AMD-Ryzen-AI-Max-395-and-128-GB-LPDDR5X-RAM-launching-soon.1199933.0.html|MSI AI Edge mini-PC based on AMD Ryzen AI Max+ 395 and 128 GB LPDDR5X RAM launching soon]]
* [[https://videocardz.com/newz/fevms-new-faex1-mini-pc-with-16-core-ryzen-ai-max-395-fits-in-1-liter-chassis|FEMV FAEX1]] features 3× M.2 2280 PCIe 4.0 ×4 slot and OCuLink port, but it too pricy ([[aliexpress>1005011787879680|€4300]] for 128GB + 1TB version)
* [[https://liliputing.com/aoostar-nex-395-mini-pc-with-amd-strix-halo-is-coming-soon/|AOOSTAR NEX 395]] features 3× M.2 2280 PCIe 4.0 ×4 slot
* [[aliexpress>1005010737973381|Aoostar NEX395 Ryzen AI Max+ 395]] features 3× M.2 2280 PCIe 4.0 ×4 slot for €3500.
* [[https://onexplayerstore.com/products/onexstation-mini-ai-workstation-ryzen%E2%84%A2-ai-max-395-up-to-128gb-ram-ai-mini-pc?variant=52998151668006|ONEXPLAYER AMD Ryzen AI Max+ 395]] 128GB / 1TB for $2999.
* [[https://www.thermalright.com/product/ai-hydronous-r1/|Thermalright AI HydroNous R1 (not released as to 2026-04-15)]] features 3× M.2 2280 PCIe 4.0 ×4 slot, and liquid cooling ([[https://liliputing.com/thermalright-hydronous-r1-is-a-liquid-cooled-mini-pc-with-ryzen-ai-max-395/|review]])
* [[https://liliputing.com/thermalright-introduces-liquid-cooled-mini-pcs-with-amd-strix-halo/|Thermalright Strix Halo mini PC]] announced, also liquid cooled
* [[https://www.acer.com/us-en/desktops-and-all-in-ones/veriton-workstations/veriton-ra100-ai-mini-workstation|Acer Veriton RA100 AI Mini Workstation]], [[https://www.morefine.com/products/morefine-s500-r5-5600h-r5-7430u-ddr4-mini-pc-%E5%89%AF%E6%9C%AC|MOREFINE H1]], [[https://videocardz.com/newz/corsair-quietly-increases-amd-strix-halo-pc-price-by-1100-for-flagship-sku|Corsair AI Workstation 300]] have similar specs and prices.
===== Future =====
NVidia chipset:
* [[https://www.theverge.com/news/631835/nvidia-blackwell-ultra-ai-chip-gb300|Rubin has 50 petaflops of FP4, up from 20 petaflops in Blackwell]]
===== Old-school but interesting =====
* [[youtube>G5DBks2IsYI&t=854s|Nvidia Tesla V100 в работе и играх]] -- сравнение Tesla V100 с 3090, 4090, 5090 по TFLOPS, [[youtube>Bg_50B81-6E|Что может серверная Tesla V100 в играх?]] -- установка самых последних драйверов на NVidia Tesla V100 PG503.
* [[youtube>xyKEQjUzfAk|Cheap GMKtec Mini PC with 96GB RAM runs a 70B LLM in Intel Core Ultra CPU]] using [[github>intel/ipex-llm|Intel® LLM Library]] (discontinued), but checkout [[youtube>Cmsx01H-0xY|Geekom A9 Max with AMD Ryzen AI Max runs 120B LLM]]
====== LLM ======
* [[https://openrouter.ai/models?fmt=cards&input_modalities=text&max_price=0&order=context-high-to-low|Free models on OpenRouter]]. Note that you need to add $10 credits to your account in order the limit for free models to increase from 50 to 1000 API requests per day.
* [[https://kilo.ai/leaderboard#all-models|All models on Kilo Code]], however notice that one cannot force a particular model: either "free" or "non-free" options are available ("smart" routing):
# docker compose exec openclaw-gateway /app/openclaw.mjs models list --provider kilocode
Model Input Ctx Local Auth Tags
kilocode/kilo-auto/free text 977k no yes default
kilocode/kilo/auto text+image 977k no yes configured,alias:Kilo Gateway
====== Software ======
* [[https://lmstudio.ai/|LM Studio]] -- run AI models, locally and privately
* [[https://localllm.in/blog/interactive-vram-calculator|VRAM Calculator for Local Open Source LLMs]] or try [[github>alexziskind1/llm-inference-calculator|LLM Inference Hardware Calculator]]
* [[youtube>qmAbco38pXA|"speculative decoding" is a technique to dramatically boost Large Language Model speed]] using a smaller model drafts ahead, while a larger model verifies
===== OpenClaw =====
==== Install OpenClaw ====
* Add new ''openclaw'' user: ''useradd -m -u 987 -g 1001 -s /usr/sbin/nologin openclaw && mkdir -m 700 /home/openclaw && chown openclaw:openclaw /home/openclaw''
* Make sure that ''gateway.auth.token'' in ''/home/openclaw/.openclaw/openclaw.json'' matches the one in ''docker-compose.yaml'' (''openclaw-gateway.environment.OPENCLAW_GATEWAY_TOKEN'').
* Start/stop the container: ''docker compose up -d openclaw-gateway'' / ''docker compose down''
* To approve device (OpenClaw UI) request:
# docker compose exec openclaw-gateway bash
$ /app/openclaw.mjs devices list
Direct scope access failed; using local fallback.
Pending (1)
┌──────────────────────────────────────┬───────────────────────────────────────────────────┬──────────┬───────────────┬──────────┬────────┐
│ Request │ Device │ Role │ IP │ Age │ Flags │
├──────────────────────────────────────┼───────────────────────────────────────────────────┼──────────┼───────────────┼──────────┼────────┤
│ 4ec7a9d0-f5f2-4316-9c07-f9e4fa96620a │ f74fdd392ee3bca006e344a86554ef76b473d7e2bd8502fde │ operator │ │ just now │ │
└──────────────────────────────────────┴───────────────────────────────────────────────────┴──────────┴───────────────┴──────────┴────────┘
$ /app/openclaw.mjs devices approve 4ec7a9d0-f5f2-4316-9c07-f9e4fa96620a
Direct scope access failed; using local fallback.
Approved f74fdd392ee3bca006e344a86554ef76b473d7e2bd8502fde (4ec7a9d0-f5f2-4316-9c07-f9e4fa96620a)
* If you get the following error ''Control UI requires gateway.controlUi.allowedOrigins (set explicit origins), or set gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true to use Host-header origin fallback
mode'' then add the following to ''.openclaw/openclaw.json'':
"gateway": {
"controlUi": {
"allowedOrigins": [
"http://localhost"
]
}
}
and force that host in Apache configuration:
RequestHeader set Origin "http://localhost:18789"
* To workaround OpenClaw error "Proxy headers detected from untrusted address. Connection will not be treated as local." add the following to Apache configuration:
ProxyAddHeaders Off
* To force OpenClaw to bind to localhost instead of *, make sure that `OPENCLAW_GATEWAY_BIND` is not set ([github>openclaw/openclaw/blob/3e72c0352dde84a0bcb3aabafa99c2d4b12d1c46/docker-compose.yml#L34C10-L37|remove lines that configure ''--bind'' and ''--port'']]) and configure those via ''.openclaw/openclaw.json''
"gateway": {
"port": 18789,
"mode": "local",
"bind": "loopback"
}
Then check logs:
openclaw-gateway-1 | 2026-04-05T17:55:40.225+00:00 [canvas] host mounted at http://127.0.0.1:18789/__openclaw__/canvas/ (root /home/node/.openclaw/canvas)
openclaw-gateway-1 | 2026-04-05T17:55:40.296+00:00 [gateway] listening on ws://127.0.0.1:18789, ws://[::1]:18789 (PID 7)
* To add extras to original docker image do:
# cat - > docker/Dockerfile
FROM alpine/openclaw:2026.4.2
USER root
RUN apt-get update -q \
&& apt-get install -y -q --no-install-recommends \
python3-bs4 \
python3-dateutil \
python3-lxml \
python3-requests \
python3-yaml \
&& rm -rf /var/lib/apt/lists/* /var/cache/apt/archives/*
USER openclaw
# docker build -t openclaw-custom:2026.4.2 .
then use ''openclaw-custom:2026.4.2'' in ''docker-compose.yaml''.
=== Using LLama local model ===
* Add to ''docker-compose.yaml'':
services:
ollama:
image: ollama/ollama:latest
user: "987:1001"
network_mode: host
volumes:
- /home/openclaw/.ollama:/.ollama
* Pull LLM model (~3GB) and run it:
# docker compose up -d ollama
# docker compose exec ollama ollama pull llama3.1:8b-instruct-q4_K_M
# docker compose exec ollama ollama run llama3.1:8b-instruct-q4_K_M
* Configure OpenClaw to use it so that configuration in ''.openclaw/openclaw.json'' looks like this:
"models": {
"providers": {
"vllm": {
"baseUrl": "http://127.0.0.1:11434/v1",
"apiKey": "dummy-api-key",
"api": "openai-completions",
"models": [
{
"id": "ollama/llama3.1:8b-instruct-q4_K_M",
"name": "ollama/llama3.1:8b-instruct-q4_K_M",
"reasoning": false,
...
==== Install skills ====
* [[https://clawhub.ai/levineam/qmd-external|qmd]]: ''docker compose exec openclaw-gateway /app/openclaw.mjs skills install qmd-external'' and add ''npm install -g @tobilu/qmd'' to ''Dockerfile''.
* Configuring [[github>tobi/qmd|QMD]] in OpenClaw fundamentally upgrades its "memory + retrieval" system from a simple index into something much closer to a local RAG (retrieval-augmented generation) engine, which means it can find relevant info even if wording is different, not just exact matches resulting higher recall + higher precision. With QMD, OpenClaw switches to a hybrid search engine that combines:
* BM25 keyword search (exact matches)
* Vector (semantic) search (meaning-based)
* LLM reranking (reorders results by relevance)
* [[https://velvetshark.com/openclaw-memory-masterclass|OpenClaw Memory Masterclass: The complete guide to agent memory that survives]]
* Add the following to ''.openclaw/.env'':
XDG_CONFIG_HOME=/home/node/.openclaw/.config
XDG_CACHE_HOME=/home/node/.openclaw/.cache
* Run the following:
$ set -a; source ~/.openclaw/.env; set +a
$ qmd collection add ~/.openclaw/workspace --name workspace --mask "**/*.md"
$ qmd status
QMD Status
Index: /home/node/.openclaw/.cache/qmd/index.sqlite
Size: 904.0 KB
Documents
Total: 77 files indexed
Vectors: 0 embedded
Pending: 77 need embedding (run 'qmd embed')
Updated: 2h ago
AST Chunking
Status: active
Languages: typescript, tsx, javascript, python, go, rust
Collections
workspace (qmd://workspace/)
Pattern: **/*.md
Files: 77 (updated 2h ago)
Device
GPU: none (running on CPU — models will be slow)
Tip: Install CUDA, Vulkan, or Metal support for GPU acceleration.
CPU: 4 math cores
* [[https://clawhub.ai/matrixy/agent-browser-clawdbot|agent-browser]]: ''docker compose exec openclaw-gateway /app/openclaw.mjs skills install agent-browser-clawdbot'' add ''npm install -g agent-browser'' to ''Dockerfile'' (optionally install Linux packages and download Chrome) \\
This agent allows to control remotely Chrome browser, hence you can ask agent to stop or a particular page when human interaction is needed to overcome bot protection.
* [[https://clawhub.ai/gzlicanyi/imap-smtp-email|imap-smtp-email]]: ''docker compose exec openclaw-gateway /app/openclaw.mjs skills install imap-smtp-email'' \\
Allows to send emails without need to implement Python scriplets for that. Configure via ''.openclaw/workspace/skills/imap-smtp-email/.env''.
=== Install browser support (outdated) ===
:OPT: Run below if ''agent-browser'' is not installed system-wide:
* Add extra directory mappings:
volumes:
- /home/openclaw/.openclaw:/home/node/.openclaw
- /home/openclaw/.openclaw/.agent-browser:/home/node/.agent-browser
- /home/openclaw/.openclaw/.cache:/home/node/.cache
* Run:
~/.openclaw$ ./bin/agent-browser install
* Test:
~/.openclaw$ ./bin/agent-browser open google.com
* To configure add this to ''.openclaw/openclaw.json'':
"browser": {
"cdpUrl": "http://127.0.0.1:3003"
}
=== Install TTS and STT support ===
* Add the following to ''.openclaw/openclaw.json'' (check also [[https://docs.openclaw.ai/tools/tts|TTS documentation]], [[https://learn.microsoft.com/azure/ai-services/speech-service/rest-text-to-speech#audio-outputs|audio formats]]):
"messages": {
"tts": {
"auto": "inbound",
"provider": "microsoft",
"providers": {
"microsoft": {
"enabled": true,
"type": "microsoft",
"voice": "en-GB-ChristopherMultilingualNeural", // alternatively use "en-GB-AndrewMultilingualNeural"
"rate": "+10%",
"outputFormat": "audio-24khz-48kbitrate-mono-mp3"
},
"openai": {
"enabled": true,
"apiKey": "${OPENAI_API_KEY}",
"model": "gpt-4o-mini-tts",
"voice": "onyx", // change to "alloy" for female voice
"rate": "1.1"
}
}
}
}
:WARN: The format ''ogg-24khz-16bit-mono-opus'' should be supported by Microsoft, but in fact ''audio-24khz-48kbitrate-mono-mp3'' had worked.
* For local-only TTS install [[github>OHF-Voice/piper1-gpl/blob/main/docs/CLI.md|piper-tts]].
* Add the following to ''Dockerfile'':
USER root
RUN pip install piper-tts --break-system-packages
USER node
RUN mkdir /home/node/.piper
# Check more voices here: https://huggingface.co/rhasspy/piper-voices/tree/main/en/en_GB
RUN python3 -m piper.download_voices --data-dir /home/node/.piper en_GB-northern_english_male-medium
* Skill description to create:
# Piper TTS Skill
Local offline text-to-speech using Piper neural TTS. No API keys, no network calls — fully on-device synthesis.
## Quick Start
```bash
# Basic invocation — note the model must be a full path to an .onnx file
piper \
-m /home/node/.piper/en_GB-northern_english_male-medium.onnx \
-f /tmp/output.wav \
-- "Your text here"
```
**Example to console (raw PCM):**
```bash
echo "Hello" | piper -m model.onnx --output-raw > audio.raw
```
## CLI Parameters
All flags accept both GNU-style (`--flag`) and underscore (`--flag_name`) forms.
| Short | Long | Type | Default | Description |
|-------|----------------------|--------------------|-------------|--------------------------------------------------|
| `-h` | `--help` | — | — | Show help and exit |
| `-m` | `--model` | path | required | Path to the `.onnx` model file |
| `-c` | `--config` | path | — | Path to model config JSON (optional) |
| `-i` | `--input-file` | path(s) | — | Read text from file(s) instead of stdin/arg |
| `-f` | `--output-file` | path | stdout | Write WAV to file (default: raw to stdout) |
| `-d` | `--output-dir` | path | cwd | Write WAV file(s) to directory |
| — | `--output-dir-naming`| `{timestamp,text}` | `timestamp` | Filename scheme for output directory |
| — | `--output-raw` | — | false | Stream raw PCM to stdout instead of WAV header |
| `-s` | `--speaker` | int | 0 | Speaker ID (multi-speaker models only) |
| — | `--length-scale` | float | 1.0 | Phoneme duration multiplier (higher = slower) |
| — | `--noise-scale` | float | 0.667 | Generator noise |
| — | `--noise-w-scale` | float | 0.8 | Phoneme width noise scale |
| — | `--cuda` | — | false | Use GPU acceleration (requires onnxruntime-gpu) |
| — | `--sentence-silence` | float | 0.0 | Seconds of silence after each sentence |
| — | `--volume` | float | 1.0 | Volume multiplier (1.0 = normal) |
| — | `--no-normalize` | — | false | Skip automatic volume normalisation |
| — | `--data-dir` | path | `.` | Directory that contains voice models |
| — | `--debug` | — | false | Print debug information to stderr |
Text passed directly on the command line must be placed after `--` so it's not parsed as a flag.
## Installing Piper
```bash
pip install piper-tts
```
The `piper` binary is installed to `/usr/local/bin/piper` by default. Verify:
```bash
which piper
```
Voices are `.onnx` files downloaded separately. The Quick Start example uses the model already present at `/home/node/.piper/en_GB-northern_english_male-medium.onnx`.
## Post-Processing: WAV → OGG
Telegram voice messages and many chat apps prefer OGG/Opus format for smaller size and better quality. This is strongly recommended — WAV works fine, but OGG reduces file size 4–5× with no audible quality loss for speech.
Convert a Piper-generated WAV file to OGG/Opus:
```bash
ffmpeg -i /tmp/input.wav -c:a libopus -b:a 32k -vbr on /tmp/output.ogg
```
**Common presets:**
- `-b:a 32k` — good quality voice (recommended for speech)
- `-b:a 64k` — high quality music
- `-vbr on` — variable bitrate (smaller files)
## One-Pass WAV → OGG (optimized)
Instead of writing an intermediate WAV file, pipe Piper's output directly to ffmpeg for on-the-fly conversion:
```bash
echo "Your text here" | \
piper \
-m /home/node/.piper/en_GB-northern_english_male-medium.onnx \
--output-raw | \
ffmpeg \
-f s16le -ar 22050 -ac 1 \
-i pipe:0 \
-c:a libopus -b:a 32k -vbr on \
-f ogg /tmp/output.ogg
```
This avoids writing a temporary WAV file to disk and reduces I/O overhead.
**Explanation:**
- `--output-raw` — Piper emits raw PCM (no WAV header) to stdout
- `-f s16le` — 16-bit signed little-endian PCM format
- `-ar 22050` — sample rate matches Piper's output
- `-ac 1` — mono channel
- `-i pipe:0` — read input from stdin
- `-f ogg` — force OGG container output
## Notes
To speedup processing check for solution when Piper is running as [Web server](https://github.com/OHF-Voice/piper1-gpl/blob/main/docs/API_HTTP.md).
* :OPT: [[https://clawhub.ai/irachex/local-tts|local-tts]] skill is based on [[github>Blaizzy/mlx-audio|mlx_audio]] (not explored)
* :INFO: [[https://clawhub.ai/steipete/openai-whisper|openai-whisper]] skill is already included in vanilla OpenClaw image.
* Add the following to ''Dockerfile'':
USER root
RUN pip install openai-whisper --break-system-packages
USER node
RUN whisper --model tiny dummy.mp3
RUN whisper --model medium dummy.mp3
USER root
# Replace the script with a wrapper:
RUN mv /usr/local/bin/whisper /usr/local/bin/whisper.py
COPY --chown=root:root whisper /usr/local/bin/whisper
# Forbid downloading new models (stick to "medium"):
RUN chmod a-w -R /home/node/.cache/whisper
which will pre-download the model and replace the script with a wrapper.
* Wrapper script:
#!/bin/bash
#
# Wrapper script that overrides model and language (for faster processing on CPU).
# Note that this wrapper script does not actually execute /usr/local/bin/whisper.py, but executes whisper/transcribe.py as __main__.
#
exec python3 -m whisper.transcribe "$@" --model medium --language en --fp16 False
==== Using OpenClaw ====
* To re-run onboarding, do ''%%docker compose run --rm openclaw-cli onboard%%'' or like below.
* To switch the model, run ''%%docker compose exec openclaw-gateway /app/openclaw.mjs config%%''((Alternative to running ''openclaw-cli'' docker))
* To list all configured models, run
# docker compose exec openclaw-gateway /app/openclaw.mjs models list
Model Input Ctx Local Auth Tags
openrouter/stepfun/step-3.5-flash:free text 250k no yes default,configured,alias:OpenRouter
openrouter/minimax/minimax-m2.5:free text 192k no yes fallback#1,configured,alias:text-reasoning-minimax
ollama/qwen2.5:7b text 32k yes yes configured,alias:text-reasoning-qwen
openrouter/anthropic/claude-sonnet-4.6 text+image 977k no yes configured,alias:text-reasoning-sonnet
openrouter/google/gemini-3-flash-preview text+image 1024k no yes configured,alias:text-reasoning-gemini
openrouter/nvidia/nemotron-3-nano-30b-a... text 250k no yes configured,alias:text-reasoning-nemotron
openrouter/openai/gpt-oss-120b:free text 128k no yes configured,alias:text-reasoning-gpt
openrouter/qwen/qwen3-next-80b-a3b-inst... text 256k no yes configured,alias:text-reasoning-instruct
openrouter/qwen/qwen3-coder:free text 256k no yes configured,alias:coder
openai/gpt-5.1-codex text+image 391k no yes configured,alias:GPT
openrouter/nvidia/nemotron-nano-12b-v2-... text+image 125k no yes image,configured,alias:image-reasoning
* When you get a paring request from a bot:
OpenClaw: access not configured.
Your Telegram user id: 20538162
Pairing code: Z4RQ92MX
you need to run
# docker compose exec openclaw-gateway /app/openclaw.mjs pairing approve telegram Z4RQ92MX
Approved telegram sender 20538162.
==== Testing ====
^ Task / LLM name ^ :ADD: ''openrouter/stepfun/step-3.5-flash:free'' ^ ''openrouter/openai/gpt-oss-120b:free'' ^ ''ollama/qwen2.5:7b'' ^ :ADD: ''openrouter/google/gemini-3-flash-preview'' ^ ''nvidia/nemotron-3-nano-30b-a3b:free'' ^ ''qwen/qwen3-next-80b-a3b-instruct:free'' ^ :ADD: ''ollama/minimax-m2.7:cloud'' ^
| Free / price | :YES: | :YES: | :YES: | $0.50/M input tokens + $3/M output tokens | :YES: | :YES: | :YES: |
| Remembers to use "agent-browser" skill as instructed in ''TOOLS.md'' | :NO: | :NO: | | :YES: | :HELP: | :HELP: | :YES: |
| Tries to complete the task (does not stop in the middle) | :YES: | :NO: | | :YES: | :NO: | :HELP: | :YES: |
| "Send to Telegram the summary of OS, hardware of the system you're running on plus current model detailed configuration and usage." | :NO: | :NO: | | :YES: | :YES: | :HELP: | :YES: has even added emoji to message 💪 |
| Is able to complete the task about mini PC news tracking((See prompt 1)) | :NO: | :NO: lost in iterations | | :YES: but executed only one search query instead of five | :NO: stopped after 1st iteration and could not resume | :HELP: | :YES: |
| Is able to complete the task about ParagraphAlignment start((Prompt cannot be published)) | :HELP: | :HELP: | | :NO: