{"id":16848,"date":"2025-10-17T17:54:35","date_gmt":"2025-10-17T15:54:35","guid":{"rendered":"https:\/\/www.beseit.net\/?p=16848"},"modified":"2025-12-15T13:24:27","modified_gmt":"2025-12-15T11:24:27","slug":"nova-funcio-polidic","status":"publish","type":"post","link":"https:\/\/www.beseit.net\/?p=16848","title":{"rendered":"Nova funci\u00f3 Polidic"},"content":{"rendered":"\n<p>Polidic, voldria afegir una funci\u00f3 nova a polidic: afegir un bot\u00f3 nou a continuaci\u00f3 de l&#8217;entrada &#8216;cercar&#8217; i el bot\u00f3 cercar\/confirmar, aquest bot\u00f3 conte un altaveu com icona, de forma que al pem\u00e8r-lo converteix el text de l&#8217;entrada en \u00e0udio (veu anglesa). \u00c9s complicat?<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"851\" height=\"212\" src=\"https:\/\/www.beseit.net\/wp-content\/uploads\/2025\/10\/image.png\" alt=\"\" class=\"wp-image-16850\" srcset=\"https:\/\/www.beseit.net\/wp-content\/uploads\/2025\/10\/image.png 851w, https:\/\/www.beseit.net\/wp-content\/uploads\/2025\/10\/image-300x75.png 300w, https:\/\/www.beseit.net\/wp-content\/uploads\/2025\/10\/image-768x191.png 768w, https:\/\/www.beseit.net\/wp-content\/uploads\/2025\/10\/image-500x125.png 500w\" sizes=\"auto, (max-width: 851px) 100vw, 851px\" \/><\/figure>\n\n\n\n<p>No, no \u00e9s gaire complicat! Afegir un bot\u00f3 amb un icona d\u2019altaveu que llegeixi en veu alta (text-to-speech, TTS) el contingut de l\u2019entrada de cerca en angl\u00e8s \u00e9s una funcionalitat bastant est\u00e0ndard en navegadors moderns, gr\u00e0cies a l\u2019API <strong>Web Speech API<\/strong>, concretament la part de <strong>SpeechSynthesis<\/strong>.<\/p>\n\n\n\n<p>Aqu\u00ed tens una guia senzilla per implementar-ho a Polidic:<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\u2705 Passos per afegir el bot\u00f3 de lectura en veu alta<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">1. <strong>Afegir el bot\u00f3 al HTML<\/strong><\/h4>\n\n\n\n<p>Suposant que tens una entrada de text amb id <code>searchInput<\/code> i un bot\u00f3 de cerca, afegeix un bot\u00f3 nou al costat:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;input type=\"text\" id=\"searchInput\" placeholder=\"Cerca...\"&gt;\n&lt;button id=\"searchButton\"&gt;Cercar&lt;\/button&gt;\n&lt;button id=\"speakButton\" title=\"Llegir en veu alta\"&gt;\n  &lt;span&gt;?&lt;\/span&gt; &lt;!-- o usa un \u00edcona SVG o Font Awesome --&gt;\n&lt;\/button&gt;<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>? Si vols un \u00edcona m\u00e9s professional, pots fer servir una llibreria com Font Awesome (<code>&lt;i class=\"fas fa-volume-up\"&gt;&lt;\/i&gt;<\/code>) o un SVG.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">2. <strong>Afegir el JavaScript per fer la lectura<\/strong><\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>document.getElementById('speakButton').addEventListener('click', () =&gt; {\n  const text = document.getElementById('searchInput').value.trim();\n  if (!text) return; \/\/ No diu res si est\u00e0 buit\n\n  \/\/ Cancel\u00b7la qualsevol parla anterior\n  speechSynthesis.cancel();\n\n  const utterance = new SpeechSynthesisUtterance(text);\n  utterance.lang = 'en-US'; \/\/ Veu en angl\u00e8s (USA)\n  utterance.rate = 1;       \/\/ Velocitat normal\n  utterance.pitch = 1;      \/\/ To normal\n\n  \/\/ Opcional: escull una veu espec\u00edfica en angl\u00e8s si vols\n  \/\/ speechSynthesis.getVoices() es carrega as\u00edncronament, aix\u00ed que cal esperar\n  utterance.addEventListener('start', () =&gt; {\n    \/\/ Opcional: canviar l\u2019estat del bot\u00f3 (ex: desactivar temporalment)\n  });\n\n  speechSynthesis.speak(utterance);\n});<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u26a0\ufe0f <strong>Nota important<\/strong>: <code>speechSynthesis.getVoices()<\/code> pot trigar a carregar. Si vols triar una veu concreta (per exemple, &#8220;Google US English&#8221;), cal esperar almenys un esdeveniment <code>voiceschanged<\/code>:<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>let voicesLoaded = false;\nspeechSynthesis.addEventListener('voiceschanged', () =&gt; {\n  voicesLoaded = true;\n});\n\n\/\/ I dins del bot\u00f3:\nif (voicesLoaded) {\n  const voices = speechSynthesis.getVoices();\n  const englishVoice = voices.find(voice =&gt; voice.lang === 'en-US');\n  if (englishVoice) utterance.voice = englishVoice;\n}<\/code><\/pre>\n\n\n\n<p>Per\u00f2 <strong>no \u00e9s obligatori<\/strong>: si nom\u00e9s poses <code>utterance.lang = 'en-US'<\/code>, el navegador triar\u00e0 autom\u00e0ticament una veu en angl\u00e8s disponible.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">3. <strong>Estils (opcional)<\/strong><\/h4>\n\n\n\n<p>Per fer que el bot\u00f3 quedi b\u00e9:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#speakButton {\n  background: none;\n  border: none;\n  font-size: 1.2em;\n  cursor: pointer;\n  padding: 0 8px;\n  color: #333;\n}\n#speakButton:hover {\n  color: #007bff;\n}<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\u2705 Comprovacions finals<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Funciona en <strong>Chrome, Edge, Firefox<\/strong> (Safari tamb\u00e9, per\u00f2 amb menys veus).<\/li>\n\n\n\n<li>No requereix connexi\u00f3 externa: \u00e9s nativa del navegador.<\/li>\n\n\n\n<li>Respecta la privacitat: el text <strong>no surt del navegador<\/strong>.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">? Prova r\u00e0pida<\/h3>\n\n\n\n<p>Obre la consola del navegador i prova aix\u00f2:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>const u = new SpeechSynthesisUtterance(\"Hello, this is a test.\");\nu.lang = \"en-US\";\nspeechSynthesis.speak(u);<\/code><\/pre>\n\n\n\n<p>Si ho llegeix en angl\u00e8s, ja tens el suport actiu!<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>Vols que t\u2019ajudi a integrar-ho directament al codi actual de Polidic? Si em passes un tros del HTML\/JS on est\u00e0 la barra de cerca, et puc donar el codi exacte per enganxar.<\/p>\n\n\n\n<p>Fet:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"816\" height=\"288\" src=\"https:\/\/www.beseit.net\/wp-content\/uploads\/2025\/10\/image-5.png\" alt=\"\" class=\"wp-image-17216\" srcset=\"https:\/\/www.beseit.net\/wp-content\/uploads\/2025\/10\/image-5.png 816w, https:\/\/www.beseit.net\/wp-content\/uploads\/2025\/10\/image-5-300x106.png 300w, https:\/\/www.beseit.net\/wp-content\/uploads\/2025\/10\/image-5-768x271.png 768w, https:\/\/www.beseit.net\/wp-content\/uploads\/2025\/10\/image-5-500x176.png 500w\" sizes=\"auto, (max-width: 816px) 100vw, 816px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><mark style=\"background-color:rgba(0, 0, 0, 0);color:#f10202\" class=\"has-inline-color\">Llistat de punts a solucionar o millorar (15-12-2025)<\/mark> <\/h2>\n\n\n\n<p>stud\/Index:<\/p>\n\n\n\n<p>1 Agenda visual. Algunes preguntes es mostren sense imatge treballant amb Agenda visual<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"238\" height=\"296\" src=\"https:\/\/www.beseit.net\/wp-content\/uploads\/2025\/10\/image-6.png\" alt=\"\" class=\"wp-image-17221\"\/><\/figure>\n\n\n\n<p>2 Implementar Preguntes a respostes (Preg &lt;&gt; Resp)<\/p>\n\n\n\n<p>En una primera fase l&#8217;enllas Preg &lt;&gt; Resp est\u00e0 en color verd que \u00e9s la posici\u00f3 per defecte. Pregunta el camp2 (&#8216;castell\u00e0) i s&#8217;ha de respondre el camp1 (&#8216;catal\u00e0). Si es prem ha de canviar a color vermell, on inverteix el mode a camp1-&gt; camp2<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"171\" height=\"408\" src=\"https:\/\/www.beseit.net\/wp-content\/uploads\/2025\/10\/image-7.png\" alt=\"\" class=\"wp-image-17223\" srcset=\"https:\/\/www.beseit.net\/wp-content\/uploads\/2025\/10\/image-7.png 171w, https:\/\/www.beseit.net\/wp-content\/uploads\/2025\/10\/image-7-126x300.png 126w\" sizes=\"auto, (max-width: 171px) 100vw, 171px\" \/><\/figure>\n\n\n\n<p>3 Si estem a Stud  (estad &#8216;jugant&#8217;) men\u00fas d&#8217;idiomes, diccionaris, cerques -> bloquejats (no es despleguen)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Polidic, voldria afegir una funci\u00f3 nova a polidic: afegir un bot\u00f3 nou a continuaci\u00f3 de l&#8217;entrada &#8216;cercar&#8217; i el bot\u00f3 cercar\/confirmar, aquest bot\u00f3 conte un altaveu com icona, de forma que al pem\u00e8r-lo converteix el text de l&#8217;entrada en \u00e0udio &hellip; <a href=\"https:\/\/www.beseit.net\/?p=16848\">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":[193,1],"tags":[],"class_list":["post-16848","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-polidic","category-bloc-de-notes"],"_links":{"self":[{"href":"https:\/\/www.beseit.net\/index.php?rest_route=\/wp\/v2\/posts\/16848","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=16848"}],"version-history":[{"count":8,"href":"https:\/\/www.beseit.net\/index.php?rest_route=\/wp\/v2\/posts\/16848\/revisions"}],"predecessor-version":[{"id":17227,"href":"https:\/\/www.beseit.net\/index.php?rest_route=\/wp\/v2\/posts\/16848\/revisions\/17227"}],"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=16848"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.beseit.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=16848"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.beseit.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=16848"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}