iobroker.assistant 1.3.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/README.md +12 -0
  2. package/admin/custom/.vite/manifest.json +62 -62
  3. package/admin/custom/assets/{Components-x2Dfv8qE.js → Components-D15eOzOp.js} +2 -2
  4. package/admin/custom/assets/{_virtual_mf-localSharedImportMap___mfe_internal__ConfigCustomAssistant__mf_owner__1-B4YbqhBb.js → _virtual_mf-localSharedImportMap___mfe_internal__ConfigCustomAssistant__mf_owner__1-C8qbMwoi.js} +1 -1
  5. package/admin/custom/assets/{_virtual_mf___mfe_internal__ConfigCustomAssistant__mf_owner__163539842885036__loadShare___mf_0_emotion_mf_1_styled__loadShare__.js-IaosaymG.js → _virtual_mf___mfe_internal__ConfigCustomAssistant__mf_owner__212234797318001__loadShare___mf_0_emotion_mf_1_styled__loadShare__.js-BWAFmFMj.js} +1 -1
  6. package/admin/custom/assets/{_virtual_mf___mfe_internal__ConfigCustomAssistant__mf_owner__163539842885036__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-o4EU_Ut5.js → _virtual_mf___mfe_internal__ConfigCustomAssistant__mf_owner__212234797318001__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-Bh5IbNwb.js} +1 -1
  7. package/admin/custom/assets/{_virtual_mf___mfe_internal__ConfigCustomAssistant__mf_owner__163539842885036__loadShare__shared--be2hWbV.js → _virtual_mf___mfe_internal__ConfigCustomAssistant__mf_owner__212234797318001__loadShare__shared-D8mhEL60.js} +1 -1
  8. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomAssistant__mf_owner__212234797318001__prebuild___mf_0_iobroker_mf_1_json_mf_2_config__prebuild__-T80cpMmm.js +122 -0
  9. package/admin/custom/assets/{_virtual_mf___mfe_internal__ConfigCustomAssistant__mf_owner__163539842885036__prebuild__react_mf_1_jsx_mf_2_runtime__prebuild__-M61rjtmp.js → _virtual_mf___mfe_internal__ConfigCustomAssistant__mf_owner__212234797318001__prebuild__react_mf_1_jsx_mf_2_runtime__prebuild__--SURtz9t.js} +1 -1
  10. package/admin/custom/assets/hostInit-DpzPHTOk.js +1 -0
  11. package/admin/custom/assets/{lib-DBbNtolG.js → lib-70DV4zKj.js} +1 -1
  12. package/admin/custom/assets/{mf-entry-bootstrap-0-7abd30d3.js → mf-entry-bootstrap-0-0119ee25.js} +2 -2
  13. package/admin/custom/assets/{pendingShares-U0D1MYK4.js → pendingShares-CKvyybtG.js} +1 -1
  14. package/admin/custom/customComponents.js +2 -2
  15. package/admin/custom/index.html +2 -2
  16. package/admin/custom/mf-manifest.json +1 -1
  17. package/admin/custom/mf-stats.json +1 -1
  18. package/admin/i18n/de.json +6 -1
  19. package/admin/i18n/en.json +6 -1
  20. package/admin/i18n/es.json +6 -1
  21. package/admin/i18n/fr.json +6 -1
  22. package/admin/i18n/it.json +6 -1
  23. package/admin/i18n/nl.json +6 -1
  24. package/admin/i18n/pl.json +6 -1
  25. package/admin/i18n/pt.json +6 -1
  26. package/admin/i18n/ru.json +6 -1
  27. package/admin/i18n/uk.json +6 -1
  28. package/admin/i18n/zh-cn.json +6 -1
  29. package/admin/jsonConfig.json +38 -4
  30. package/build/lib/nlu.js +14 -0
  31. package/build/lib/nlu.js.map +1 -1
  32. package/build/lib/piAgent.js +5 -0
  33. package/build/lib/piAgent.js.map +1 -1
  34. package/build/lib/voice/captures.js +87 -0
  35. package/build/lib/voice/captures.js.map +1 -0
  36. package/build/lib/voice/engines.js +1 -1
  37. package/build/lib/voice/engines.js.map +1 -1
  38. package/build/lib/voice/esphome.js +81 -5
  39. package/build/lib/voice/esphome.js.map +1 -1
  40. package/build/lib/voice/ttsCache.js +49 -1
  41. package/build/lib/voice/ttsCache.js.map +1 -1
  42. package/build/lib/voice/vad.js +14 -1
  43. package/build/lib/voice/vad.js.map +1 -1
  44. package/build/main.js +173 -63
  45. package/build/main.js.map +1 -1
  46. package/io-package.json +29 -27
  47. package/package.json +5 -5
  48. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomAssistant__mf_owner__163539842885036__prebuild___mf_0_iobroker_mf_1_json_mf_2_config__prebuild__-BsTz_EWE.js +0 -122
  49. package/admin/custom/assets/hostInit-Blh7a-Qe.js +0 -1
  50. /package/admin/custom/assets/{_virtual_mf___mfe_internal__ConfigCustomAssistant__mf_owner__163539842885036__loadShare___mf_0_emotion_mf_1_react__loadShare__.js-BkH7fzDw.js → _virtual_mf___mfe_internal__ConfigCustomAssistant__mf_owner__212234797318001__loadShare___mf_0_emotion_mf_1_react__loadShare__.js-BkH7fzDw.js} +0 -0
@@ -63,6 +63,8 @@
63
63
  "Enable voice server (satellites)": "Abilita il server vocale (satelliti)",
64
64
  "Enables speech recognition/synthesis. ioBroker-native satellites reach it over the message bus — no port needed. Turn on the UDP server below only for ESP / Hannah satellites.": "Abilita il riconoscimento/sintesi vocale. I satelliti nativi di ioBroker lo raggiungono tramite il bus di messaggi, senza bisogno di porte. Attivare il server UDP qui sotto solo per i satelliti ESP/Hannah.",
65
65
  "End of speech after (ms of silence)": "Fine del parlato dopo (ms di silenzio)",
66
+ "Keep dropped recordings for diagnosis": "Conserva le registrazioni scartate per la diagnosi",
67
+ "Recordings that were dropped as silence or that speech recognition returned empty are stored as WAV plus a JSON with the levels, under Files → assistant.N/captures (the newest 50). They contain audio from the room: only enable this for troubleshooting.": "Le registrazioni scartate come silenzio o che il riconoscimento vocale ha restituito vuote vengono salvate come WAV più un JSON con i livelli, in File → assistant.N/captures (le 50 più recenti). Contengono audio della stanza: attivalo solo per la risoluzione dei problemi.",
66
68
  "Extra actions (JSON)": "Azioni aggiuntive (JSON)",
67
69
  "Give a set of satellites a name, so an announcement, a question or a trigger can address it: a group of rooms (\"Upstairs\") or the speakers that belong to one person (\"Denis\", so \"tell Denis dinner is ready\" reaches them). Members: satellite ids, room names or device names, separated by commas. Kind: empty or group, or person. A real satellite or room of the same name always wins, so a group can never make a speaker unreachable.": "Dai un nome a un insieme di satelliti, così un annuncio, una domanda o un trigger può rivolgersi a esso: un gruppo di stanze (\"Piano di sopra\") o gli altoparlanti di una persona (\"Denis\", così \"di' a Denis che la cena è pronta\" arriva a loro). Membri: id dei satelliti, nomi delle stanze o dei dispositivi, separati da virgole. Tipo: vuoto o group, oppure person. Un satellite o una stanza reale con lo stesso nome ha sempre la precedenza, quindi un gruppo non può mai rendere irraggiungibile un altoparlante.",
68
70
  "Google Gemini": "Google Gemini",
@@ -98,7 +100,7 @@
98
100
  "No sound": "Nessun suono",
99
101
  "None": "Nessuno",
100
102
  "Object read access": "accesso in lettura all'oggetto",
101
- "One row per device. Port empty = 6053. The room is what the assistant treats the satellite as being in. Leave the password empty unless the device really has an API password set — table values are stored unencrypted.": "Una riga per dispositivo. Porta vuota = 6053. La stanza è quella in cui l’assistente colloca il satellite. Lascia vuota la password a meno che il dispositivo non abbia davvero una password API — i valori di tabella sono salvati in chiaro.",
103
+ "One row per device. Port empty = 6053. The room is what the assistant treats the satellite as being in. Speech threshold: the lowest microphone level (RMS) that counts as speech, empty = 250 — lower it (e.g. to 100) if the device reacts to the wake word but does not hear the command; the debug log shows the levels (\"peak RMS\", \"speech/silence gate\"). Leave the password empty unless the device really has an API password set — table values are stored unencrypted.": "Una riga per dispositivo. Porta vuota = 6053. La stanza è quella in cui l'assistente colloca il satellite. Soglia del parlato: il livello minimo del microfono (RMS) che conta come parlato, vuoto = 250 — abbassala (ad es. a 100) se il dispositivo reagisce alla parola di attivazione ma non sente il comando; il log di debug mostra i livelli (\"peak RMS\", \"speech/silence gate\"). Lascia vuota la password a meno che il dispositivo non abbia davvero una password API — i valori della tabella sono salvati in chiaro.",
102
104
  "Only devices, rooms, functions": "Solo dispositivi, stanze, funzioni",
103
105
  "OpenAI": "OpenAI",
104
106
  "OpenAI (Whisper)": "OpenAI (Whisper)",
@@ -126,6 +128,7 @@
126
128
  "Rewrite spoken or typed variants to your device/room names before local matching, e.g. \"TV\" to \"Fernseher\". Leave the language empty to apply to all languages. Also used for the text channels.": "Riscrivi le varianti vocali o digitate con i nomi del tuo dispositivo/stanza prima della corrispondenza locale, ad esempio \"TV\" in \"Fernseher\". Lascia vuoto il campo della lingua per applicare la funzione a tutte le lingue. Utilizzato anche per i canali di testo.",
127
129
  "Ring duration (seconds)": "Durata dello squillo (secondi)",
128
130
  "Room": "Stanza",
131
+ "Speech threshold": "Soglia del parlato",
129
132
  "Routines": "Routine",
130
133
  "Run the UDP voice server (ESP / Hannah satellites)": "Avviare il server vocale UDP (satelliti ESP/Hannah)",
131
134
  "Runs a small local model (node-llama-cpp) for general questions. With a cloud provider it only answers when the cloud fails, unless \"Ask the local model first\" is on. Install it with the button below.": "Esegue un piccolo modello locale (node-llama-cpp) per le domande generali. Con un provider cloud risponde solo quando il cloud non funziona, a meno che «Chiedi prima al modello locale» sia attivo. Installalo con il pulsante qui sotto.",
@@ -151,6 +154,8 @@
151
154
  "TTS voice": "Sintesi vocale",
152
155
  "Test connection": "Verifica la connessione",
153
156
  "Text-to-speech fallback": "Sintesi vocale di riserva",
157
+ "Longest spoken answer (characters)": "Risposta parlata più lunga (caratteri)",
158
+ "A longer answer is cut at the last sentence end before this limit. 400 characters are about 25–30 seconds of speech. 0 = no limit.": "Una risposta più lunga viene tagliata all'ultima fine di frase prima di questo limite. 400 caratteri sono circa 25–30 secondi di parlato. 0 = nessun limite.",
154
159
  "Text-to-speech provider": "Fornitore di sintesi vocale",
155
160
  "These devices stream until the server stops them, so the adapter decides when you stopped talking. Raise it if replies cut you off, lower it if the assistant waits too long.": "Questi dispositivi trasmettono finché il server non li ferma, quindi è l’adapter a decidere quando hai smesso di parlare. Aumenta se la risposta ti interrompe, riduci se l’assistente attende troppo.",
156
161
  "ThirdReality Voice & Music Assistant, Home Assistant Voice PE, linux-voice-assistant. These devices listen on TCP 6053 and the adapter dials them, so no port is opened for the audio itself — only the media server below, which they fetch the spoken reply from.": "ThirdReality Voice & Music Assistant, Home Assistant Voice PE, linux-voice-assistant. Questi dispositivi ascoltano sulla TCP 6053 ed è l’adapter a contattarli, quindi per l’audio non viene aperta alcuna porta: solo il media server qui sotto, da cui scaricano la risposta parlata.",
@@ -63,6 +63,8 @@
63
63
  "Enable voice server (satellites)": "Schakel de spraakserver (satellieten) in.",
64
64
  "Enables speech recognition/synthesis. ioBroker-native satellites reach it over the message bus — no port needed. Turn on the UDP server below only for ESP / Hannah satellites.": "Maakt spraakherkenning/synthese mogelijk. ioBroker-native satellieten bereiken deze via de berichtenbus — er is geen poort nodig. Schakel de onderstaande UDP-server alleen in voor ESP/Hannah-satellieten.",
65
65
  "End of speech after (ms of silence)": "Einde spraak na (ms stilte)",
66
+ "Keep dropped recordings for diagnosis": "Verworpen opnames bewaren voor diagnose",
67
+ "Recordings that were dropped as silence or that speech recognition returned empty are stored as WAV plus a JSON with the levels, under Files → assistant.N/captures (the newest 50). They contain audio from the room: only enable this for troubleshooting.": "Opnames die als stilte zijn verworpen of waarvoor de spraakherkenning niets teruggaf, worden als WAV plus een JSON met de niveaus opgeslagen onder Bestanden → assistant.N/captures (de nieuwste 50). Ze bevatten geluid uit de kamer: alleen inschakelen voor probleemoplossing.",
66
68
  "Extra actions (JSON)": "Extra acties (JSON)",
67
69
  "Give a set of satellites a name, so an announcement, a question or a trigger can address it: a group of rooms (\"Upstairs\") or the speakers that belong to one person (\"Denis\", so \"tell Denis dinner is ready\" reaches them). Members: satellite ids, room names or device names, separated by commas. Kind: empty or group, or person. A real satellite or room of the same name always wins, so a group can never make a speaker unreachable.": "Geef een set satellieten een naam, zodat een aankondiging, een vraag of een trigger die kan aanspreken: een groep kamers (\"Boven\") of de speakers van één persoon (\"Denis\", zodat \"zeg Denis dat het eten klaar is\" daar aankomt). Leden: satelliet-ids, kamernamen of apparaatnamen, gescheiden door komma's. Soort: leeg of group, of person. Een echte satelliet of kamer met dezelfde naam gaat altijd voor, dus een groep kan een speaker nooit onbereikbaar maken.",
68
70
  "Google Gemini": "Google Gemini",
@@ -98,7 +100,7 @@
98
100
  "No sound": "Geen geluid",
99
101
  "None": "Geen",
100
102
  "Object read access": "Object leestoegang",
101
- "One row per device. Port empty = 6053. The room is what the assistant treats the satellite as being in. Leave the password empty unless the device really has an API password set — table values are stored unencrypted.": "Eén rij per apparaat. Poort leeg = 6053. De ruimte is die waarin de assistent de satelliet plaatst. Laat het wachtwoord leeg tenzij het apparaat echt een API-wachtwoord heeft — tabelwaarden worden onversleuteld opgeslagen.",
103
+ "One row per device. Port empty = 6053. The room is what the assistant treats the satellite as being in. Speech threshold: the lowest microphone level (RMS) that counts as speech, empty = 250 — lower it (e.g. to 100) if the device reacts to the wake word but does not hear the command; the debug log shows the levels (\"peak RMS\", \"speech/silence gate\"). Leave the password empty unless the device really has an API password set — table values are stored unencrypted.": "Eén rij per apparaat. Poort leeg = 6053. De kamer is waar de assistent de satelliet plaatst. Spraakdrempel: het laagste microfoonniveau (RMS) dat als spraak telt, leeg = 250 — verlaag het (bijv. naar 100) als het apparaat op het wekwoord reageert maar het commando niet hoort; het debuglog toont de niveaus (\"peak RMS\", \"speech/silence gate\"). Laat het wachtwoord leeg, tenzij het apparaat echt een API-wachtwoord heeft — tabelwaarden worden onversleuteld opgeslagen.",
102
104
  "Only devices, rooms, functions": "Alleen apparaten, kamers, functies",
103
105
  "OpenAI": "OpenAI",
104
106
  "OpenAI (Whisper)": "OpenAI (Whisper)",
@@ -126,6 +128,7 @@
126
128
  "Rewrite spoken or typed variants to your device/room names before local matching, e.g. \"TV\" to \"Fernseher\". Leave the language empty to apply to all languages. Also used for the text channels.": "Herschrijf gesproken of getypte varianten naar de namen van uw apparaten/ruimtes voordat u lokale overeenkomsten zoekt, bijvoorbeeld \"TV\" naar \"Fernseher\". Laat het taalveld leeg om dit op alle talen toe te passen. Ook gebruikt voor tekstkanalen.",
127
129
  "Ring duration (seconds)": "Belduur (seconden)",
128
130
  "Room": "Ruimte",
131
+ "Speech threshold": "Spraakdrempel",
129
132
  "Routines": "Routines",
130
133
  "Run the UDP voice server (ESP / Hannah satellites)": "Start de UDP-spraakserver (ESP/Hannah-satellieten).",
131
134
  "Runs a small local model (node-llama-cpp) for general questions. With a cloud provider it only answers when the cloud fails, unless \"Ask the local model first\" is on. Install it with the button below.": "Draait een klein lokaal model (node-llama-cpp) voor algemene vragen. Met een cloudprovider antwoordt het alleen als de cloud uitvalt, tenzij \"Eerst het lokale model vragen\" aan staat. Installeer het met de knop hieronder.",
@@ -151,6 +154,8 @@
151
154
  "TTS voice": "TTS-stem",
152
155
  "Test connection": "Testverbinding",
153
156
  "Text-to-speech fallback": "Reserve tekst-naar-spraak",
157
+ "Longest spoken answer (characters)": "Langste gesproken antwoord (tekens)",
158
+ "A longer answer is cut at the last sentence end before this limit. 400 characters are about 25–30 seconds of speech. 0 = no limit.": "Een langer antwoord wordt afgekapt bij het laatste zinseinde vóór deze grens. 400 tekens zijn ongeveer 25–30 seconden spraak. 0 = geen grens.",
154
159
  "Text-to-speech provider": "Tekst-naar-spraak-aanbieder",
155
160
  "These devices stream until the server stops them, so the adapter decides when you stopped talking. Raise it if replies cut you off, lower it if the assistant waits too long.": "Deze apparaten streamen tot de server ze stopt, dus de adapter bepaalt wanneer je klaar bent met praten. Verhoog dit als het antwoord je afkapt, verlaag het als de assistent te lang wacht.",
156
161
  "ThirdReality Voice & Music Assistant, Home Assistant Voice PE, linux-voice-assistant. These devices listen on TCP 6053 and the adapter dials them, so no port is opened for the audio itself — only the media server below, which they fetch the spoken reply from.": "ThirdReality Voice & Music Assistant, Home Assistant Voice PE, linux-voice-assistant. Deze apparaten luisteren op TCP 6053 en de adapter belt ze zelf aan, dus voor de audio zelf wordt geen poort geopend — alleen de mediaserver hieronder, waar ze het gesproken antwoord ophalen.",
@@ -63,6 +63,8 @@
63
63
  "Enable voice server (satellites)": "Włącz serwer głosowy (satelity)",
64
64
  "Enables speech recognition/synthesis. ioBroker-native satellites reach it over the message bus — no port needed. Turn on the UDP server below only for ESP / Hannah satellites.": "Umożliwia rozpoznawanie/syntezę mowy. Satelity natywne dla ioBroker osiągają go przez magistralę komunikatów — nie jest potrzebny żaden port. Włącz serwer UDP poniżej tylko dla satelitów ESP/Hannah.",
65
65
  "End of speech after (ms of silence)": "Koniec mowy po (ms ciszy)",
66
+ "Keep dropped recordings for diagnosis": "Zachowuj odrzucone nagrania do diagnostyki",
67
+ "Recordings that were dropped as silence or that speech recognition returned empty are stored as WAV plus a JSON with the levels, under Files → assistant.N/captures (the newest 50). They contain audio from the room: only enable this for troubleshooting.": "Nagrania odrzucone jako cisza lub te, dla których rozpoznawanie mowy zwróciło pusty tekst, są zapisywane jako WAV oraz JSON z poziomami w Pliki → assistant.N/captures (najnowsze 50). Zawierają dźwięk z pomieszczenia: włączaj tylko do rozwiązywania problemów.",
66
68
  "Extra actions (JSON)": "Dodatkowe akcje (JSON)",
67
69
  "Give a set of satellites a name, so an announcement, a question or a trigger can address it: a group of rooms (\"Upstairs\") or the speakers that belong to one person (\"Denis\", so \"tell Denis dinner is ready\" reaches them). Members: satellite ids, room names or device names, separated by commas. Kind: empty or group, or person. A real satellite or room of the same name always wins, so a group can never make a speaker unreachable.": "Nadaj nazwę zestawowi satelitów, aby komunikat, pytanie lub wyzwalacz mógł się do niego zwrócić: grupa pomieszczeń (\"Piętro\") lub głośniki należące do jednej osoby (\"Denis\", aby \"powiedz Denisowi, że obiad gotowy\" do nich dotarło). Członkowie: identyfikatory satelitów, nazwy pomieszczeń lub urządzeń, oddzielone przecinkami. Rodzaj: puste lub group, albo person. Prawdziwy satelita lub pomieszczenie o tej samej nazwie zawsze ma pierwszeństwo, więc grupa nigdy nie uczyni głośnika nieosiągalnym.",
68
70
  "Google Gemini": "Google Gemini",
@@ -98,7 +100,7 @@
98
100
  "No sound": "Brak dźwięku",
99
101
  "None": "Brak",
100
102
  "Object read access": "Dostęp do odczytu obiektu",
101
- "One row per device. Port empty = 6053. The room is what the assistant treats the satellite as being in. Leave the password empty unless the device really has an API password set — table values are stored unencrypted.": "Jeden wiersz na urządzenie. Pusty port = 6053. Pokój to ten, w którym asystent umieszcza satelitę. Hasło wypełnij tylko wtedy, gdy urządzenie naprawdę ma ustawione hasło API — wartości tabeli są zapisywane bez szyfrowania.",
103
+ "One row per device. Port empty = 6053. The room is what the assistant treats the satellite as being in. Speech threshold: the lowest microphone level (RMS) that counts as speech, empty = 250 — lower it (e.g. to 100) if the device reacts to the wake word but does not hear the command; the debug log shows the levels (\"peak RMS\", \"speech/silence gate\"). Leave the password empty unless the device really has an API password set — table values are stored unencrypted.": "Jeden wiersz na urządzenie. Port pusty = 6053. Pokój to ten, w którym asystent umiejscawia satelitę. Próg mowy: najniższy poziom mikrofonu (RMS) uznawany za mowę, puste = 250 — obniż go (np. do 100), jeśli urządzenie reaguje na słowo aktywujące, ale nie słyszy polecenia; dziennik debugowania pokazuje poziomy („peak RMS”, „speech/silence gate”). Hasło zostaw puste, chyba że urządzenie naprawdę ma hasło API — wartości tabeli są zapisywane bez szyfrowania.",
102
104
  "Only devices, rooms, functions": "Tylko urządzenia, pomieszczenia, funkcje",
103
105
  "OpenAI": "OpenAI",
104
106
  "OpenAI (Whisper)": "OpenAI (Whisper)",
@@ -126,6 +128,7 @@
126
128
  "Rewrite spoken or typed variants to your device/room names before local matching, e.g. \"TV\" to \"Fernseher\". Leave the language empty to apply to all languages. Also used for the text channels.": "Przepisz mówione lub pisane warianty nazw urządzeń/pomieszczeń przed dopasowaniem lokalnym, np. „TV” na „Fernseher”. Pozostaw pole języka puste, aby zastosować je do wszystkich języków. Używane również w kanałach tekstowych.",
127
129
  "Ring duration (seconds)": "Czas trwania dzwonka (sekundy)",
128
130
  "Room": "Pokój",
131
+ "Speech threshold": "Próg mowy",
129
132
  "Routines": "Rutyny",
130
133
  "Run the UDP voice server (ESP / Hannah satellites)": "Uruchom serwer głosowy UDP (satelity ESP/Hannah)",
131
134
  "Runs a small local model (node-llama-cpp) for general questions. With a cloud provider it only answers when the cloud fails, unless \"Ask the local model first\" is on. Install it with the button below.": "Uruchamia mały lokalny model (node-llama-cpp) do ogólnych pytań. Przy dostawcy chmurowym odpowiada tylko, gdy chmura zawiedzie, chyba że włączono „Najpierw pytaj model lokalny”. Zainstaluj go przyciskiem poniżej.",
@@ -151,6 +154,8 @@
151
154
  "TTS voice": "Głos TTS",
152
155
  "Test connection": "Połączenie testowe",
153
156
  "Text-to-speech fallback": "Zapasowa synteza mowy",
157
+ "Longest spoken answer (characters)": "Najdłuższa wypowiadana odpowiedź (znaki)",
158
+ "A longer answer is cut at the last sentence end before this limit. 400 characters are about 25–30 seconds of speech. 0 = no limit.": "Dłuższa odpowiedź jest obcinana na ostatnim końcu zdania przed tym limitem. 400 znaków to około 25–30 sekund mowy. 0 = bez limitu.",
154
159
  "Text-to-speech provider": "Dostawca tekstu na mowę",
155
160
  "These devices stream until the server stops them, so the adapter decides when you stopped talking. Raise it if replies cut you off, lower it if the assistant waits too long.": "Te urządzenia transmitują, dopóki serwer ich nie zatrzyma, więc to adapter decyduje, kiedy skończyłeś mówić. Zwiększ, jeśli odpowiedź ci przerywa; zmniejsz, jeśli asystent czeka zbyt długo.",
156
161
  "ThirdReality Voice & Music Assistant, Home Assistant Voice PE, linux-voice-assistant. These devices listen on TCP 6053 and the adapter dials them, so no port is opened for the audio itself — only the media server below, which they fetch the spoken reply from.": "ThirdReality Voice & Music Assistant, Home Assistant Voice PE, linux-voice-assistant. Te urządzenia nasłuchują na TCP 6053 i to adapter nawiązuje z nimi połączenie, więc dla samego dźwięku nie jest otwierany żaden port — tylko serwer multimediów poniżej, z którego pobierają wypowiedzianą odpowiedź.",
@@ -63,6 +63,8 @@
63
63
  "Enable voice server (satellites)": "Ativar servidor de voz (satélites)",
64
64
  "Enables speech recognition/synthesis. ioBroker-native satellites reach it over the message bus — no port needed. Turn on the UDP server below only for ESP / Hannah satellites.": "Habilita o reconhecimento/síntese de voz. Os satélites nativos do ioBroker acessam o servidor através do barramento de mensagens — sem necessidade de porta. Ative o servidor UDP abaixo apenas para satélites ESP/Hannah.",
65
65
  "End of speech after (ms of silence)": "Fim da fala após (ms de silêncio)",
66
+ "Keep dropped recordings for diagnosis": "Guardar as gravações descartadas para diagnóstico",
67
+ "Recordings that were dropped as silence or that speech recognition returned empty are stored as WAV plus a JSON with the levels, under Files → assistant.N/captures (the newest 50). They contain audio from the room: only enable this for troubleshooting.": "As gravações descartadas como silêncio ou que o reconhecimento de voz devolveu vazias são guardadas como WAV mais um JSON com os níveis, em Ficheiros → assistant.N/captures (as 50 mais recentes). Contêm áudio da divisão: ative apenas para resolução de problemas.",
66
68
  "Extra actions (JSON)": "Ações extras (JSON)",
67
69
  "Give a set of satellites a name, so an announcement, a question or a trigger can address it: a group of rooms (\"Upstairs\") or the speakers that belong to one person (\"Denis\", so \"tell Denis dinner is ready\" reaches them). Members: satellite ids, room names or device names, separated by commas. Kind: empty or group, or person. A real satellite or room of the same name always wins, so a group can never make a speaker unreachable.": "Dê um nome a um conjunto de satélites para que um anúncio, uma pergunta ou um gatilho possa se dirigir a ele: um grupo de cômodos (\"Andar de cima\") ou os alto-falantes de uma pessoa (\"Denis\", para que \"diga ao Denis que o jantar está pronto\" chegue até eles). Membros: ids de satélites, nomes de cômodos ou de dispositivos, separados por vírgulas. Tipo: vazio ou group, ou person. Um satélite ou cômodo real com o mesmo nome sempre tem prioridade, então um grupo nunca pode tornar um alto-falante inacessível.",
68
70
  "Google Gemini": "Google Gemini",
@@ -98,7 +100,7 @@
98
100
  "No sound": "Sem som",
99
101
  "None": "Nenhum",
100
102
  "Object read access": "Acesso de leitura ao objeto",
101
- "One row per device. Port empty = 6053. The room is what the assistant treats the satellite as being in. Leave the password empty unless the device really has an API password set — table values are stored unencrypted.": "Uma linha por dispositivo. Porta vazia = 6053. A divisão é aquela em que o assistente situa o satélite. Deixe a palavra-passe vazia a menos que o dispositivo tenha mesmo uma palavra-passe de API — os valores de tabela são guardados sem cifra.",
103
+ "One row per device. Port empty = 6053. The room is what the assistant treats the satellite as being in. Speech threshold: the lowest microphone level (RMS) that counts as speech, empty = 250 — lower it (e.g. to 100) if the device reacts to the wake word but does not hear the command; the debug log shows the levels (\"peak RMS\", \"speech/silence gate\"). Leave the password empty unless the device really has an API password set — table values are stored unencrypted.": "Uma linha por dispositivo. Porta vazia = 6053. A divisão é onde o assistente considera que o satélite está. Limiar de fala: o nível de microfone mais baixo (RMS) que conta como fala, vazio = 250 — baixe-o (p. ex. para 100) se o dispositivo reage à palavra de ativação mas não ouve o comando; o registo de depuração mostra os níveis (\"peak RMS\", \"speech/silence gate\"). Deixe a palavra-passe vazia, a menos que o dispositivo tenha mesmo uma palavra-passe de API — os valores da tabela são guardados sem encriptação.",
102
104
  "Only devices, rooms, functions": "Apenas dispositivos, salas, funções",
103
105
  "OpenAI": "OpenAI",
104
106
  "OpenAI (Whisper)": "OpenAI (Sussurro)",
@@ -126,6 +128,7 @@
126
128
  "Rewrite spoken or typed variants to your device/room names before local matching, e.g. \"TV\" to \"Fernseher\". Leave the language empty to apply to all languages. Also used for the text channels.": "Reescreva as variantes faladas ou digitadas para os nomes do seu dispositivo/sala antes da correspondência local, por exemplo, \"TV\" para \"Fernseher\". Deixe o campo de idioma vazio para aplicar a todos os idiomas. Também usado para os canais de texto.",
127
129
  "Ring duration (seconds)": "Duração do toque (segundos)",
128
130
  "Room": "Divisão",
131
+ "Speech threshold": "Limiar de fala",
129
132
  "Routines": "Rotinas",
130
133
  "Run the UDP voice server (ESP / Hannah satellites)": "Execute o servidor de voz UDP (ESP / satélites Hannah)",
131
134
  "Runs a small local model (node-llama-cpp) for general questions. With a cloud provider it only answers when the cloud fails, unless \"Ask the local model first\" is on. Install it with the button below.": "Executa um pequeno modelo local (node-llama-cpp) para perguntas gerais. Com um provedor de nuvem, só responde quando a nuvem falha, a menos que \"Perguntar primeiro ao modelo local\" esteja ativo. Instale-o com o botão abaixo.",
@@ -151,6 +154,8 @@
151
154
  "TTS voice": "Voz TTS",
152
155
  "Test connection": "Teste de conexão",
153
156
  "Text-to-speech fallback": "Síntese de voz de reserva",
157
+ "Longest spoken answer (characters)": "Resposta falada mais longa (caracteres)",
158
+ "A longer answer is cut at the last sentence end before this limit. 400 characters are about 25–30 seconds of speech. 0 = no limit.": "Uma resposta mais longa é cortada no último fim de frase antes deste limite. 400 caracteres são cerca de 25–30 segundos de fala. 0 = sem limite.",
154
159
  "Text-to-speech provider": "provedor de texto para voz",
155
160
  "These devices stream until the server stops them, so the adapter decides when you stopped talking. Raise it if replies cut you off, lower it if the assistant waits too long.": "Estes dispositivos transmitem até o servidor os parar, por isso é o adaptador que decide quando terminou de falar. Aumente se a resposta o interromper; reduza se o assistente esperar demasiado.",
156
161
  "ThirdReality Voice & Music Assistant, Home Assistant Voice PE, linux-voice-assistant. These devices listen on TCP 6053 and the adapter dials them, so no port is opened for the audio itself — only the media server below, which they fetch the spoken reply from.": "ThirdReality Voice & Music Assistant, Home Assistant Voice PE, linux-voice-assistant. Estes dispositivos escutam na TCP 6053 e é o adaptador que os contacta, por isso não é aberta nenhuma porta para o áudio em si — apenas o servidor de media abaixo, de onde eles buscam a resposta falada.",
@@ -63,6 +63,8 @@
63
63
  "Enable voice server (satellites)": "Включить голосовой сервер (спутники)",
64
64
  "Enables speech recognition/synthesis. ioBroker-native satellites reach it over the message bus — no port needed. Turn on the UDP server below only for ESP / Hannah satellites.": "Включает распознавание/синтез речи. Спутники, использующие ioBroker, получают к нему доступ через шину сообщений — порт не требуется. Включите UDP-сервер, указанный ниже, только для спутников ESP/Hannah.",
65
65
  "End of speech after (ms of silence)": "Конец речи после (мс тишины)",
66
+ "Keep dropped recordings for diagnosis": "Сохранять отброшенные записи для диагностики",
67
+ "Recordings that were dropped as silence or that speech recognition returned empty are stored as WAV plus a JSON with the levels, under Files → assistant.N/captures (the newest 50). They contain audio from the room: only enable this for troubleshooting.": "Записи, отброшенные как тишина или по которым распознавание речи вернуло пустой текст, сохраняются как WAV и JSON с уровнями в разделе Файлы → assistant.N/captures (последние 50). Они содержат звук из комнаты: включайте только для поиска неисправностей.",
66
68
  "Extra actions (JSON)": "Дополнительные действия (JSON)",
67
69
  "Give a set of satellites a name, so an announcement, a question or a trigger can address it: a group of rooms (\"Upstairs\") or the speakers that belong to one person (\"Denis\", so \"tell Denis dinner is ready\" reaches them). Members: satellite ids, room names or device names, separated by commas. Kind: empty or group, or person. A real satellite or room of the same name always wins, so a group can never make a speaker unreachable.": "Дайте набору сателлитов имя, чтобы к нему могли обращаться объявление, вопрос или триггер: группа комнат («Наверху») или динамики, принадлежащие одному человеку («Denis», чтобы «скажи Denis, что ужин готов» дошло до них). Участники: id сателлитов, названия комнат или устройств через запятую. Тип: пусто или group, либо person. Настоящий сателлит или комната с тем же именем всегда имеет приоритет, поэтому группа никогда не сделает динамик недоступным.",
68
70
  "Google Gemini": "Google Gemini",
@@ -98,7 +100,7 @@
98
100
  "No sound": "Нет звука",
99
101
  "None": "Нет",
100
102
  "Object read access": "доступ на чтение объекта",
101
- "One row per device. Port empty = 6053. The room is what the assistant treats the satellite as being in. Leave the password empty unless the device really has an API password set — table values are stored unencrypted.": "Одна строка на устройство. Пустой порт = 6053. Комната — та, в которой ассистент считает сателлит находящимся. Пароль заполняйте, только если на устройстве действительно задан пароль API — значения таблицы хранятся без шифрования.",
103
+ "One row per device. Port empty = 6053. The room is what the assistant treats the satellite as being in. Speech threshold: the lowest microphone level (RMS) that counts as speech, empty = 250 — lower it (e.g. to 100) if the device reacts to the wake word but does not hear the command; the debug log shows the levels (\"peak RMS\", \"speech/silence gate\"). Leave the password empty unless the device really has an API password set — table values are stored unencrypted.": "Одна строка на устройство. Порт пустой = 6053. Комната — та, в которой ассистент считает спутник. Порог речи: минимальный уровень микрофона (RMS), который считается речью, пусто = 250 — уменьшите (например, до 100), если устройство реагирует на кодовое слово, но не слышит команду; уровни видны в отладочном логе («peak RMS», «speech/silence gate»). Пароль оставьте пустым, если на устройстве действительно не задан API-пароль — значения таблицы хранятся без шифрования.",
102
104
  "Only devices, rooms, functions": "Только устройства, помещения, функции",
103
105
  "OpenAI": "OpenAI",
104
106
  "OpenAI (Whisper)": "OpenAI (Whisper)",
@@ -126,6 +128,7 @@
126
128
  "Rewrite spoken or typed variants to your device/room names before local matching, e.g. \"TV\" to \"Fernseher\". Leave the language empty to apply to all languages. Also used for the text channels.": "Перед локальным сопоставлением замените произносимые или набранные варианты названиями ваших устройств/комнат, например, «TV» на «Fernseher». Оставьте поле языка пустым, чтобы применить ко всем языкам. Также используется для текстовых каналов.",
127
129
  "Ring duration (seconds)": "Длительность звонка (в секундах)",
128
130
  "Room": "Комната",
131
+ "Speech threshold": "Порог речи",
129
132
  "Routines": "Рутины",
130
133
  "Run the UDP voice server (ESP / Hannah satellites)": "Запустите UDP-сервер голосовой связи (спутники ESP/Hannah).",
131
134
  "Runs a small local model (node-llama-cpp) for general questions. With a cloud provider it only answers when the cloud fails, unless \"Ask the local model first\" is on. Install it with the button below.": "Запускает небольшую локальную модель (node-llama-cpp) для общих вопросов. При наличии облачного провайдера она отвечает только при сбое облака, если не включено «Сначала спрашивать локальную модель». Установка кнопкой ниже.",
@@ -151,6 +154,8 @@
151
154
  "TTS voice": "Голос TTS",
152
155
  "Test connection": "Проверить соединение",
153
156
  "Text-to-speech fallback": "Резервный синтез речи",
157
+ "Longest spoken answer (characters)": "Самый длинный произносимый ответ (символов)",
158
+ "A longer answer is cut at the last sentence end before this limit. 400 characters are about 25–30 seconds of speech. 0 = no limit.": "Более длинный ответ обрезается по последнему концу предложения перед этим пределом. 400 символов — это примерно 25–30 секунд речи. 0 = без ограничения.",
154
159
  "Text-to-speech provider": "Поставщик услуг преобразования текста в речь",
155
160
  "These devices stream until the server stops them, so the adapter decides when you stopped talking. Raise it if replies cut you off, lower it if the assistant waits too long.": "Эти устройства передают поток, пока сервер их не остановит, поэтому момент окончания речи определяет адаптер. Увеличьте, если ответ перебивает вас; уменьшите, если ассистент слишком долго ждёт.",
156
161
  "ThirdReality Voice & Music Assistant, Home Assistant Voice PE, linux-voice-assistant. These devices listen on TCP 6053 and the adapter dials them, so no port is opened for the audio itself — only the media server below, which they fetch the spoken reply from.": "ThirdReality Voice & Music Assistant, Home Assistant Voice PE, linux-voice-assistant. Эти устройства слушают TCP 6053, и адаптер подключается к ним сам — поэтому для самого звука порт не открывается, только медиасервер ниже, с которого они забирают произнесённый ответ.",
@@ -63,6 +63,8 @@
63
63
  "Enable voice server (satellites)": "Увімкнути голосовий сервер (супутники)",
64
64
  "Enables speech recognition/synthesis. ioBroker-native satellites reach it over the message bus — no port needed. Turn on the UDP server below only for ESP / Hannah satellites.": "Дозволяє розпізнавання/синтез мовлення. Супутники, сумісні з ioBroker, досягають його через шину повідомлень — порт не потрібен. Увімкніть UDP-сервер нижче лише для супутників ESP / Hannah.",
65
65
  "End of speech after (ms of silence)": "Кінець мовлення після (мс тиші)",
66
+ "Keep dropped recordings for diagnosis": "Зберігати відкинуті записи для діагностики",
67
+ "Recordings that were dropped as silence or that speech recognition returned empty are stored as WAV plus a JSON with the levels, under Files → assistant.N/captures (the newest 50). They contain audio from the room: only enable this for troubleshooting.": "Записи, відкинуті як тиша або для яких розпізнавання мовлення повернуло порожній текст, зберігаються як WAV і JSON з рівнями в розділі Файли → assistant.N/captures (останні 50). Вони містять звук із кімнати: вмикайте лише для пошуку несправностей.",
66
68
  "Extra actions (JSON)": "Додаткові дії (JSON)",
67
69
  "Give a set of satellites a name, so an announcement, a question or a trigger can address it: a group of rooms (\"Upstairs\") or the speakers that belong to one person (\"Denis\", so \"tell Denis dinner is ready\" reaches them). Members: satellite ids, room names or device names, separated by commas. Kind: empty or group, or person. A real satellite or room of the same name always wins, so a group can never make a speaker unreachable.": "Дайте набору сателітів назву, щоб до нього могли звертатися оголошення, запитання або тригер: група кімнат («Нагорі») або динаміки, що належать одній людині («Denis», щоб «скажи Denis, що вечеря готова» дійшло до них). Учасники: id сателітів, назви кімнат або пристроїв через кому. Тип: порожньо або group, або person. Справжній сателіт або кімната з такою самою назвою завжди має пріоритет, тож група ніколи не зробить динамік недоступним.",
68
70
  "Google Gemini": "Google Близнюки",
@@ -98,7 +100,7 @@
98
100
  "No sound": "Без звуку",
99
101
  "None": "Немає",
100
102
  "Object read access": "Доступ для читання об'єкта",
101
- "One row per device. Port empty = 6053. The room is what the assistant treats the satellite as being in. Leave the password empty unless the device really has an API password set — table values are stored unencrypted.": "Один рядок на пристрій. Порожній порт = 6053. Кімната — та, в якій асистент розміщує сателіт. Пароль заповнюйте, лише якщо на пристрої справді задано пароль API — значення таблиці зберігаються без шифрування.",
103
+ "One row per device. Port empty = 6053. The room is what the assistant treats the satellite as being in. Speech threshold: the lowest microphone level (RMS) that counts as speech, empty = 250 — lower it (e.g. to 100) if the device reacts to the wake word but does not hear the command; the debug log shows the levels (\"peak RMS\", \"speech/silence gate\"). Leave the password empty unless the device really has an API password set — table values are stored unencrypted.": "Один рядок на пристрій. Порт порожній = 6053. Кімната — та, у якій асистент вважає супутник. Поріг мовлення: найнижчий рівень мікрофона (RMS), що вважається мовленням, порожньо = 250 — зменште (наприклад, до 100), якщо пристрій реагує на кодове слово, але не чує команду; рівні видно в журналі налагодження («peak RMS», «speech/silence gate»). Пароль залиште порожнім, якщо на пристрої справді не задано API-пароль — значення таблиці зберігаються без шифрування.",
102
104
  "Only devices, rooms, functions": "Тільки пристрої, кімнати, функції",
103
105
  "OpenAI": "OpenAI",
104
106
  "OpenAI (Whisper)": "OpenAI (Whisper)",
@@ -126,6 +128,7 @@
126
128
  "Rewrite spoken or typed variants to your device/room names before local matching, e.g. \"TV\" to \"Fernseher\". Leave the language empty to apply to all languages. Also used for the text channels.": "Перепишіть усні або друковані варіанти назв пристроїв/кімнат перед локальним зіставленням, наприклад, «TV» на «Fernseher». Залиште поле мови порожнім, щоб застосувати його до всіх мов. Також використовується для текстових каналів.",
127
129
  "Ring duration (seconds)": "Тривалість дзвінка (секунди)",
128
130
  "Room": "Кімната",
131
+ "Speech threshold": "Поріг мовлення",
129
132
  "Routines": "Рутини",
130
133
  "Run the UDP voice server (ESP / Hannah satellites)": "Запуск голосового сервера UDP (супутники ESP / Hannah)",
131
134
  "Runs a small local model (node-llama-cpp) for general questions. With a cloud provider it only answers when the cloud fails, unless \"Ask the local model first\" is on. Install it with the button below.": "Запускає невелику локальну модель (node-llama-cpp) для загальних запитань. З хмарним провайдером вона відповідає лише у разі збою хмари, якщо не ввімкнено «Спочатку питати локальну модель». Встановлення кнопкою нижче.",
@@ -151,6 +154,8 @@
151
154
  "TTS voice": "Голос для синтезу мовлення",
152
155
  "Test connection": "Тестове з'єднання",
153
156
  "Text-to-speech fallback": "Резервний синтез мовлення",
157
+ "Longest spoken answer (characters)": "Найдовша вимовлена відповідь (символів)",
158
+ "A longer answer is cut at the last sentence end before this limit. 400 characters are about 25–30 seconds of speech. 0 = no limit.": "Довша відповідь обрізається за останнім кінцем речення перед цією межею. 400 символів — це приблизно 25–30 секунд мовлення. 0 = без обмеження.",
154
159
  "Text-to-speech provider": "Постачальник перетворення тексту в мовлення",
155
160
  "These devices stream until the server stops them, so the adapter decides when you stopped talking. Raise it if replies cut you off, lower it if the assistant waits too long.": "Ці пристрої передають потік, доки сервер їх не зупинить, тож момент завершення мовлення визначає адаптер. Збільште, якщо відповідь перебиває вас; зменште, якщо асистент чекає задовго.",
156
161
  "ThirdReality Voice & Music Assistant, Home Assistant Voice PE, linux-voice-assistant. These devices listen on TCP 6053 and the adapter dials them, so no port is opened for the audio itself — only the media server below, which they fetch the spoken reply from.": "ThirdReality Voice & Music Assistant, Home Assistant Voice PE, linux-voice-assistant. Ці пристрої слухають на TCP 6053, і адаптер підключається до них сам — тож для самого звуку порт не відкривається, лише медіасервер нижче, з якого вони забирають озвучену відповідь.",
@@ -63,6 +63,8 @@
63
63
  "Enable voice server (satellites)": "启用语音服务器(卫星)",
64
64
  "Enables speech recognition/synthesis. ioBroker-native satellites reach it over the message bus — no port needed. Turn on the UDP server below only for ESP / Hannah satellites.": "启用语音识别/合成功能。ioBroker 原生卫星通过消息总线与其通信,无需端口。仅当 ESP/Hannah 卫星连接时,才需要启用下方的 UDP 服务器。",
65
65
  "End of speech after (ms of silence)": "静音多久后视为说完(毫秒)",
66
+ "Keep dropped recordings for diagnosis": "保留被丢弃的录音用于诊断",
67
+ "Recordings that were dropped as silence or that speech recognition returned empty are stored as WAV plus a JSON with the levels, under Files → assistant.N/captures (the newest 50). They contain audio from the room: only enable this for troubleshooting.": "被当作静音丢弃或语音识别返回为空的录音会以 WAV 加带电平的 JSON 形式保存在 文件 → assistant.N/captures 下(最新 50 条)。其中包含房间内的声音:仅在排查问题时启用。",
66
68
  "Extra actions (JSON)": "附加动作(JSON)",
67
69
  "Give a set of satellites a name, so an announcement, a question or a trigger can address it: a group of rooms (\"Upstairs\") or the speakers that belong to one person (\"Denis\", so \"tell Denis dinner is ready\" reaches them). Members: satellite ids, room names or device names, separated by commas. Kind: empty or group, or person. A real satellite or room of the same name always wins, so a group can never make a speaker unreachable.": "为一组卫星设备命名,以便播报、提问或触发器可以指定它:一组房间(\"楼上\")或属于某个人的扬声器(\"Denis\",这样“告诉 Denis 晚饭好了”就能送达)。成员:卫星设备 id、房间名或设备名,用逗号分隔。类型:留空或 group,或 person。同名的真实卫星设备或房间始终优先,因此组永远不会导致扬声器无法访问。",
68
70
  "Google Gemini": "Google Gemini",
@@ -98,7 +100,7 @@
98
100
  "No sound": "无声",
99
101
  "None": "无",
100
102
  "Object read access": "对象读取访问",
101
- "One row per device. Port empty = 6053. The room is what the assistant treats the satellite as being in. Leave the password empty unless the device really has an API password set — table values are stored unencrypted.": "每台设备一行。端口留空 = 6053。房间即助手认定该卫星所在的位置。除非设备确实设置了 API 密码,否则请留空——表格中的值以明文保存。",
103
+ "One row per device. Port empty = 6053. The room is what the assistant treats the satellite as being in. Speech threshold: the lowest microphone level (RMS) that counts as speech, empty = 250 — lower it (e.g. to 100) if the device reacts to the wake word but does not hear the command; the debug log shows the levels (\"peak RMS\", \"speech/silence gate\"). Leave the password empty unless the device really has an API password set — table values are stored unencrypted.": "每台设备一行。端口为空 = 6053。房间是助手认为该卫星所在的位置。语音阈值:被视为语音的最低麦克风电平(RMS),为空 = 250 — 如果设备能响应唤醒词却听不到随后的指令,请调低(例如 100);调试日志会显示电平(“peak RMS”、“speech/silence gate”)。除非设备确实设置了 API 密码,否则请将密码留空 — 表格中的值以未加密方式存储。",
102
104
  "Only devices, rooms, functions": "仅限设备、房间、功能",
103
105
  "OpenAI": "OpenAI",
104
106
  "OpenAI (Whisper)": "OpenAI(Whisper)",
@@ -126,6 +128,7 @@
126
128
  "Rewrite spoken or typed variants to your device/room names before local matching, e.g. \"TV\" to \"Fernseher\". Leave the language empty to apply to all languages. Also used for the text channels.": "在进行本地匹配之前,请将口语或文本形式的名称重写为您的设备/房间名称,例如将“TV”重写为“Fernseher”。将语言留空则应用所有语言。此设置也适用于文本频道。",
127
129
  "Ring duration (seconds)": "铃声持续时间(秒)",
128
130
  "Room": "房间",
131
+ "Speech threshold": "语音阈值",
129
132
  "Routines": "例程",
130
133
  "Run the UDP voice server (ESP / Hannah satellites)": "运行UDP语音服务器(ESP/Hannah卫星)",
131
134
  "Runs a small local model (node-llama-cpp) for general questions. With a cloud provider it only answers when the cloud fails, unless \"Ask the local model first\" is on. Install it with the button below.": "运行一个小型本地模型(node-llama-cpp)回答一般问题。配置了云服务商时,只有在云端失败时才由它回答,除非启用了“先询问本地模型”。请用下方按钮安装。",
@@ -151,6 +154,8 @@
151
154
  "TTS voice": "TTS语音",
152
155
  "Test connection": "测试连接",
153
156
  "Text-to-speech fallback": "文字转语音备用方案",
157
+ "Longest spoken answer (characters)": "最长语音回答(字符)",
158
+ "A longer answer is cut at the last sentence end before this limit. 400 characters are about 25–30 seconds of speech. 0 = no limit.": "更长的回答会在此上限之前的最后一个句末处截断。400 个字符约为 25–30 秒语音。0 = 不限制。",
154
159
  "Text-to-speech provider": "文本转语音服务提供商",
155
160
  "These devices stream until the server stops them, so the adapter decides when you stopped talking. Raise it if replies cut you off, lower it if the assistant waits too long.": "这些设备会一直传输,直到服务器让它们停止,因此由适配器判断你何时说完。若回复打断你就调大,若助手等待过久就调小。",
156
161
  "ThirdReality Voice & Music Assistant, Home Assistant Voice PE, linux-voice-assistant. These devices listen on TCP 6053 and the adapter dials them, so no port is opened for the audio itself — only the media server below, which they fetch the spoken reply from.": "ThirdReality Voice & Music Assistant、Home Assistant Voice PE、linux-voice-assistant。这些设备在 TCP 6053 上监听,由适配器主动连接它们,因此音频本身不会占用端口——只有下面的媒体服务器,设备会从那里获取语音回复。",
@@ -877,7 +877,7 @@
877
877
  "newLine": true,
878
878
  "type": "table",
879
879
  "label": "ESPHome satellites",
880
- "help": "One row per device. Port empty = 6053. The room is what the assistant treats the satellite as being in. Leave the password empty unless the device really has an API password set — table values are stored unencrypted.",
880
+ "help": "One row per device. Port empty = 6053. The room is what the assistant treats the satellite as being in. Speech threshold: the lowest microphone level (RMS) that counts as speech, empty = 250 — lower it (e.g. to 100) if the device reacts to the wake word but does not hear the command; the debug log shows the levels (\"peak RMS\", \"speech/silence gate\"). Leave the password empty unless the device really has an API password set — table values are stored unencrypted.",
881
881
  "hidden": "!data.voiceEnabled || !data.esphomeEnabled",
882
882
  "xs": 12,
883
883
  "sm": 12,
@@ -885,17 +885,25 @@
885
885
  "lg": 12,
886
886
  "xl": 12,
887
887
  "items": [
888
- { "type": "text", "attr": "ip", "title": "Address (IP or host name)", "width": "30%" },
888
+ { "type": "text", "attr": "ip", "title": "Address (IP or host name)", "width": "25%" },
889
889
  {
890
890
  "type": "number",
891
891
  "attr": "port",
892
892
  "title": "Port",
893
- "width": "15%",
893
+ "width": "12%",
894
894
  "min": 1,
895
895
  "max": 65535,
896
896
  "default": 6053
897
897
  },
898
- { "type": "text", "attr": "room", "title": "Room", "width": "30%" },
898
+ { "type": "text", "attr": "room", "title": "Room", "width": "23%" },
899
+ {
900
+ "type": "number",
901
+ "attr": "speechLevel",
902
+ "title": "Speech threshold",
903
+ "width": "15%",
904
+ "min": 10,
905
+ "max": 5000
906
+ },
899
907
  { "type": "text", "attr": "password", "title": "API password (usually empty)", "width": "25%" }
900
908
  ]
901
909
  },
@@ -940,6 +948,18 @@
940
948
  "lg": 3,
941
949
  "xl": 3
942
950
  },
951
+ "esphomeSaveCaptures": {
952
+ "type": "checkbox",
953
+ "label": "Keep dropped recordings for diagnosis",
954
+ "help": "Recordings that were dropped as silence or that speech recognition returned empty are stored as WAV plus a JSON with the levels, under Files → assistant.N/captures (the newest 50). They contain audio from the room: only enable this for troubleshooting.",
955
+ "default": false,
956
+ "hidden": "!data.voiceEnabled || !data.esphomeEnabled",
957
+ "xs": 12,
958
+ "sm": 6,
959
+ "md": 4,
960
+ "lg": 4,
961
+ "xl": 4
962
+ },
943
963
  "voiceLanguage": {
944
964
  "newLine": true,
945
965
  "type": "select",
@@ -1077,6 +1097,20 @@
1077
1097
  "lg": 3,
1078
1098
  "xl": 3
1079
1099
  },
1100
+ "ttsMaxChars": {
1101
+ "type": "number",
1102
+ "label": "Longest spoken answer (characters)",
1103
+ "help": "A longer answer is cut at the last sentence end before this limit. 400 characters are about 25–30 seconds of speech. 0 = no limit.",
1104
+ "default": 400,
1105
+ "min": 0,
1106
+ "max": 10000,
1107
+ "hidden": "!data.voiceEnabled",
1108
+ "xs": 12,
1109
+ "sm": 6,
1110
+ "md": 3,
1111
+ "lg": 3,
1112
+ "xl": 3
1113
+ },
1080
1114
  "voiceCredentialType": {
1081
1115
  "newLine": true,
1082
1116
  "type": "select",
package/build/lib/nlu.js CHANGED
@@ -16,6 +16,7 @@ exports.parseClockTime = parseClockTime;
16
16
  exports.parseWeekdays = parseWeekdays;
17
17
  exports.parseDurationSeconds = parseDurationSeconds;
18
18
  exports.isStopCommand = isStopCommand;
19
+ exports.mentionsScript = mentionsScript;
19
20
  exports.normalize = normalize;
20
21
  exports.splitCommands = splitCommands;
21
22
  const TURN_ON = new Set([
@@ -743,6 +744,19 @@ const STOP_RE = /(?<![\p{L}])(stopp?\p{L}*|halt|aufhoer\p{L}*|ruhe|ruhig|genug|s
743
744
  function isStopCommand(text) {
744
745
  return STOP_RE.test(normalize(text));
745
746
  }
747
+ /**
748
+ * "Skript"/"script"/"скрипт" in any form, German compounds ("Lichtskript") and Cyrillic flexion ("скрипте") included,
749
+ * plus JavaScript/TypeScript/Blockly. "script" only at the start of a word, so "description" or "subscription" do not
750
+ * count; "скрипка"/"скрипит" are other words.
751
+ */
752
+ const SCRIPT_RE = /skript|(?<![\p{L}])(?:java|type)?script|скрипт|blockly/iu;
753
+ /**
754
+ * True if the text is about a script. Such a request goes to the cloud model only: the rules would take its details for
755
+ * commands of their own ("… a script that switches the kitchen light every hour" was answered with the time).
756
+ */
757
+ function mentionsScript(text) {
758
+ return SCRIPT_RE.test(normalize(text));
759
+ }
746
760
  /** Normalize for matching: lowercase, German umlauts → ascii, ß → ss, Russian ё → е. */
747
761
  function normalize(s) {
748
762
  return s