esphome 2024.6.6__py3-none-any.whl → 2024.7.0b1__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/cover/cover.h +2 -2
- esphome/components/esp32_camera/__init__.py +6 -3
- esphome/components/ethernet/ethernet_component.cpp +3 -2
- esphome/components/font/__init__.py +2 -28
- 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 +8 -2
- esphome/components/heatpumpir/heatpumpir.cpp +6 -0
- esphome/components/heatpumpir/heatpumpir.h +6 -0
- esphome/components/http_request/update/http_request_update.cpp +6 -7
- esphome/components/http_request/update/http_request_update.h +0 -3
- esphome/components/image/__init__.py +2 -29
- esphome/components/improv_serial/improv_serial_component.cpp +8 -8
- 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 +203 -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/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/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/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 +1 -1
- 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 +1 -1
- esphome/core/helpers.h +1 -1
- esphome/external_files.py +26 -0
- {esphome-2024.6.6.dist-info → esphome-2024.7.0b1.dist-info}/METADATA +1 -1
- {esphome-2024.6.6.dist-info → esphome-2024.7.0b1.dist-info}/RECORD +77 -71
- esphome/components/micro_wake_word/audio_preprocessor_int8_model_data.h +0 -493
- {esphome-2024.6.6.dist-info → esphome-2024.7.0b1.dist-info}/LICENSE +0 -0
- {esphome-2024.6.6.dist-info → esphome-2024.7.0b1.dist-info}/WHEEL +0 -0
- {esphome-2024.6.6.dist-info → esphome-2024.7.0b1.dist-info}/entry_points.txt +0 -0
- {esphome-2024.6.6.dist-info → esphome-2024.7.0b1.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,55 @@ 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
|
-
cv.Optional(CONF_SLIDING_WINDOW_AVERAGE_SIZE): cv.positive_int,
|
360
|
+
cv.Required(CONF_MODELS): cv.ensure_list(MODEL_SCHEMA),
|
270
361
|
cv.Optional(CONF_ON_WAKE_WORD_DETECTED): automation.validate_automation(
|
271
362
|
single=True
|
272
363
|
),
|
273
|
-
cv.
|
274
|
-
cv.
|
364
|
+
cv.Optional(CONF_VAD): _maybe_empty_vad_schema,
|
365
|
+
cv.Optional(CONF_MODEL): cv.invalid(
|
366
|
+
f"The {CONF_MODEL} parameter has moved to be a list element under the {CONF_MODELS} parameter."
|
367
|
+
),
|
368
|
+
cv.Optional(CONF_PROBABILITY_CUTOFF): cv.invalid(
|
369
|
+
f"The {CONF_PROBABILITY_CUTOFF} parameter has moved to be a list element under the {CONF_MODELS} parameter."
|
370
|
+
),
|
371
|
+
cv.Optional(CONF_SLIDING_WINDOW_AVERAGE_SIZE): cv.invalid(
|
372
|
+
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."
|
373
|
+
),
|
275
374
|
}
|
276
375
|
).extend(cv.COMPONENT_SCHEMA),
|
277
376
|
cv.only_with_esp_idf,
|
@@ -282,19 +381,58 @@ def _load_model_data(manifest_path: Path):
|
|
282
381
|
with open(manifest_path, encoding="utf-8") as f:
|
283
382
|
manifest = json.load(f)
|
284
383
|
|
285
|
-
|
286
|
-
MANIFEST_SCHEMA_V1(manifest)
|
287
|
-
except cv.Invalid as e:
|
288
|
-
raise EsphomeError(f"Invalid manifest file: {e}") from e
|
384
|
+
_validate_manifest_version(manifest)
|
289
385
|
|
290
386
|
model_path = manifest_path.parent / manifest[CONF_MODEL]
|
291
387
|
|
292
388
|
with open(model_path, "rb") as f:
|
293
389
|
model = f.read()
|
294
390
|
|
391
|
+
if manifest.get(KEY_VERSION) == 1:
|
392
|
+
manifest = _convert_manifest_v1_to_v2(manifest)
|
393
|
+
|
295
394
|
return manifest, model
|
296
395
|
|
297
396
|
|
397
|
+
def _model_config_to_manifest_data(model_config):
|
398
|
+
if model_config[CONF_TYPE] == TYPE_GIT:
|
399
|
+
# compute path to model file
|
400
|
+
key = f"{model_config[CONF_URL]}@{model_config.get(CONF_REF)}"
|
401
|
+
base_dir = Path(CORE.data_dir) / DOMAIN
|
402
|
+
h = hashlib.new("sha256")
|
403
|
+
h.update(key.encode())
|
404
|
+
file: Path = base_dir / h.hexdigest()[:8] / model_config[CONF_FILE]
|
405
|
+
|
406
|
+
elif model_config[CONF_TYPE] == TYPE_LOCAL:
|
407
|
+
file = Path(model_config[CONF_PATH])
|
408
|
+
|
409
|
+
elif model_config[CONF_TYPE] == TYPE_HTTP:
|
410
|
+
file = _compute_local_file_path(model_config) / "manifest.json"
|
411
|
+
|
412
|
+
else:
|
413
|
+
raise ValueError("Unsupported config type: {model_config[CONF_TYPE]}")
|
414
|
+
|
415
|
+
return _load_model_data(file)
|
416
|
+
|
417
|
+
|
418
|
+
def _feature_step_size_validate(config):
|
419
|
+
features_step_size = None
|
420
|
+
|
421
|
+
for model_parameters in config[CONF_MODELS]:
|
422
|
+
model_config = model_parameters.get(CONF_MODEL)
|
423
|
+
manifest, _ = _model_config_to_manifest_data(model_config)
|
424
|
+
|
425
|
+
model_step_size = manifest[KEY_MICRO][CONF_FEATURE_STEP_SIZE]
|
426
|
+
|
427
|
+
if features_step_size is None:
|
428
|
+
features_step_size = model_step_size
|
429
|
+
elif features_step_size != model_step_size:
|
430
|
+
raise cv.Invalid("Cannot load models with different features step sizes.")
|
431
|
+
|
432
|
+
|
433
|
+
FINAL_VALIDATE_SCHEMA = _feature_step_size_validate
|
434
|
+
|
435
|
+
|
298
436
|
async def to_code(config):
|
299
437
|
var = cg.new_Pvariable(config[CONF_ID])
|
300
438
|
await cg.register_component(var, config)
|
@@ -302,58 +440,67 @@ async def to_code(config):
|
|
302
440
|
mic = await cg.get_variable(config[CONF_MICROPHONE])
|
303
441
|
cg.add(var.set_microphone(mic))
|
304
442
|
|
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
443
|
esp32.add_idf_component(
|
313
444
|
name="esp-tflite-micro",
|
314
445
|
repo="https://github.com/espressif/esp-tflite-micro",
|
446
|
+
ref="v1.3.1",
|
315
447
|
)
|
316
448
|
|
317
449
|
cg.add_build_flag("-DTF_LITE_STATIC_MEMORY")
|
318
450
|
cg.add_build_flag("-DTF_LITE_DISABLE_X86_NEON")
|
319
451
|
cg.add_build_flag("-DESP_NN")
|
320
452
|
|
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])
|
453
|
+
if on_wake_word_detection_config := config.get(CONF_ON_WAKE_WORD_DETECTED):
|
454
|
+
await automation.build_automation(
|
455
|
+
var.get_wake_word_detected_trigger(),
|
456
|
+
[(cg.std_string, "wake_word")],
|
457
|
+
on_wake_word_detection_config,
|
458
|
+
)
|
333
459
|
|
334
|
-
|
335
|
-
|
460
|
+
if vad_model := config.get(CONF_VAD):
|
461
|
+
cg.add_define("USE_MICRO_WAKE_WORD_VAD")
|
336
462
|
|
337
|
-
|
338
|
-
|
463
|
+
# Use the general model loading code for the VAD codegen
|
464
|
+
config[CONF_MODELS].append(vad_model)
|
339
465
|
|
340
|
-
|
466
|
+
for model_parameters in config[CONF_MODELS]:
|
467
|
+
model_config = model_parameters.get(CONF_MODEL)
|
468
|
+
data = []
|
469
|
+
manifest, data = _model_config_to_manifest_data(model_config)
|
341
470
|
|
342
|
-
|
343
|
-
|
344
|
-
cg.add(var.set_model_start(prog_arr))
|
471
|
+
rhs = [HexInt(x) for x in data]
|
472
|
+
prog_arr = cg.progmem_array(model_parameters[CONF_RAW_DATA_ID], rhs)
|
345
473
|
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
)
|
354
|
-
cg.add(var.set_sliding_window_average_size(sliding_window_average_size))
|
474
|
+
probability_cutoff = model_parameters.get(
|
475
|
+
CONF_PROBABILITY_CUTOFF, manifest[KEY_MICRO][CONF_PROBABILITY_CUTOFF]
|
476
|
+
)
|
477
|
+
sliding_window_size = model_parameters.get(
|
478
|
+
CONF_SLIDING_WINDOW_SIZE,
|
479
|
+
manifest[KEY_MICRO][CONF_SLIDING_WINDOW_SIZE],
|
480
|
+
)
|
355
481
|
|
356
|
-
|
482
|
+
if manifest[KEY_WAKE_WORD] == "vad":
|
483
|
+
cg.add(
|
484
|
+
var.add_vad_model(
|
485
|
+
prog_arr,
|
486
|
+
probability_cutoff,
|
487
|
+
sliding_window_size,
|
488
|
+
manifest[KEY_MICRO][CONF_TENSOR_ARENA_SIZE],
|
489
|
+
)
|
490
|
+
)
|
491
|
+
else:
|
492
|
+
cg.add(
|
493
|
+
var.add_wake_word_model(
|
494
|
+
prog_arr,
|
495
|
+
probability_cutoff,
|
496
|
+
sliding_window_size,
|
497
|
+
manifest[KEY_WAKE_WORD],
|
498
|
+
manifest[KEY_MICRO][CONF_TENSOR_ARENA_SIZE],
|
499
|
+
)
|
500
|
+
)
|
501
|
+
|
502
|
+
cg.add(var.set_features_step_size(manifest[KEY_MICRO][CONF_FEATURE_STEP_SIZE]))
|
503
|
+
cg.add_library("kahrendt/ESPMicroSpeechFeatures", "1.0.0")
|
357
504
|
|
358
505
|
|
359
506
|
MICRO_WAKE_WORD_ACTION_SCHEMA = cv.Schema({cv.GenerateID(): cv.use_id(MicroWakeWord)})
|