{"id":19184,"date":"2026-09-20T12:31:57","date_gmt":"2026-09-20T10:31:57","guid":{"rendered":"https:\/\/www.beseit.net\/?page_id=19184"},"modified":"2026-09-20T12:33:19","modified_gmt":"2026-09-20T10:33:19","slug":"qween","status":"publish","type":"page","link":"http:\/\/www.beseit.net\/?page_id=19184","title":{"rendered":"Muntatge d&#8217;un servidor TTS local amb veu catalana (Ona, UPC) a Deepin proposat per Qween"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Perfecte! Aqu\u00ed tens el <strong>text complet i millorat<\/strong> del teu blog, llest per copiar i enganxar:<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u2b50\u2b50\u2b50 Muntatge d'un servidor TTS local amb veu catalana (Ona, UPC) a Deepin\n\n## \ud83c\udfaf Objectius\n\nL'objectiu del projecte \u00e9s doble:\n\n1. **Instal\u00b7lar un servidor local de s\u00edntesi de veu (TTS)** accessible a `http:\/\/127.0.0.1:8765\/`, amb capacitat de conversa (STT + LLM + TTS).\n2. **Disposar d'una veu en catal\u00e0** d'alta qualitat per a proves i integraci\u00f3, de manera que el sistema es pugui reproduir en altres punts de treball amb \u00e0udio.\n\nEl resultat final combina dues eines complement\u00e0ries:\n\n- **`speech-to-speech`** (servidor conversacional complet, port 8765)\n- **Piper TTS** amb la veu **Ona de la UPC** (port 10200)\n\n---\n\n## \ud83d\udd04 Els dos protocols\n\n### 1. Speech-to-Speech (Port 8765)\n\n- **Protocol**: \u2705 **HTTP\/WebSocket**\n- **URL**: `http:\/\/127.0.0.1:8765\/`\n- Aquest \u00e9s el servidor conversacional complet (STT + LLM + TTS)\n- Es pot consultar via HTTP normal\n- Endpoint WebSocket: `ws:\/\/127.0.0.1:8765\/v1\/realtime`\n\n---\n\n### 2. Piper TTS (Port 10200)\n\n- **Protocol**: \u2705 **Wyoming Protocol**\n- **Port**: `10200`\n- Aquest \u00e9s el Piper pur (nom\u00e9s TTS)\n- **NO** \u00e9s HTTP REST (per aix\u00f2 `curl http:\/\/127.0.0.1:10200\/` retorna \"Empty reply from server\")\n- Dissenyat per a **Home Assistant**\n\n---\n\n### \ud83d\udccb Resum clar:\n\n| Servei | Port | Protocol | Comanda de prova |\n|--------|------|----------|------------------|\n| **Speech-to-Speech** | 8765 | HTTP\/WebSocket | `curl http:\/\/127.0.0.1:8765\/` \u2705 |\n| **Piper TTS** | 10200 | **Wyoming** | `curl http:\/\/127.0.0.1:10200\/` \u274c (Empty reply) |\n\n---\n\n## \ud83d\udce6 Fase 1 \u2014 Preparaci\u00f3 de l'entorn\n\n**Sistema:** Deepin (basat en Debian)\n\n```bash\nsudo apt update\nsudo apt install python3 python3-pip python3-venv git docker.io -y<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Creaci\u00f3 de l&#8217;entorn virtual i instal\u00b7laci\u00f3 del paquet conversacional:<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">mkdir -p ~\/tts-server &amp;&amp; cd ~\/tts-server\npython3 -m venv venv\nsource venv\/bin\/activate\npip install --upgrade pip\npip install speech-to-speech<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\ude80 Fase 2 \u2014 Primera arrencada del servidor <code>speech-to-speech<\/code><\/h2>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">speech-to-speech<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Resultats de la primera execuci\u00f3:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u2705 Desc\u00e0rrega autom\u00e0tica de depend\u00e8ncies (NLTK, Silero VAD)<\/li>\n\n\n\n<li>\u2705 Desc\u00e0rrega del model de reconeixement de veu <strong>Parakeet TDT<\/strong> (nvidia\/parakeet-tdt-0.6b-v3, ~230 MB)<\/li>\n\n\n\n<li>\u2705 Model desat en mem\u00f2ria cau (<code>~\/.cache\/huggingface<\/code>)<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Observaci\u00f3 important:<\/strong> el servidor escolta en protocol <strong>WebSocket<\/strong> a <code>ws:\/\/127.0.0.1:8765\/v1\/realtime<\/code>, no \u00e9s un endpoint HTTP cl\u00e0ssic, per tant <code>curl<\/code> no \u00e9s el client adequat per provar-lo.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udc33 Fase 3 \u2014 Instal\u00b7laci\u00f3 de Docker a Deepin<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Per al desplegament lleuger del TTS, vam instal\u00b7lar Docker:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo systemctl enable --now docker\nsudo usermod -aG docker $USER\nnewgrp docker # activa el grup a la sessi\u00f3 actual<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Prova de verificaci\u00f3:<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker run hello-world<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u2705 Resposta: <em>\u00abHello from Docker!\u00bb<\/em> \u2192 instal\u00b7laci\u00f3 correcta.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udde3\ufe0f Fase 4 \u2014 Piper TTS amb veu catalana (Ona, UPC)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Creaci\u00f3 del contenidor amb la veu catalana:<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker run -d \\\n  --name piper \\\n  -p 10200:10200 \\\n  -e PIPER_VOICE=ca_ES-upc_ona-medium \\\n  --restart unless-stopped \\\n  linuxserver\/piper<\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>\ud83d\udca1 Pro Tip<\/strong>: La imatge <code>linuxserver\/piper<\/code> admet la variable d&#8217;entorn <code>PIPER_VOICE<\/code>. Si s&#8217;especifica (ex: <code>ca_ES-upc_ona-medium<\/code>), el contenidor <strong>descarrega i configura el model autom\u00e0ticament<\/strong> en arrencar, estalviant-nos haver de baixar el fitxer <code>.onnx<\/code> manualment.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Incident resolt:<\/strong> a la primera creaci\u00f3 sense <code>PIPER_VOICE<\/code>, el contenidor fallava amb l&#8217;error <code>--voice is required for the piper backend<\/code>. Calia especificar la veu mitjan\u00e7ant la variable d&#8217;entorn.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Logs d&#8217;\u00e8xit:<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">INFO:wyoming_piper.download:Downloaded \/config\/ca_ES-upc_ona-medium.onnx\nINFO:__main__:Ready\nConnection to localhost (127.0.0.1) 10200 port [tcp\/*] succeeded!<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u2705 Veu <strong>Ona<\/strong> (<code>ca_ES-upc_ona-medium<\/code>, desenvolupada a la UPC de Barcelona) descarregada i carregada.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udd0a Fase 5 \u2014 Prova de s\u00edntesi de veu<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Opci\u00f3 A: Guardar com a fitxer WAV<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>S\u00edntesi directa dins del contenidor:<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker exec piper bash -c \"echo 'Hola, soc l Ona, la meva veu s ha desenvolupat a la UPC de Barcelona.' | piper --model \/config\/ca_ES-upc_ona-medium.onnx --output_file \/config\/prova.wav\"<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Extracci\u00f3 i reproducci\u00f3:<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker cp piper:\/config\/prova.wav ~\/prova.wav\naplay ~\/prova.wav<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Opci\u00f3 B: Streaming directe als altaveus (recomanada)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Per fer que l&#8217;\u00e0udio soni directament pels altaveus en lloc de guardar-lo en un fitxer:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker exec piper bash -c \"echo 'Hola, soc l Ona, la meva veu s ha desenvolupat a la UPC de Barcelona.' | piper --model \/config\/ca_ES-upc_ona-medium.onnx --output-raw\" | aplay -f S16_LE -r 22050 -c 1<\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>\u26a0\ufe0f Important<\/strong>: Utilitza <strong><code>--output-raw<\/code><\/strong> (no <code>--output_file -<\/code>) quan facis pipe directe a <code>aplay<\/code>.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>--output-raw<\/code>: Genera \u00e0udio RAW sense cap\u00e7alera \u2192 compatible amb <code>aplay -f S16_LE -r 22050 -c 1<\/code><\/li>\n\n\n\n<li><code>--output_file -<\/code>: Genera WAV complet \u2192 nom\u00e9s per guardar a fitxer<\/li>\n<\/ul>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Explicaci\u00f3 dels par\u00e0metres d&#8217;aplay:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>-f S16_LE<\/code>: Format Signed 16-bit Little Endian<\/li>\n\n\n\n<li><code>-r 22050<\/code>: Sample rate 22050 Hz<\/li>\n\n\n\n<li><code>-c 1<\/code>: Mono (1 canal)<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udc0d Fase 6 \u2014 Integraci\u00f3 amb Python (Flask)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Per enviar text al Piper directament des d&#8217;un script de Python (com un servidor Flask), podem cridar la comanda de Docker mitjan\u00e7ant la llibreria <code>subprocess<\/code>:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import subprocess\n\ndef reproduir_text_en_catala(text):\n    \"\"\"\n    Reprodueix un text en catal\u00e0 utilitzant la veu Ona de la UPC\n    mitjan\u00e7ant el contenidor Docker Piper.\n    \"\"\"\n    # Escapar cometes simples per evitar errors de bash\n    text_net = text.replace(\"'\", \"\\\\'\")\n    \n    comanda = f\"\"\"\n    docker exec piper bash -c \"echo '{text_net}' | piper --model \/config\/ca_ES-upc_ona-medium.onnx --output-raw\" | aplay -f S16_LE -r 22050 -c 1\n    \"\"\"\n    \n    print(f\"\ud83d\udd0a Reproduint: {text}\")\n    subprocess.run(comanda, shell=True)\n\n# Prova\nreproduir_text_en_catala(\"Hola, aix\u00f2 \u00e9s una prova des de Python.\")<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Exemple complet amb Flask:<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from flask import Flask, request, render_template_string\nimport subprocess\n\napp = Flask(__name__)\n\ndef reproduir_text(text, desti='ona'):\n    \"\"\"Reprodueix el text segons el destinatari\"\"\"\n    if desti == 'ona':\n        text_net = text.replace(\"'\", \"\\\\'\")\n        comanda = f\"\"\"\n        docker exec piper bash -c \"echo '{text_net}' | piper --model \/config\/ca_ES-upc_ona-medium.onnx --output-raw\" | aplay -f S16_LE -r 22050 -c 1\n        \"\"\"\n        subprocess.run(comanda, shell=True)\n\n@app.route('\/')\ndef index():\n    return '''\n    &lt;!DOCTYPE html>\n    &lt;html>\n    &lt;head>&lt;title>Enviar text a l Ona&lt;\/title>&lt;\/head>\n    &lt;body>\n        &lt;h1>Enviar text al servidor TTS&lt;\/h1>\n        &lt;form action=\"\/processa\" method=\"POST\">\n            &lt;label>Text:&lt;\/label>&lt;br>\n            &lt;textarea name=\"text\" rows=\"4\" cols=\"50\">&lt;\/textarea>&lt;br>&lt;br>\n            &lt;input type=\"submit\" value=\"Enviar i reproduir\">\n        &lt;\/form>\n    &lt;\/body>\n    &lt;\/html>\n    '''\n\n@app.route('\/processa', methods=['POST'])\ndef processa():\n    missatge = request.form.get('text', '')\n    reproduir_text(missatge, 'ona')\n    \n    return f'''\n    &lt;!DOCTYPE html>\n    &lt;html>\n    &lt;head>&lt;title>Missatge rebut&lt;\/title>&lt;\/head>\n    &lt;body>\n        &lt;h1>Missatge rebut:&lt;\/h1>\n        &lt;p>&lt;strong>Text:&lt;\/strong> {missatge}&lt;\/p>\n        &lt;p>\ud83d\udd0a S ha reprodu\u00eft amb la veu Ona&lt;\/p>\n        &lt;a href=\"\/\">Tornar a enviar&lt;\/a>\n    &lt;\/body>\n    &lt;\/html>\n    '''\n\nif __name__ == '__main__':\n    app.run(debug=True, host='127.0.0.1', port=5000)<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udcca Resultats finals<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Servei<\/th><th>Port<\/th><th>Protocol<\/th><th>Estat<\/th><\/tr><\/thead><tbody><tr><td><strong>speech-to-speech<\/strong> (STT+LLM+TTS)<\/td><td>8765<\/td><td>WebSocket (<code>\/v1\/realtime<\/code>)<\/td><td>\u2705 Instal\u00b7lat (models en cau)<\/td><\/tr><tr><td><strong>Piper TTS<\/strong> (veu Ona, catal\u00e0)<\/td><td>10200<\/td><td>Wyoming<\/td><td>\u2705 Funcionant<\/td><\/tr><tr><td><strong>Docker<\/strong><\/td><td>\u2014<\/td><td>\u2014<\/td><td>\u2705 Operatiu<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Verificaci\u00f3 final<\/h2>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># Docker i el teu grup\ngroups | grep docker\n\n# El contenidor Piper en marxa\ndocker ps | grep piper\n\n# Provar connexi\u00f3 al port Wyoming\nnc -zv 127.0.0.1 10200<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Si surt <code>docker<\/code> a la primera comanda i el contenidor <code>piper<\/code> apareix com a <strong>Up<\/strong>, tot est\u00e0 correcte! \u2705<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udee0\ufe0f Soluci\u00f3 de problemes comuns<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Error: <code>aplay: read_header:2973: read error<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Causa<\/strong>: Est\u00e0s utilitzant <code>--output_file -<\/code> amb <code>aplay -f S16_LE...<\/code><br><strong>Soluci\u00f3<\/strong>: Canvia a <code>--output-raw<\/code><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Error: <code>Empty reply from server<\/code> amb curl<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Causa<\/strong>: El port 10200 utilitza protocol Wyoming, no HTTP<br><strong>Soluci\u00f3<\/strong>: Utilitza <code>docker exec<\/code> per accedir a Piper<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Error: <code>--voice is required for the piper backend<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Causa<\/strong>: No s&#8217;ha especificat la variable <code>PIPER_VOICE<\/code><br><strong>Soluci\u00f3<\/strong>: Afegeix <code>-e PIPER_VOICE=ca_ES-upc_ona-medium<\/code> al <code>docker run<\/code><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83c\udf93 Conclusions<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>La instal\u00b7laci\u00f3 d&#8217;un <strong>TTS en catal\u00e0<\/strong> \u00e9s viable amb eines de codi obert (Piper + veus de la UPC), sense necessitat de serveis externs.<\/li>\n\n\n\n<li>La combinaci\u00f3 <strong><code>speech-to-speech<\/code> + Piper<\/strong> cobreix tant el cas d&#8217;\u00fas conversacional complet (WebSocket 8765) com el de s\u00edntesi lleugera i fiable (Wyoming 10200).<\/li>\n\n\n\n<li>L&#8217;\u00fas de <strong>Docker<\/strong> garanteix la portabilitat i la reproductibilitat entre equips i fins i tot en NAS com el Synology.<\/li>\n\n\n\n<li>La veu <strong>Ona de la UPC<\/strong> ofereix una s\u00edntesi en catal\u00e0 de bona qualitat i \u00e9s la candidata principal per al desplegament final.<\/li>\n\n\n\n<li>La <strong>integraci\u00f3 amb Python\/Flask<\/strong> permet automatitzar la reproducci\u00f3 de textos des d&#8217;aplicacions web personalitzades.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udcda Recursos addicionals<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Piper TTS<\/strong>: <a href=\"https:\/\/github.com\/rhasspy\/piper\">https:\/\/github.com\/rhasspy\/piper<\/a><\/li>\n\n\n\n<li><strong>Veu Ona (UPC)<\/strong>: <a href=\"https:\/\/github.com\/upc-sgt\/piper-voices\">https:\/\/github.com\/upc-sgt\/piper-voices<\/a><\/li>\n\n\n\n<li><strong>LinuxServer Piper Docker<\/strong>: <a href=\"https:\/\/docs.linuxserver.io\/images\/docker-piper\">https:\/\/docs.linuxserver.io\/images\/docker-piper<\/a><\/li>\n\n\n\n<li><strong>Wyoming Protocol<\/strong>: <a href=\"https:\/\/github.com\/rhasspy\/wyoming\">https:\/\/github.com\/rhasspy\/wyoming<\/a><\/li>\n\n\n\n<li><strong>Speech-to-Speech<\/strong>: <a href=\"https:\/\/pypi.org\/project\/speech-to-speech\/\">https:\/\/pypi.org\/project\/speech-to-speech\/<\/a><\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Autor<\/strong>: Miquel<br><strong>Data<\/strong>: Setembre 2026<br><strong>Sistema<\/strong>: Deepin (Debian-based)<br><strong>Tags<\/strong>: TTS, Catal\u00e0, Docker, Piper, Voice Synthesis, Local AI<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\n---\n\nAquest \u00e9s el text **complet, corregit i millorat** amb:\n\n\u2705 Correcci\u00f3 de `--output_file -` a `--output-raw`  \n\u2705 Pro Tip sobre `PIPER_VOICE`  \n\u2705 Explicaci\u00f3 detallada dels errors comuns  \n\u2705 Fase 6 amb integraci\u00f3 Python\/Flask completa  \n\u2705 Taula de soluci\u00f3 de problemes  \n\u2705 Recursos addicionals  \n\u2705 Format Markdown net i professional  \n\nLlest per publicar! \ud83d\ude80<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Perfecte! Aqu\u00ed tens el text complet i millorat del teu blog, llest per copiar i enganxar: Creaci\u00f3 de l&#8217;entorn virtual i instal\u00b7laci\u00f3 del paquet conversacional: \ud83d\ude80 Fase 2 \u2014 Primera arrencada del servidor speech-to-speech Resultats de la primera execuci\u00f3: Observaci\u00f3 &hellip; <a href=\"http:\/\/www.beseit.net\/?page_id=19184\">Continua llegint <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"categories":[],"class_list":["post-19184","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"http:\/\/www.beseit.net\/index.php?rest_route=\/wp\/v2\/pages\/19184","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.beseit.net\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"http:\/\/www.beseit.net\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"http:\/\/www.beseit.net\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/www.beseit.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=19184"}],"version-history":[{"count":2,"href":"http:\/\/www.beseit.net\/index.php?rest_route=\/wp\/v2\/pages\/19184\/revisions"}],"predecessor-version":[{"id":19186,"href":"http:\/\/www.beseit.net\/index.php?rest_route=\/wp\/v2\/pages\/19184\/revisions\/19186"}],"wp:attachment":[{"href":"http:\/\/www.beseit.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=19184"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.beseit.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=19184"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}