{"id":7167,"date":"2026-10-20T09:52:35","date_gmt":"2026-10-20T07:52:35","guid":{"rendered":"https:\/\/www.pschatzmann.ch\/home\/?p=7167"},"modified":"2026-10-20T09:58:46","modified_gmt":"2026-10-20T07:58:46","slug":"the-cheapest-way-to-run-a-neural-tts","status":"publish","type":"post","link":"https:\/\/www.pschatzmann.ch\/home\/2026\/10\/20\/the-cheapest-way-to-run-a-neural-tts\/","title":{"rendered":"The Cheapest Way to Run a Neural TTS"},"content":{"rendered":"<p>Classic embedded text-to-speech (formant synthesizers like SAM or eSpeak) is tiny and fast, but it sounds like a robot from the 80s. Neural TTS sounds natural, but it is usually something you run on a PC or in the cloud. I wanted to know: <strong>what is the cheapest hardware that can run a neural text-to-speech model locally, faster than real time?<\/strong><\/p>\n<p>To find out I ported <a href=\"https:\/\/github.com\/tronghieuit\/tiny-tts\">tiny-tts<\/a> to C++ as <a href=\"https:\/\/github.com\/pschatzmann\/TinyTTS\">TinyTTS<\/a>. It is a VITS-style, end-to-end model with only ~1.6 million parameters, and the port is plain hand-written C++ with no inference runtime (no TFLite, no ONNX Runtime). That makes it easy to run the exact same code on very different hardware.<\/p>\n<p>Here is what &#8220;Hello world!&#8221; sounds like: <a href=\"https:\/\/cdn.jsdelivr.net\/gh\/pschatzmann\/TinyTTS@main\/docs\/assets\/hello_world.wav\">\u25b6\ufe0f hello_world.wav<\/a><\/p>\n<h2 id=\"microcontrollers-enough-memory-not-enough-speed\">Microcontrollers: enough memory, not enough speed<\/h2>\n<p>My first target was the ESP32. Memory turned out not to be a problem at all: the model, a slimmed pronunciation dictionary and a small neural G2P model for unknown words need about 4.2 MB of flash, and only about 743 KB of PSRAM after startup.<\/p>\n<p>Speed is a different story. Even after INT8 weight quantization, weight caching and SIMD dot products, the numbers for <code>speak(\"Hello world!\")<\/code> (1.49 s of audio) are:<\/p>\n<table>\n<thead>\n<tr>\n<th>Board<\/th>\n<th align=\"right\">Time<\/th>\n<th align=\"right\">Real-time factor<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>ESP32-S3<\/td>\n<td align=\"right\">~33.9 s<\/td>\n<td align=\"right\">~23x slower than real time<\/td>\n<\/tr>\n<tr>\n<td>ESP32-P4<\/td>\n<td align=\"right\">~19.6 s<\/td>\n<td align=\"right\">~13x slower than real time<\/td>\n<\/tr>\n<tr>\n<td>ESP32-P4, model trained for 16 kHz<\/td>\n<td align=\"right\">~9.2 s<\/td>\n<td align=\"right\">~8x slower than real time<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>It works, and it is a nice proof of concept, but you would not want to wait 20 seconds for your doorbell to say &#8220;Hello&#8221;.<\/p>\n<h2 id=\"where-does-the-time-go\">Where does the time go?<\/h2>\n<p>Profiling shows the same picture on every CPU: the <strong>decoder<\/strong> (a HiFi-GAN-style vocoder that turns the spectral representation into audio samples) takes 87-90% of the time. Most of the rest goes to the <strong>flow<\/strong>. The text encoder, the duration predictor and the grapheme-to-phoneme conversion are cheap.<\/p>\n<p>So the question is not &#8220;which CPU is fast enough?&#8221; but &#8220;which cheap board has something that can do convolutions in parallel?&#8221; That points to a GPU or an NPU.<\/p>\n<h2 id=\"the-winner-milk-v-duo-256m\">The winner: Milk-V Duo 256M<\/h2>\n<p>The <a href=\"https:\/\/milkv.io\/duo\">Milk-V Duo 256M<\/a> is a tiny Linux board around the size of a Raspberry Pi Pico. It sells for roughly ten dollars, and its SG2002 SoC has:<\/p>\n<ul>\n<li>a 1 GHz T-Head C906 RISC-V core running Linux<\/li>\n<li>256 MB of RAM<\/li>\n<li>a <strong>TPU rated at 1 TOPS INT8<\/strong>, which also does BF16<\/li>\n<\/ul>\n<p>On the CPU alone it is already better than the ESP32s, but still far from real time. Moving the flow and the decoder to the TPU changes everything:<\/p>\n<table>\n<thead>\n<tr>\n<th>&#8220;Hello world!&#8221;, 44.1 kHz model<\/th>\n<th align=\"right\">CPU only<\/th>\n<th align=\"right\">Flow and decoder on the TPU<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>g2p<\/td>\n<td align=\"right\">48 ms<\/td>\n<td align=\"right\">42 ms<\/td>\n<\/tr>\n<tr>\n<td>text encoder<\/td>\n<td align=\"right\">32 ms<\/td>\n<td align=\"right\">31 ms<\/td>\n<\/tr>\n<tr>\n<td>duration predictor<\/td>\n<td align=\"right\">52 ms<\/td>\n<td align=\"right\">61 ms<\/td>\n<\/tr>\n<tr>\n<td>flow<\/td>\n<td align=\"right\">808 ms<\/td>\n<td align=\"right\"><strong>12 ms<\/strong><\/td>\n<\/tr>\n<tr>\n<td>vocoder<\/td>\n<td align=\"right\">7,781 ms<\/td>\n<td align=\"right\"><strong>138 ms<\/strong><\/td>\n<\/tr>\n<tr>\n<td><strong>total, incl. startup<\/strong><\/td>\n<td align=\"right\"><strong>8.85 s<\/strong><\/td>\n<td align=\"right\"><strong>0.61 s<\/strong><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>That is <strong>about 2.4x faster than real time<\/strong>, including program startup and loading five models, on a board that costs about as much as a pizza.<\/p>\n<h3 id=\"how-it-works\">How it works<\/h3>\n<p>The TPU is programmed with Sophgo&#8217;s <a href=\"https:\/\/github.com\/sophgo\/tpu-mlir\">TPU-MLIR<\/a> compiler, which only accepts models with static shapes. Speech has a different length for every sentence, so I had to work around that:<\/p>\n<ul>\n<li><strong>Decoder:<\/strong> it is purely convolutional, so it runs in overlapping fixed-size windows of 128 frames, with 12 frames of context on each side. The stitched result is practically identical to running the whole sentence at once (108 dB SNR in the ONNX check).<\/li>\n<li><strong>Flow:<\/strong> it uses attention over the whole sentence, so windowing is not possible. Instead I compile four versions for 128, 256, 512 and 1,024 frames and pad the input to the next size. 1,024 frames is about 12 s of speech; longer sentences fall back to the CPU.<\/li>\n<li><strong>Precision:<\/strong> the models run in BF16, not INT8. INT8 would be faster in theory, but the decoder&#8217;s output turned into noise, and even mixed precision with 47 layers kept in BF16 could not fix it. BF16 is as close to float as the CPU version.<\/li>\n<\/ul>\n<p>The small, variable-length stages (G2P, text encoder, duration predictor) stay on the CPU. TinyTTS has <code>setFlow()<\/code> and <code>setVocoder()<\/code> hooks so that an external implementation can take over these two stages; the Milk-V build plugs the TPU in there.<\/p>\n<p>The workflow is:<\/p>\n<ol>\n<li>On the PC, export the decoder and the flow as ONNX.<\/li>\n<li>Compile them with TPU-MLIR into <code>.cvimodel<\/code> files.<\/li>\n<li>Cross-compile the <code>tinytts<\/code> command line program with the T-Head musl toolchain.<\/li>\n<li>Copy the program and the models to the board with <code>scp<\/code> and run it:<\/li>\n<\/ol>\n<pre><code class=\"language-bash\">export LD_LIBRARY_PATH=\/mnt\/system\/lib\r\n.\/tinytts --tpu-model decoder_44100hz_w128_bf16.cvimodel \\\r\n  --tpu-flow flow_44100hz_l128_bf16.cvimodel --tpu-flow flow_44100hz_l256_bf16.cvimodel \\\r\n  --tpu-flow flow_44100hz_l512_bf16.cvimodel --tpu-flow flow_44100hz_l1024_bf16.cvimodel \\\r\n  -o hello.wav \"Hello world!\"\r\n<\/code><\/pre>\n<p>All the details are in <a href=\"milkv-duo.md\">docs\/milkv-duo.md<\/a>.<\/p>\n<h2 id=\"getting-sound-out-of-a-10-board\">Getting sound out of a $10 board<\/h2>\n<p>The Duo has no usable audio output with the default image. There are a few options:<\/p>\n<ul>\n<li><strong>Play it on your PC.<\/strong> <code>tinytts --stdout<\/code> writes a WAV to standard output, so you can run it on the board over SSH and play it locally:\n<pre><code class=\"language-bash\">ssh root@192.168.42.1 '.\/tinytts --stdout \"Hello world!\"' | aplay\r\n<\/code><\/pre>\n<p>The <code>duo-say.sh<\/code> script in the repository wraps this up with the TPU. A 2.6 s sentence takes about 1 s from command to WAV, SSH included.<\/li>\n<li><strong>An I2S amplifier (MAX98357A).<\/strong> None of the header pins offers I2S, but I2S2 is available on the Ethernet pads. With a rebuilt kernel (scripts and patches are in <code>research\/milkv_duo\/i2s\/<\/code>), the board gets a sound card and <code>tinytts<\/code> plays on it directly at 16 and 44.1 kHz. The sound card and playback work; I still have to confirm the actual sound on a connected amplifier, so treat the wiring as unverified for now.<\/li>\n<li><strong>A USB speaker.<\/strong> This works too, but the Duo has only one USB-C port, so you lose the USB network and SSH.<\/li>\n<li>The built-in DAC and PWM are not really usable for speech.<\/li>\n<\/ul>\n<h2 id=\"the-runner-up-raspberry-pi-zero-w\">The runner-up: Raspberry Pi Zero W<\/h2>\n<p>If you already have a Raspberry Pi Zero W in a drawer, it can do the same trick with its VideoCore IV GPU. With hand-written QPU kernels for the flow and the decoder, &#8220;Hello world!&#8221; drops from <em>15.7 s on the CPU to <strong>0.58 s<\/strong><\/em> (about 1.0 s with startup), also faster than real time. See <a href=\"rpi-zero-gpu.md\">docs\/rpi-zero-gpu.md<\/a>.<\/p>\n<p>The Milk-V Duo wins on price, and its toolchain (ONNX in, compiled model out) is a lot more pleasant than writing GPU assembly.<\/p>\n<h2 id=\"summary\">Summary<\/h2>\n<table>\n<thead>\n<tr>\n<th>Board<\/th>\n<th align=\"right\">Total time for &#8220;Hello world!&#8221; (1.49 s of audio)<\/th>\n<th align=\"center\">Real time?<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>ESP32-S3<\/td>\n<td align=\"right\">~33.9 s<\/td>\n<td align=\"center\">no<\/td>\n<\/tr>\n<tr>\n<td>ESP32-P4<\/td>\n<td align=\"right\">~19.6 s<\/td>\n<td align=\"center\">no<\/td>\n<\/tr>\n<tr>\n<td>Raspberry Pi Zero W, CPU<\/td>\n<td align=\"right\">~15.7 s<\/td>\n<td align=\"center\">no<\/td>\n<\/tr>\n<tr>\n<td>Milk-V Duo 256M, CPU<\/td>\n<td align=\"right\">~8.85 s<\/td>\n<td align=\"center\">no<\/td>\n<\/tr>\n<tr>\n<td>Raspberry Pi 4, 4 threads<\/td>\n<td align=\"right\">~1.55 s<\/td>\n<td align=\"center\">almost<\/td>\n<\/tr>\n<tr>\n<td>Desktop PC<\/td>\n<td align=\"right\">~0.76 s<\/td>\n<td align=\"center\">yes<\/td>\n<\/tr>\n<tr>\n<td>Raspberry Pi Zero W, GPU<\/td>\n<td align=\"right\">~0.58 s<\/td>\n<td align=\"center\">yes<\/td>\n<\/tr>\n<tr>\n<td><strong>Milk-V Duo 256M, TPU<\/strong><\/td>\n<td align=\"right\"><strong>~0.61 s<\/strong><\/td>\n<td align=\"center\"><strong>yes<\/strong><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>My conclusions:<\/p>\n<ul>\n<li><strong>Memory is no longer the problem.<\/strong> A small neural TTS model fits easily into a microcontroller with PSRAM.<\/li>\n<li><strong>CPUs in this price class are too slow<\/strong>, because the vocoder dominates everything.<\/li>\n<li><strong>A small accelerator is enough.<\/strong> A few dollars&#8217; worth of TPU or an old mobile GPU turns &#8220;23x slower than real time&#8221; into &#8220;faster than real time&#8221;.<\/li>\n<\/ul>\n<p>So the cheapest way to run a neural TTS today is a <strong>Milk-V Duo 256M with the flow and the decoder on its TPU<\/strong>, at about ten dollars for the board.<\/p>\n<p>The code, the models and the documentation are on GitHub: <a href=\"https:\/\/github.com\/pschatzmann\/TinyTTS\">pschatzmann\/TinyTTS<\/a>. You can also train your own voice, or a model at a lower sample rate (see <a href=\"training.md\">docs\/training.md<\/a>).<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Classic embedded text-to-speech (formant synthesizers like SAM or eSpeak) is tiny and fast, but it sounds like a robot from the 80s. Neural TTS sounds natural, but it is usually something you run on a PC or in the cloud. I wanted to know: what is the cheapest hardware that [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":7168,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","_exactmetrics_skip_tracking":false,"footnotes":""},"categories":[22,35],"tags":[27],"class_list":["post-7167","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-machine-sound","category-text-to-speech","tag-tts"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>The Cheapest Way to Run a Neural TTS - Phil Schatzmann<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.pschatzmann.ch\/home\/2026\/10\/20\/the-cheapest-way-to-run-a-neural-tts\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"The Cheapest Way to Run a Neural TTS - Phil Schatzmann\" \/>\n<meta property=\"og:description\" content=\"Classic embedded text-to-speech (formant synthesizers like SAM or eSpeak) is tiny and fast, but it sounds like a robot from the 80s. Neural TTS sounds natural, but it is usually something you run on a PC or in the cloud. I wanted to know: what is the cheapest hardware that [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.pschatzmann.ch\/home\/2026\/10\/20\/the-cheapest-way-to-run-a-neural-tts\/\" \/>\n<meta property=\"og:site_name\" content=\"Phil Schatzmann\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-20T07:52:35+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-20T07:58:46+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2026\/10\/milkv.jpeg\" \/>\n\t<meta property=\"og:image:width\" content=\"574\" \/>\n\t<meta property=\"og:image:height\" content=\"348\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"pschatzmann\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"pschatzmann\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2026\\\/10\\\/20\\\/the-cheapest-way-to-run-a-neural-tts\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2026\\\/10\\\/20\\\/the-cheapest-way-to-run-a-neural-tts\\\/\"},\"author\":{\"name\":\"pschatzmann\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#\\\/schema\\\/person\\\/73a53638a4e34e8373405fd737dac9b1\"},\"headline\":\"The Cheapest Way to Run a Neural TTS\",\"datePublished\":\"2026-10-20T07:52:35+00:00\",\"dateModified\":\"2026-10-20T07:58:46+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2026\\\/10\\\/20\\\/the-cheapest-way-to-run-a-neural-tts\\\/\"},\"wordCount\":1170,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#\\\/schema\\\/person\\\/73a53638a4e34e8373405fd737dac9b1\"},\"image\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2026\\\/10\\\/20\\\/the-cheapest-way-to-run-a-neural-tts\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/milkv.jpeg\",\"keywords\":[\"TTS\"],\"articleSection\":[\"Machine Sound\",\"Text To Speech\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2026\\\/10\\\/20\\\/the-cheapest-way-to-run-a-neural-tts\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2026\\\/10\\\/20\\\/the-cheapest-way-to-run-a-neural-tts\\\/\",\"url\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2026\\\/10\\\/20\\\/the-cheapest-way-to-run-a-neural-tts\\\/\",\"name\":\"The Cheapest Way to Run a Neural TTS - Phil Schatzmann\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2026\\\/10\\\/20\\\/the-cheapest-way-to-run-a-neural-tts\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2026\\\/10\\\/20\\\/the-cheapest-way-to-run-a-neural-tts\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/milkv.jpeg\",\"datePublished\":\"2026-10-20T07:52:35+00:00\",\"dateModified\":\"2026-10-20T07:58:46+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2026\\\/10\\\/20\\\/the-cheapest-way-to-run-a-neural-tts\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2026\\\/10\\\/20\\\/the-cheapest-way-to-run-a-neural-tts\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2026\\\/10\\\/20\\\/the-cheapest-way-to-run-a-neural-tts\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/milkv.jpeg\",\"contentUrl\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/milkv.jpeg\",\"width\":574,\"height\":348},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/2026\\\/10\\\/20\\\/the-cheapest-way-to-run-a-neural-tts\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"The Cheapest Way to Run a Neural TTS\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#website\",\"url\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/\",\"name\":\"Phil Schatzmann Consulting\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#\\\/schema\\\/person\\\/73a53638a4e34e8373405fd737dac9b1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/home\\\/#\\\/schema\\\/person\\\/73a53638a4e34e8373405fd737dac9b1\",\"name\":\"pschatzmann\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2022\\\/08\\\/pschatzmann.png\",\"url\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2022\\\/08\\\/pschatzmann.png\",\"contentUrl\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2022\\\/08\\\/pschatzmann.png\",\"width\":305,\"height\":305,\"caption\":\"pschatzmann\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.pschatzmann.ch\\\/wp-content\\\/uploads\\\/2022\\\/08\\\/pschatzmann.png\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"The Cheapest Way to Run a Neural TTS - Phil Schatzmann","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.pschatzmann.ch\/home\/2026\/10\/20\/the-cheapest-way-to-run-a-neural-tts\/","og_locale":"en_US","og_type":"article","og_title":"The Cheapest Way to Run a Neural TTS - Phil Schatzmann","og_description":"Classic embedded text-to-speech (formant synthesizers like SAM or eSpeak) is tiny and fast, but it sounds like a robot from the 80s. Neural TTS sounds natural, but it is usually something you run on a PC or in the cloud. I wanted to know: what is the cheapest hardware that [&hellip;]","og_url":"https:\/\/www.pschatzmann.ch\/home\/2026\/10\/20\/the-cheapest-way-to-run-a-neural-tts\/","og_site_name":"Phil Schatzmann","article_published_time":"2026-10-20T07:52:35+00:00","article_modified_time":"2026-10-20T07:58:46+00:00","og_image":[{"width":574,"height":348,"url":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2026\/10\/milkv.jpeg","type":"image\/jpeg"}],"author":"pschatzmann","twitter_card":"summary_large_image","twitter_misc":{"Written by":"pschatzmann","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.pschatzmann.ch\/home\/2026\/10\/20\/the-cheapest-way-to-run-a-neural-tts\/#article","isPartOf":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2026\/10\/20\/the-cheapest-way-to-run-a-neural-tts\/"},"author":{"name":"pschatzmann","@id":"https:\/\/www.pschatzmann.ch\/home\/#\/schema\/person\/73a53638a4e34e8373405fd737dac9b1"},"headline":"The Cheapest Way to Run a Neural TTS","datePublished":"2026-10-20T07:52:35+00:00","dateModified":"2026-10-20T07:58:46+00:00","mainEntityOfPage":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2026\/10\/20\/the-cheapest-way-to-run-a-neural-tts\/"},"wordCount":1170,"commentCount":0,"publisher":{"@id":"https:\/\/www.pschatzmann.ch\/home\/#\/schema\/person\/73a53638a4e34e8373405fd737dac9b1"},"image":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2026\/10\/20\/the-cheapest-way-to-run-a-neural-tts\/#primaryimage"},"thumbnailUrl":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2026\/10\/milkv.jpeg","keywords":["TTS"],"articleSection":["Machine Sound","Text To Speech"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.pschatzmann.ch\/home\/2026\/10\/20\/the-cheapest-way-to-run-a-neural-tts\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.pschatzmann.ch\/home\/2026\/10\/20\/the-cheapest-way-to-run-a-neural-tts\/","url":"https:\/\/www.pschatzmann.ch\/home\/2026\/10\/20\/the-cheapest-way-to-run-a-neural-tts\/","name":"The Cheapest Way to Run a Neural TTS - Phil Schatzmann","isPartOf":{"@id":"https:\/\/www.pschatzmann.ch\/home\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2026\/10\/20\/the-cheapest-way-to-run-a-neural-tts\/#primaryimage"},"image":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2026\/10\/20\/the-cheapest-way-to-run-a-neural-tts\/#primaryimage"},"thumbnailUrl":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2026\/10\/milkv.jpeg","datePublished":"2026-10-20T07:52:35+00:00","dateModified":"2026-10-20T07:58:46+00:00","breadcrumb":{"@id":"https:\/\/www.pschatzmann.ch\/home\/2026\/10\/20\/the-cheapest-way-to-run-a-neural-tts\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.pschatzmann.ch\/home\/2026\/10\/20\/the-cheapest-way-to-run-a-neural-tts\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.pschatzmann.ch\/home\/2026\/10\/20\/the-cheapest-way-to-run-a-neural-tts\/#primaryimage","url":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2026\/10\/milkv.jpeg","contentUrl":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2026\/10\/milkv.jpeg","width":574,"height":348},{"@type":"BreadcrumbList","@id":"https:\/\/www.pschatzmann.ch\/home\/2026\/10\/20\/the-cheapest-way-to-run-a-neural-tts\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.pschatzmann.ch\/home\/"},{"@type":"ListItem","position":2,"name":"The Cheapest Way to Run a Neural TTS"}]},{"@type":"WebSite","@id":"https:\/\/www.pschatzmann.ch\/home\/#website","url":"https:\/\/www.pschatzmann.ch\/home\/","name":"Phil Schatzmann Consulting","description":"","publisher":{"@id":"https:\/\/www.pschatzmann.ch\/home\/#\/schema\/person\/73a53638a4e34e8373405fd737dac9b1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.pschatzmann.ch\/home\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.pschatzmann.ch\/home\/#\/schema\/person\/73a53638a4e34e8373405fd737dac9b1","name":"pschatzmann","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2022\/08\/pschatzmann.png","url":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2022\/08\/pschatzmann.png","contentUrl":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2022\/08\/pschatzmann.png","width":305,"height":305,"caption":"pschatzmann"},"logo":{"@id":"https:\/\/www.pschatzmann.ch\/wp-content\/uploads\/2022\/08\/pschatzmann.png"}}]}},"post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/posts\/7167","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/comments?post=7167"}],"version-history":[{"count":5,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/posts\/7167\/revisions"}],"predecessor-version":[{"id":7173,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/posts\/7167\/revisions\/7173"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/media\/7168"}],"wp:attachment":[{"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/media?parent=7167"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/categories?post=7167"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.pschatzmann.ch\/home\/wp-json\/wp\/v2\/tags?post=7167"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}