{"id":19059,"date":"2026-09-13T15:35:55","date_gmt":"2026-09-13T13:35:55","guid":{"rendered":"https:\/\/www.beseit.net\/?p=19059"},"modified":"2026-09-13T15:35:55","modified_gmt":"2026-09-13T13:35:55","slug":"integracio-a-speech-dispatcher-amb-el-contenidor-docker-del-piper","status":"publish","type":"post","link":"https:\/\/www.beseit.net\/?p=19059","title":{"rendered":"Integracio a Speech Dispatcher amb el contenidor Docker del Piper."},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">S\u00ed, \u00e9s possible! I de fet, <strong>recordo que ja ho vam treballar abans<\/strong>. Deixa&#8217;m recuperar els detalls d&#8217;aquella configuraci\u00f3 per donar-te la resposta exacta.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">S\u00ed, <strong>\u00e9s possible!<\/strong> I de fet, <strong>ja ho vam integrar abans<\/strong> \u2014 tens un script pont <code>piper-spd<\/code> que connecta Speech Dispatcher amb el contenidor Docker del Piper. \ud83c\udf99\ufe0f<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Com funciona la integraci\u00f3<\/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=\"\">Aplicaci\u00f3 (spd-say, ORCA, etc.)\n        \u2502\n        \u25bc\nSpeech Dispatcher (sd_generic \"piper\")\n        \u2502\n        \u25bc\n\/usr\/lib\/speech-dispatcher-modules\/piper-spd   \u2190 script pont\n        \u2502\n        \u25bc\ndocker exec piper \u2192 piper --model ca_ES-upc_ona-medium.onnx\n        \u2502\n        \u25bc\n\u00c0udio (WAV\/PCM) per stdout \u2192 altaveus<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Fitxers implicats (de la configuraci\u00f3 anterior):<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>\/usr\/lib\/speech-dispatcher-modules\/piper-spd<\/code> (script pont, executable)<\/li>\n\n\n\n<li><code>\/etc\/speech-dispatcher\/modules\/piper.conf<\/code> (config del m\u00f2dul)<\/li>\n\n\n\n<li><code>\/etc\/speech-dispatcher\/speechd.conf<\/code> \u2192 l\u00ednia <code>AddModule \"piper\" \"sd_generic\" \"piper-spd\"<\/code><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\u26a0\ufe0f El punt clau que vam detectar<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">El m\u00f2dul <code>sd_generic<\/code> espera l&#8217;\u00e0udio <strong>per stdout<\/strong>, per\u00f2 el primer script el desava en un fitxer (<code>-o<\/code>). <strong>Cal que l&#8217;script emeti el WAV per stdout<\/strong> perqu\u00e8 funcioni. La soluci\u00f3 \u00e9s usar <code>--output_file -<\/code> (i opcionalment <code>--output_raw<\/code> per PCM pur).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Com ho comprovem ara?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Primer mira si la configuraci\u00f3 anterior encara hi \u00e9s:<\/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=\"\">ls -l \/usr\/lib\/speech-dispatcher-modules\/piper-spd\ncat \/etc\/speech-dispatcher\/modules\/piper.conf 2>\/dev\/null\ngrep -n \"piper\" \/etc\/speech-dispatcher\/speechd.conf<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">I prova directa (amb el contenidor en marxa):<\/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=\"\">spd-say -o piper -y ca_ES-upc_ona-medium \"Hola, soc l'Ona\"<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Si no sona o et dona error, et passo l&#8217;<strong>script corregit<\/strong> que envia l&#8217;\u00e0udio per stdout i queda tot llest. Vols que te&#8217;l prepari? \ud83d\ude0a<\/p>\n","protected":false},"excerpt":{"rendered":"<p>S\u00ed, \u00e9s possible! I de fet, recordo que ja ho vam treballar abans. Deixa&#8217;m recuperar els detalls d&#8217;aquella configuraci\u00f3 per donar-te la resposta exacta. S\u00ed, \u00e9s possible! I de fet, ja ho vam integrar abans \u2014 tens un script pont &hellip; <a href=\"https:\/\/www.beseit.net\/?p=19059\">Continua llegint <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-19059","post","type-post","status-publish","format-standard","hentry","category-bloc-de-notes"],"_links":{"self":[{"href":"https:\/\/www.beseit.net\/index.php?rest_route=\/wp\/v2\/posts\/19059","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=19059"}],"version-history":[{"count":1,"href":"https:\/\/www.beseit.net\/index.php?rest_route=\/wp\/v2\/posts\/19059\/revisions"}],"predecessor-version":[{"id":19060,"href":"https:\/\/www.beseit.net\/index.php?rest_route=\/wp\/v2\/posts\/19059\/revisions\/19060"}],"wp:attachment":[{"href":"https:\/\/www.beseit.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=19059"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.beseit.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=19059"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.beseit.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=19059"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}