summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMalik Talha <talhamalik727x@gmail.com>2023-09-28 15:50:31 +0500
committerJan-Simon Moeller <jsmoeller@linuxfoundation.org>2023-10-05 13:25:58 +0000
commit35e7b9d2774e8d104d0693e0a0758363c2afb16d (patch)
tree926eb79fc153cf68ed6b7a54cf68f6894ef50f07
parent39319e3a3bdfcc6c6da47035bf04b4255aec09e5 (diff)
Add dependencies for intent engine snips
This adds the libraries for the snips intent engine. Bug-AGL: SPEC-4856 Change-Id: I0acec6fdd1d0809ee2a0a52ee2c95cd86671d760 Signed-off-by: Malik Talha <talhamalik727x@gmail.com>
-rw-r--r--meta-offline-voice-agent/README.md82
-rw-r--r--meta-offline-voice-agent/recipes-blas/openblas/openblas-native_0.3.20.bb111
-rw-r--r--meta-offline-voice-agent/recipes-lapack/lapack/lapack_%.bbappend11
-rw-r--r--meta-offline-voice-agent/recipes-nlu/nlu-model/snips-model-agl_0.2.0.bb19
-rw-r--r--meta-offline-voice-agent/recipes-python/python3-joblib/python3-joblib_1.2.0.bb14
-rw-r--r--meta-offline-voice-agent/recipes-python/python3-numpy/python3-numpy/0001-Disable-runtimelibdirs-for-cross-compile.patch25
-rw-r--r--meta-offline-voice-agent/recipes-python/python3-numpy/python3-numpy/0001-Remove-using-library-directories-as-runtime-library-.patch48
-rw-r--r--meta-offline-voice-agent/recipes-python/python3-numpy/python3-numpy_%.bbappend6
-rw-r--r--meta-offline-voice-agent/recipes-python/python3-python-crfsuite/python3-python-crfsuite_0.9.9.bb12
-rw-r--r--meta-offline-voice-agent/recipes-python/python3-scikit-learn/files/0001-hack-around-numpy-get_include-to-force-looking-in-ta.patch563
-rw-r--r--meta-offline-voice-agent/recipes-python/python3-scikit-learn/python3-scikit-learn_0.24.2.bb36
-rw-r--r--meta-offline-voice-agent/recipes-python/python3-scipy/files/0001-Allow-passing-flags-via-FARCH-for-mach.patch44
-rw-r--r--meta-offline-voice-agent/recipes-python/python3-scipy/files/static-lib.patch32
-rw-r--r--meta-offline-voice-agent/recipes-python/python3-scipy/python3-beniget_0.4.1.bb11
-rw-r--r--meta-offline-voice-agent/recipes-python/python3-scipy/python3-pythran_0.11.0.bb14
-rw-r--r--meta-offline-voice-agent/recipes-python/python3-scipy/python3-scipy-native_1.8.1.bb44
-rw-r--r--meta-offline-voice-agent/recipes-python/python3-scipy/python3-scipy_1.8.1.bb52
-rw-r--r--meta-offline-voice-agent/recipes-python/python3-sklearn-crfsuite/python3-sklearn-crfsuite_0.3.6.bb27
-rw-r--r--meta-offline-voice-agent/recipes-python/python3-snips-inference/python3-num2words_0.5.12.bb16
-rw-r--r--meta-offline-voice-agent/recipes-python/python3-snips-inference/python3-pyaml_19.12.0.bb16
-rw-r--r--meta-offline-voice-agent/recipes-python/python3-snips-inference/python3-snips-inference-agl_0.2.0.bb52
-rw-r--r--meta-offline-voice-agent/recipes-python/python3-snips-inference/python3-snips-nlu-parsers-crates.inc176
-rw-r--r--meta-offline-voice-agent/recipes-python/python3-snips-inference/python3-snips-nlu-parsers_0.4.3.bb25
-rw-r--r--meta-offline-voice-agent/recipes-python/python3-snips-inference/python3-snips-nlu-utils-crates.inc64
-rw-r--r--meta-offline-voice-agent/recipes-python/python3-snips-inference/python3-snips-nlu-utils_0.9.1.bb20
-rw-r--r--meta-offline-voice-agent/recipes-python/python3-threadpoolctl/python3-threadpoolctl_3.1.0.bb29
-rw-r--r--meta-offline-voice-agent/recipes-vosk/vosk-kaldi/vosk-kaldi_git.bb4
-rw-r--r--meta-offline-voice-agent/recipes-vosk/vosk-model/vosk-model-small-en-us_0.15.bb3
28 files changed, 1551 insertions, 5 deletions
diff --git a/meta-offline-voice-agent/README.md b/meta-offline-voice-agent/README.md
new file mode 100644
index 00000000..abde819a
--- /dev/null
+++ b/meta-offline-voice-agent/README.md
@@ -0,0 +1,82 @@
+# Offline Speech Recognition and Command Execution
+The `meta-offline-voice-agent` is an AGL Layer that enables Offline Speech Recognition and Command Execution capabilities for Automotive Grade Linux.
+
+## Table of Contents
+- [Introduction](#introduction)
+- [Layer Status](#layer-status)
+- [Working Features](#working-features)
+- [Testing Features on AGL](#testing-features-on-agl)
+ - [Build Layer](#build-layer)
+ - [Test Vosk](#test-vosk)
+ - [Test Snips](#test-snips)
+- [Supported Targets](#supported-targets)
+- [Maintainers](#maintainers)
+
+## Introduction
+The `meta-offline-voice-agent` layer integrates the Vosk API and Snips (Inference Only) to provide offline speech recognition and command execution for Automotive Grade Linux. The layer is based on the Kaldi ASR Toolkit, which allows for accurate and efficient speech recognition in the AGL platform, and Snips which provides us with a lightweight Natural Language Intent Engine.
+
+## Layer Status
+**Status**: *WIP (Work In Progress)*
+
+This layer is currently in development and integrates the Vosk, Snips (Inference Only), and RASA libraries. Speech recognition has been verified using test scripts from the [vosk-api python examples](https://github.com/alphacep/vosk-api/tree/master/python/example). Additionally, Snips has undergone testing and verification to ensure its functionality. Currently, work on integrating RASA and command execution is still in progress.
+
+## External Dependencies
+This layer does not have any external layer dependency.
+
+## Working Features
+The following features are currently working in the `meta-offline-voice-agent` layer:
+- [Vosk API (Python)](https://github.com/alphacep/vosk-api/tree/master/python)
+- [Vosk Websocket Server](https://github.com/alphacep/vosk-server/tree/master/websocket)
+- [Snips Inference](https://github.com/malik727/snips-inference-agl)
+
+## Testing Features on AGL
+
+### Build Layer
+In order to test the features of this layer you first need to build it as part of your final AGL image. First of all ensure that you have all the external layer dependencies included. Then you can use the following set of commands to initialize and build this layer into the `agl-demo-platform` qemux86_64 image:
+```shell
+$ source master/meta-agl/scripts/aglsetup.sh -m qemux86-64 -b build-master agl-demo agl-devel agl-offline-voice-agent
+$ source agl-init-build-env
+$ bitbake agl-demo-platform
+```
+
+The build can take anywhere from 6 hours to 24 hours or even more depending upon compute power of your machine. After the build completes you can use the following command to boot into your AGL image: (you need to install QEMU if not already for the command to work)
+```shell
+$ runqemu tmp/deploy/images/qemux86-64/agl-demo-platform-qemux86-64.qemuboot.conf kvm serialstdio slirp publicvnc audio
+```
+
+### Test Vosk
+(**Not Recommended**) The simplest way to test Vosk API is by using the following command:
+```shell
+$ ptest-runner python3-vosk-api
+```
+
+In order for the above command to work you need to turn on `ptests` by adding the following lines to your `local.conf` that can be found at `meta-agl-devel/templates/feature/agl-offline-voice-agent/50_local.conf.inc`:
+```shell
+DISTRO_FEATURES:append = " ptest"
+EXTRA_IMAGE_FEATURES += "ptest-pkgs"
+```
+
+The above method may be the easiest one but it's not recommended because `ptests` increase the image build times by a substantial amount. You can look into the official [vosk-api docs](https://alphacephei.com/vosk/install) for usage and other ways of testing.
+
+### Test Snips
+(**Important**) Currently, there are some library linking issues between NumPy, SciPy, and OpenBLAS. While we investigate and fix them you need to use `LD_PRELOAD` method as a workaround for Snips to work properly. Input the following command as soon as you boot into the target image:
+```shell
+$ export LD_PRELOAD=/usr/lib/libopenblas.so.0
+```
+
+
+In order to test the Snips NLU Intent Engine you can use the sample [pre-trained model](https://github.com/malik727/snips-model-agl), by default it automatically gets built into the target image when you include this layer. To perform inference using this model you can run the following command inside your target image:
+```shell
+$ snips-inference parse /usr/share/nlu/snips/model/ -q "your command here"
+```
+
+This is just a sample model and may not be able to handle all types of commands. You can always train your own intent engine model using your custom dataset, for more details on how to do that you can look into the README files of [snips-sdk-agl](https://github.com/malik727/snips-sdk-agl), [snips-model-agl](https://github.com/malik727/snips-model-agl), and [snips-inference-agl](https://github.com/malik727/snips-inference-agl).
+
+## Supported Targets
+Currently, the following targets are fully supported:
+- QEMU x86-64 (work in progress)
+
+## Maintainers
+- Malik Talha <talhamalik727x@gmail.com>
+- Aman Arora <aman.arora9848@gmail.com>
+
diff --git a/meta-offline-voice-agent/recipes-blas/openblas/openblas-native_0.3.20.bb b/meta-offline-voice-agent/recipes-blas/openblas/openblas-native_0.3.20.bb
new file mode 100644
index 00000000..ac14656f
--- /dev/null
+++ b/meta-offline-voice-agent/recipes-blas/openblas/openblas-native_0.3.20.bb
@@ -0,0 +1,111 @@
+#
+# Copyright (c) 2016 Intel Corporation. All rights reserved.
+# Copyright (c) 2019 Luxoft Sweden AB
+#
+# SPDX-License-Identifier: MIT
+#
+
+DESCRIPTION = "OpenBLAS is an optimized BLAS library based on GotoBLAS2 1.13 BSD version."
+SUMMARY = "OpenBLAS : An optimized BLAS library"
+AUTHOR = "Alexander Leiva <norxander@gmail.com>"
+HOMEPAGE = "http://www.openblas.net/"
+SECTION = "libs"
+LICENSE = "BSD-3-Clause"
+
+DEPENDS += "make libgfortran patchelf-native"
+
+LIC_FILES_CHKSUM = "file://LICENSE;md5=5adf4792c949a00013ce25d476a2abc0"
+
+SRC_URI = "git://github.com/xianyi/OpenBLAS.git;protocol=https;branch=develop"
+
+S = "${WORKDIR}/git"
+SRCREV = "0b678b19dc03f2a999d6e038814c4c50b9640a4e"
+
+# Used for TARGET=... , documented in TargetList.txt
+BLAS_X86_ARCH ?= "ATOM"
+BLAS_AARCH32_ARCH ?= "CORTEXA9"
+BLAS_AARCH64_ARCH ?= "ARMV8"
+BLAS_ARM_ARCH ?= "ARMV7"
+
+def map_arch(a, d):
+ import re
+ if re.match('i.86$', a): return d.getVar('BLAS_X86_ARCH')
+ elif re.match('x86_64$', a): return d.getVar('BLAS_X86_ARCH')
+ elif re.match('aarch32$', a): return d.getVar('BLAS_AARCH32_ARCH')
+ elif re.match('aarch64$', a): return d.getVar('BLAS_AARCH64_ARCH')
+ elif re.match('arm$', a): return d.getVar('BLAS_ARM_ARCH')
+ return a
+
+def map_bits(a, d):
+ import re
+ if re.match('i.86$', a): return 32
+ elif re.match('x86_64$', a): return 64
+ elif re.match('aarch32$', a): return 32
+ elif re.match('aarch64$', a): return 64
+ elif re.match('arm$', a): return 32
+ return 32
+
+def map_extra_options(a, d):
+ import re
+ if re.match('arm$', a): return '-mfpu=neon-vfpv4 -mfloat-abi=hard'
+ return ''
+
+PACKAGECONFIG[lapack] = ""
+PACKAGECONFIG[lapacke] = ""
+PACKAGECONFIG[cblas] = ""
+PACKAGECONFIG[affinity] = ""
+PACKAGECONFIG[openmp] = ""
+PACKAGECONFIG[dynarch] = ""
+
+PACKAGECONFIG ??= "openmp"
+
+inherit native
+
+do_compile () {
+ oe_runmake HOSTCC="${BUILD_CC}" \
+ CC="${TARGET_PREFIX}gcc ${TOOLCHAIN_OPTIONS} ${@map_extra_options(d.getVar('TARGET_ARCH', True), d)}" \
+ PREFIX=${exec_prefix} \
+ CROSS=1 \
+ CROSS_SUFFIX=${HOST_PREFIX} \
+ NO_STATIC=1 \
+ ${@bb.utils.contains('PACKAGECONFIG', 'lapack', 'NO_LAPACK=0', 'NO_LAPACK=1', d)} \
+ ${@bb.utils.contains('PACKAGECONFIG', 'lapacke', 'NO_LAPACKE=0', 'NO_LAPACKE=1', d)} \
+ ${@bb.utils.contains('PACKAGECONFIG', 'cblas', 'NO_CBLAS=0', 'NO_CBLAS=1', d)} \
+ ${@bb.utils.contains('PACKAGECONFIG', 'affinity', 'NO_AFFINITY=0', 'NO_AFFINITY=1', d)} \
+ ${@bb.utils.contains('PACKAGECONFIG', 'openmp', 'USE_OPENMP=1', 'USE_OPENMP=0', d)} \
+ ${@bb.utils.contains('PACKAGECONFIG', 'dynarch', 'DYNAMIC_ARCH=1', 'DYNAMIC_ARCH=0', d)} \
+ BINARY='${@map_bits(d.getVar('TARGET_ARCH', True), d)}' \
+ TARGET='${@map_arch(d.getVar('TARGET_ARCH', True), d)}'
+}
+
+do_install() {
+ oe_runmake HOSTCC="${BUILD_CC}" \
+ CC="${TARGET_PREFIX}gcc ${TOOLCHAIN_OPTIONS}" \
+ PREFIX=${exec_prefix} \
+ CROSS=1 \
+ CROSS_SUFFIX=${HOST_PREFIX} \
+ NO_STATIC=1 \
+ ${@bb.utils.contains('PACKAGECONFIG', 'lapack', 'NO_LAPACK=0', 'NO_LAPACK=1', d)} \
+ ${@bb.utils.contains('PACKAGECONFIG', 'lapacke', 'NO_LAPACKE=0', 'NO_LAPACKE=1', d)} \
+ ${@bb.utils.contains('PACKAGECONFIG', 'cblas', 'NO_CBLAS=0', 'NO_CBLAS=1', d)} \
+ ${@bb.utils.contains('PACKAGECONFIG', 'affinity', 'NO_AFFINITY=0', 'NO_AFFINITY=1', d)} \
+ ${@bb.utils.contains('PACKAGECONFIG', 'openmp', 'USE_OPENMP=1', 'USE_OPENMP=0', d)} \
+ ${@bb.utils.contains('PACKAGECONFIG', 'dynarch', 'DYNAMIC_ARCH=1', 'DYNAMIC_ARCH=0', d)} \
+ BINARY='${@map_bits(d.getVar('TARGET_ARCH', True), d)}' \
+ TARGET='${@map_arch(d.getVar('TARGET_ARCH', True), d)}' \
+ DESTDIR=${D} \
+ install
+
+
+ rm -rf ${D}${bindir}
+
+ cd ${D}${libdir}
+ cp -ar libopenblas*r*.so libblas.so.3
+ patchelf --set-soname libblas.so.3 libblas.so.3
+ ln -s libblas.so.3 libblas.so
+}
+
+FILES:${PN} = "${libdir}/lib*"
+FILES:${PN}-dev = "${includedir} ${libdir}/lib${PN}.a ${libdir}/libblas.a ${libdir}/cmake ${libdir}/pkgconfig ${libdir}/libopenblas.so ${libdir}/libblas.so"
+
+DEPENDS:remove:class-native = "libgfortran"
diff --git a/meta-offline-voice-agent/recipes-lapack/lapack/lapack_%.bbappend b/meta-offline-voice-agent/recipes-lapack/lapack/lapack_%.bbappend
new file mode 100644
index 00000000..d5cd8e7c
--- /dev/null
+++ b/meta-offline-voice-agent/recipes-lapack/lapack/lapack_%.bbappend
@@ -0,0 +1,11 @@
+DEPENDS += "openblas"
+DEPENDS:remove:class-native = "libgfortran"
+
+EXTRA_OECMAKE:append = " -DCBLAS=ON"
+EXTRA_OECMAKE += " -DUSE_OPTIMIZED_BLAS=1"
+
+do_install:append() {
+ rm -f ${D}${includedir}/cblas.h
+}
+
+BBCLASSEXTEND = "native"
diff --git a/meta-offline-voice-agent/recipes-nlu/nlu-model/snips-model-agl_0.2.0.bb b/meta-offline-voice-agent/recipes-nlu/nlu-model/snips-model-agl_0.2.0.bb
new file mode 100644
index 00000000..6d191baf
--- /dev/null
+++ b/meta-offline-voice-agent/recipes-nlu/nlu-model/snips-model-agl_0.2.0.bb
@@ -0,0 +1,19 @@
+SUMMARY = "Dataset and a pre-trained model for the Automotive Grade Linux's Snips NLU intent engine."
+HOMEPAGE = "https://github.com/malik727/snips-model-agl"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=ecab3ce0771d366e0f8e4ca058eb48e7"
+
+SRC_URI = " \
+ git://github.com/malik727/snips-model-agl.git;protocol=https;branch=main \
+"
+
+PV = "1.0.0+git${SRCPV}"
+SRCREV = "${AUTOREV}"
+S = "${WORKDIR}/git"
+
+do_install() {
+ install -d ${D}/usr/share/nlu/snips
+ cp -R ${WORKDIR}/git/* ${D}/usr/share/nlu/snips/
+}
+
+FILES:${PN} += " /usr/share/nlu/snips"
diff --git a/meta-offline-voice-agent/recipes-python/python3-joblib/python3-joblib_1.2.0.bb b/meta-offline-voice-agent/recipes-python/python3-joblib/python3-joblib_1.2.0.bb
new file mode 100644
index 00000000..ce896fd4
--- /dev/null
+++ b/meta-offline-voice-agent/recipes-python/python3-joblib/python3-joblib_1.2.0.bb
@@ -0,0 +1,14 @@
+SUMMARY = "Lightweight pipelining: using Python functions as pipeline jobs"
+HOMEPAGE = "https://github.com/joblib/joblib"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=2e481820abf0a70a18011a30153df066"
+
+PYPI_PACKAGE = "joblib"
+
+SRC_URI[md5sum] = "928a19e66a10f6cda32fb004440c70fb"
+SRC_URI[sha256sum] = "e1cee4a79e4af22881164f218d4311f60074197fb707e082e803b61f6d137018"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += "python3-pydoc"
+BBCLASSEXTEND = "native" \ No newline at end of file
diff --git a/meta-offline-voice-agent/recipes-python/python3-numpy/python3-numpy/0001-Disable-runtimelibdirs-for-cross-compile.patch b/meta-offline-voice-agent/recipes-python/python3-numpy/python3-numpy/0001-Disable-runtimelibdirs-for-cross-compile.patch
new file mode 100644
index 00000000..c96bb64d
--- /dev/null
+++ b/meta-offline-voice-agent/recipes-python/python3-numpy/python3-numpy/0001-Disable-runtimelibdirs-for-cross-compile.patch
@@ -0,0 +1,25 @@
+From 9729175ae0ee7b2c8641483b9dfd16051cc4ad23 Mon Sep 17 00:00:00 2001
+From: Greg Anders <greg@gpanders.com>
+Date: Mon, 2 Mar 2020 14:34:04 +0000
+Subject: [PATCH] Disable runtime_lib_dirs for cross compile
+
+---
+ numpy/distutils/system_info.py | 5 +----
+ 1 file changed, 1 insertion(+), 4 deletions(-)
+
+diff --git a/numpy/distutils/system_info.py b/numpy/distutils/system_info.py
+index 28c7b92..d1a92ab 100644
+--- a/numpy/distutils/system_info.py
++++ b/numpy/distutils/system_info.py
+@@ -669,10 +669,7 @@ class system_info(object):
+ return self.get_paths(self.section, key)
+
+ def get_runtime_lib_dirs(self, key='runtime_library_dirs'):
+- path = self.get_paths(self.section, key)
+- if path == ['']:
+- path = []
+- return path
++ return []
+
+ def get_include_dirs(self, key='include_dirs'):
+ return self.get_paths(self.section, key) \ No newline at end of file
diff --git a/meta-offline-voice-agent/recipes-python/python3-numpy/python3-numpy/0001-Remove-using-library-directories-as-runtime-library-.patch b/meta-offline-voice-agent/recipes-python/python3-numpy/python3-numpy/0001-Remove-using-library-directories-as-runtime-library-.patch
new file mode 100644
index 00000000..d7e818a8
--- /dev/null
+++ b/meta-offline-voice-agent/recipes-python/python3-numpy/python3-numpy/0001-Remove-using-library-directories-as-runtime-library-.patch
@@ -0,0 +1,48 @@
+From b14d1c1b684014a65b8b7ea0030f7f070a34e6c5 Mon Sep 17 00:00:00 2001
+From: Scott Murray <scott.murray@konsulko.com>
+Date: Tue, 4 Jul 2023 10:24:11 -0400
+Subject: [PATCH] Remove using library directories as runtime library
+ directories
+
+The code in calc_libraries_info in distutils/system_info.py converts
+library directories to runtime library directories, which seems to
+only make sense in an environment when the external libraries are not
+coming from standard system locations. It is actively harmful in the
+OE build environment since it results in sysroot paths getting put
+into RPATH in the resulting binaries. Remove that snippet of code so
+that module .so's do not trigger the rpath QA sanity checking.
+
+Upstream-Status: Inappropriate
+
+Signed-off-by: Scott Murray <scott.murray@konsulko.com>
+---
+ numpy/distutils/system_info.py | 13 -------------
+ 1 file changed, 13 deletions(-)
+
+diff --git a/numpy/distutils/system_info.py b/numpy/distutils/system_info.py
+index 656bc37..fb075a1 100644
+--- a/numpy/distutils/system_info.py
++++ b/numpy/distutils/system_info.py
+@@ -728,19 +728,6 @@ class system_info:
+ else:
+ log.info('Library %s was not found. Ignoring' % (lib))
+
+- if r_dirs:
+- i = self.check_libs(r_dirs, [lib])
+- if i is not None:
+- # Swap library keywords found to runtime_library_dirs
+- # the libraries are insisting on the user having defined
+- # them using the library_dirs, and not necessarily by
+- # runtime_library_dirs
+- del i['libraries']
+- i['runtime_library_dirs'] = i.pop('library_dirs')
+- dict_append(info, **i)
+- else:
+- log.info('Runtime library %s was not found. Ignoring' % (lib))
+-
+ return info
+
+ def set_info(self, **info):
+--
+2.40.1
+
diff --git a/meta-offline-voice-agent/recipes-python/python3-numpy/python3-numpy_%.bbappend b/meta-offline-voice-agent/recipes-python/python3-numpy/python3-numpy_%.bbappend
new file mode 100644
index 00000000..b8d1f144
--- /dev/null
+++ b/meta-offline-voice-agent/recipes-python/python3-numpy/python3-numpy_%.bbappend
@@ -0,0 +1,6 @@
+FILESEXTRAPATHS:prepend := "${THISDIR}/${BPN}:"
+
+SRC_URI += " \
+ file://0001-Disable-runtimelibdirs-for-cross-compile.patch \
+ file://0001-Remove-using-library-directories-as-runtime-library-.patch \
+ "
diff --git a/meta-offline-voice-agent/recipes-python/python3-python-crfsuite/python3-python-crfsuite_0.9.9.bb b/meta-offline-voice-agent/recipes-python/python3-python-crfsuite/python3-python-crfsuite_0.9.9.bb
new file mode 100644
index 00000000..19fb4cf6
--- /dev/null
+++ b/meta-offline-voice-agent/recipes-python/python3-python-crfsuite/python3-python-crfsuite_0.9.9.bb
@@ -0,0 +1,12 @@
+SUMMARY = "A python binding for crfsuite"
+HOMEPAGE = "https://github.com/scrapinghub/python-crfsuite"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=0a36d267a3ece77cbc8ebc95ca7e2edd"
+
+PYPI_PACKAGE = "python-crfsuite"
+
+SRC_URI[md5sum] = "01691860ad087f1270a78062ba0ded4c"
+SRC_URI[sha256sum] = "caa6261d6955466756f986b7fcfbd4fd50622963e3bdb5cc180c129c62b3a76d"
+
+inherit pypi setuptools3
diff --git a/meta-offline-voice-agent/recipes-python/python3-scikit-learn/files/0001-hack-around-numpy-get_include-to-force-looking-in-ta.patch b/meta-offline-voice-agent/recipes-python/python3-scikit-learn/files/0001-hack-around-numpy-get_include-to-force-looking-in-ta.patch
new file mode 100644
index 00000000..bd0f9458
--- /dev/null
+++ b/meta-offline-voice-agent/recipes-python/python3-scikit-learn/files/0001-hack-around-numpy-get_include-to-force-looking-in-ta.patch
@@ -0,0 +1,563 @@
+From eed8f56c787a251a6cad0f4291ca8f4055e463cf Mon Sep 17 00:00:00 2001
+From: Jack Mitchell <ml@embed.me.uk>
+Date: Fri, 22 Jan 2021 10:16:08 +0000
+Subject: [PATCH] hack around numpy get_include to force looking in target
+ sysroot
+
+---
+ sklearn/__check_build/setup.py | 4 ++--
+ sklearn/cluster/setup.py | 12 ++++++------
+ sklearn/datasets/setup.py | 4 ++--
+ sklearn/decomposition/setup.py | 6 +++---
+ sklearn/ensemble/setup.py | 22 +++++++++++-----------
+ sklearn/feature_extraction/setup.py | 4 ++--
+ sklearn/linear_model/setup.py | 8 ++++----
+ sklearn/manifold/setup.py | 6 +++---
+ sklearn/metrics/cluster/setup.py | 4 ++--
+ sklearn/neighbors/setup.py | 15 +++++++--------
+ sklearn/preprocessing/setup.py | 4 ++--
+ sklearn/setup.py | 4 ++--
+ sklearn/svm/setup.py | 11 ++++++-----
+ sklearn/tree/setup.py | 10 +++++-----
+ sklearn/utils/setup.py | 16 ++++++++--------
+ 15 files changed, 65 insertions(+), 65 deletions(-)
+
+diff --git a/sklearn/__check_build/setup.py b/sklearn/__check_build/setup.py
+index b8c30d9c8..e2bfc90ee 100644
+--- a/sklearn/__check_build/setup.py
++++ b/sklearn/__check_build/setup.py
+@@ -1,7 +1,7 @@
+ # Author: Virgile Fritsch <virgile.fritsch@inria.fr>
+ # License: BSD 3 clause
+
+-import numpy
++import numpy, os
+
+
+ def configuration(parent_package='', top_path=None):
+@@ -9,7 +9,7 @@ def configuration(parent_package='', top_path=None):
+ config = Configuration('__check_build', parent_package, top_path)
+ config.add_extension('_check_build',
+ sources=['_check_build.pyx'],
+- include_dirs=[numpy.get_include()])
++ include_dirs=[os.environ["NUMPY_INCLUDE_PATH"]])
+
+ return config
+
+diff --git a/sklearn/cluster/setup.py b/sklearn/cluster/setup.py
+index 48ed25c5c..bd395e3aa 100644
+--- a/sklearn/cluster/setup.py
++++ b/sklearn/cluster/setup.py
+@@ -2,7 +2,7 @@
+ # License: BSD 3 clause
+ import os
+
+-import numpy
++import numpy, os
+
+
+ def configuration(parent_package='', top_path=None):
+@@ -16,28 +16,28 @@ def configuration(parent_package='', top_path=None):
+
+ config.add_extension('_dbscan_inner',
+ sources=['_dbscan_inner.pyx'],
+- include_dirs=[numpy.get_include()],
++ include_dirs=[os.environ["NUMPY_INCLUDE_PATH"]],
+ language="c++")
+
+ config.add_extension('_hierarchical_fast',
+ sources=['_hierarchical_fast.pyx'],
+ language="c++",
+- include_dirs=[numpy.get_include()],
++ include_dirs=[os.environ["NUMPY_INCLUDE_PATH"]],
+ libraries=libraries)
+
+ config.add_extension('_k_means_fast',
+ sources=['_k_means_fast.pyx'],
+- include_dirs=[numpy.get_include()],
++ include_dirs=[os.environ["NUMPY_INCLUDE_PATH"]],
+ libraries=libraries)
+
+ config.add_extension('_k_means_lloyd',
+ sources=['_k_means_lloyd.pyx'],
+- include_dirs=[numpy.get_include()],
++ include_dirs=[os.environ["NUMPY_INCLUDE_PATH"]],
+ libraries=libraries)
+
+ config.add_extension('_k_means_elkan',
+ sources=['_k_means_elkan.pyx'],
+- include_dirs=[numpy.get_include()],
++ include_dirs=[os.environ["NUMPY_INCLUDE_PATH"]],
+ libraries=libraries)
+
+ config.add_subpackage('tests')
+diff --git a/sklearn/datasets/setup.py b/sklearn/datasets/setup.py
+index 1107505d4..de4ac3c87 100644
+--- a/sklearn/datasets/setup.py
++++ b/sklearn/datasets/setup.py
+@@ -1,5 +1,5 @@
+
+-import numpy
++import numpy, os
+ import os
+ import platform
+
+@@ -14,7 +14,7 @@ def configuration(parent_package='', top_path=None):
+ if platform.python_implementation() != 'PyPy':
+ config.add_extension('_svmlight_format_fast',
+ sources=['_svmlight_format_fast.pyx'],
+- include_dirs=[numpy.get_include()])
++ include_dirs=[os.environ["NUMPY_INCLUDE_PATH"]])
+ config.add_subpackage('tests')
+ return config
+
+diff --git a/sklearn/decomposition/setup.py b/sklearn/decomposition/setup.py
+index f915d6d78..26799c0af 100644
+--- a/sklearn/decomposition/setup.py
++++ b/sklearn/decomposition/setup.py
+@@ -1,5 +1,5 @@
+ import os
+-import numpy
++import numpy, os
+ from numpy.distutils.misc_util import Configuration
+
+
+@@ -12,12 +12,12 @@ def configuration(parent_package="", top_path=None):
+
+ config.add_extension("_online_lda_fast",
+ sources=["_online_lda_fast.pyx"],
+- include_dirs=[numpy.get_include()],
++ include_dirs=[os.environ["NUMPY_INCLUDE_PATH"]],
+ libraries=libraries)
+
+ config.add_extension('_cdnmf_fast',
+ sources=['_cdnmf_fast.pyx'],
+- include_dirs=[numpy.get_include()],
++ include_dirs=[os.environ["NUMPY_INCLUDE_PATH"]],
+ libraries=libraries)
+
+ config.add_subpackage("tests")
+diff --git a/sklearn/ensemble/setup.py b/sklearn/ensemble/setup.py
+index 05d71cf31..c12382220 100644
+--- a/sklearn/ensemble/setup.py
++++ b/sklearn/ensemble/setup.py
+@@ -1,4 +1,4 @@
+-import numpy
++import numpy, os
+ from numpy.distutils.misc_util import Configuration
+
+
+@@ -7,7 +7,7 @@ def configuration(parent_package="", top_path=None):
+
+ config.add_extension("_gradient_boosting",
+ sources=["_gradient_boosting.pyx"],
+- include_dirs=[numpy.get_include()])
++ include_dirs=[os.environ["NUMPY_INCLUDE_PATH"]])
+
+ config.add_subpackage("tests")
+
+@@ -15,39 +15,39 @@ def configuration(parent_package="", top_path=None):
+ config.add_extension(
+ "_hist_gradient_boosting._gradient_boosting",
+ sources=["_hist_gradient_boosting/_gradient_boosting.pyx"],
+- include_dirs=[numpy.get_include()])
++ include_dirs=[os.environ["NUMPY_INCLUDE_PATH"]])
+
+ config.add_extension("_hist_gradient_boosting.histogram",
+ sources=["_hist_gradient_boosting/histogram.pyx"],
+- include_dirs=[numpy.get_include()])
++ include_dirs=[os.environ["NUMPY_INCLUDE_PATH"]])
+
+ config.add_extension("_hist_gradient_boosting.splitting",
+ sources=["_hist_gradient_boosting/splitting.pyx"],
+- include_dirs=[numpy.get_include()])
++ include_dirs=[os.environ["NUMPY_INCLUDE_PATH"]])
+
+ config.add_extension("_hist_gradient_boosting._binning",
+ sources=["_hist_gradient_boosting/_binning.pyx"],
+- include_dirs=[numpy.get_include()])
++ include_dirs=[os.environ["NUMPY_INCLUDE_PATH"]])
+
+ config.add_extension("_hist_gradient_boosting._predictor",
+ sources=["_hist_gradient_boosting/_predictor.pyx"],
+- include_dirs=[numpy.get_include()])
++ include_dirs=[os.environ["NUMPY_INCLUDE_PATH"]])
+
+ config.add_extension("_hist_gradient_boosting._loss",
+ sources=["_hist_gradient_boosting/_loss.pyx"],
+- include_dirs=[numpy.get_include()])
++ include_dirs=[os.environ["NUMPY_INCLUDE_PATH"]])
+
+ config.add_extension("_hist_gradient_boosting._bitset",
+ sources=["_hist_gradient_boosting/_bitset.pyx"],
+- include_dirs=[numpy.get_include()])
++ include_dirs=[os.environ["NUMPY_INCLUDE_PATH"]])
+
+ config.add_extension("_hist_gradient_boosting.common",
+ sources=["_hist_gradient_boosting/common.pyx"],
+- include_dirs=[numpy.get_include()])
++ include_dirs=[os.environ["NUMPY_INCLUDE_PATH"]])
+
+ config.add_extension("_hist_gradient_boosting.utils",
+ sources=["_hist_gradient_boosting/utils.pyx"],
+- include_dirs=[numpy.get_include()])
++ include_dirs=[os.environ["NUMPY_INCLUDE_PATH"]])
+
+ config.add_subpackage("_hist_gradient_boosting.tests")
+
+diff --git a/sklearn/feature_extraction/setup.py b/sklearn/feature_extraction/setup.py
+index 8c3bbb100..a872c7603 100644
+--- a/sklearn/feature_extraction/setup.py
++++ b/sklearn/feature_extraction/setup.py
+@@ -3,7 +3,7 @@ import platform
+
+
+ def configuration(parent_package='', top_path=None):
+- import numpy
++ import numpy, os
+ from numpy.distutils.misc_util import Configuration
+
+ config = Configuration('feature_extraction', parent_package, top_path)
+@@ -14,7 +14,7 @@ def configuration(parent_package='', top_path=None):
+ if platform.python_implementation() != 'PyPy':
+ config.add_extension('_hashing_fast',
+ sources=['_hashing_fast.pyx'],
+- include_dirs=[numpy.get_include()],
++ include_dirs=[os.environ["NUMPY_INCLUDE_PATH"]],
+ libraries=libraries)
+ config.add_subpackage("tests")
+
+diff --git a/sklearn/linear_model/setup.py b/sklearn/linear_model/setup.py
+index d0c9e8c04..962340210 100644
+--- a/sklearn/linear_model/setup.py
++++ b/sklearn/linear_model/setup.py
+@@ -1,5 +1,5 @@
+ import os
+-import numpy
++import numpy, os
+
+ from sklearn._build_utils import gen_from_templates
+
+@@ -15,12 +15,12 @@ def configuration(parent_package='', top_path=None):
+
+ config.add_extension('_cd_fast',
+ sources=['_cd_fast.pyx'],
+- include_dirs=numpy.get_include(),
++ include_dirs=os.environ["NUMPY_INCLUDE_PATH"],
+ libraries=libraries)
+
+ config.add_extension('_sgd_fast',
+ sources=['_sgd_fast.pyx'],
+- include_dirs=numpy.get_include(),
++ include_dirs=os.environ["NUMPY_INCLUDE_PATH"],
+ libraries=libraries)
+
+ # generate sag_fast from template
+@@ -29,7 +29,7 @@ def configuration(parent_package='', top_path=None):
+
+ config.add_extension('_sag_fast',
+ sources=['_sag_fast.pyx'],
+- include_dirs=numpy.get_include())
++ include_dirs=os.environ["NUMPY_INCLUDE_PATH"])
+
+ # add other directories
+ config.add_subpackage('tests')
+diff --git a/sklearn/manifold/setup.py b/sklearn/manifold/setup.py
+index 0db2d5d04..959a4996a 100644
+--- a/sklearn/manifold/setup.py
++++ b/sklearn/manifold/setup.py
+@@ -1,6 +1,6 @@
+ import os
+
+-import numpy
++import numpy, os
+
+
+ def configuration(parent_package="", top_path=None):
+@@ -14,13 +14,13 @@ def configuration(parent_package="", top_path=None):
+
+ config.add_extension("_utils",
+ sources=["_utils.pyx"],
+- include_dirs=[numpy.get_include()],
++ include_dirs=[os.environ["NUMPY_INCLUDE_PATH"]],
+ libraries=libraries,
+ extra_compile_args=["-O3"])
+
+ config.add_extension("_barnes_hut_tsne",
+ sources=["_barnes_hut_tsne.pyx"],
+- include_dirs=[numpy.get_include()],
++ include_dirs=[os.environ["NUMPY_INCLUDE_PATH"]],
+ libraries=libraries,
+ extra_compile_args=['-O3'])
+
+diff --git a/sklearn/metrics/cluster/setup.py b/sklearn/metrics/cluster/setup.py
+index c39e414d9..98640b5f3 100644
+--- a/sklearn/metrics/cluster/setup.py
++++ b/sklearn/metrics/cluster/setup.py
+@@ -1,6 +1,6 @@
+ import os
+
+-import numpy
++import numpy, os
+ from numpy.distutils.misc_util import Configuration
+
+
+@@ -11,7 +11,7 @@ def configuration(parent_package="", top_path=None):
+ libraries.append('m')
+ config.add_extension("_expected_mutual_info_fast",
+ sources=["_expected_mutual_info_fast.pyx"],
+- include_dirs=[numpy.get_include()],
++ include_dirs=[os.environ["NUMPY_INCLUDE_PATH"]],
+ libraries=libraries)
+
+ config.add_subpackage("tests")
+diff --git a/sklearn/neighbors/setup.py b/sklearn/neighbors/setup.py
+index 926404467..aeedcb940 100644
+--- a/sklearn/neighbors/setup.py
++++ b/sklearn/neighbors/setup.py
+@@ -2,7 +2,7 @@ import os
+
+
+ def configuration(parent_package='', top_path=None):
+- import numpy
++ import numpy, os
+ from numpy.distutils.misc_util import Configuration
+
+ config = Configuration('neighbors', parent_package, top_path)
+@@ -12,28 +12,27 @@ def configuration(parent_package='', top_path=None):
+
+ config.add_extension('_ball_tree',
+ sources=['_ball_tree.pyx'],
+- include_dirs=[numpy.get_include()],
++ include_dirs=[os.environ["NUMPY_INCLUDE_PATH"]],
+ libraries=libraries)
+
+ config.add_extension('_kd_tree',
+ sources=['_kd_tree.pyx'],
+- include_dirs=[numpy.get_include()],
++ include_dirs=[os.environ["NUMPY_INCLUDE_PATH"]],
+ libraries=libraries)
+
+ config.add_extension('_dist_metrics',
+ sources=['_dist_metrics.pyx'],
+- include_dirs=[numpy.get_include(),
+- os.path.join(numpy.get_include(),
+- 'numpy')],
++ include_dirs=[os.environ["NUMPY_INCLUDE_PATH"],
++ os.path.join(os.environ["NUMPY_INCLUDE_PATH"], 'numpy')],
+ libraries=libraries)
+
+ config.add_extension('_typedefs',
+ sources=['_typedefs.pyx'],
+- include_dirs=[numpy.get_include()],
++ include_dirs=[os.environ["NUMPY_INCLUDE_PATH"]],
+ libraries=libraries)
+ config.add_extension("_quad_tree",
+ sources=["_quad_tree.pyx"],
+- include_dirs=[numpy.get_include()],
++ include_dirs=[os.environ["NUMPY_INCLUDE_PATH"]],
+ libraries=libraries)
+
+ config.add_subpackage('tests')
+diff --git a/sklearn/preprocessing/setup.py b/sklearn/preprocessing/setup.py
+index 29dae9b8f..7c059d90f 100644
+--- a/sklearn/preprocessing/setup.py
++++ b/sklearn/preprocessing/setup.py
+@@ -2,7 +2,7 @@ import os
+
+
+ def configuration(parent_package='', top_path=None):
+- import numpy
++ import numpy, os
+ from numpy.distutils.misc_util import Configuration
+
+ config = Configuration('preprocessing', parent_package, top_path)
+@@ -12,7 +12,7 @@ def configuration(parent_package='', top_path=None):
+
+ config.add_extension('_csr_polynomial_expansion',
+ sources=['_csr_polynomial_expansion.pyx'],
+- include_dirs=[numpy.get_include()],
++ include_dirs=[os.environ["NUMPY_INCLUDE_PATH"]],
+ libraries=libraries)
+
+ config.add_subpackage('tests')
+diff --git a/sklearn/setup.py b/sklearn/setup.py
+index e5d7e6e26..a814bca87 100644
+--- a/sklearn/setup.py
++++ b/sklearn/setup.py
+@@ -6,7 +6,7 @@ from sklearn._build_utils import cythonize_extensions
+
+ def configuration(parent_package='', top_path=None):
+ from numpy.distutils.misc_util import Configuration
+- import numpy
++ import numpy, os
+
+ libraries = []
+ if os.name == 'posix':
+@@ -69,7 +69,7 @@ def configuration(parent_package='', top_path=None):
+ # add cython extension module for isotonic regression
+ config.add_extension('_isotonic',
+ sources=['_isotonic.pyx'],
+- include_dirs=[numpy.get_include()],
++ include_dirs=[os.environ["NUMPY_INCLUDE_PATH"]],
+ libraries=libraries,
+ )
+
+diff --git a/sklearn/svm/setup.py b/sklearn/svm/setup.py
+index dffcff8eb..d01614780 100644
+--- a/sklearn/svm/setup.py
++++ b/sklearn/svm/setup.py
+@@ -1,6 +1,6 @@
+ import os
+ from os.path import join
+-import numpy
++import numpy, os
+
+
+ def configuration(parent_package='', top_path=None):
+@@ -13,7 +13,7 @@ def configuration(parent_package='', top_path=None):
+ # newrand wrappers
+ config.add_extension('_newrand',
+ sources=['_newrand.pyx'],
+- include_dirs=[numpy.get_include(),
++ include_dirs=[os.environ["NUMPY_INCLUDE_PATH"],
+ join('src', 'newrand')],
+ depends=[join('src', 'newrand', 'newrand.h')],
+ language='c++',
+@@ -34,6 +34,7 @@ def configuration(parent_package='', top_path=None):
+ extra_link_args=['-lstdc++'],
+ # Use C++11 to use the random number generator fix
+ extra_compiler_args=['-std=c++11'],
++ include_dirs=[os.environ["NUMPY_INCLUDE_PATH"]],
+ )
+
+ libsvm_sources = ['_libsvm.pyx']
+@@ -45,7 +46,7 @@ def configuration(parent_package='', top_path=None):
+
+ config.add_extension('_libsvm',
+ sources=libsvm_sources,
+- include_dirs=[numpy.get_include(),
++ include_dirs=[os.environ["NUMPY_INCLUDE_PATH"],
+ join('src', 'libsvm'),
+ join('src', 'newrand')],
+ libraries=['libsvm-skl'],
+@@ -82,7 +83,7 @@ def configuration(parent_package='', top_path=None):
+ include_dirs=[join('.', 'src', 'liblinear'),
+ join('.', 'src', 'newrand'),
+ join('..', 'utils'),
+- numpy.get_include()],
++ os.environ["NUMPY_INCLUDE_PATH"]],
+ depends=liblinear_depends,
+ # extra_compile_args=['-O0 -fno-inline'],
+ )
+@@ -93,7 +94,7 @@ def configuration(parent_package='', top_path=None):
+ libsvm_sparse_sources = ['_libsvm_sparse.pyx']
+ config.add_extension('_libsvm_sparse', libraries=['libsvm-skl'],
+ sources=libsvm_sparse_sources,
+- include_dirs=[numpy.get_include(),
++ include_dirs=[os.environ["NUMPY_INCLUDE_PATH"],
+ join("src", "libsvm"),
+ join("src", "newrand")],
+ depends=[join("src", "libsvm", "svm.h"),
+diff --git a/sklearn/tree/setup.py b/sklearn/tree/setup.py
+index 079ae9d86..0308a5cf9 100644
+--- a/sklearn/tree/setup.py
++++ b/sklearn/tree/setup.py
+@@ -1,6 +1,6 @@
+ import os
+
+-import numpy
++import numpy, os
+ from numpy.distutils.misc_util import Configuration
+
+
+@@ -11,22 +11,22 @@ def configuration(parent_package="", top_path=None):
+ libraries.append('m')
+ config.add_extension("_tree",
+ sources=["_tree.pyx"],
+- include_dirs=[numpy.get_include()],
++ include_dirs=[os.environ["NUMPY_INCLUDE_PATH"]],
+ libraries=libraries,
+ extra_compile_args=["-O3"])
+ config.add_extension("_splitter",
+ sources=["_splitter.pyx"],
+- include_dirs=[numpy.get_include()],
++ include_dirs=[os.environ["NUMPY_INCLUDE_PATH"]],
+ libraries=libraries,
+ extra_compile_args=["-O3"])
+ config.add_extension("_criterion",
+ sources=["_criterion.pyx"],
+- include_dirs=[numpy.get_include()],
++ include_dirs=[os.environ["NUMPY_INCLUDE_PATH"]],
+ libraries=libraries,
+ extra_compile_args=["-O3"])
+ config.add_extension("_utils",
+ sources=["_utils.pyx"],
+- include_dirs=[numpy.get_include()],
++ include_dirs=[os.environ["NUMPY_INCLUDE_PATH"]],
+ libraries=libraries,
+ extra_compile_args=["-O3"])
+
+diff --git a/sklearn/utils/setup.py b/sklearn/utils/setup.py
+index 098adeecc..d24e1b1c8 100644
+--- a/sklearn/utils/setup.py
++++ b/sklearn/utils/setup.py
+@@ -5,7 +5,7 @@ from sklearn._build_utils import gen_from_templates
+
+
+ def configuration(parent_package='', top_path=None):
+- import numpy
++ import numpy, os
+ from numpy.distutils.misc_util import Configuration
+
+ config = Configuration('utils', parent_package, top_path)
+@@ -24,7 +24,7 @@ def configuration(parent_package='', top_path=None):
+
+ config.add_extension('arrayfuncs',
+ sources=['arrayfuncs.pyx'],
+- include_dirs=[numpy.get_include()],
++ include_dirs=[os.environ["NUMPY_INCLUDE_PATH"]],
+ libraries=libraries)
+
+ config.add_extension('murmurhash',
+@@ -34,12 +34,12 @@ def configuration(parent_package='', top_path=None):
+
+ config.add_extension('graph_shortest_path',
+ sources=['graph_shortest_path.pyx'],
+- include_dirs=[numpy.get_include()])
++ include_dirs=[os.environ["NUMPY_INCLUDE_PATH"]])
+
+ config.add_extension('_fast_dict',
+ sources=['_fast_dict.pyx'],
+ language="c++",
+- include_dirs=[numpy.get_include()],
++ include_dirs=[os.environ["NUMPY_INCLUDE_PATH"]],
+ libraries=libraries)
+
+ config.add_extension('_openmp_helpers',
+@@ -53,21 +53,21 @@ def configuration(parent_package='', top_path=None):
+
+ config.add_extension('_seq_dataset',
+ sources=['_seq_dataset.pyx'],
+- include_dirs=[numpy.get_include()])
++ include_dirs=[os.environ["NUMPY_INCLUDE_PATH"]])
+
+ config.add_extension('_weight_vector',
+ sources=['_weight_vector.pyx'],
+- include_dirs=[numpy.get_include()],
++ include_dirs=[os.environ["NUMPY_INCLUDE_PATH"]],
+ libraries=libraries)
+
+ config.add_extension("_random",
+ sources=["_random.pyx"],
+- include_dirs=[numpy.get_include()],
++ include_dirs=[os.environ["NUMPY_INCLUDE_PATH"]],
+ libraries=libraries)
+
+ config.add_extension("_logistic_sigmoid",
+ sources=["_logistic_sigmoid.pyx"],
+- include_dirs=[numpy.get_include()],
++ include_dirs=[os.environ["NUMPY_INCLUDE_PATH"]],
+ libraries=libraries)
+
+ config.add_subpackage('tests')
diff --git a/meta-offline-voice-agent/recipes-python/python3-scikit-learn/python3-scikit-learn_0.24.2.bb b/meta-offline-voice-agent/recipes-python/python3-scikit-learn/python3-scikit-learn_0.24.2.bb
new file mode 100644
index 00000000..64a532f0
--- /dev/null
+++ b/meta-offline-voice-agent/recipes-python/python3-scikit-learn/python3-scikit-learn_0.24.2.bb
@@ -0,0 +1,36 @@
+SUMMARY = "A set of python modules for machine learning and data mining"
+HOMEPAGE = "http://scikit-learn.org"
+
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://COPYING;md5=c8d7e027b3e67a2b1fe7fe85ebeb17d7"
+
+SRC_URI = "git://github.com/scikit-learn/scikit-learn.git;branch=0.24.X;protocol=https \
+ file://0001-hack-around-numpy-get_include-to-force-looking-in-ta.patch \
+ "
+SRCREV = "15a949460dbf19e5e196b8ef48f9712b72a3b3c3"
+S = "${WORKDIR}/git"
+
+DEPENDS += "python3-numpy-native python3-scipy-native python3-cython-native python3-numpy python3-scipy python3-cython"
+
+inherit setuptools3 pkgconfig python3-dir
+
+RDEPENDS:${PN} += "python3-numpy python3-scipy python3-joblib python3-threadpoolctl python3-pytest"
+
+export PYTHON_CROSSENV = "1"
+export SKLEARN_BUILD_PARALLEL = "${@oe.utils.cpu_count()}"
+export NPY_PKG_CONFIG_PATH = "${WORKDIR}/npy-pkg-config"
+export NUMPY_INCLUDE_PATH = "${STAGING_DIR_TARGET}/usr/lib/python${PYTHON_BASEVERSION}/site-packages/numpy/core/include"
+
+# Tell Numpy to look in target sysroot site-packages directory for libraries
+LDFLAGS:append = " -L${STAGING_LIBDIR}/${PYTHON_DIR}/site-packages/numpy/core/lib"
+
+do_compile:prepend() {
+ echo "[ALL]" > ${S}/site.cfg
+ echo "library_dirs = ${STAGING_LIBDIR}" >> ${S}/site.cfg
+ echo "include_dirs = ${STAGING_INCDIR}" >> ${S}/site.cfg
+
+ mkdir -p ${WORKDIR}/npy-pkg-config
+ cp ${STAGING_DIR_TARGET}/usr/lib/python${PYTHON_BASEVERSION}/site-packages/numpy/core/lib/npy-pkg-config/* ${WORKDIR}/npy-pkg-config
+ sed -i 's&prefix=${pkgdir}&prefix=${STAGING_DIR_TARGET}/usr/lib/python${PYTHON_BASEVERSION}/site-packages/numpy/core&g' ${WORKDIR}/npy-pkg-config/npymath.ini
+ sed -i 's&prefix=${pkgdir}&prefix=${STAGING_DIR_TARGET}/usr/lib/python${PYTHON_BASEVERSION}/site-packages/numpy/core&g' ${WORKDIR}/npy-pkg-config/mlib.ini
+}
diff --git a/meta-offline-voice-agent/recipes-python/python3-scipy/files/0001-Allow-passing-flags-via-FARCH-for-mach.patch b/meta-offline-voice-agent/recipes-python/python3-scipy/files/0001-Allow-passing-flags-via-FARCH-for-mach.patch
new file mode 100644
index 00000000..8a874af4
--- /dev/null
+++ b/meta-offline-voice-agent/recipes-python/python3-scipy/files/0001-Allow-passing-flags-via-FARCH-for-mach.patch
@@ -0,0 +1,44 @@
+From 973767f29391eca1c76292556de03cdd7520c07d Mon Sep 17 00:00:00 2001
+From: Erik Boto <erik.boto@gmail.com>
+Date: Tue, 3 Nov 2020 09:08:56 -0700
+Subject: [PATCH] Allow passing flags via FARCH for mach
+
+Enable passing options via FARCH, so that the flags for setting the
+correct floating point ABI is propagated properly to the fortran
+compiler.
+
+This fixes an issue where the mach lib would otherwise be built as
+soft-float, even though the target arch is hard-float.
+---
+ scipy/integrate/setup.py | 3 +--
+ scipy/special/setup.py | 3 +--
+ 2 files changed, 2 insertions(+), 4 deletions(-)
+
+diff --git a/scipy/integrate/setup.py b/scipy/integrate/setup.py
+index 11ce3d1..8e4a3dc 100755
+--- a/scipy/integrate/setup.py
++++ b/scipy/integrate/setup.py
+@@ -34,8 +34,7 @@ def configuration(parent_package='',top_path=None):
+ quadpack_test_src = [join('tests','_test_multivariate.c')]
+ odeint_banded_test_src = [join('tests', 'banded5x5.f')]
+
+- config.add_library('mach', sources=mach_src, config_fc={'noopt': (__file__, 1)},
+- _pre_build_hook=pre_build_hook)
++ config.add_library('mach', sources=mach_src, _pre_build_hook=pre_build_hook)
+ config.add_library('quadpack', sources=quadpack_src, _pre_build_hook=pre_build_hook)
+ config.add_library('lsoda', sources=lsoda_src, _pre_build_hook=pre_build_hook)
+ config.add_library('vode', sources=vode_src, _pre_build_hook=pre_build_hook)
+diff --git a/scipy/special/setup.py b/scipy/special/setup.py
+index 81eb09f..260cfb3 100755
+--- a/scipy/special/setup.py
++++ b/scipy/special/setup.py
+@@ -46,8 +46,7 @@ def configuration(parent_package='',top_path=None):
+ amos_src = [join('amos','*.f')]
+ cdf_src = [join('cdflib','*.f')]
+ specfun_src = [join('specfun','*.f')]
+- config.add_library('sc_mach',sources=mach_src,
+- config_fc={'noopt':(__file__,1)})
++ config.add_library('sc_mach',sources=mach_src)
+ config.add_library('sc_amos',sources=amos_src)
+ config.add_library('sc_cdf',sources=cdf_src)
+ config.add_library('sc_specfun',sources=specfun_src)
diff --git a/meta-offline-voice-agent/recipes-python/python3-scipy/files/static-lib.patch b/meta-offline-voice-agent/recipes-python/python3-scipy/files/static-lib.patch
new file mode 100644
index 00000000..05b6133a
--- /dev/null
+++ b/meta-offline-voice-agent/recipes-python/python3-scipy/files/static-lib.patch
@@ -0,0 +1,32 @@
+diff --git a/scipy/stats/setup.py b/scipy/stats/setup.py
+index 52a5a36f0..fb5c16a6b 100644
+--- a/scipy/stats/setup.py
++++ b/scipy/stats/setup.py
+@@ -64,10 +64,10 @@ def configuration(parent_package='', top_path=None):
+ biasedurn_libs = []
+ biasedurn_libdirs = []
+ else:
+- biasedurn_libs = ['npyrandom', 'npymath']
+- biasedurn_libdirs = [join(np.get_include(),
+- '..', '..', 'random', 'lib')]
+- biasedurn_libdirs += get_info('npymath')['library_dirs']
++ biasedurn_libs = [join(os.environ["NUMPY_INCLUDE_PATH"],
++ '..', '..', 'random', 'lib', 'libnpyrandom.a')]
++ biasedurn_libs.append([join(os.environ["NUMPY_INCLUDE_PATH"],
++ '..', '..', 'core', 'lib', 'libnpymath.a')])
+
+ ext = config.add_extension(
+ '_biasedurn',
+@@ -79,11 +79,10 @@ def configuration(parent_package='', top_path=None):
+ 'biasedurn/stoc1.cpp',
+ 'biasedurn/stoc3.cpp'],
+ include_dirs=[np.get_include()],
+- library_dirs=biasedurn_libdirs,
+- libraries=biasedurn_libs,
+ define_macros=[('R_BUILD', None)],
+ language='c++',
+ depends=['biasedurn/stocR.h'],
++ extra_objects=biasedurn_libs,
+ )
+ ext._pre_build_hook = pre_build_hook
+
diff --git a/meta-offline-voice-agent/recipes-python/python3-scipy/python3-beniget_0.4.1.bb b/meta-offline-voice-agent/recipes-python/python3-scipy/python3-beniget_0.4.1.bb
new file mode 100644
index 00000000..cfd31447
--- /dev/null
+++ b/meta-offline-voice-agent/recipes-python/python3-scipy/python3-beniget_0.4.1.bb
@@ -0,0 +1,11 @@
+SUMMARY = "A static analyzer for Python2 and Python3 code"
+HOMEPAGE = "https://github.com/serge-sans-paille/beniget/"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=02550c296a72ab0b70961eb70a5a7242"
+
+SRC_URI[md5sum] = "a2bbe7f17f10f9c127d8ef00692ddc55"
+SRC_URI[sha256sum] = "75554b3b8ad0553ce2f607627dad3d95c60c441189875b98e097528f8e23ac0c"
+
+inherit pypi setuptools3
+
+BBCLASSEXTEND = "native"
diff --git a/meta-offline-voice-agent/recipes-python/python3-scipy/python3-pythran_0.11.0.bb b/meta-offline-voice-agent/recipes-python/python3-scipy/python3-pythran_0.11.0.bb
new file mode 100644
index 00000000..deabb9b5
--- /dev/null
+++ b/meta-offline-voice-agent/recipes-python/python3-scipy/python3-pythran_0.11.0.bb
@@ -0,0 +1,14 @@
+SUMMARY = "Ahead of Time compiler for numeric kernels"
+HOMEPAGE = "https://pythran.readthedocs.io/"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=e277a0b6033e0cb3d510c86b74144b01"
+
+SRC_URI[md5sum] = "e09e90484771937ab499380858bdb18d"
+SRC_URI[sha256sum] = "0b2cba712e09f7630879dff69f268460bfe34a6d6000451b47d598558a92a875"
+
+DEPENDS += "python3-gast"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += "python3-beniget python3-gast"
+BBCLASSEXTEND = "native"
diff --git a/meta-offline-voice-agent/recipes-python/python3-scipy/python3-scipy-native_1.8.1.bb b/meta-offline-voice-agent/recipes-python/python3-scipy/python3-scipy-native_1.8.1.bb
new file mode 100644
index 00000000..ca46f9db
--- /dev/null
+++ b/meta-offline-voice-agent/recipes-python/python3-scipy/python3-scipy-native_1.8.1.bb
@@ -0,0 +1,44 @@
+SUMMARY = "SciPy: Scientific Library for Python"
+HOMEPAGE = "https://www.scipy.org"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=27ca2e35416b6316570bf126e08b7062"
+
+SRC_URI = "https://pypi.python.org/packages/source/s/scipy/scipy-${PV}.tar.gz \
+ file://0001-Allow-passing-flags-via-FARCH-for-mach.patch \
+ "
+
+SRC_URI[md5sum] = "df5ce79288fc457238aeef18e8f70dfc"
+SRC_URI[sha256sum] = "9e3fb1b0e896f14a85aa9a28d5f755daaeeb54c897b746df7a55ccb02b340f33"
+
+S = "${WORKDIR}/scipy-${PV}"
+
+DEPENDS += " \
+ ${PYTHON_PN}-numpy-native \
+ ${PYTHON_PN}-pybind11-native \
+ ${PYTHON_PN}-pythran-native \
+ ${PYTHON_PN}-gast-native \
+ ${PYTHON_PN}-beniget-native \
+ ${PYTHON_PN}-ply-native \
+ lapack-native \
+"
+
+CLEANBROKEN = "1"
+
+inherit setuptools3 native
+
+export LAPACK = "${STAGING_LIBDIR}"
+export BLAS = "${STAGING_LIBDIR}"
+
+export F90 = "${FC}"
+
+# Numpy expects the LDSHARED env variable to point to a single
+# executable, but OE sets it to include some flags as well. So we split
+# the existing LDSHARED variable into the base executable and flags, and
+# prepend the flags into LDFLAGS
+LDFLAGS:prepend := "${@" ".join(d.getVar('LDSHARED', True).split()[1:])} "
+export LDSHARED := "${@d.getVar('LDSHARED', True).split()[0]}"
+
+# Tell Numpy to look in target sysroot site-packages directory for libraries
+LDFLAGS:append = " -L${STAGING_LIBDIR}/${PYTHON_DIR}/site-packages/numpy/core/lib"
+
+INSANE_SKIP:${PN} = "already-stripped"
diff --git a/meta-offline-voice-agent/recipes-python/python3-scipy/python3-scipy_1.8.1.bb b/meta-offline-voice-agent/recipes-python/python3-scipy/python3-scipy_1.8.1.bb
new file mode 100644
index 00000000..2c9424e6
--- /dev/null
+++ b/meta-offline-voice-agent/recipes-python/python3-scipy/python3-scipy_1.8.1.bb
@@ -0,0 +1,52 @@
+SUMMARY = "SciPy: Scientific Library for Python"
+HOMEPAGE = "https://www.scipy.org"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=27ca2e35416b6316570bf126e08b7062"
+
+SRC_URI += " \
+ file://0001-Allow-passing-flags-via-FARCH-for-mach.patch \
+ file://static-lib.patch \
+"
+SRC_URI[md5sum] = "df5ce79288fc457238aeef18e8f70dfc"
+SRC_URI[sha256sum] = "9e3fb1b0e896f14a85aa9a28d5f755daaeeb54c897b746df7a55ccb02b340f33"
+
+DEPENDS += " \
+ ${PYTHON_PN}-numpy \
+ ${PYTHON_PN}-numpy-native \
+ ${PYTHON_PN}-pybind11-native \
+ ${PYTHON_PN}-pythran-native \
+ ${PYTHON_PN}-gast-native \
+ ${PYTHON_PN}-beniget-native \
+ ${PYTHON_PN}-ply-native \
+ lapack \
+"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += " \
+ ${PYTHON_PN}-numpy \
+ lapack \
+"
+
+CLEANBROKEN = "1"
+
+export LAPACK = "${STAGING_LIBDIR}"
+export BLAS = "${STAGING_LIBDIR}"
+
+export F90 = "${TARGET_PREFIX}gfortran"
+export F77 = "${TARGET_PREFIX}gfortran"
+export FARCH = "${TUNE_CCARGS}"
+
+export NUMPY_INCLUDE_PATH = "${STAGING_DIR_TARGET}/usr/lib/python${PYTHON_BASEVERSION}/site-packages/numpy/core/include"
+
+# Numpy expects the LDSHARED env variable to point to a single
+# executable, but OE sets it to include some flags as well. So we split
+# the existing LDSHARED variable into the base executable and flags, and
+# prepend the flags into LDFLAGS
+LDFLAGS:prepend := "${@" ".join(d.getVar('LDSHARED', True).split()[1:])} "
+export LDSHARED := "${@d.getVar('LDSHARED', True).split()[0]}"
+
+# Tell Numpy to look in target sysroot site-packages directory for libraries
+LDFLAGS:append = " -L${STAGING_LIBDIR}/${PYTHON_DIR}/site-packages/numpy/core/lib"
+
+INSANE_SKIP:${PN} = "already-stripped"
diff --git a/meta-offline-voice-agent/recipes-python/python3-sklearn-crfsuite/python3-sklearn-crfsuite_0.3.6.bb b/meta-offline-voice-agent/recipes-python/python3-sklearn-crfsuite/python3-sklearn-crfsuite_0.3.6.bb
new file mode 100644
index 00000000..2991a33d
--- /dev/null
+++ b/meta-offline-voice-agent/recipes-python/python3-sklearn-crfsuite/python3-sklearn-crfsuite_0.3.6.bb
@@ -0,0 +1,27 @@
+SUMMARY = "scikit-learn inspired API for CRFsuite"
+HOMEPAGE = "https://github.com/TeamHG-Memex/sklearn-crfsuite"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://README.rst;md5=430135089e45e49b28e1cb481484db9a"
+
+PYPI_PACKAGE = "sklearn-crfsuite"
+
+SRC_URI[md5sum] = "14b51eb8a1195f2dc441a7164133008f"
+SRC_URI[sha256sum] = "2f59aad3055e01a778a79a6352891cac04788e8b52688aa5bc8b11be7717861e"
+
+DEPENDS += " \
+ python3-tabulate \
+ python3-python-crfsuite \
+ python3-six \
+ python3-tqdm \
+ python3-setuptools-native \
+ "
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += " \
+ python3-tabulate \
+ python3-python-crfsuite \
+ python3-six \
+ python3-tqdm \
+ "
diff --git a/meta-offline-voice-agent/recipes-python/python3-snips-inference/python3-num2words_0.5.12.bb b/meta-offline-voice-agent/recipes-python/python3-snips-inference/python3-num2words_0.5.12.bb
new file mode 100644
index 00000000..d1ca38fe
--- /dev/null
+++ b/meta-offline-voice-agent/recipes-python/python3-snips-inference/python3-num2words_0.5.12.bb
@@ -0,0 +1,16 @@
+SUMMARY = "Modules to convert numbers to words"
+HOMEPAGE = "https://github.com/savoirfairelinux/num2words"
+LICENSE = "LGPL-2.1-only"
+LIC_FILES_CHKSUM = "file://COPYING;md5=f1b68565299e4b2403b8b3a87d0bcacf"
+
+PYPI_PACKAGE = "num2words"
+
+SRC_URI[md5sum] = "6ef51562822308f7e20f8059d2a81686"
+SRC_URI[sha256sum] = "7e7c0b0f080405aa3a1dd9d32b1ca90b3bf03bab17b8e54db05e1b78301a0988"
+
+DEPENDS += "python3-docopt python3-setuptools-native"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += "python3-docopt"
+BBCLASSEXTEND = "native" \ No newline at end of file
diff --git a/meta-offline-voice-agent/recipes-python/python3-snips-inference/python3-pyaml_19.12.0.bb b/meta-offline-voice-agent/recipes-python/python3-snips-inference/python3-pyaml_19.12.0.bb
new file mode 100644
index 00000000..6cfc34df
--- /dev/null
+++ b/meta-offline-voice-agent/recipes-python/python3-snips-inference/python3-pyaml_19.12.0.bb
@@ -0,0 +1,16 @@
+SUMMARY = "PyYAML-based module to produce a bit more pretty and readable YAML-serialized data"
+HOMEPAGE = "https://github.com/mk-fg/pretty-yaml"
+LICENSE = "WTFPL"
+LIC_FILES_CHKSUM = "file://COPYING;md5=cb6845a9953333608b280507d7803cb3"
+
+PYPI_PACKAGE = "pyaml"
+
+SRC_URI[md5sum] = "a41620eeb64f4b460e6d23b98156780e"
+SRC_URI[sha256sum] = "b3f636b467864319d7ded1558f86bb305b8612a274f5d443a62dc5eceb1b7176"
+
+DEPENDS += "python3-pyyaml python3-setuptools-native"
+
+inherit pypi setuptools3
+
+RDEPENDS:${PN} += "python3-pyyaml"
+BBCLASSEXTEND = "native" \ No newline at end of file
diff --git a/meta-offline-voice-agent/recipes-python/python3-snips-inference/python3-snips-inference-agl_0.2.0.bb b/meta-offline-voice-agent/recipes-python/python3-snips-inference/python3-snips-inference-agl_0.2.0.bb
new file mode 100644
index 00000000..df18ac53
--- /dev/null
+++ b/meta-offline-voice-agent/recipes-python/python3-snips-inference/python3-snips-inference-agl_0.2.0.bb
@@ -0,0 +1,52 @@
+SUMMARY = "Inference only module of Snips NLU library"
+HOMEPAGE = "https://github.com/malik727/snips-inference-agl"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=ecab3ce0771d366e0f8e4ca058eb48e7"
+
+SRC_URI += " \
+ git://github.com/malik727/snips-inference-agl.git;protocol=https;branch=main \
+ "
+
+PV = "0.2.0+git${SRCPV}"
+S = "${WORKDIR}/git"
+SRCREV = "6d45b8d814b1937251524dd8a1e8cac0d8cab5de"
+
+DEPENDS += " \
+ python3-setuptools-native \
+ python3-numpy-native \
+ python3-numpy \
+ python3-num2words \
+ python3-pyaml \
+ python3-six \
+ python3-requests \
+ python3-deprecation \
+ python3-future \
+ python3-scipy \
+ python3-scikit-learn \
+ python3-threadpoolctl \
+ python3-sklearn-crfsuite \
+ python3-tqdm \
+ python3-packaging \
+ python3-snips-nlu-utils \
+ python3-snips-nlu-parsers \
+ "
+
+inherit setuptools3
+
+RDEPENDS:${PN} += " \
+ python3-numpy \
+ python3-num2words \
+ python3-pyaml \
+ python3-six \
+ python3-requests \
+ python3-deprecation \
+ python3-future \
+ python3-scipy \
+ python3-scikit-learn \
+ python3-threadpoolctl \
+ python3-sklearn-crfsuite \
+ python3-tqdm \
+ python3-packaging \
+ python3-snips-nlu-utils \
+ python3-snips-nlu-parsers \
+ "
diff --git a/meta-offline-voice-agent/recipes-python/python3-snips-inference/python3-snips-nlu-parsers-crates.inc b/meta-offline-voice-agent/recipes-python/python3-snips-inference/python3-snips-nlu-parsers-crates.inc
new file mode 100644
index 00000000..dbdbf384
--- /dev/null
+++ b/meta-offline-voice-agent/recipes-python/python3-snips-inference/python3-snips-nlu-parsers-crates.inc
@@ -0,0 +1,176 @@
+# Autogenerated with 'bitbake -c update_crates python3-snips-nlu-parsers'
+
+# from Cargo.lock
+SRC_URI += " \
+ crate://crates.io/addr2line/0.19.0 \
+ crate://crates.io/adler/1.0.2 \
+ crate://crates.io/aho-corasick/1.0.2 \
+ crate://crates.io/autocfg/1.1.0 \
+ crate://crates.io/backtrace/0.3.67 \
+ crate://crates.io/bitflags/1.3.2 \
+ crate://crates.io/bumpalo/3.13.0 \
+ crate://crates.io/byteorder/1.4.3 \
+ crate://crates.io/cc/1.0.79 \
+ crate://crates.io/cfg-if/1.0.0 \
+ crate://crates.io/chrono/0.4.8 \
+ crate://crates.io/derive-new/0.5.9 \
+ crate://crates.io/either/1.8.1 \
+ crate://crates.io/enum_primitive/0.1.1 \
+ crate://crates.io/errno/0.3.1 \
+ crate://crates.io/errno-dragonfly/0.1.2 \
+ crate://crates.io/failure/0.1.8 \
+ crate://crates.io/failure_derive/0.1.8 \
+ crate://crates.io/fastrand/1.9.0 \
+ crate://crates.io/fnv/1.0.7 \
+ crate://crates.io/gimli/0.27.3 \
+ crate://crates.io/hermit-abi/0.3.1 \
+ crate://crates.io/instant/0.1.12 \
+ crate://crates.io/io-lifetimes/1.0.11 \
+ crate://crates.io/itertools/0.8.2 \
+ crate://crates.io/itoa/1.0.6 \
+ crate://crates.io/js-sys/0.3.64 \
+ crate://crates.io/lazy_static/1.4.0 \
+ crate://crates.io/libc/0.2.146 \
+ crate://crates.io/linux-raw-sys/0.3.8 \
+ crate://crates.io/log/0.4.19 \
+ crate://crates.io/maybe-uninit/2.0.0 \
+ crate://crates.io/memchr/2.5.0 \
+ crate://crates.io/miniz_oxide/0.6.2 \
+ crate://crates.io/num-integer/0.1.45 \
+ crate://crates.io/num-traits/0.1.43 \
+ crate://crates.io/num-traits/0.2.15 \
+ crate://crates.io/object/0.30.4 \
+ crate://crates.io/once_cell/1.18.0 \
+ crate://crates.io/paste/1.0.12 \
+ crate://crates.io/proc-macro2/1.0.63 \
+ crate://crates.io/quote/1.0.28 \
+ crate://crates.io/redox_syscall/0.3.5 \
+ crate://crates.io/regex/1.8.4 \
+ crate://crates.io/regex-syntax/0.7.2 \
+ crate://crates.io/rmp/0.8.11 \
+ crate://crates.io/rmp-serde/0.13.7 \
+ crate://crates.io/rmp-serde/0.14.4 \
+ crate://crates.io/rustc-demangle/0.1.23 \
+ crate://crates.io/rustix/0.37.20 \
+ crate://crates.io/ryu/1.0.13 \
+ crate://crates.io/serde/1.0.164 \
+ crate://crates.io/serde_derive/1.0.164 \
+ crate://crates.io/serde_json/1.0.99 \
+ crate://crates.io/smallvec/0.6.14 \
+ crate://crates.io/string-interner/0.7.1 \
+ crate://crates.io/syn/1.0.109 \
+ crate://crates.io/syn/2.0.22 \
+ crate://crates.io/synstructure/0.12.6 \
+ crate://crates.io/tempfile/3.6.0 \
+ crate://crates.io/time/0.1.45 \
+ crate://crates.io/tinyvec/1.6.0 \
+ crate://crates.io/tinyvec_macros/0.1.1 \
+ crate://crates.io/unicode-ident/1.0.9 \
+ crate://crates.io/unicode-normalization/0.1.22 \
+ crate://crates.io/unicode-xid/0.2.4 \
+ crate://crates.io/vec_map/0.8.2 \
+ crate://crates.io/wasi/0.10.0+wasi-snapshot-preview1 \
+ crate://crates.io/wasm-bindgen/0.2.87 \
+ crate://crates.io/wasm-bindgen-backend/0.2.87 \
+ crate://crates.io/wasm-bindgen-macro/0.2.87 \
+ crate://crates.io/wasm-bindgen-macro-support/0.2.87 \
+ crate://crates.io/wasm-bindgen-shared/0.2.87 \
+ crate://crates.io/winapi/0.3.9 \
+ crate://crates.io/winapi-i686-pc-windows-gnu/0.4.0 \
+ crate://crates.io/winapi-x86_64-pc-windows-gnu/0.4.0 \
+ crate://crates.io/windows-sys/0.48.0 \
+ crate://crates.io/windows-targets/0.48.0 \
+ crate://crates.io/windows_aarch64_gnullvm/0.48.0 \
+ crate://crates.io/windows_aarch64_msvc/0.48.0 \
+ crate://crates.io/windows_i686_gnu/0.48.0 \
+ crate://crates.io/windows_i686_msvc/0.48.0 \
+ crate://crates.io/windows_x86_64_gnu/0.48.0 \
+ crate://crates.io/windows_x86_64_gnullvm/0.48.0 \
+ crate://crates.io/windows_x86_64_msvc/0.48.0 \
+"
+
+SRC_URI[addr2line-0.19.0.sha256sum] = "a76fd60b23679b7d19bd066031410fb7e458ccc5e958eb5c325888ce4baedc97"
+SRC_URI[adler-1.0.2.sha256sum] = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
+SRC_URI[aho-corasick-1.0.2.sha256sum] = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41"
+SRC_URI[autocfg-1.1.0.sha256sum] = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+SRC_URI[backtrace-0.3.67.sha256sum] = "233d376d6d185f2a3093e58f283f60f880315b6c60075b01f36b3b85154564ca"
+SRC_URI[bitflags-1.3.2.sha256sum] = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+SRC_URI[bumpalo-3.13.0.sha256sum] = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1"
+SRC_URI[byteorder-1.4.3.sha256sum] = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
+SRC_URI[cc-1.0.79.sha256sum] = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f"
+SRC_URI[cfg-if-1.0.0.sha256sum] = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+SRC_URI[chrono-0.4.8.sha256sum] = "27429a03ca54100bf6bdc726c09adc46a74187ac93f9ce96dc7aaa9594ebf707"
+SRC_URI[derive-new-0.5.9.sha256sum] = "3418329ca0ad70234b9735dc4ceed10af4df60eff9c8e7b06cb5e520d92c3535"
+SRC_URI[either-1.8.1.sha256sum] = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91"
+SRC_URI[enum_primitive-0.1.1.sha256sum] = "be4551092f4d519593039259a9ed8daedf0da12e5109c5280338073eaeb81180"
+SRC_URI[errno-0.3.1.sha256sum] = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a"
+SRC_URI[errno-dragonfly-0.1.2.sha256sum] = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf"
+SRC_URI[failure-0.1.8.sha256sum] = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86"
+SRC_URI[failure_derive-0.1.8.sha256sum] = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4"
+SRC_URI[fastrand-1.9.0.sha256sum] = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be"
+SRC_URI[fnv-1.0.7.sha256sum] = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
+SRC_URI[gimli-0.27.3.sha256sum] = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e"
+SRC_URI[hermit-abi-0.3.1.sha256sum] = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286"
+SRC_URI[instant-0.1.12.sha256sum] = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c"
+SRC_URI[io-lifetimes-1.0.11.sha256sum] = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2"
+SRC_URI[itertools-0.8.2.sha256sum] = "f56a2d0bc861f9165be4eb3442afd3c236d8a98afd426f65d92324ae1091a484"
+SRC_URI[itoa-1.0.6.sha256sum] = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6"
+SRC_URI[js-sys-0.3.64.sha256sum] = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a"
+SRC_URI[lazy_static-1.4.0.sha256sum] = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
+SRC_URI[libc-0.2.146.sha256sum] = "f92be4933c13fd498862a9e02a3055f8a8d9c039ce33db97306fd5a6caa7f29b"
+SRC_URI[linux-raw-sys-0.3.8.sha256sum] = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519"
+SRC_URI[log-0.4.19.sha256sum] = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4"
+SRC_URI[maybe-uninit-2.0.0.sha256sum] = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00"
+SRC_URI[memchr-2.5.0.sha256sum] = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
+SRC_URI[miniz_oxide-0.6.2.sha256sum] = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa"
+SRC_URI[num-integer-0.1.45.sha256sum] = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9"
+SRC_URI[num-traits-0.1.43.sha256sum] = "92e5113e9fd4cc14ded8e499429f396a20f98c772a47cc8622a736e1ec843c31"
+SRC_URI[num-traits-0.2.15.sha256sum] = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd"
+SRC_URI[object-0.30.4.sha256sum] = "03b4680b86d9cfafba8fc491dc9b6df26b68cf40e9e6cd73909194759a63c385"
+SRC_URI[once_cell-1.18.0.sha256sum] = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d"
+SRC_URI[paste-1.0.12.sha256sum] = "9f746c4065a8fa3fe23974dd82f15431cc8d40779821001404d10d2e79ca7d79"
+SRC_URI[proc-macro2-1.0.63.sha256sum] = "7b368fba921b0dce7e60f5e04ec15e565b3303972b42bcfde1d0713b881959eb"
+SRC_URI[quote-1.0.28.sha256sum] = "1b9ab9c7eadfd8df19006f1cf1a4aed13540ed5cbc047010ece5826e10825488"
+SRC_URI[redox_syscall-0.3.5.sha256sum] = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29"
+SRC_URI[regex-1.8.4.sha256sum] = "d0ab3ca65655bb1e41f2a8c8cd662eb4fb035e67c3f78da1d61dffe89d07300f"
+SRC_URI[regex-syntax-0.7.2.sha256sum] = "436b050e76ed2903236f032a59761c1eb99e1b0aead2c257922771dab1fc8c78"
+SRC_URI[rmp-0.8.11.sha256sum] = "44519172358fd6d58656c86ab8e7fbc9e1490c3e8f14d35ed78ca0dd07403c9f"
+SRC_URI[rmp-serde-0.13.7.sha256sum] = "011e1d58446e9fa3af7cdc1fb91295b10621d3ac4cb3a85cc86385ee9ca50cd3"
+SRC_URI[rmp-serde-0.14.4.sha256sum] = "4ce7d70c926fe472aed493b902010bccc17fa9f7284145cb8772fd22fdb052d8"
+SRC_URI[rustc-demangle-0.1.23.sha256sum] = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76"
+SRC_URI[rustix-0.37.20.sha256sum] = "b96e891d04aa506a6d1f318d2771bcb1c7dfda84e126660ace067c9b474bb2c0"
+SRC_URI[ryu-1.0.13.sha256sum] = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041"
+SRC_URI[serde-1.0.164.sha256sum] = "9e8c8cf938e98f769bc164923b06dce91cea1751522f46f8466461af04c9027d"
+SRC_URI[serde_derive-1.0.164.sha256sum] = "d9735b638ccc51c28bf6914d90a2e9725b377144fc612c49a611fddd1b631d68"
+SRC_URI[serde_json-1.0.99.sha256sum] = "46266871c240a00b8f503b877622fe33430b3c7d963bdc0f2adc511e54a1eae3"
+SRC_URI[smallvec-0.6.14.sha256sum] = "b97fcaeba89edba30f044a10c6a3cc39df9c3f17d7cd829dd1446cab35f890e0"
+SRC_URI[string-interner-0.7.1.sha256sum] = "fd710eadff449a1531351b0e43eb81ea404336fa2f56c777427ab0e32a4cf183"
+SRC_URI[syn-1.0.109.sha256sum] = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
+SRC_URI[syn-2.0.22.sha256sum] = "2efbeae7acf4eabd6bcdcbd11c92f45231ddda7539edc7806bd1a04a03b24616"
+SRC_URI[synstructure-0.12.6.sha256sum] = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f"
+SRC_URI[tempfile-3.6.0.sha256sum] = "31c0432476357e58790aaa47a8efb0c5138f137343f3b5f23bd36a27e3b0a6d6"
+SRC_URI[time-0.1.45.sha256sum] = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a"
+SRC_URI[tinyvec-1.6.0.sha256sum] = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50"
+SRC_URI[tinyvec_macros-0.1.1.sha256sum] = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
+SRC_URI[unicode-ident-1.0.9.sha256sum] = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0"
+SRC_URI[unicode-normalization-0.1.22.sha256sum] = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921"
+SRC_URI[unicode-xid-0.2.4.sha256sum] = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c"
+SRC_URI[vec_map-0.8.2.sha256sum] = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191"
+SRC_URI[wasi-0.10.0+wasi-snapshot-preview1.sha256sum] = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f"
+SRC_URI[wasm-bindgen-0.2.87.sha256sum] = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342"
+SRC_URI[wasm-bindgen-backend-0.2.87.sha256sum] = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd"
+SRC_URI[wasm-bindgen-macro-0.2.87.sha256sum] = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d"
+SRC_URI[wasm-bindgen-macro-support-0.2.87.sha256sum] = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b"
+SRC_URI[wasm-bindgen-shared-0.2.87.sha256sum] = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1"
+SRC_URI[winapi-0.3.9.sha256sum] = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
+SRC_URI[winapi-i686-pc-windows-gnu-0.4.0.sha256sum] = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+SRC_URI[winapi-x86_64-pc-windows-gnu-0.4.0.sha256sum] = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
+SRC_URI[windows-sys-0.48.0.sha256sum] = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
+SRC_URI[windows-targets-0.48.0.sha256sum] = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5"
+SRC_URI[windows_aarch64_gnullvm-0.48.0.sha256sum] = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc"
+SRC_URI[windows_aarch64_msvc-0.48.0.sha256sum] = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3"
+SRC_URI[windows_i686_gnu-0.48.0.sha256sum] = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241"
+SRC_URI[windows_i686_msvc-0.48.0.sha256sum] = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00"
+SRC_URI[windows_x86_64_gnu-0.48.0.sha256sum] = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1"
+SRC_URI[windows_x86_64_gnullvm-0.48.0.sha256sum] = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953"
+SRC_URI[windows_x86_64_msvc-0.48.0.sha256sum] = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a"
diff --git a/meta-offline-voice-agent/recipes-python/python3-snips-inference/python3-snips-nlu-parsers_0.4.3.bb b/meta-offline-voice-agent/recipes-python/python3-snips-inference/python3-snips-nlu-parsers_0.4.3.bb
new file mode 100644
index 00000000..d7ced8eb
--- /dev/null
+++ b/meta-offline-voice-agent/recipes-python/python3-snips-inference/python3-snips-nlu-parsers_0.4.3.bb
@@ -0,0 +1,25 @@
+SUMMARY = "Python wrapper of the snips-nlu-parsers Rust crate"
+HOMEPAGE = "https://github.com/snipsco/snips-nlu-parsers"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = " \
+ file://../LICENSE-APACHE;md5=1836efb2eb779966696f473ee8540542 \
+ file://../LICENSE-MIT;md5=b377b220f43d747efdec40d69fcaa69d \
+ "
+
+SRC_URI += " \
+ git://github.com/snipsco/snips-nlu-parsers;protocol=https;branch=master \
+ "
+
+PV = "0.4.3+git${SRCPV}"
+SRCREV = "8cfdae50437732fcf906af90626c8db196729d30"
+S = "${WORKDIR}/git/python"
+
+DEPENDS += "python3-future python3-setuptools-rust-native"
+
+require ${BPN}-crates.inc
+
+inherit cargo python_setuptools3_rust
+
+do_compile[network] = "1"
+
+RDEPENDS:${PN} += "python3-future"
diff --git a/meta-offline-voice-agent/recipes-python/python3-snips-inference/python3-snips-nlu-utils-crates.inc b/meta-offline-voice-agent/recipes-python/python3-snips-inference/python3-snips-nlu-utils-crates.inc
new file mode 100644
index 00000000..5338492d
--- /dev/null
+++ b/meta-offline-voice-agent/recipes-python/python3-snips-inference/python3-snips-nlu-utils-crates.inc
@@ -0,0 +1,64 @@
+# Autogenerated with 'bitbake -c update_crates python3-snips-nlu-utils'
+
+# from Cargo.lock
+SRC_URI += " \
+ crate://crates.io/addr2line/0.19.0 \
+ crate://crates.io/adler/1.0.2 \
+ crate://crates.io/aho-corasick/1.0.2 \
+ crate://crates.io/backtrace/0.3.67 \
+ crate://crates.io/cc/1.0.79 \
+ crate://crates.io/cfg-if/1.0.0 \
+ crate://crates.io/either/1.8.1 \
+ crate://crates.io/failure/0.1.8 \
+ crate://crates.io/failure_derive/0.1.8 \
+ crate://crates.io/fnv/1.0.7 \
+ crate://crates.io/gimli/0.27.3 \
+ crate://crates.io/itertools/0.8.2 \
+ crate://crates.io/lazy_static/1.4.0 \
+ crate://crates.io/libc/0.2.146 \
+ crate://crates.io/memchr/2.5.0 \
+ crate://crates.io/miniz_oxide/0.6.2 \
+ crate://crates.io/object/0.30.4 \
+ crate://crates.io/proc-macro2/1.0.63 \
+ crate://crates.io/quote/1.0.28 \
+ crate://crates.io/regex/1.8.4 \
+ crate://crates.io/regex-syntax/0.7.2 \
+ crate://crates.io/rustc-demangle/0.1.23 \
+ crate://crates.io/syn/1.0.109 \
+ crate://crates.io/synstructure/0.12.6 \
+ crate://crates.io/tinyvec/1.6.0 \
+ crate://crates.io/tinyvec_macros/0.1.1 \
+ crate://crates.io/unicode-ident/1.0.9 \
+ crate://crates.io/unicode-normalization/0.1.22 \
+ crate://crates.io/unicode-xid/0.2.4 \
+"
+
+SRC_URI[addr2line-0.19.0.sha256sum] = "a76fd60b23679b7d19bd066031410fb7e458ccc5e958eb5c325888ce4baedc97"
+SRC_URI[adler-1.0.2.sha256sum] = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
+SRC_URI[aho-corasick-1.0.2.sha256sum] = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41"
+SRC_URI[backtrace-0.3.67.sha256sum] = "233d376d6d185f2a3093e58f283f60f880315b6c60075b01f36b3b85154564ca"
+SRC_URI[cc-1.0.79.sha256sum] = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f"
+SRC_URI[cfg-if-1.0.0.sha256sum] = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+SRC_URI[either-1.8.1.sha256sum] = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91"
+SRC_URI[failure-0.1.8.sha256sum] = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86"
+SRC_URI[failure_derive-0.1.8.sha256sum] = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4"
+SRC_URI[fnv-1.0.7.sha256sum] = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
+SRC_URI[gimli-0.27.3.sha256sum] = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e"
+SRC_URI[itertools-0.8.2.sha256sum] = "f56a2d0bc861f9165be4eb3442afd3c236d8a98afd426f65d92324ae1091a484"
+SRC_URI[lazy_static-1.4.0.sha256sum] = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
+SRC_URI[libc-0.2.146.sha256sum] = "f92be4933c13fd498862a9e02a3055f8a8d9c039ce33db97306fd5a6caa7f29b"
+SRC_URI[memchr-2.5.0.sha256sum] = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
+SRC_URI[miniz_oxide-0.6.2.sha256sum] = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa"
+SRC_URI[object-0.30.4.sha256sum] = "03b4680b86d9cfafba8fc491dc9b6df26b68cf40e9e6cd73909194759a63c385"
+SRC_URI[proc-macro2-1.0.63.sha256sum] = "7b368fba921b0dce7e60f5e04ec15e565b3303972b42bcfde1d0713b881959eb"
+SRC_URI[quote-1.0.28.sha256sum] = "1b9ab9c7eadfd8df19006f1cf1a4aed13540ed5cbc047010ece5826e10825488"
+SRC_URI[regex-1.8.4.sha256sum] = "d0ab3ca65655bb1e41f2a8c8cd662eb4fb035e67c3f78da1d61dffe89d07300f"
+SRC_URI[regex-syntax-0.7.2.sha256sum] = "436b050e76ed2903236f032a59761c1eb99e1b0aead2c257922771dab1fc8c78"
+SRC_URI[rustc-demangle-0.1.23.sha256sum] = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76"
+SRC_URI[syn-1.0.109.sha256sum] = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
+SRC_URI[synstructure-0.12.6.sha256sum] = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f"
+SRC_URI[tinyvec-1.6.0.sha256sum] = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50"
+SRC_URI[tinyvec_macros-0.1.1.sha256sum] = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
+SRC_URI[unicode-ident-1.0.9.sha256sum] = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0"
+SRC_URI[unicode-normalization-0.1.22.sha256sum] = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921"
+SRC_URI[unicode-xid-0.2.4.sha256sum] = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c"
diff --git a/meta-offline-voice-agent/recipes-python/python3-snips-inference/python3-snips-nlu-utils_0.9.1.bb b/meta-offline-voice-agent/recipes-python/python3-snips-inference/python3-snips-nlu-utils_0.9.1.bb
new file mode 100644
index 00000000..491e4633
--- /dev/null
+++ b/meta-offline-voice-agent/recipes-python/python3-snips-inference/python3-snips-nlu-utils_0.9.1.bb
@@ -0,0 +1,20 @@
+SUMMARY = "Python wrapper of rust library for NLU utils with wrappers in other languages"
+HOMEPAGE = "https://github.com/snipsco/snips-nlu-utils"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://../LICENSE;md5=fdebc354a9200f9dc847e624d4584ea9"
+
+SRC_URI += " \
+ git://github.com/malik727/snips-nlu-utils.git;protocol=https;branch=master \
+ "
+
+PV = "0.9.1+git${SRCPV}"
+S = "${WORKDIR}/git/python"
+SRCREV = "b632934413bf84a733cd745db33a0c83640eada8"
+
+DEPENDS += "python3-setuptools-rust-native"
+
+require ${BPN}-crates.inc
+
+inherit cargo python_setuptools3_rust
+
+do_compile[network] = "1" \ No newline at end of file
diff --git a/meta-offline-voice-agent/recipes-python/python3-threadpoolctl/python3-threadpoolctl_3.1.0.bb b/meta-offline-voice-agent/recipes-python/python3-threadpoolctl/python3-threadpoolctl_3.1.0.bb
new file mode 100644
index 00000000..9fed3639
--- /dev/null
+++ b/meta-offline-voice-agent/recipes-python/python3-threadpoolctl/python3-threadpoolctl_3.1.0.bb
@@ -0,0 +1,29 @@
+SUMMARY = "Python helpers to limit the number of threads used \
+ in native libraries that handle their own internal threadpool"
+HOMEPAGE = "https://github.com/joblib/threadpoolctl"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=8f2439cfddfbeebdb5cac3ae4ae80eaf"
+
+PYPI_PACKAGE = "threadpoolctl"
+
+SRC_URI[md5sum] = "e278b89038d9c9b39e7afafb8f5f87a3"
+SRC_URI[sha256sum] = "a335baacfaa4400ae1f0d8e3a58d6674d2f8828e3716bb2802c44955ad391380"
+
+DEPENDS += "python3-flit-core python3-setuptools-native"
+
+inherit pypi setuptools3
+
+do_configure:prepend() {
+cat > ${S}/setup.py <<-EOF
+from setuptools import setup
+
+setup(
+ name="${PYPI_PACKAGE}",
+ version="${PV}",
+ license="${LICENSE}",
+)
+EOF
+}
+
+RDEPENDS:${PN} += "python3-flit-core"
+BBCLASSEXTEND = "native" \ No newline at end of file
diff --git a/meta-offline-voice-agent/recipes-vosk/vosk-kaldi/vosk-kaldi_git.bb b/meta-offline-voice-agent/recipes-vosk/vosk-kaldi/vosk-kaldi_git.bb
index 16ed3398..19206d9a 100644
--- a/meta-offline-voice-agent/recipes-vosk/vosk-kaldi/vosk-kaldi_git.bb
+++ b/meta-offline-voice-agent/recipes-vosk/vosk-kaldi/vosk-kaldi_git.bb
@@ -9,9 +9,7 @@ SRC_URI = "git://github.com/alphacep/kaldi.git;protocol=https;branch=vosk \
"
PV = "1.0+git${SRCPV}"
-#SRCREV = "76cd51d44c0a61e3905c35cadb2ec5f54f3e42d1"
-SRCREV = "${AUTOREV}"
-
+SRCREV = "a25f216f5ce4eec5e45a6ab7651e20c9840a05cd"
S = "${WORKDIR}/git/src"
DEPENDS += "openblas vosk-openfst"
diff --git a/meta-offline-voice-agent/recipes-vosk/vosk-model/vosk-model-small-en-us_0.15.bb b/meta-offline-voice-agent/recipes-vosk/vosk-model/vosk-model-small-en-us_0.15.bb
index b18f8801..f959e566 100644
--- a/meta-offline-voice-agent/recipes-vosk/vosk-model/vosk-model-small-en-us_0.15.bb
+++ b/meta-offline-voice-agent/recipes-vosk/vosk-model/vosk-model-small-en-us_0.15.bb
@@ -11,8 +11,7 @@ SRC_URI = " \
# License listed on https://alphacephei.com/vosk/models
SRC_URI[model.sha256sum] = "30f26242c4eb449f948e42cb302dd7a686cb29a3423a8367f99ff41780942498"
-SRC_URI[license.sha256sum] = "69e091d43baae61f93c586d939ff7c1997415964621614add8aed06590193f47"
-# SRC_URI[license.sha256sum] = "3fbe0ee1fa914cb4b1cea2f2d7201a155884727cd0afbb51a267b66a73cb3444" (previously)
+SRC_URI[license.sha256sum] = "1ff7bf86a1243a98be7964040a7c569ade4e70f8b5e815b1edb5f3a74ca5f567"
do_install() {
install -d ${D}/usr/share/vosk