esphome 2024.6.6__py3-none-any.whl → 2024.7.0__py3-none-any.whl
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.
- esphome/components/aht10/aht10.cpp +4 -2
- esphome/components/climate/climate.cpp +10 -6
- esphome/components/climate/climate_traits.h +3 -3
- esphome/components/cover/cover.h +2 -2
- esphome/components/esp32_camera/__init__.py +6 -3
- esphome/components/esp32_can/canbus.py +3 -0
- esphome/components/ethernet/ethernet_component.cpp +8 -3
- esphome/components/font/__init__.py +2 -28
- esphome/components/gree/climate.py +1 -0
- esphome/components/gree/gree.cpp +11 -3
- esphome/components/gree/gree.h +5 -1
- esphome/components/haier/binary_sensor/__init__.py +4 -4
- esphome/components/haier/button/__init__.py +1 -1
- esphome/components/haier/climate.py +43 -9
- esphome/components/haier/haier_base.cpp +4 -0
- esphome/components/haier/haier_base.h +11 -1
- esphome/components/haier/hon_climate.cpp +109 -55
- esphome/components/haier/hon_climate.h +7 -1
- esphome/components/haier/hon_packet.h +5 -0
- esphome/components/haier/sensor/__init__.py +5 -5
- esphome/components/haier/smartair2_climate.cpp +1 -0
- esphome/components/haier/text_sensor/__init__.py +4 -4
- esphome/components/heatpumpir/climate.py +12 -5
- esphome/components/heatpumpir/heatpumpir.cpp +11 -0
- esphome/components/heatpumpir/heatpumpir.h +11 -0
- esphome/components/http_request/http_request_arduino.cpp +7 -2
- esphome/components/http_request/update/http_request_update.cpp +6 -7
- esphome/components/http_request/update/http_request_update.h +0 -3
- esphome/components/i2s_audio/__init__.py +10 -0
- esphome/components/i2s_audio/microphone/__init__.py +7 -0
- esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp +2 -3
- esphome/components/i2s_audio/microphone/i2s_audio_microphone.h +3 -0
- esphome/components/image/__init__.py +2 -29
- esphome/components/improv_serial/improv_serial_component.cpp +9 -8
- esphome/components/ltr390/ltr390.cpp +44 -29
- esphome/components/ltr390/ltr390.h +9 -5
- esphome/components/ltr390/sensor.py +35 -5
- esphome/components/mdns/__init__.py +3 -3
- esphome/components/mdns/mdns_component.cpp +3 -1
- esphome/components/mdns/mdns_component.h +3 -1
- esphome/components/mdns/mdns_esp32.cpp +2 -1
- esphome/components/mdns/mdns_esp8266.cpp +2 -1
- esphome/components/mdns/mdns_host.cpp +2 -1
- esphome/components/mdns/mdns_libretiny.cpp +2 -1
- esphome/components/mdns/mdns_rp2040.cpp +2 -1
- esphome/components/micro_wake_word/__init__.py +205 -56
- esphome/components/micro_wake_word/micro_wake_word.cpp +225 -275
- esphome/components/micro_wake_word/micro_wake_word.h +77 -107
- esphome/components/micro_wake_word/preprocessor_settings.h +20 -0
- esphome/components/micro_wake_word/streaming_model.cpp +189 -0
- esphome/components/micro_wake_word/streaming_model.h +84 -0
- esphome/components/mitsubishi/mitsubishi.cpp +1 -0
- esphome/components/modbus_controller/text_sensor/__init__.py +2 -1
- esphome/components/modbus_controller/text_sensor/modbus_textsensor.cpp +4 -1
- esphome/components/modbus_controller/text_sensor/modbus_textsensor.h +1 -1
- esphome/components/number/__init__.py +2 -0
- esphome/components/ota/ota_backend_arduino_esp32.cpp +22 -7
- esphome/components/ota/ota_backend_arduino_esp8266.cpp +23 -8
- esphome/components/ota/ota_backend_arduino_libretiny.cpp +22 -7
- esphome/components/ota/ota_backend_arduino_rp2040.cpp +22 -7
- esphome/components/pmsa003i/pmsa003i.cpp +9 -0
- esphome/components/qspi_amoled/display.py +16 -4
- esphome/components/qspi_amoled/qspi_amoled.cpp +16 -0
- esphome/components/qspi_amoled/qspi_amoled.h +0 -3
- esphome/components/remote_base/dooya_protocol.cpp +4 -4
- esphome/components/remote_base/rc_switch_protocol.cpp +1 -1
- esphome/components/restart/button/__init__.py +2 -0
- esphome/components/script/__init__.py +1 -1
- esphome/components/sensor/__init__.py +2 -0
- esphome/components/tuya/tuya.cpp +8 -2
- esphome/components/tuya/tuya.h +3 -1
- esphome/components/uart/__init__.py +72 -9
- esphome/components/uart/uart_component_esp32_arduino.cpp +18 -4
- esphome/components/uart/uart_component_esp_idf.cpp +22 -2
- esphome/components/uart/uart_component_host.cpp +295 -0
- esphome/components/uart/uart_component_host.h +38 -0
- esphome/components/uptime/sensor.py +44 -11
- esphome/components/uptime/{uptime_sensor.cpp → uptime_seconds_sensor.cpp} +11 -7
- esphome/components/uptime/{uptime_sensor.h → uptime_seconds_sensor.h} +2 -2
- esphome/components/uptime/uptime_timestamp_sensor.cpp +39 -0
- esphome/components/uptime/uptime_timestamp_sensor.h +30 -0
- esphome/components/veml7700/veml7700.cpp +1 -1
- esphome/components/veml7700/veml7700.h +5 -5
- esphome/components/voice_assistant/voice_assistant.cpp +4 -2
- esphome/components/web_server/server_index_v2.h +42 -41
- esphome/components/web_server/server_index_v3.h +368 -367
- esphome/components/wifi/wifi_component_esp_idf.cpp +1 -1
- esphome/components/wifi/wifi_component_pico_w.cpp +18 -2
- esphome/components/wireguard/__init__.py +1 -1
- esphome/components/x9c/output.py +7 -1
- esphome/const.py +2 -1
- esphome/core/defines.h +1 -0
- esphome/core/helpers.cpp +2 -2
- esphome/core/helpers.h +1 -1
- esphome/external_files.py +26 -0
- {esphome-2024.6.6.dist-info → esphome-2024.7.0.dist-info}/METADATA +1 -1
- {esphome-2024.6.6.dist-info → esphome-2024.7.0.dist-info}/RECORD +101 -95
- esphome/components/micro_wake_word/audio_preprocessor_int8_model_data.h +0 -493
- {esphome-2024.6.6.dist-info → esphome-2024.7.0.dist-info}/LICENSE +0 -0
- {esphome-2024.6.6.dist-info → esphome-2024.7.0.dist-info}/WHEEL +0 -0
- {esphome-2024.6.6.dist-info → esphome-2024.7.0.dist-info}/entry_points.txt +0 -0
- {esphome-2024.6.6.dist-info → esphome-2024.7.0.dist-info}/top_level.txt +0 -0
@@ -9,7 +9,7 @@ import requests
|
|
9
9
|
import esphome.config_validation as cv
|
10
10
|
import esphome.codegen as cg
|
11
11
|
|
12
|
-
from esphome.core import CORE, HexInt
|
12
|
+
from esphome.core import CORE, HexInt
|
13
13
|
|
14
14
|
from esphome.components import esp32, microphone
|
15
15
|
from esphome import automation, git, external_files
|
@@ -41,9 +41,15 @@ CODEOWNERS = ["@kahrendt", "@jesserockz"]
|
|
41
41
|
DEPENDENCIES = ["microphone"]
|
42
42
|
DOMAIN = "micro_wake_word"
|
43
43
|
|
44
|
+
|
45
|
+
CONF_FEATURE_STEP_SIZE = "feature_step_size"
|
46
|
+
CONF_MODELS = "models"
|
47
|
+
CONF_ON_WAKE_WORD_DETECTED = "on_wake_word_detected"
|
44
48
|
CONF_PROBABILITY_CUTOFF = "probability_cutoff"
|
45
49
|
CONF_SLIDING_WINDOW_AVERAGE_SIZE = "sliding_window_average_size"
|
46
|
-
|
50
|
+
CONF_SLIDING_WINDOW_SIZE = "sliding_window_size"
|
51
|
+
CONF_TENSOR_ARENA_SIZE = "tensor_arena_size"
|
52
|
+
CONF_VAD = "vad"
|
47
53
|
|
48
54
|
TYPE_HTTP = "http"
|
49
55
|
|
@@ -98,12 +104,14 @@ GIT_SCHEMA = cv.All(
|
|
98
104
|
_process_git_source,
|
99
105
|
)
|
100
106
|
|
101
|
-
|
107
|
+
|
102
108
|
KEY_AUTHOR = "author"
|
103
|
-
KEY_WEBSITE = "website"
|
104
|
-
KEY_VERSION = "version"
|
105
109
|
KEY_MICRO = "micro"
|
106
110
|
KEY_MINIMUM_ESPHOME_VERSION = "minimum_esphome_version"
|
111
|
+
KEY_TRAINED_LANGUAGES = "trained_languages"
|
112
|
+
KEY_VERSION = "version"
|
113
|
+
KEY_WAKE_WORD = "wake_word"
|
114
|
+
KEY_WEBSITE = "website"
|
107
115
|
|
108
116
|
MANIFEST_SCHEMA_V1 = cv.Schema(
|
109
117
|
{
|
@@ -125,6 +133,29 @@ MANIFEST_SCHEMA_V1 = cv.Schema(
|
|
125
133
|
}
|
126
134
|
)
|
127
135
|
|
136
|
+
MANIFEST_SCHEMA_V2 = cv.Schema(
|
137
|
+
{
|
138
|
+
cv.Required(CONF_TYPE): "micro",
|
139
|
+
cv.Required(CONF_MODEL): cv.string,
|
140
|
+
cv.Required(KEY_AUTHOR): cv.string,
|
141
|
+
cv.Required(KEY_VERSION): cv.All(cv.int_, 2),
|
142
|
+
cv.Required(KEY_WAKE_WORD): cv.string,
|
143
|
+
cv.Required(KEY_TRAINED_LANGUAGES): cv.ensure_list(cv.string),
|
144
|
+
cv.Optional(KEY_WEBSITE): cv.url,
|
145
|
+
cv.Required(KEY_MICRO): cv.Schema(
|
146
|
+
{
|
147
|
+
cv.Required(CONF_FEATURE_STEP_SIZE): cv.int_range(min=0, max=30),
|
148
|
+
cv.Required(CONF_TENSOR_ARENA_SIZE): cv.int_,
|
149
|
+
cv.Required(CONF_PROBABILITY_CUTOFF): cv.float_,
|
150
|
+
cv.Required(CONF_SLIDING_WINDOW_SIZE): cv.positive_int,
|
151
|
+
cv.Required(KEY_MINIMUM_ESPHOME_VERSION): cv.All(
|
152
|
+
cv.version_number, cv.validate_esphome_version
|
153
|
+
),
|
154
|
+
}
|
155
|
+
),
|
156
|
+
}
|
157
|
+
)
|
158
|
+
|
128
159
|
|
129
160
|
def _compute_local_file_path(config: dict) -> Path:
|
130
161
|
url = config[CONF_URL]
|
@@ -135,6 +166,24 @@ def _compute_local_file_path(config: dict) -> Path:
|
|
135
166
|
return base_dir / key
|
136
167
|
|
137
168
|
|
169
|
+
def _convert_manifest_v1_to_v2(v1_manifest):
|
170
|
+
v2_manifest = v1_manifest.copy()
|
171
|
+
|
172
|
+
v2_manifest[KEY_VERSION] = 2
|
173
|
+
v2_manifest[KEY_MICRO][CONF_SLIDING_WINDOW_SIZE] = v1_manifest[KEY_MICRO][
|
174
|
+
CONF_SLIDING_WINDOW_AVERAGE_SIZE
|
175
|
+
]
|
176
|
+
del v2_manifest[KEY_MICRO][CONF_SLIDING_WINDOW_AVERAGE_SIZE]
|
177
|
+
v2_manifest[KEY_MICRO][
|
178
|
+
CONF_TENSOR_ARENA_SIZE
|
179
|
+
] = 45672 # Original Inception-based V1 manifest models require a minimum of 45672 bytes
|
180
|
+
v2_manifest[KEY_MICRO][
|
181
|
+
CONF_FEATURE_STEP_SIZE
|
182
|
+
] = 20 # Original Inception-based V1 manifest models use a 20 ms feature step size
|
183
|
+
|
184
|
+
return v2_manifest
|
185
|
+
|
186
|
+
|
138
187
|
def _download_file(url: str, path: Path) -> bytes:
|
139
188
|
if not external_files.has_remote_file_changed(url, path):
|
140
189
|
_LOGGER.debug("Remote file has not changed, skipping download")
|
@@ -155,6 +204,24 @@ def _download_file(url: str, path: Path) -> bytes:
|
|
155
204
|
return req.content
|
156
205
|
|
157
206
|
|
207
|
+
def _validate_manifest_version(manifest_data):
|
208
|
+
if manifest_version := manifest_data.get(KEY_VERSION):
|
209
|
+
if manifest_version == 1:
|
210
|
+
try:
|
211
|
+
MANIFEST_SCHEMA_V1(manifest_data)
|
212
|
+
except cv.Invalid as e:
|
213
|
+
raise cv.Invalid(f"Invalid manifest file: {e}") from e
|
214
|
+
elif manifest_version == 2:
|
215
|
+
try:
|
216
|
+
MANIFEST_SCHEMA_V2(manifest_data)
|
217
|
+
except cv.Invalid as e:
|
218
|
+
raise cv.Invalid(f"Invalid manifest file: {e}") from e
|
219
|
+
else:
|
220
|
+
raise cv.Invalid("Invalid manifest version")
|
221
|
+
else:
|
222
|
+
raise cv.Invalid("Invalid manifest file, missing 'version' key.")
|
223
|
+
|
224
|
+
|
158
225
|
def _process_http_source(config):
|
159
226
|
url = config[CONF_URL]
|
160
227
|
path = _compute_local_file_path(config)
|
@@ -167,11 +234,6 @@ def _process_http_source(config):
|
|
167
234
|
if not isinstance(manifest_data, dict):
|
168
235
|
raise cv.Invalid("Manifest file must contain a JSON object")
|
169
236
|
|
170
|
-
try:
|
171
|
-
MANIFEST_SCHEMA_V1(manifest_data)
|
172
|
-
except cv.Invalid as e:
|
173
|
-
raise cv.Invalid(f"Invalid manifest file: {e}") from e
|
174
|
-
|
175
237
|
model = manifest_data[CONF_MODEL]
|
176
238
|
model_url = urljoin(url, model)
|
177
239
|
|
@@ -206,7 +268,7 @@ def _validate_source_model_name(value):
|
|
206
268
|
return MODEL_SOURCE_SCHEMA(
|
207
269
|
{
|
208
270
|
CONF_TYPE: TYPE_HTTP,
|
209
|
-
CONF_URL: f"https://github.com/esphome/micro-wake-word-models/raw/main/models/{value}.json",
|
271
|
+
CONF_URL: f"https://github.com/esphome/micro-wake-word-models/raw/main/models/v2/{value}.json",
|
210
272
|
}
|
211
273
|
)
|
212
274
|
|
@@ -260,18 +322,57 @@ MODEL_SOURCE_SCHEMA = cv.Any(
|
|
260
322
|
msg="Not a valid model name, local path, http(s) url, or github shorthand",
|
261
323
|
)
|
262
324
|
|
325
|
+
MODEL_SCHEMA = cv.Schema(
|
326
|
+
{
|
327
|
+
cv.Optional(CONF_MODEL): MODEL_SOURCE_SCHEMA,
|
328
|
+
cv.Optional(CONF_PROBABILITY_CUTOFF): cv.percentage,
|
329
|
+
cv.Optional(CONF_SLIDING_WINDOW_SIZE): cv.positive_int,
|
330
|
+
cv.GenerateID(CONF_RAW_DATA_ID): cv.declare_id(cg.uint8),
|
331
|
+
}
|
332
|
+
)
|
333
|
+
|
334
|
+
# Provide a default VAD model that could be overridden
|
335
|
+
VAD_MODEL_SCHEMA = MODEL_SCHEMA.extend(
|
336
|
+
cv.Schema(
|
337
|
+
{
|
338
|
+
cv.Optional(
|
339
|
+
CONF_MODEL,
|
340
|
+
default="vad",
|
341
|
+
): MODEL_SOURCE_SCHEMA,
|
342
|
+
}
|
343
|
+
)
|
344
|
+
)
|
345
|
+
|
346
|
+
|
347
|
+
def _maybe_empty_vad_schema(value):
|
348
|
+
# Idea borrowed from uart/__init__.py's ``maybe_empty_debug`` function. Accessed 2 July 2024.
|
349
|
+
# Loads a default VAD model without any parameters overridden.
|
350
|
+
if value is None:
|
351
|
+
value = {}
|
352
|
+
return VAD_MODEL_SCHEMA(value)
|
353
|
+
|
354
|
+
|
263
355
|
CONFIG_SCHEMA = cv.All(
|
264
356
|
cv.Schema(
|
265
357
|
{
|
266
358
|
cv.GenerateID(): cv.declare_id(MicroWakeWord),
|
267
359
|
cv.GenerateID(CONF_MICROPHONE): cv.use_id(microphone.Microphone),
|
268
|
-
cv.
|
269
|
-
|
360
|
+
cv.Required(CONF_MODELS): cv.ensure_list(
|
361
|
+
cv.maybe_simple_value(MODEL_SCHEMA, key=CONF_MODEL)
|
362
|
+
),
|
270
363
|
cv.Optional(CONF_ON_WAKE_WORD_DETECTED): automation.validate_automation(
|
271
364
|
single=True
|
272
365
|
),
|
273
|
-
cv.
|
274
|
-
cv.
|
366
|
+
cv.Optional(CONF_VAD): _maybe_empty_vad_schema,
|
367
|
+
cv.Optional(CONF_MODEL): cv.invalid(
|
368
|
+
f"The {CONF_MODEL} parameter has moved to be a list element under the {CONF_MODELS} parameter."
|
369
|
+
),
|
370
|
+
cv.Optional(CONF_PROBABILITY_CUTOFF): cv.invalid(
|
371
|
+
f"The {CONF_PROBABILITY_CUTOFF} parameter has moved to be a list element under the {CONF_MODELS} parameter."
|
372
|
+
),
|
373
|
+
cv.Optional(CONF_SLIDING_WINDOW_AVERAGE_SIZE): cv.invalid(
|
374
|
+
f"The {CONF_SLIDING_WINDOW_AVERAGE_SIZE} parameter has been renamed to {CONF_SLIDING_WINDOW_SIZE} and moved to be a list element under the {CONF_MODELS} parameter."
|
375
|
+
),
|
275
376
|
}
|
276
377
|
).extend(cv.COMPONENT_SCHEMA),
|
277
378
|
cv.only_with_esp_idf,
|
@@ -282,19 +383,58 @@ def _load_model_data(manifest_path: Path):
|
|
282
383
|
with open(manifest_path, encoding="utf-8") as f:
|
283
384
|
manifest = json.load(f)
|
284
385
|
|
285
|
-
|
286
|
-
MANIFEST_SCHEMA_V1(manifest)
|
287
|
-
except cv.Invalid as e:
|
288
|
-
raise EsphomeError(f"Invalid manifest file: {e}") from e
|
386
|
+
_validate_manifest_version(manifest)
|
289
387
|
|
290
388
|
model_path = manifest_path.parent / manifest[CONF_MODEL]
|
291
389
|
|
292
390
|
with open(model_path, "rb") as f:
|
293
391
|
model = f.read()
|
294
392
|
|
393
|
+
if manifest.get(KEY_VERSION) == 1:
|
394
|
+
manifest = _convert_manifest_v1_to_v2(manifest)
|
395
|
+
|
295
396
|
return manifest, model
|
296
397
|
|
297
398
|
|
399
|
+
def _model_config_to_manifest_data(model_config):
|
400
|
+
if model_config[CONF_TYPE] == TYPE_GIT:
|
401
|
+
# compute path to model file
|
402
|
+
key = f"{model_config[CONF_URL]}@{model_config.get(CONF_REF)}"
|
403
|
+
base_dir = Path(CORE.data_dir) / DOMAIN
|
404
|
+
h = hashlib.new("sha256")
|
405
|
+
h.update(key.encode())
|
406
|
+
file: Path = base_dir / h.hexdigest()[:8] / model_config[CONF_FILE]
|
407
|
+
|
408
|
+
elif model_config[CONF_TYPE] == TYPE_LOCAL:
|
409
|
+
file = Path(model_config[CONF_PATH])
|
410
|
+
|
411
|
+
elif model_config[CONF_TYPE] == TYPE_HTTP:
|
412
|
+
file = _compute_local_file_path(model_config) / "manifest.json"
|
413
|
+
|
414
|
+
else:
|
415
|
+
raise ValueError("Unsupported config type: {model_config[CONF_TYPE]}")
|
416
|
+
|
417
|
+
return _load_model_data(file)
|
418
|
+
|
419
|
+
|
420
|
+
def _feature_step_size_validate(config):
|
421
|
+
features_step_size = None
|
422
|
+
|
423
|
+
for model_parameters in config[CONF_MODELS]:
|
424
|
+
model_config = model_parameters.get(CONF_MODEL)
|
425
|
+
manifest, _ = _model_config_to_manifest_data(model_config)
|
426
|
+
|
427
|
+
model_step_size = manifest[KEY_MICRO][CONF_FEATURE_STEP_SIZE]
|
428
|
+
|
429
|
+
if features_step_size is None:
|
430
|
+
features_step_size = model_step_size
|
431
|
+
elif features_step_size != model_step_size:
|
432
|
+
raise cv.Invalid("Cannot load models with different features step sizes.")
|
433
|
+
|
434
|
+
|
435
|
+
FINAL_VALIDATE_SCHEMA = _feature_step_size_validate
|
436
|
+
|
437
|
+
|
298
438
|
async def to_code(config):
|
299
439
|
var = cg.new_Pvariable(config[CONF_ID])
|
300
440
|
await cg.register_component(var, config)
|
@@ -302,58 +442,67 @@ async def to_code(config):
|
|
302
442
|
mic = await cg.get_variable(config[CONF_MICROPHONE])
|
303
443
|
cg.add(var.set_microphone(mic))
|
304
444
|
|
305
|
-
if on_wake_word_detection_config := config.get(CONF_ON_WAKE_WORD_DETECTED):
|
306
|
-
await automation.build_automation(
|
307
|
-
var.get_wake_word_detected_trigger(),
|
308
|
-
[(cg.std_string, "wake_word")],
|
309
|
-
on_wake_word_detection_config,
|
310
|
-
)
|
311
|
-
|
312
445
|
esp32.add_idf_component(
|
313
446
|
name="esp-tflite-micro",
|
314
447
|
repo="https://github.com/espressif/esp-tflite-micro",
|
448
|
+
ref="v1.3.1",
|
315
449
|
)
|
316
450
|
|
317
451
|
cg.add_build_flag("-DTF_LITE_STATIC_MEMORY")
|
318
452
|
cg.add_build_flag("-DTF_LITE_DISABLE_X86_NEON")
|
319
453
|
cg.add_build_flag("-DESP_NN")
|
320
454
|
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
h = hashlib.new("sha256")
|
328
|
-
h.update(key.encode())
|
329
|
-
file: Path = base_dir / h.hexdigest()[:8] / model_config[CONF_FILE]
|
330
|
-
|
331
|
-
elif model_config[CONF_TYPE] == TYPE_LOCAL:
|
332
|
-
file = Path(model_config[CONF_PATH])
|
455
|
+
if on_wake_word_detection_config := config.get(CONF_ON_WAKE_WORD_DETECTED):
|
456
|
+
await automation.build_automation(
|
457
|
+
var.get_wake_word_detected_trigger(),
|
458
|
+
[(cg.std_string, "wake_word")],
|
459
|
+
on_wake_word_detection_config,
|
460
|
+
)
|
333
461
|
|
334
|
-
|
335
|
-
|
462
|
+
if vad_model := config.get(CONF_VAD):
|
463
|
+
cg.add_define("USE_MICRO_WAKE_WORD_VAD")
|
336
464
|
|
337
|
-
|
338
|
-
|
465
|
+
# Use the general model loading code for the VAD codegen
|
466
|
+
config[CONF_MODELS].append(vad_model)
|
339
467
|
|
340
|
-
|
468
|
+
for model_parameters in config[CONF_MODELS]:
|
469
|
+
model_config = model_parameters.get(CONF_MODEL)
|
470
|
+
data = []
|
471
|
+
manifest, data = _model_config_to_manifest_data(model_config)
|
341
472
|
|
342
|
-
|
343
|
-
|
344
|
-
cg.add(var.set_model_start(prog_arr))
|
473
|
+
rhs = [HexInt(x) for x in data]
|
474
|
+
prog_arr = cg.progmem_array(model_parameters[CONF_RAW_DATA_ID], rhs)
|
345
475
|
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
)
|
354
|
-
cg.add(var.set_sliding_window_average_size(sliding_window_average_size))
|
476
|
+
probability_cutoff = model_parameters.get(
|
477
|
+
CONF_PROBABILITY_CUTOFF, manifest[KEY_MICRO][CONF_PROBABILITY_CUTOFF]
|
478
|
+
)
|
479
|
+
sliding_window_size = model_parameters.get(
|
480
|
+
CONF_SLIDING_WINDOW_SIZE,
|
481
|
+
manifest[KEY_MICRO][CONF_SLIDING_WINDOW_SIZE],
|
482
|
+
)
|
355
483
|
|
356
|
-
|
484
|
+
if manifest[KEY_WAKE_WORD] == "vad":
|
485
|
+
cg.add(
|
486
|
+
var.add_vad_model(
|
487
|
+
prog_arr,
|
488
|
+
probability_cutoff,
|
489
|
+
sliding_window_size,
|
490
|
+
manifest[KEY_MICRO][CONF_TENSOR_ARENA_SIZE],
|
491
|
+
)
|
492
|
+
)
|
493
|
+
else:
|
494
|
+
cg.add(
|
495
|
+
var.add_wake_word_model(
|
496
|
+
prog_arr,
|
497
|
+
probability_cutoff,
|
498
|
+
sliding_window_size,
|
499
|
+
manifest[KEY_WAKE_WORD],
|
500
|
+
manifest[KEY_MICRO][CONF_TENSOR_ARENA_SIZE],
|
501
|
+
)
|
502
|
+
)
|
503
|
+
|
504
|
+
cg.add(var.set_features_step_size(manifest[KEY_MICRO][CONF_FEATURE_STEP_SIZE]))
|
505
|
+
cg.add_library("kahrendt/ESPMicroSpeechFeatures", "1.0.0")
|
357
506
|
|
358
507
|
|
359
508
|
MICRO_WAKE_WORD_ACTION_SCHEMA = cv.Schema({cv.GenerateID(): cv.use_id(MicroWakeWord)})
|