iobroker.assistant 1.4.5 → 1.4.7
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.
- package/README.md +16 -1
- package/admin/i18n/de.json +11 -2
- package/admin/i18n/en.json +11 -2
- package/admin/i18n/es.json +11 -2
- package/admin/i18n/fr.json +11 -2
- package/admin/i18n/it.json +11 -2
- package/admin/i18n/nl.json +11 -2
- package/admin/i18n/pl.json +11 -2
- package/admin/i18n/pt.json +11 -2
- package/admin/i18n/ru.json +11 -2
- package/admin/i18n/uk.json +11 -2
- package/admin/i18n/zh-cn.json +11 -2
- package/admin/jsonConfig.json +65 -2
- package/build/lib/ask.js +10 -0
- package/build/lib/ask.js.map +1 -1
- package/build/lib/journal.js.map +1 -1
- package/build/lib/llm.js +50 -12
- package/build/lib/llm.js.map +1 -1
- package/build/lib/media.js +226 -0
- package/build/lib/media.js.map +1 -0
- package/build/lib/piAgent.js +1 -0
- package/build/lib/piAgent.js.map +1 -1
- package/build/lib/voice/engines.js +3 -0
- package/build/lib/voice/engines.js.map +1 -1
- package/build/lib/voice/esphome.js +258 -5
- package/build/lib/voice/esphome.js.map +1 -1
- package/build/lib/voice/ffmpegStatic.js +137 -0
- package/build/lib/voice/ffmpegStatic.js.map +1 -0
- package/build/lib/voice/stt.js +35 -3
- package/build/lib/voice/stt.js.map +1 -1
- package/build/main.js +306 -32
- package/build/main.js.map +1 -1
- package/io-package.json +34 -29
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -57,7 +57,9 @@ the origin in `assistant.0.text.querySource` (satellite name, `chat`, or empty f
|
|
|
57
57
|
or — if it is a URL/path to an audio file (`.mp3`/`.wav`/…) — played back.
|
|
58
58
|
|
|
59
59
|
> **Playing audio files needs [ffmpeg](https://ffmpeg.org/) on the host** (Windows and Linux):
|
|
60
|
-
> Linux → `sudo apt install ffmpeg`; Windows → install ffmpeg and add it to the `PATH
|
|
60
|
+
> Linux → `sudo apt install ffmpeg`; Windows → install ffmpeg and add it to the `PATH`, or enter its full path
|
|
61
|
+
> under **Path to ffmpeg** on the Voice tab. Without either, **Download ffmpeg** on the Voice tab fetches a static
|
|
62
|
+
> build (ffmpeg-static, 20–30 MB) into the data directory of the instance.
|
|
61
63
|
> Plain-text TTS does not need it — only audio-file playback (mp3/wav/…) does.
|
|
62
64
|
|
|
63
65
|
### Start a Hannah satellite pointed at this adapter
|
|
@@ -235,6 +237,19 @@ train it twice.
|
|
|
235
237
|
Placeholder for the next version (at the beginning of the line):
|
|
236
238
|
### **WORK IN PROGRESS**
|
|
237
239
|
-->
|
|
240
|
+
### 1.4.7 (2026-11-04)
|
|
241
|
+
* (@GermanBluefox) Voice messages: `ask` also takes a recording (`audio` as base64 plus `format`, e.g. `ogg`) instead of text. It is recognised with the speech recognition of the Voice tab and answered like a text question; the reply carries the recognised text as `heard`. Telegram uses it for voice messages
|
|
242
|
+
* (@GermanBluefox) Path to ffmpeg can be set on the Voice tab (empty = from the search path), with a button that checks it
|
|
243
|
+
* (@GermanBluefox) Hosts without ffmpeg: "Download ffmpeg" on the Voice tab fetches a static build of ffmpeg-static (20-30 MB, checked against a fixed SHA-256) into the data directory of the instance; it is used while no path is entered
|
|
244
|
+
* (@GermanBluefox) Pictures: `ask` takes `images` (base64 JPEG/PNG/GIF/WebP, at most 4) and passes them to the cloud model (OpenAI-compatible, Anthropic, pi-agent); without a text the question is "What is in this picture?". Rules and the local model are skipped for them. Telegram uses it for photos
|
|
245
|
+
* (@GermanBluefox) Videos: `ask` takes a reference `video: { adapter, path }` into the file storage (never the content). Videos are not looked at yet: without a question the answer says so, with one the model is told
|
|
246
|
+
* (@GermanBluefox) ESPHome: after a reply that asked something, every later reply re-opened the microphone. The firmware keeps `continue_conversation` until it is told "0", so every reply now says it, like Home Assistant does
|
|
247
|
+
* (@GermanBluefox) Satellites only listen again after a reply that asks something: a [[LISTEN]] marker (pi-agent's confirmations) or a question mark at the end. A question mark in the middle of a reply no longer opens the microphone
|
|
248
|
+
* (@GermanBluefox) ESPHome satellites with a screen: yes/no buttons (event `confirm_answer`) answer the open question like a spoken "yes"/"no" - the microphone closes, the reply is announced on that satellite. A select `display_language` is set to the voice language when the satellite connects
|
|
249
|
+
|
|
250
|
+
### 1.4.6 (2026-11-03)
|
|
251
|
+
* (@GermanBluefox) Speech recognition: own OpenAI-compatible server (Voice tab, provider OpenAI, "Speech recognition server"), e.g. a local whisper-large-v3-turbo in speaches, faster-whisper-server or LocalAI. It needs no OpenAI key and never gets it; an own key for the server is optional
|
|
252
|
+
|
|
238
253
|
### 1.4.5 (2026-11-03)
|
|
239
254
|
* (@GermanBluefox) ESPHome satellites: spoken replies go out in the format the device's media player announces (FLAC at its sample rate, as Home Assistant does; MP3/Opus via ffmpeg). Since ESPHome 2026.10 the player is built with only the codecs its pipelines use, and a WAV reply did not play at all. Devices that announce no formats keep getting WAV
|
|
240
255
|
* (@GermanBluefox) ESPHome satellites: when the device ends the conversation itself (button, or the wake word said again), it now gets its RUN_END. It stayed in the conversation, and every further wake word only sent another stop
|
package/admin/i18n/de.json
CHANGED
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
"ESPHome satellites": "ESPHome-Satelliten",
|
|
59
59
|
"ESPHome satellites do not get the reply over their API socket — they fetch it as a URL. This is the port that small HTTP server listens on.": "ESPHome-Satelliten bekommen die Antwort nicht über ihren API-Socket — sie holen sie als URL ab. Das ist der Port, auf dem dieser kleine HTTP-Server lauscht.",
|
|
60
60
|
"Empty = tts-1. Also: tts-1-hd, gpt-4o-mini-tts.": "Leer = tts-1. Auch: tts-1-hd, gpt-4o-mini-tts.",
|
|
61
|
-
"Empty = whisper-1. Also: gpt-4o-transcribe, gpt-4o-mini-transcribe.": "Leer = whisper-1. Auch: gpt-4o-transcribe, gpt-4o-mini-transcribe.",
|
|
61
|
+
"Empty = whisper-1. Also: gpt-4o-transcribe, gpt-4o-mini-transcribe. With an own server: the model as that server names it, e.g. Systran/faster-whisper-large-v3-turbo.": "Leer = whisper-1. Auch: gpt-4o-transcribe, gpt-4o-mini-transcribe. Mit eigenem Server: das Modell so, wie der Server es nennt, z. B. Systran/faster-whisper-large-v3-turbo.",
|
|
62
62
|
"Enable voice (STT/TTS for satellites)": "Sprache aktivieren (STT/TTS für Satelliten)",
|
|
63
63
|
"Enable voice server (satellites)": "Sprach-Server aktivieren (Satelliten)",
|
|
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.": "Aktiviert Spracherkennung/-synthese. ioBroker-native Satelliten erreichen sie über den Nachrichtenbus — kein Port nötig. Den UDP-Server unten nur für ESP-/Hannah-Satelliten einschalten.",
|
|
@@ -222,5 +222,14 @@
|
|
|
222
222
|
"Person": "Person",
|
|
223
223
|
"Guest": "Gast",
|
|
224
224
|
"Pet": "Haustier",
|
|
225
|
-
"Group": "Gruppe"
|
|
225
|
+
"Group": "Gruppe",
|
|
226
|
+
"Speech recognition server (optional)": "Server für die Spracherkennung (optional)",
|
|
227
|
+
"OpenAI-compatible server instead of OpenAI, e.g. a local Whisper: http://192.168.1.10:8000/v1 (speaches, faster-whisper-server, LocalAI). Empty = OpenAI.": "OpenAI-kompatibler Server statt OpenAI, z. B. ein lokales Whisper: http://192.168.1.10:8000/v1 (speaches, faster-whisper-server, LocalAI). Leer = OpenAI.",
|
|
228
|
+
"Key of the speech recognition server": "Schlüssel des Spracherkennungs-Servers",
|
|
229
|
+
"Only if the server wants one. The OpenAI key is never sent to it.": "Nur, wenn der Server einen verlangt. Der OpenAI-Schlüssel wird nie dorthin geschickt.",
|
|
230
|
+
"Path to ffmpeg": "Pfad zu ffmpeg",
|
|
231
|
+
"Empty = the downloaded ffmpeg, otherwise ffmpeg from the search path. Needed for timer/alarm sounds, Telegram voice messages and MP3/Opus replies. Example: /usr/bin/ffmpeg or C:\\ffmpeg\\bin\\ffmpeg.exe": "Leer = das heruntergeladene ffmpeg, sonst ffmpeg aus dem Suchpfad. Wird für Timer-/Weckertöne, Telegram-Sprachnachrichten und MP3/Opus-Antworten gebraucht. Beispiel: /usr/bin/ffmpeg oder C:\\ffmpeg\\bin\\ffmpeg.exe",
|
|
232
|
+
"Check ffmpeg": "ffmpeg prüfen",
|
|
233
|
+
"Download ffmpeg": "ffmpeg herunterladen",
|
|
234
|
+
"Downloads a static ffmpeg (ffmpeg-static, 20-30 MB) into the data directory of the instance. It is used when no path is entered.": "Lädt ein statisches ffmpeg (ffmpeg-static, 20–30 MB) in das Datenverzeichnis der Instanz. Es wird genutzt, wenn kein Pfad eingetragen ist."
|
|
226
235
|
}
|
package/admin/i18n/en.json
CHANGED
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
"ESPHome satellites": "ESPHome satellites",
|
|
59
59
|
"ESPHome satellites do not get the reply over their API socket — they fetch it as a URL. This is the port that small HTTP server listens on.": "ESPHome satellites do not get the reply over their API socket — they fetch it as a URL. This is the port that small HTTP server listens on.",
|
|
60
60
|
"Empty = tts-1. Also: tts-1-hd, gpt-4o-mini-tts.": "Empty = tts-1. Also: tts-1-hd, gpt-4o-mini-tts.",
|
|
61
|
-
"Empty = whisper-1. Also: gpt-4o-transcribe, gpt-4o-mini-transcribe.": "Empty = whisper-1. Also: gpt-4o-transcribe, gpt-4o-mini-transcribe.",
|
|
61
|
+
"Empty = whisper-1. Also: gpt-4o-transcribe, gpt-4o-mini-transcribe. With an own server: the model as that server names it, e.g. Systran/faster-whisper-large-v3-turbo.": "Empty = whisper-1. Also: gpt-4o-transcribe, gpt-4o-mini-transcribe. With an own server: the model as that server names it, e.g. Systran/faster-whisper-large-v3-turbo.",
|
|
62
62
|
"Enable voice (STT/TTS for satellites)": "Enable voice (STT/TTS for satellites)",
|
|
63
63
|
"Enable voice server (satellites)": "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.": "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.",
|
|
@@ -222,5 +222,14 @@
|
|
|
222
222
|
"Person": "Person",
|
|
223
223
|
"Guest": "Guest",
|
|
224
224
|
"Pet": "Pet",
|
|
225
|
-
"Group": "Group"
|
|
225
|
+
"Group": "Group",
|
|
226
|
+
"Speech recognition server (optional)": "Speech recognition server (optional)",
|
|
227
|
+
"OpenAI-compatible server instead of OpenAI, e.g. a local Whisper: http://192.168.1.10:8000/v1 (speaches, faster-whisper-server, LocalAI). Empty = OpenAI.": "OpenAI-compatible server instead of OpenAI, e.g. a local Whisper: http://192.168.1.10:8000/v1 (speaches, faster-whisper-server, LocalAI). Empty = OpenAI.",
|
|
228
|
+
"Key of the speech recognition server": "Key of the speech recognition server",
|
|
229
|
+
"Only if the server wants one. The OpenAI key is never sent to it.": "Only if the server wants one. The OpenAI key is never sent to it.",
|
|
230
|
+
"Path to ffmpeg": "Path to ffmpeg",
|
|
231
|
+
"Empty = the downloaded ffmpeg, otherwise ffmpeg from the search path. Needed for timer/alarm sounds, Telegram voice messages and MP3/Opus replies. Example: /usr/bin/ffmpeg or C:\\ffmpeg\\bin\\ffmpeg.exe": "Empty = the downloaded ffmpeg, otherwise ffmpeg from the search path. Needed for timer/alarm sounds, Telegram voice messages and MP3/Opus replies. Example: /usr/bin/ffmpeg or C:\\ffmpeg\\bin\\ffmpeg.exe",
|
|
232
|
+
"Check ffmpeg": "Check ffmpeg",
|
|
233
|
+
"Download ffmpeg": "Download ffmpeg",
|
|
234
|
+
"Downloads a static ffmpeg (ffmpeg-static, 20-30 MB) into the data directory of the instance. It is used when no path is entered.": "Downloads a static ffmpeg (ffmpeg-static, 20-30 MB) into the data directory of the instance. It is used when no path is entered."
|
|
226
235
|
}
|
package/admin/i18n/es.json
CHANGED
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
"ESPHome satellites": "Satélites ESPHome",
|
|
59
59
|
"ESPHome satellites do not get the reply over their API socket — they fetch it as a URL. This is the port that small HTTP server listens on.": "Los satélites ESPHome no reciben la respuesta por su socket de API: la descargan como URL. Este es el puerto en el que escucha ese pequeño servidor HTTP.",
|
|
60
60
|
"Empty = tts-1. Also: tts-1-hd, gpt-4o-mini-tts.": "Vacío = tts-1. También: tts-1-hd, gpt-4o-mini-tts.",
|
|
61
|
-
"Empty = whisper-1. Also: gpt-4o-transcribe, gpt-4o-mini-transcribe.": "Vacío = whisper-1. También: gpt-4o-transcribe, gpt-4o-mini-transcribe.",
|
|
61
|
+
"Empty = whisper-1. Also: gpt-4o-transcribe, gpt-4o-mini-transcribe. With an own server: the model as that server names it, e.g. Systran/faster-whisper-large-v3-turbo.": "Vacío = whisper-1. También: gpt-4o-transcribe, gpt-4o-mini-transcribe. Con un servidor propio: el modelo tal como lo llama el servidor, p. ej. Systran/faster-whisper-large-v3-turbo.",
|
|
62
62
|
"Enable voice (STT/TTS for satellites)": "Habilitar la voz (STT/TTS para satélites)",
|
|
63
63
|
"Enable voice server (satellites)": "Habilitar 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.": "Permite el reconocimiento/síntesis de voz. Los satélites nativos de ioBroker se conectan a través del bus de mensajes; no se necesita ningún puerto. Active el servidor UDP que se indica a continuación solo para los satélites ESP/Hannah.",
|
|
@@ -222,5 +222,14 @@
|
|
|
222
222
|
"Person": "Persona",
|
|
223
223
|
"Guest": "Invitado",
|
|
224
224
|
"Pet": "Mascota",
|
|
225
|
-
"Group": "Grupo"
|
|
225
|
+
"Group": "Grupo",
|
|
226
|
+
"Speech recognition server (optional)": "Servidor de reconocimiento de voz (opcional)",
|
|
227
|
+
"OpenAI-compatible server instead of OpenAI, e.g. a local Whisper: http://192.168.1.10:8000/v1 (speaches, faster-whisper-server, LocalAI). Empty = OpenAI.": "Servidor compatible con OpenAI en lugar de OpenAI, p. ej. un Whisper local: http://192.168.1.10:8000/v1 (speaches, faster-whisper-server, LocalAI). Vacío = OpenAI.",
|
|
228
|
+
"Key of the speech recognition server": "Clave del servidor de reconocimiento de voz",
|
|
229
|
+
"Only if the server wants one. The OpenAI key is never sent to it.": "Solo si el servidor la pide. La clave de OpenAI nunca se envía allí.",
|
|
230
|
+
"Path to ffmpeg": "Ruta de ffmpeg",
|
|
231
|
+
"Empty = the downloaded ffmpeg, otherwise ffmpeg from the search path. Needed for timer/alarm sounds, Telegram voice messages and MP3/Opus replies. Example: /usr/bin/ffmpeg or C:\\ffmpeg\\bin\\ffmpeg.exe": "Vacío = el ffmpeg descargado, si no, ffmpeg de la ruta de búsqueda. Necesario para los sonidos de temporizador/alarma, los mensajes de voz de Telegram y las respuestas MP3/Opus. Ejemplo: /usr/bin/ffmpeg o C:\\ffmpeg\\bin\\ffmpeg.exe",
|
|
232
|
+
"Check ffmpeg": "Comprobar ffmpeg",
|
|
233
|
+
"Download ffmpeg": "Descargar ffmpeg",
|
|
234
|
+
"Downloads a static ffmpeg (ffmpeg-static, 20-30 MB) into the data directory of the instance. It is used when no path is entered.": "Descarga un ffmpeg estático (ffmpeg-static, 20-30 MB) en el directorio de datos de la instancia. Se usa cuando no se indica ninguna ruta."
|
|
226
235
|
}
|
package/admin/i18n/fr.json
CHANGED
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
"ESPHome satellites": "Satellites ESPHome",
|
|
59
59
|
"ESPHome satellites do not get the reply over their API socket — they fetch it as a URL. This is the port that small HTTP server listens on.": "Les satellites ESPHome ne reçoivent pas la réponse par leur socket API : ils la récupèrent via une URL. C’est le port sur lequel écoute ce petit serveur HTTP.",
|
|
60
60
|
"Empty = tts-1. Also: tts-1-hd, gpt-4o-mini-tts.": "Vide = tts-1. Également : tts-1-hd, gpt-4o-mini-tts.",
|
|
61
|
-
"Empty = whisper-1. Also: gpt-4o-transcribe, gpt-4o-mini-transcribe.": "Vide = whisper-1. Également
|
|
61
|
+
"Empty = whisper-1. Also: gpt-4o-transcribe, gpt-4o-mini-transcribe. With an own server: the model as that server names it, e.g. Systran/faster-whisper-large-v3-turbo.": "Vide = whisper-1. Également : gpt-4o-transcribe, gpt-4o-mini-transcribe. Avec un serveur propre : le modèle tel que le serveur le nomme, p. ex. Systran/faster-whisper-large-v3-turbo.",
|
|
62
62
|
"Enable voice (STT/TTS for satellites)": "Activer la voix (STT/TTS pour les satellites)",
|
|
63
63
|
"Enable voice server (satellites)": "Activer le serveur vocal (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.": "Permet la reconnaissance et la synthèse vocales. Les satellites natifs d'ioBroker y accèdent via le bus de messages ; aucun port n'est nécessaire. Activez le serveur UDP ci-dessous uniquement pour les satellites ESP/Hannah.",
|
|
@@ -222,5 +222,14 @@
|
|
|
222
222
|
"Person": "Personne",
|
|
223
223
|
"Guest": "Invité",
|
|
224
224
|
"Pet": "Animal",
|
|
225
|
-
"Group": "Groupe"
|
|
225
|
+
"Group": "Groupe",
|
|
226
|
+
"Speech recognition server (optional)": "Serveur de reconnaissance vocale (facultatif)",
|
|
227
|
+
"OpenAI-compatible server instead of OpenAI, e.g. a local Whisper: http://192.168.1.10:8000/v1 (speaches, faster-whisper-server, LocalAI). Empty = OpenAI.": "Serveur compatible OpenAI à la place d'OpenAI, p. ex. un Whisper local : http://192.168.1.10:8000/v1 (speaches, faster-whisper-server, LocalAI). Vide = OpenAI.",
|
|
228
|
+
"Key of the speech recognition server": "Clé du serveur de reconnaissance vocale",
|
|
229
|
+
"Only if the server wants one. The OpenAI key is never sent to it.": "Seulement si le serveur en demande une. La clé OpenAI n'y est jamais envoyée.",
|
|
230
|
+
"Path to ffmpeg": "Chemin vers ffmpeg",
|
|
231
|
+
"Empty = the downloaded ffmpeg, otherwise ffmpeg from the search path. Needed for timer/alarm sounds, Telegram voice messages and MP3/Opus replies. Example: /usr/bin/ffmpeg or C:\\ffmpeg\\bin\\ffmpeg.exe": "Vide = le ffmpeg téléchargé, sinon ffmpeg du chemin de recherche. Nécessaire pour les sons de minuterie/réveil, les messages vocaux Telegram et les réponses MP3/Opus. Exemple : /usr/bin/ffmpeg ou C:\\ffmpeg\\bin\\ffmpeg.exe",
|
|
232
|
+
"Check ffmpeg": "Vérifier ffmpeg",
|
|
233
|
+
"Download ffmpeg": "Télécharger ffmpeg",
|
|
234
|
+
"Downloads a static ffmpeg (ffmpeg-static, 20-30 MB) into the data directory of the instance. It is used when no path is entered.": "Télécharge un ffmpeg statique (ffmpeg-static, 20 à 30 Mo) dans le répertoire de données de l'instance. Il est utilisé quand aucun chemin n'est indiqué."
|
|
226
235
|
}
|
package/admin/i18n/it.json
CHANGED
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
"ESPHome satellites": "Satelliti ESPHome",
|
|
59
59
|
"ESPHome satellites do not get the reply over their API socket — they fetch it as a URL. This is the port that small HTTP server listens on.": "I satelliti ESPHome non ricevono la risposta dal loro socket API: la scaricano come URL. Questa è la porta su cui ascolta quel piccolo server HTTP.",
|
|
60
60
|
"Empty = tts-1. Also: tts-1-hd, gpt-4o-mini-tts.": "Vuoto = tts-1. Anche: tts-1-hd, gpt-4o-mini-tts.",
|
|
61
|
-
"Empty = whisper-1. Also: gpt-4o-transcribe, gpt-4o-mini-transcribe.": "Vuoto = whisper-1. Anche: gpt-4o-transcribe, gpt-4o-mini-transcribe.",
|
|
61
|
+
"Empty = whisper-1. Also: gpt-4o-transcribe, gpt-4o-mini-transcribe. With an own server: the model as that server names it, e.g. Systran/faster-whisper-large-v3-turbo.": "Vuoto = whisper-1. Anche: gpt-4o-transcribe, gpt-4o-mini-transcribe. Con un server proprio: il modello come lo chiama il server, ad es. Systran/faster-whisper-large-v3-turbo.",
|
|
62
62
|
"Enable voice (STT/TTS for satellites)": "Abilita la voce (STT/TTS per i satelliti)",
|
|
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.",
|
|
@@ -222,5 +222,14 @@
|
|
|
222
222
|
"Person": "Persona",
|
|
223
223
|
"Guest": "Ospite",
|
|
224
224
|
"Pet": "Animale",
|
|
225
|
-
"Group": "Gruppo"
|
|
225
|
+
"Group": "Gruppo",
|
|
226
|
+
"Speech recognition server (optional)": "Server di riconoscimento vocale (facoltativo)",
|
|
227
|
+
"OpenAI-compatible server instead of OpenAI, e.g. a local Whisper: http://192.168.1.10:8000/v1 (speaches, faster-whisper-server, LocalAI). Empty = OpenAI.": "Server compatibile con OpenAI al posto di OpenAI, ad es. un Whisper locale: http://192.168.1.10:8000/v1 (speaches, faster-whisper-server, LocalAI). Vuoto = OpenAI.",
|
|
228
|
+
"Key of the speech recognition server": "Chiave del server di riconoscimento vocale",
|
|
229
|
+
"Only if the server wants one. The OpenAI key is never sent to it.": "Solo se il server ne richiede una. La chiave OpenAI non viene mai inviata lì.",
|
|
230
|
+
"Path to ffmpeg": "Percorso di ffmpeg",
|
|
231
|
+
"Empty = the downloaded ffmpeg, otherwise ffmpeg from the search path. Needed for timer/alarm sounds, Telegram voice messages and MP3/Opus replies. Example: /usr/bin/ffmpeg or C:\\ffmpeg\\bin\\ffmpeg.exe": "Vuoto = l'ffmpeg scaricato, altrimenti ffmpeg dal percorso di ricerca. Necessario per i suoni di timer/sveglia, i messaggi vocali di Telegram e le risposte MP3/Opus. Esempio: /usr/bin/ffmpeg o C:\\ffmpeg\\bin\\ffmpeg.exe",
|
|
232
|
+
"Check ffmpeg": "Verifica ffmpeg",
|
|
233
|
+
"Download ffmpeg": "Scarica ffmpeg",
|
|
234
|
+
"Downloads a static ffmpeg (ffmpeg-static, 20-30 MB) into the data directory of the instance. It is used when no path is entered.": "Scarica un ffmpeg statico (ffmpeg-static, 20-30 MB) nella directory dei dati dell'istanza. Viene usato quando non è indicato alcun percorso."
|
|
226
235
|
}
|
package/admin/i18n/nl.json
CHANGED
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
"ESPHome satellites": "ESPHome-satellieten",
|
|
59
59
|
"ESPHome satellites do not get the reply over their API socket — they fetch it as a URL. This is the port that small HTTP server listens on.": "ESPHome-satellieten krijgen het antwoord niet via hun API-socket — ze halen het op als URL. Dit is de poort waarop die kleine HTTP-server luistert.",
|
|
60
60
|
"Empty = tts-1. Also: tts-1-hd, gpt-4o-mini-tts.": "Leeg = tts-1. Ook: tts-1-hd, gpt-4o-mini-tts.",
|
|
61
|
-
"Empty = whisper-1. Also: gpt-4o-transcribe, gpt-4o-mini-transcribe.": "Leeg = whisper-1. Ook: gpt-4o-transcribe, gpt-4o-mini-transcribe.",
|
|
61
|
+
"Empty = whisper-1. Also: gpt-4o-transcribe, gpt-4o-mini-transcribe. With an own server: the model as that server names it, e.g. Systran/faster-whisper-large-v3-turbo.": "Leeg = whisper-1. Ook: gpt-4o-transcribe, gpt-4o-mini-transcribe. Met een eigen server: het model zoals de server het noemt, bijv. Systran/faster-whisper-large-v3-turbo.",
|
|
62
62
|
"Enable voice (STT/TTS for satellites)": "Schakel spraak in (STT/TTS voor satellieten)",
|
|
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.",
|
|
@@ -222,5 +222,14 @@
|
|
|
222
222
|
"Person": "Persoon",
|
|
223
223
|
"Guest": "Gast",
|
|
224
224
|
"Pet": "Huisdier",
|
|
225
|
-
"Group": "Groep"
|
|
225
|
+
"Group": "Groep",
|
|
226
|
+
"Speech recognition server (optional)": "Server voor spraakherkenning (optioneel)",
|
|
227
|
+
"OpenAI-compatible server instead of OpenAI, e.g. a local Whisper: http://192.168.1.10:8000/v1 (speaches, faster-whisper-server, LocalAI). Empty = OpenAI.": "OpenAI-compatibele server in plaats van OpenAI, bijv. een lokale Whisper: http://192.168.1.10:8000/v1 (speaches, faster-whisper-server, LocalAI). Leeg = OpenAI.",
|
|
228
|
+
"Key of the speech recognition server": "Sleutel van de spraakherkenningsserver",
|
|
229
|
+
"Only if the server wants one. The OpenAI key is never sent to it.": "Alleen als de server er een vraagt. De OpenAI-sleutel wordt er nooit naartoe gestuurd.",
|
|
230
|
+
"Path to ffmpeg": "Pad naar ffmpeg",
|
|
231
|
+
"Empty = the downloaded ffmpeg, otherwise ffmpeg from the search path. Needed for timer/alarm sounds, Telegram voice messages and MP3/Opus replies. Example: /usr/bin/ffmpeg or C:\\ffmpeg\\bin\\ffmpeg.exe": "Leeg = de gedownloade ffmpeg, anders ffmpeg uit het zoekpad. Nodig voor timer-/wekkergeluiden, Telegram-spraakberichten en MP3/Opus-antwoorden. Voorbeeld: /usr/bin/ffmpeg of C:\\ffmpeg\\bin\\ffmpeg.exe",
|
|
232
|
+
"Check ffmpeg": "ffmpeg controleren",
|
|
233
|
+
"Download ffmpeg": "ffmpeg downloaden",
|
|
234
|
+
"Downloads a static ffmpeg (ffmpeg-static, 20-30 MB) into the data directory of the instance. It is used when no path is entered.": "Downloadt een statische ffmpeg (ffmpeg-static, 20-30 MB) naar de gegevensmap van de instantie. Die wordt gebruikt als er geen pad is ingevuld."
|
|
226
235
|
}
|
package/admin/i18n/pl.json
CHANGED
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
"ESPHome satellites": "Satelity ESPHome",
|
|
59
59
|
"ESPHome satellites do not get the reply over their API socket — they fetch it as a URL. This is the port that small HTTP server listens on.": "Satelity ESPHome nie odbierają odpowiedzi przez swoje gniazdo API — pobierają ją jako URL. To port, na którym nasłuchuje ten mały serwer HTTP.",
|
|
60
60
|
"Empty = tts-1. Also: tts-1-hd, gpt-4o-mini-tts.": "Pusty = tts-1. Również: tts-1-hd, gpt-4o-mini-tts.",
|
|
61
|
-
"Empty = whisper-1. Also: gpt-4o-transcribe, gpt-4o-mini-transcribe.": "
|
|
61
|
+
"Empty = whisper-1. Also: gpt-4o-transcribe, gpt-4o-mini-transcribe. With an own server: the model as that server names it, e.g. Systran/faster-whisper-large-v3-turbo.": "Puste = whisper-1. Również: gpt-4o-transcribe, gpt-4o-mini-transcribe. Z własnym serwerem: model tak, jak nazywa go serwer, np. Systran/faster-whisper-large-v3-turbo.",
|
|
62
62
|
"Enable voice (STT/TTS for satellites)": "Włącz głos (STT/TTS dla satelitów)",
|
|
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.",
|
|
@@ -222,5 +222,14 @@
|
|
|
222
222
|
"Person": "Osoba",
|
|
223
223
|
"Guest": "Gość",
|
|
224
224
|
"Pet": "Zwierzę",
|
|
225
|
-
"Group": "Grupa"
|
|
225
|
+
"Group": "Grupa",
|
|
226
|
+
"Speech recognition server (optional)": "Serwer rozpoznawania mowy (opcjonalnie)",
|
|
227
|
+
"OpenAI-compatible server instead of OpenAI, e.g. a local Whisper: http://192.168.1.10:8000/v1 (speaches, faster-whisper-server, LocalAI). Empty = OpenAI.": "Serwer zgodny z OpenAI zamiast OpenAI, np. lokalny Whisper: http://192.168.1.10:8000/v1 (speaches, faster-whisper-server, LocalAI). Puste = OpenAI.",
|
|
228
|
+
"Key of the speech recognition server": "Klucz serwera rozpoznawania mowy",
|
|
229
|
+
"Only if the server wants one. The OpenAI key is never sent to it.": "Tylko jeśli serwer go wymaga. Klucz OpenAI nigdy nie jest tam wysyłany.",
|
|
230
|
+
"Path to ffmpeg": "Ścieżka do ffmpeg",
|
|
231
|
+
"Empty = the downloaded ffmpeg, otherwise ffmpeg from the search path. Needed for timer/alarm sounds, Telegram voice messages and MP3/Opus replies. Example: /usr/bin/ffmpeg or C:\\ffmpeg\\bin\\ffmpeg.exe": "Puste = pobrany ffmpeg, w przeciwnym razie ffmpeg ze ścieżki wyszukiwania. Potrzebny do dźwięków minutnika/budzika, wiadomości głosowych z Telegrama i odpowiedzi MP3/Opus. Przykład: /usr/bin/ffmpeg lub C:\\ffmpeg\\bin\\ffmpeg.exe",
|
|
232
|
+
"Check ffmpeg": "Sprawdź ffmpeg",
|
|
233
|
+
"Download ffmpeg": "Pobierz ffmpeg",
|
|
234
|
+
"Downloads a static ffmpeg (ffmpeg-static, 20-30 MB) into the data directory of the instance. It is used when no path is entered.": "Pobiera statyczny ffmpeg (ffmpeg-static, 20–30 MB) do katalogu danych instancji. Jest używany, gdy nie podano ścieżki."
|
|
226
235
|
}
|
package/admin/i18n/pt.json
CHANGED
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
"ESPHome satellites": "Satélites ESPHome",
|
|
59
59
|
"ESPHome satellites do not get the reply over their API socket — they fetch it as a URL. This is the port that small HTTP server listens on.": "Os satélites ESPHome não recebem a resposta pelo seu socket de API — buscam-na como URL. Esta é a porta em que esse pequeno servidor HTTP escuta.",
|
|
60
60
|
"Empty = tts-1. Also: tts-1-hd, gpt-4o-mini-tts.": "Vazio = tts-1. Também: tts-1-hd, gpt-4o-mini-tts.",
|
|
61
|
-
"Empty = whisper-1. Also: gpt-4o-transcribe, gpt-4o-mini-transcribe.": "Vazio = whisper-1. Também: gpt-4o-transcribe, gpt-4o-mini-transcribe.",
|
|
61
|
+
"Empty = whisper-1. Also: gpt-4o-transcribe, gpt-4o-mini-transcribe. With an own server: the model as that server names it, e.g. Systran/faster-whisper-large-v3-turbo.": "Vazio = whisper-1. Também: gpt-4o-transcribe, gpt-4o-mini-transcribe. Com servidor próprio: o modelo como o servidor o chama, p. ex. Systran/faster-whisper-large-v3-turbo.",
|
|
62
62
|
"Enable voice (STT/TTS for satellites)": "Ativar voz (STT/TTS para satélites)",
|
|
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.",
|
|
@@ -222,5 +222,14 @@
|
|
|
222
222
|
"Person": "Pessoa",
|
|
223
223
|
"Guest": "Convidado",
|
|
224
224
|
"Pet": "Animal de estimação",
|
|
225
|
-
"Group": "Grupo"
|
|
225
|
+
"Group": "Grupo",
|
|
226
|
+
"Speech recognition server (optional)": "Servidor de reconhecimento de voz (opcional)",
|
|
227
|
+
"OpenAI-compatible server instead of OpenAI, e.g. a local Whisper: http://192.168.1.10:8000/v1 (speaches, faster-whisper-server, LocalAI). Empty = OpenAI.": "Servidor compatível com OpenAI em vez da OpenAI, p. ex. um Whisper local: http://192.168.1.10:8000/v1 (speaches, faster-whisper-server, LocalAI). Vazio = OpenAI.",
|
|
228
|
+
"Key of the speech recognition server": "Chave do servidor de reconhecimento de voz",
|
|
229
|
+
"Only if the server wants one. The OpenAI key is never sent to it.": "Só se o servidor pedir uma. A chave da OpenAI nunca é enviada para lá.",
|
|
230
|
+
"Path to ffmpeg": "Caminho para o ffmpeg",
|
|
231
|
+
"Empty = the downloaded ffmpeg, otherwise ffmpeg from the search path. Needed for timer/alarm sounds, Telegram voice messages and MP3/Opus replies. Example: /usr/bin/ffmpeg or C:\\ffmpeg\\bin\\ffmpeg.exe": "Vazio = o ffmpeg transferido, caso contrário ffmpeg do caminho de pesquisa. Necessário para os sons de temporizador/alarme, as mensagens de voz do Telegram e as respostas MP3/Opus. Exemplo: /usr/bin/ffmpeg ou C:\\ffmpeg\\bin\\ffmpeg.exe",
|
|
232
|
+
"Check ffmpeg": "Verificar ffmpeg",
|
|
233
|
+
"Download ffmpeg": "Transferir ffmpeg",
|
|
234
|
+
"Downloads a static ffmpeg (ffmpeg-static, 20-30 MB) into the data directory of the instance. It is used when no path is entered.": "Transfere um ffmpeg estático (ffmpeg-static, 20-30 MB) para o diretório de dados da instância. É usado quando nenhum caminho é indicado."
|
|
226
235
|
}
|
package/admin/i18n/ru.json
CHANGED
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
"ESPHome satellites": "Сателлиты ESPHome",
|
|
59
59
|
"ESPHome satellites do not get the reply over their API socket — they fetch it as a URL. This is the port that small HTTP server listens on.": "Сателлиты ESPHome получают ответ не через свой сокет API — они забирают его по URL. Это порт, на котором слушает этот небольшой HTTP-сервер.",
|
|
60
60
|
"Empty = tts-1. Also: tts-1-hd, gpt-4o-mini-tts.": "Пусто = tts-1. Также: tts-1-hd, gpt-4o-mini-tts.",
|
|
61
|
-
"Empty = whisper-1. Also: gpt-4o-transcribe, gpt-4o-mini-transcribe.": "Пусто = whisper-1. Также: gpt-4o-transcribe, gpt-4o-mini-transcribe.",
|
|
61
|
+
"Empty = whisper-1. Also: gpt-4o-transcribe, gpt-4o-mini-transcribe. With an own server: the model as that server names it, e.g. Systran/faster-whisper-large-v3-turbo.": "Пусто = whisper-1. Также: gpt-4o-transcribe, gpt-4o-mini-transcribe. Со своим сервером: модель так, как её называет сервер, напр. Systran/faster-whisper-large-v3-turbo.",
|
|
62
62
|
"Enable voice (STT/TTS for satellites)": "Включить голосовую связь (STT/TTS для спутниковой связи)",
|
|
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.",
|
|
@@ -222,5 +222,14 @@
|
|
|
222
222
|
"Person": "Человек",
|
|
223
223
|
"Guest": "Гость",
|
|
224
224
|
"Pet": "Питомец",
|
|
225
|
-
"Group": "Группа"
|
|
225
|
+
"Group": "Группа",
|
|
226
|
+
"Speech recognition server (optional)": "Сервер распознавания речи (опционально)",
|
|
227
|
+
"OpenAI-compatible server instead of OpenAI, e.g. a local Whisper: http://192.168.1.10:8000/v1 (speaches, faster-whisper-server, LocalAI). Empty = OpenAI.": "OpenAI-совместимый сервер вместо OpenAI, напр. локальный Whisper: http://192.168.1.10:8000/v1 (speaches, faster-whisper-server, LocalAI). Пусто = OpenAI.",
|
|
228
|
+
"Key of the speech recognition server": "Ключ сервера распознавания речи",
|
|
229
|
+
"Only if the server wants one. The OpenAI key is never sent to it.": "Только если сервер его требует. Ключ OpenAI туда никогда не отправляется.",
|
|
230
|
+
"Path to ffmpeg": "Путь к ffmpeg",
|
|
231
|
+
"Empty = the downloaded ffmpeg, otherwise ffmpeg from the search path. Needed for timer/alarm sounds, Telegram voice messages and MP3/Opus replies. Example: /usr/bin/ffmpeg or C:\\ffmpeg\\bin\\ffmpeg.exe": "Пусто = загруженный ffmpeg, иначе ffmpeg из пути поиска (PATH). Нужен для звуков таймера/будильника, голосовых сообщений Telegram и ответов в MP3/Opus. Пример: /usr/bin/ffmpeg или C:\\ffmpeg\\bin\\ffmpeg.exe",
|
|
232
|
+
"Check ffmpeg": "Проверить ffmpeg",
|
|
233
|
+
"Download ffmpeg": "Загрузить ffmpeg",
|
|
234
|
+
"Downloads a static ffmpeg (ffmpeg-static, 20-30 MB) into the data directory of the instance. It is used when no path is entered.": "Загружает статический ffmpeg (ffmpeg-static, 20–30 МБ) в каталог данных экземпляра. Используется, если путь не указан."
|
|
226
235
|
}
|
package/admin/i18n/uk.json
CHANGED
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
"ESPHome satellites": "Сателіти ESPHome",
|
|
59
59
|
"ESPHome satellites do not get the reply over their API socket — they fetch it as a URL. This is the port that small HTTP server listens on.": "Сателіти ESPHome отримують відповідь не через свій сокет API — вони забирають її за URL. Це порт, на якому слухає цей невеликий HTTP-сервер.",
|
|
60
60
|
"Empty = tts-1. Also: tts-1-hd, gpt-4o-mini-tts.": "Порожнє = tts-1. Також: tts-1-hd, gpt-4o-mini-tts.",
|
|
61
|
-
"Empty = whisper-1. Also: gpt-4o-transcribe, gpt-4o-mini-transcribe.": "
|
|
61
|
+
"Empty = whisper-1. Also: gpt-4o-transcribe, gpt-4o-mini-transcribe. With an own server: the model as that server names it, e.g. Systran/faster-whisper-large-v3-turbo.": "Порожньо = whisper-1. Також: gpt-4o-transcribe, gpt-4o-mini-transcribe. З власним сервером: модель так, як її називає сервер, напр. Systran/faster-whisper-large-v3-turbo.",
|
|
62
62
|
"Enable voice (STT/TTS for satellites)": "Увімкнути голосовий зв'язок (STT/TTS для супутників)",
|
|
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.",
|
|
@@ -222,5 +222,14 @@
|
|
|
222
222
|
"Person": "Людина",
|
|
223
223
|
"Guest": "Гість",
|
|
224
224
|
"Pet": "Улюбленець",
|
|
225
|
-
"Group": "Група"
|
|
225
|
+
"Group": "Група",
|
|
226
|
+
"Speech recognition server (optional)": "Сервер розпізнавання мовлення (необов'язково)",
|
|
227
|
+
"OpenAI-compatible server instead of OpenAI, e.g. a local Whisper: http://192.168.1.10:8000/v1 (speaches, faster-whisper-server, LocalAI). Empty = OpenAI.": "OpenAI-сумісний сервер замість OpenAI, напр. локальний Whisper: http://192.168.1.10:8000/v1 (speaches, faster-whisper-server, LocalAI). Порожньо = OpenAI.",
|
|
228
|
+
"Key of the speech recognition server": "Ключ сервера розпізнавання мовлення",
|
|
229
|
+
"Only if the server wants one. The OpenAI key is never sent to it.": "Лише якщо сервер його вимагає. Ключ OpenAI туди ніколи не надсилається.",
|
|
230
|
+
"Path to ffmpeg": "Шлях до ffmpeg",
|
|
231
|
+
"Empty = the downloaded ffmpeg, otherwise ffmpeg from the search path. Needed for timer/alarm sounds, Telegram voice messages and MP3/Opus replies. Example: /usr/bin/ffmpeg or C:\\ffmpeg\\bin\\ffmpeg.exe": "Порожньо = завантажений ffmpeg, інакше ffmpeg зі шляху пошуку (PATH). Потрібен для звуків таймера/будильника, голосових повідомлень Telegram і відповідей у MP3/Opus. Приклад: /usr/bin/ffmpeg або C:\\ffmpeg\\bin\\ffmpeg.exe",
|
|
232
|
+
"Check ffmpeg": "Перевірити ffmpeg",
|
|
233
|
+
"Download ffmpeg": "Завантажити ffmpeg",
|
|
234
|
+
"Downloads a static ffmpeg (ffmpeg-static, 20-30 MB) into the data directory of the instance. It is used when no path is entered.": "Завантажує статичний ffmpeg (ffmpeg-static, 20–30 МБ) до каталогу даних екземпляра. Використовується, якщо шлях не вказано."
|
|
226
235
|
}
|
package/admin/i18n/zh-cn.json
CHANGED
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
"ESPHome satellites": "ESPHome 卫星",
|
|
59
59
|
"ESPHome satellites do not get the reply over their API socket — they fetch it as a URL. This is the port that small HTTP server listens on.": "ESPHome 卫星不会通过其 API 套接字接收回复,而是按 URL 获取。这里就是那个小型 HTTP 服务器监听的端口。",
|
|
60
60
|
"Empty = tts-1. Also: tts-1-hd, gpt-4o-mini-tts.": "空 = tts-1。另见:tts-1-hd、gpt-4o-mini-tts。",
|
|
61
|
-
"Empty = whisper-1. Also: gpt-4o-transcribe, gpt-4o-mini-transcribe.": "空 = whisper-1。另见:gpt-4o-transcribe、gpt-4o-mini-transcribe。",
|
|
61
|
+
"Empty = whisper-1. Also: gpt-4o-transcribe, gpt-4o-mini-transcribe. With an own server: the model as that server names it, e.g. Systran/faster-whisper-large-v3-turbo.": "空 = whisper-1。另见:gpt-4o-transcribe、gpt-4o-mini-transcribe。使用自己的服务器时:按服务器的名称填写模型,例如 Systran/faster-whisper-large-v3-turbo。",
|
|
62
62
|
"Enable voice (STT/TTS for satellites)": "启用语音功能(卫星语音转语音/文本转语音)",
|
|
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 服务器。",
|
|
@@ -222,5 +222,14 @@
|
|
|
222
222
|
"Person": "人员",
|
|
223
223
|
"Guest": "访客",
|
|
224
224
|
"Pet": "宠物",
|
|
225
|
-
"Group": "组"
|
|
225
|
+
"Group": "组",
|
|
226
|
+
"Speech recognition server (optional)": "语音识别服务器(可选)",
|
|
227
|
+
"OpenAI-compatible server instead of OpenAI, e.g. a local Whisper: http://192.168.1.10:8000/v1 (speaches, faster-whisper-server, LocalAI). Empty = OpenAI.": "代替 OpenAI 的 OpenAI 兼容服务器,例如本地 Whisper:http://192.168.1.10:8000/v1(speaches、faster-whisper-server、LocalAI)。空 = OpenAI。",
|
|
228
|
+
"Key of the speech recognition server": "语音识别服务器的密钥",
|
|
229
|
+
"Only if the server wants one. The OpenAI key is never sent to it.": "仅当服务器需要时填写。OpenAI 密钥永远不会发送到该服务器。",
|
|
230
|
+
"Path to ffmpeg": "ffmpeg 路径",
|
|
231
|
+
"Empty = the downloaded ffmpeg, otherwise ffmpeg from the search path. Needed for timer/alarm sounds, Telegram voice messages and MP3/Opus replies. Example: /usr/bin/ffmpeg or C:\\ffmpeg\\bin\\ffmpeg.exe": "留空 = 使用已下载的 ffmpeg,否则使用搜索路径中的 ffmpeg。计时器/闹钟提示音、Telegram 语音消息以及 MP3/Opus 回复需要它。示例:/usr/bin/ffmpeg 或 C:\\ffmpeg\\bin\\ffmpeg.exe",
|
|
232
|
+
"Check ffmpeg": "检查 ffmpeg",
|
|
233
|
+
"Download ffmpeg": "下载 ffmpeg",
|
|
234
|
+
"Downloads a static ffmpeg (ffmpeg-static, 20-30 MB) into the data directory of the instance. It is used when no path is entered.": "将静态 ffmpeg(ffmpeg-static,20–30 MB)下载到实例的数据目录。未填写路径时使用它。"
|
|
226
235
|
}
|
package/admin/jsonConfig.json
CHANGED
|
@@ -1184,8 +1184,30 @@
|
|
|
1184
1184
|
"newLine": true,
|
|
1185
1185
|
"type": "text",
|
|
1186
1186
|
"label": "OpenAI STT model (optional)",
|
|
1187
|
-
"help": "Empty = whisper-1. Also: gpt-4o-transcribe, gpt-4o-mini-transcribe.",
|
|
1188
|
-
"hidden": "!data.voiceEnabled || data.sttProvider !== 'openai'",
|
|
1187
|
+
"help": "Empty = whisper-1. Also: gpt-4o-transcribe, gpt-4o-mini-transcribe. With an own server: the model as that server names it, e.g. Systran/faster-whisper-large-v3-turbo.",
|
|
1188
|
+
"hidden": "!data.voiceEnabled || (data.sttProvider !== 'openai' && data.sttFallback !== 'openai')",
|
|
1189
|
+
"xs": 12,
|
|
1190
|
+
"sm": 6,
|
|
1191
|
+
"md": 4,
|
|
1192
|
+
"lg": 4,
|
|
1193
|
+
"xl": 4
|
|
1194
|
+
},
|
|
1195
|
+
"sttBaseUrl": {
|
|
1196
|
+
"type": "text",
|
|
1197
|
+
"label": "Speech recognition server (optional)",
|
|
1198
|
+
"help": "OpenAI-compatible server instead of OpenAI, e.g. a local Whisper: http://192.168.1.10:8000/v1 (speaches, faster-whisper-server, LocalAI). Empty = OpenAI.",
|
|
1199
|
+
"hidden": "!data.voiceEnabled || (data.sttProvider !== 'openai' && data.sttFallback !== 'openai')",
|
|
1200
|
+
"xs": 12,
|
|
1201
|
+
"sm": 6,
|
|
1202
|
+
"md": 4,
|
|
1203
|
+
"lg": 4,
|
|
1204
|
+
"xl": 4
|
|
1205
|
+
},
|
|
1206
|
+
"sttServerKey": {
|
|
1207
|
+
"type": "password",
|
|
1208
|
+
"label": "Key of the speech recognition server",
|
|
1209
|
+
"help": "Only if the server wants one. The OpenAI key is never sent to it.",
|
|
1210
|
+
"hidden": "!data.voiceEnabled || (data.sttProvider !== 'openai' && data.sttFallback !== 'openai') || !data.sttBaseUrl",
|
|
1189
1211
|
"xs": 12,
|
|
1190
1212
|
"sm": 6,
|
|
1191
1213
|
"md": 4,
|
|
@@ -1488,6 +1510,47 @@
|
|
|
1488
1510
|
"lg": 5,
|
|
1489
1511
|
"xl": 5
|
|
1490
1512
|
},
|
|
1513
|
+
"ffmpegPath": {
|
|
1514
|
+
"newLine": true,
|
|
1515
|
+
"type": "text",
|
|
1516
|
+
"label": "Path to ffmpeg",
|
|
1517
|
+
"help": "Empty = the downloaded ffmpeg, otherwise ffmpeg from the search path. Needed for timer/alarm sounds, Telegram voice messages and MP3/Opus replies. Example: /usr/bin/ffmpeg or C:\\ffmpeg\\bin\\ffmpeg.exe",
|
|
1518
|
+
"default": "",
|
|
1519
|
+
"hidden": "!data.voiceEnabled",
|
|
1520
|
+
"xs": 12,
|
|
1521
|
+
"sm": 8,
|
|
1522
|
+
"md": 5,
|
|
1523
|
+
"lg": 5,
|
|
1524
|
+
"xl": 5
|
|
1525
|
+
},
|
|
1526
|
+
"_testFfmpeg": {
|
|
1527
|
+
"type": "sendTo",
|
|
1528
|
+
"command": "testFfmpeg",
|
|
1529
|
+
"label": "Check ffmpeg",
|
|
1530
|
+
"variant": "outlined",
|
|
1531
|
+
"jsonData": "{\"path\":\"${data.ffmpegPath}\"}",
|
|
1532
|
+
"hidden": "!data.voiceEnabled",
|
|
1533
|
+
"xs": 12,
|
|
1534
|
+
"sm": 4,
|
|
1535
|
+
"md": 3,
|
|
1536
|
+
"lg": 3,
|
|
1537
|
+
"xl": 3
|
|
1538
|
+
},
|
|
1539
|
+
"_downloadFfmpeg": {
|
|
1540
|
+
"type": "sendTo",
|
|
1541
|
+
"command": "downloadFfmpeg",
|
|
1542
|
+
"label": "Download ffmpeg",
|
|
1543
|
+
"title": "Downloads a static ffmpeg (ffmpeg-static, 20-30 MB) into the data directory of the instance. It is used when no path is entered.",
|
|
1544
|
+
"variant": "outlined",
|
|
1545
|
+
"showProcess": true,
|
|
1546
|
+
"jsonData": "{\"path\":\"${data.ffmpegPath}\"}",
|
|
1547
|
+
"hidden": "!data.voiceEnabled",
|
|
1548
|
+
"xs": 12,
|
|
1549
|
+
"sm": 4,
|
|
1550
|
+
"md": 3,
|
|
1551
|
+
"lg": 3,
|
|
1552
|
+
"xl": 3
|
|
1553
|
+
},
|
|
1491
1554
|
"_voiceTest": {
|
|
1492
1555
|
"newLine": true,
|
|
1493
1556
|
"type": "custom",
|
package/build/lib/ask.js
CHANGED
|
@@ -14,10 +14,20 @@
|
|
|
14
14
|
*/
|
|
15
15
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
16
|
exports.PendingQuestions = exports.ASK_TIMEOUT_MS = exports.ANY_SOURCE = void 0;
|
|
17
|
+
exports.endsWithQuestion = endsWithQuestion;
|
|
17
18
|
/** Key for a question that any source may answer (a broadcast question). */
|
|
18
19
|
exports.ANY_SOURCE = '*';
|
|
19
20
|
/** Default time to wait for an answer before giving up. */
|
|
20
21
|
exports.ASK_TIMEOUT_MS = 60_000;
|
|
22
|
+
/**
|
|
23
|
+
* Whether a reply ends with a question, so a satellite should re-open its mic for the answer. Only the end counts:
|
|
24
|
+
* "Wie spät es ist? Es ist zwölf." waits for nothing, and a mic opened for nothing hears the room and ends with
|
|
25
|
+
* "No text recognized" (field report 2026-11-04). A model that asks in the middle ("… setzen? Sag ja oder nein.")
|
|
26
|
+
* marks its reply with [[LISTEN]] instead — pi-agent does that for its confirmations.
|
|
27
|
+
*/
|
|
28
|
+
function endsWithQuestion(reply) {
|
|
29
|
+
return /[??؟][\s"'»«“”„)\]]*$/u.test(reply || '');
|
|
30
|
+
}
|
|
21
31
|
class PendingQuestions {
|
|
22
32
|
defaultTimeoutMs;
|
|
23
33
|
/** Every armed key points at its entry; several keys can share one (a question asked in two rooms). */
|
package/build/lib/ask.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ask.js","sourceRoot":"","sources":["../../src/lib/ask.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;;
|
|
1
|
+
{"version":3,"file":"ask.js","sourceRoot":"","sources":["../../src/lib/ask.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Pending questions — the other direction of a conversation: the adapter asks and waits for the answer.\n *\n * Everywhere else the user starts the exchange. Here a script, a timer or (later) a trigger asks\n * something (\"The fryer has been on for 5 hours. Shall I switch it off?\") and the *next* utterance from\n * that source is the answer: it must not go to the NLU or the LLM, which would treat a bare \"yes\" as a\n * command and swallow it.\n *\n * A question is armed for one or more **sources** — the same key the answer pipeline sees: a satellite's\n * device name, `'chat'`, `'telegram:<user>'`, … — or for {@link ANY_SOURCE} when it was broadcast and\n * whoever hears it may answer. If nothing arrives within the timeout the promise resolves with `null`,\n * so a question can never block the pipeline for good.\n */\n\n/** Key for a question that any source may answer (a broadcast question). */\nexport const ANY_SOURCE = '*';\n\n/** Default time to wait for an answer before giving up. */\nexport const ASK_TIMEOUT_MS = 60_000;\n\n/**\n * Whether a reply ends with a question, so a satellite should re-open its mic for the answer. Only the end counts:\n * \"Wie spät es ist? Es ist zwölf.\" waits for nothing, and a mic opened for nothing hears the room and ends with\n * \"No text recognized\" (field report 2026-11-04). A model that asks in the middle (\"… setzen? Sag ja oder nein.\")\n * marks its reply with [[LISTEN]] instead — pi-agent does that for its confirmations.\n */\nexport function endsWithQuestion(reply: string): boolean {\n return /[??؟][\\s\"'»«“”„)\\]]*$/u.test(reply || '');\n}\n\ninterface Entry {\n keys: string[];\n question: string;\n asked: number;\n timer: NodeJS.Timeout | null;\n done: boolean;\n settle: (answer: string | null) => void;\n}\n\n/** One open question, for logging and diagnostics. */\nexport interface PendingInfo {\n question: string;\n /** Sources that may answer it (`'*'` = any). */\n keys: string[];\n /** When it was asked (ms epoch). */\n asked: number;\n}\n\nexport class PendingQuestions {\n /** Every armed key points at its entry; several keys can share one (a question asked in two rooms). */\n private readonly byKey = new Map<string, Entry>();\n\n constructor(private readonly defaultTimeoutMs = ASK_TIMEOUT_MS) {}\n\n /**\n * Arm `question` for `keys` (empty → {@link ANY_SOURCE}) and resolve with the first answer from one of\n * them, or with `null` on timeout. Arming a key that already holds a question cancels that older one:\n * the newest question is the one the user just heard, so it has to be the one that wins.\n */\n ask(keys: string[], question: string, timeoutMs?: number): Promise<string | null> {\n const unique = [...new Set(keys.map(k => String(k ?? '').trim()).filter(Boolean))];\n if (!unique.length) {\n unique.push(ANY_SOURCE);\n }\n for (const key of unique) {\n this.cancel(key);\n }\n return new Promise<string | null>(resolve => {\n const entry: Entry = {\n keys: unique,\n question,\n asked: Date.now(),\n timer: null,\n done: false,\n settle: resolve,\n };\n // Deliberately not unref'd: the timeout is what releases the caller, so it has to fire. It is\n // cleared on an answer, on cancel, and by cancelAll() on unload, so nothing is held for long.\n entry.timer = setTimeout(() => this.finish(entry, null), timeoutMs ?? this.defaultTimeoutMs);\n for (const key of unique) {\n this.byKey.set(key, entry);\n }\n });\n }\n\n /**\n * Consume an utterance as the answer to an open question. Returns true when it was taken — the caller\n * must then stop processing it. Blank text is never an answer (a dropped utterance would otherwise\n * silently satisfy the question).\n */\n deliver(source: string, text: string): boolean {\n if (!String(text ?? '').trim()) {\n return false;\n }\n const entry = this.find(source);\n if (!entry) {\n return false;\n }\n this.finish(entry, text);\n return true;\n }\n\n /** Whether an open question would take the next utterance from `source`. */\n has(source: string): boolean {\n return !!this.find(source);\n }\n\n /** The open question `source` is expected to answer, if any (for logs). */\n question(source: string): string {\n return this.find(source)?.question ?? '';\n }\n\n /** Give up on the question armed for `key` (resolves it with `null`). */\n cancel(key: string): boolean {\n const entry = this.byKey.get(key);\n if (!entry) {\n return false;\n }\n this.finish(entry, null);\n return true;\n }\n\n /** Give up on every open question — on unload, so no caller is left hanging. */\n cancelAll(): void {\n for (const entry of [...new Set(this.byKey.values())]) {\n this.finish(entry, null);\n }\n this.byKey.clear();\n }\n\n /** All open questions (one entry per question, not per key). */\n list(): PendingInfo[] {\n return [...new Set(this.byKey.values())].map(e => ({\n question: e.question,\n keys: [...e.keys],\n asked: e.asked,\n }));\n }\n\n /** The entry responsible for `source`: armed for it by name, else the broadcast one. */\n private find(source: string): Entry | undefined {\n const key = String(source ?? '').trim();\n return (key ? this.byKey.get(key) : undefined) ?? this.byKey.get(ANY_SOURCE);\n }\n\n private finish(entry: Entry, answer: string | null): void {\n if (entry.done) {\n return;\n }\n entry.done = true;\n if (entry.timer) {\n clearTimeout(entry.timer);\n entry.timer = null;\n }\n for (const key of entry.keys) {\n // Only drop keys still pointing here — a newer question may already have taken one over.\n if (this.byKey.get(key) === entry) {\n this.byKey.delete(key);\n }\n }\n entry.settle(answer);\n }\n}\n"]}
|