{"id":18971,"date":"2026-09-10T11:32:07","date_gmt":"2026-09-10T09:32:07","guid":{"rendered":"https:\/\/www.beseit.net\/?p=18971"},"modified":"2026-09-10T18:24:36","modified_gmt":"2026-09-10T16:24:36","slug":"veu-ona-al-servidor-local-de-deepin","status":"publish","type":"post","link":"https:\/\/www.beseit.net\/?p=18971","title":{"rendered":"Veu Ona al servidor local de deepin"},"content":{"rendered":"\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=\"\">curl -G --data-urlencode \"text=Hola, aix\u00f2 \u00e9s una prova. Soc Ona aquesta veu s'ha desenvolupat  a la UPC de Barcelona\" http:\/\/127.0.0.1:8765\/<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">Pugin Ona server<\/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=\"\"><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">aquesta genera un .wav al directori \/temp<\/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=\"\">curl -sS -X POST \\\n  -H 'Content-Type: application\/json' \\\n  -d \"{\\\"text\\\":\\\"Hola, aix\u00f2 \u00e9s una prova. Soc Ona, aquesta veu s'ha desenvolupat a la UPC de Barcelona.\\\"}\" \\\n  http:\/\/127.0.0.1:8765\/synthesize \\\n  -o \/tmp\/ona.wav\n<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">Si volem que no generi .wav<\/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=\"\">curl -sS -X POST \\\n  -H 'Content-Type: application\/json' \\\n  -d \"{\\\"text\\\":\\\"Hola, aix\u00f2 \u00e9s una prova. Soc Ona, aquesta veu s'ha desenvolupat a la UPC de Barcelona.\\\"}\" \\\n  http:\/\/127.0.0.1:8765\/synthesize \\\n  | aplay\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Reproduir amb<\/strong> <code>ffplay<\/code> <strong>(si vols m\u00e9s qualitat o control)<\/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=\"\">curl -sS -X POST \\\n  -H 'Content-Type: application\/json' \\\n  -d \"{\\\"text\\\":\\\"Hola, aix\u00f2 \u00e9s una prova. Soc Ona, aquesta veu s'ha desenvolupat a la UPC de Barcelona.\\\"}\" \\\n  http:\/\/127.0.0.1:8765\/synthesize \\\n  | ffplay -autoexit -\n<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">Perfecte! El port <strong>8765<\/strong> coincideix amb el projecte <strong>speech-to-speech<\/strong>, que aixeca un servidor local compatible amb OpenAI Realtime i inclou TTS (Qwen3-TTS) + STT (Parakeet TDT) + LLM. T&#8217;ajudo a instal\u00b7lar-lo a Deepin.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udd27 Requisits previs<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Deepin \u00e9s Debian-based, aix\u00ed que primer assegura&#8217;t de tenir Python i pip:<\/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 apt update\nsudo apt install python3 python3-pip python3-venv git -y<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udce6 Instal\u00b7laci\u00f3 del servidor TTS<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Crea un entorn virtual i instal\u00b7la el paquet:<\/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<h2 class=\"wp-block-heading\">\ud83d\ude80 Posada en marxa<\/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=\"\">export OPENAI_API_KEY=...   # opcional, nom\u00e9s si far\u00e0s servir un LLM en l\u00ednia\nspeech-to-speech<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Aix\u00f2 aixecar\u00e0 el servidor a <strong><code>ws:\/\/127.0.0.1:8765\/v1\/realtime<\/code><\/strong> amb la configuraci\u00f3 per defecte:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ud83c\udf99\ufe0f <strong>STT local<\/strong>: Parakeet TDT<\/li>\n\n\n\n<li>\ud83e\udde0 <strong>LLM<\/strong>: compatible amb OpenAI (pots connectar-hi Ollama, LM Studio, etc.)<\/li>\n\n\n\n<li>\ud83d\udd0a <strong>TTS local<\/strong>: Qwen3-TTS<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udcbb Prova de conversa<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">En un altre terminal, executa:<\/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=\"\">cd ~\/tts-server\nsource venv\/bin\/activate\npython scripts\/listen_and_play_realtime.py --host 127.0.0.1 --port 8765<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83e\udde0 Opci\u00f3: LLM 100% local (sense claus API)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Si vols que tot sigui local, pots usar <code>llama.cpp<\/code> amb Gemma:<\/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=\"\">pip install llama-cpp-python\nllama-server -hf ggml-org\/gemma-4-... <\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udca1 Alternatives si nom\u00e9s vols TTS pur (sense STT\/LLM)<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Opci\u00f3<\/th><th>Port<\/th><th>Descripci\u00f3<\/th><\/tr><\/thead><tbody><tr><td><strong>Dia-TTS-Server<\/strong><\/td><td>5000<\/td><td><code>git clone https:\/\/github.com\/devnen\/Dia-TTS-Server.git &amp;&amp; pip install -r requirements.txt &amp;&amp; python main.py<\/code><\/td><\/tr><tr><td><strong>Piper (Docker)<\/strong><\/td><td>10200<\/td><td><code>docker run -d --name piper -p 10200:10200 linuxserver\/piper<\/code> \u2014 molt lleuger, ideal per a NAS\/rPi<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">Cap problema! Fem la comprovaci\u00f3 pas a pas:<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1\ufe0f\u20e3 Primer, comprova si el servidor segueix en marxa<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">En un terminal nou, prova directament:<\/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=\"\">curl -v http:\/\/127.0.0.1:8765\/v1\/realtime 2>&amp;1 | head -20<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Si surt alguna resposta<\/strong> (fins i tot un error <code>400<\/code> o <code>426 Upgrade Required<\/code>) \u2192 el servidor <strong>est\u00e0 funcionant<\/strong> i nom\u00e9s cal un client per connectar-s&#8217;hi. \ud83c\udf89<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Si surt <code>Could not connect<\/code><\/strong> \u2192 el servidor es va aturar (potser es va tancar el terminal o es va tallar la desc\u00e0rrega).<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">2\ufe0f\u20e3 Si el servidor es va aturar, torna a engegar-lo<\/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=\"\">cd ~\/tts-server\nsource venv\/bin\/activate\nspeech-to-speech<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ud83d\udca1 <strong>Bona not\u00edcia:<\/strong> els models que ja es van descarregar queden a la mem\u00f2ria cau (<code>~\/.cache\/huggingface<\/code>), aix\u00ed que aquesta vegada <strong>ser\u00e0 molt m\u00e9s r\u00e0pid<\/strong> \u2014 no tornar\u00e0 a baixar res, nom\u00e9s carregar\u00e0.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">3\ufe0f\u20e3 Alternativa: comprova si el port est\u00e0 escoltant<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Mentre el servidor estigui en marxa, en un altre terminal:<\/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=\"\">ss -tlnp | grep 8765<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Si surt una l\u00ednia amb <code>0.0.0.0:8765<\/code> o <code>127.0.0.1:8765<\/code>, el servidor est\u00e0 escoltant correctament. \u2705<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">Fes el pas 1 i digue&#8217;m qu\u00e8 surt \u2014 si \u00e9s <code>Could not connect<\/code>, passa al pas 2 i enganxa&#8217;m el que mostri el servidor en arrencar! \ud83d\ude0a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Confirmat: <strong>el servidor est\u00e0 aturat<\/strong> (el port 8765 no est\u00e0 escoltant). El que va passar \u00e9s que probablement es va tancar el terminal on s&#8217;executava o es va interrompre.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udd04 Torna a engegar-lo (ara ser\u00e0 r\u00e0pid)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Com que els models ja estan a la mem\u00f2ria cau, no tornar\u00e0 a baixar res:<\/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=\"\">cd ~\/tts-server\nsource venv\/bin\/activate\nspeech-to-speech<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Deixa aquest terminal obert<\/strong> i espera a veure el missatge que el servidor est\u00e0 escoltant.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udca1 Consell: engega&#8217;l en segon pla (aix\u00ed no depens del terminal)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Si no vols tenir un terminal ocupat sempre, pots executar-lo en segon pla:<\/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=\"\">cd ~\/tts-server\nsource venv\/bin\/activate\nnohup speech-to-speech > server.log 2>&amp;1 &amp;<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Despr\u00e9s pots comprovar que funciona amb:<\/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=\"\">ss -tlnp | grep 8765<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">I veure els logs amb:<\/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=\"\">tail -f ~\/tts-server\/server.log<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udd0d Si torna a no engegar, comprova els logs<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Si despr\u00e9s d&#8217;executar <code>speech-to-speech<\/code> no veus el missatge d&#8217;\u00e8xit, enganxa&#8217;m <strong>les \u00faltimes l\u00ednies que surtin<\/strong> (o el contingut de <code>server.log<\/code> si fas servir el m\u00e8tode del segon pla) i ho diagnostiquem. Pot ser que estigui intentant baixar el model TTS (que \u00e9s gran, ~2-3 GB) i es tall\u00e9s.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Qu\u00e8 diu quan l&#8217;executes? \ud83d\ude0a<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Pugin Ona server aquesta genera un .wav al directori \/temp Si volem que no generi .wav Reproduir amb ffplay (si vols m\u00e9s qualitat o control) Perfecte! El port 8765 coincideix amb el projecte speech-to-speech, que aixeca un servidor local compatible &hellip; <a href=\"https:\/\/www.beseit.net\/?p=18971\">Continua llegint <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":3167,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[207,1],"tags":[],"class_list":["post-18971","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deepin-linux","category-bloc-de-notes"],"_links":{"self":[{"href":"https:\/\/www.beseit.net\/index.php?rest_route=\/wp\/v2\/posts\/18971","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.beseit.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.beseit.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.beseit.net\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.beseit.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=18971"}],"version-history":[{"count":11,"href":"https:\/\/www.beseit.net\/index.php?rest_route=\/wp\/v2\/posts\/18971\/revisions"}],"predecessor-version":[{"id":18985,"href":"https:\/\/www.beseit.net\/index.php?rest_route=\/wp\/v2\/posts\/18971\/revisions\/18985"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.beseit.net\/index.php?rest_route=\/wp\/v2\/media\/3167"}],"wp:attachment":[{"href":"https:\/\/www.beseit.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=18971"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.beseit.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=18971"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.beseit.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=18971"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}