Rework and update offline voice agent 28/28928/6
authoramanarora_09 <aman.arora9848@gmail.com>
Tue, 28 Mar 2023 20:27:17 +0000 (22:27 +0200)
committerJan-Simon Moeller <jsmoeller@linuxfoundation.org>
Tue, 8 Aug 2023 18:38:17 +0000 (20:38 +0200)
This brings the voice agent to the state shown at AMM and EW.

Change-Id: I31ac4adc874a206e6e598ba116523ecc7eb99fc9
Signed-off-by: amanarora_09 <aman.arora9848@gmail.com>
Signed-off-by: Jan-Simon Moeller <jsmoeller@linuxfoundation.org>
16 files changed:
meta-offline-voice-agent/dynamic-layers/meta-agl-demo/recipes-demo/flutter-vosk-demo/flutter-vosk-demo_git.bb [new file with mode: 0644]
meta-offline-voice-agent/dynamic-layers/meta-agl-demo/recipes-platform/images/agl-demo-platform-voice.bb [deleted file]
meta-offline-voice-agent/recipes-python/python3-vosk-websocket-server/python3-vosk-websocket-server_git.bb
meta-offline-voice-agent/recipes-python/python3-wavio/python3-wavio_0.0.4.bb [new file with mode: 0644]
meta-offline-voice-agent/recipes-python/vosk-grpc-custom-server/vosk-grpc-server_git.bb [new file with mode: 0644]
meta-offline-voice-agent/recipes-vosk/vosk-kaldi/vosk-kaldi_git.bb
meta-offline-voice-agent/recipes-vosk/vosk-model/vosk-model-small-de_0.15.bb [new file with mode: 0644]
meta-offline-voice-agent/recipes-vosk/vosk-model/vosk-model-small-en-in_0.4.bb [new file with mode: 0644]
meta-offline-voice-agent/recipes-vosk/vosk-model/vosk-model-small-en-us_0.15.bb [moved from meta-offline-voice-agent/recipes-vosk/vosk-model-small-en-us/vosk-model-small-en-us_0.15.bb with 81% similarity]
meta-offline-voice-agent/recipes-vosk/vosk-model/vosk-model-small-es_0.22.bb [new file with mode: 0644]
meta-offline-voice-agent/recipes-vosk/vosk-model/vosk-model-small-fr_0.22.bb [new file with mode: 0644]
meta-offline-voice-agent/recipes-vosk/vosk-model/vosk-model-small-it_0.22.bb [new file with mode: 0644]
meta-offline-voice-agent/recipes-vosk/vosk-model/vosk-model-small-ja_0.22.bb [new file with mode: 0644]
meta-offline-voice-agent/recipes-vosk/vosk-server/vosk-server_git.bb
meta-offline-voice-agent/recipes-vosk/vosk/vosk_0.3.42.bb
templates/feature/agl-offline-voice-agent/50_local.conf.inc

diff --git a/meta-offline-voice-agent/dynamic-layers/meta-agl-demo/recipes-demo/flutter-vosk-demo/flutter-vosk-demo_git.bb b/meta-offline-voice-agent/dynamic-layers/meta-agl-demo/recipes-demo/flutter-vosk-demo/flutter-vosk-demo_git.bb
new file mode 100644 (file)
index 0000000..78aef52
--- /dev/null
@@ -0,0 +1,33 @@
+SUMMARY = "Flutter VOSK Demo"
+DESCRIPTION = "A Flutter based Offline Speech Recognition Demo Application using the VOSK API."
+
+HOMEPAGE = "https://github.com/amanarora9848/voicerecognizer-gst-grpc.git"
+
+BUGTRACKER = "https://github.com/amanarora9848/voicerecognizer-gst-grpc.git"
+
+SECTION = "graphics"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=13e8863a069f2c314d9251336e4afcbf"
+
+
+SRC_URI = "git://github.com/amanarora9848/voicerecognizer-gst-grpc.git;protocol=https;branch=master"
+
+SRCREV = "${AUTOREV}"
+S = "${WORKDIR}/git/app"
+
+inherit agl-app flutter-app
+
+# flutter-app
+#############
+PUBSPEC_APPNAME = "flutter_vosk_demo"
+FLUTTER_APPLICATION_INSTALL_PREFIX = "/flutter"
+FLUTTER_BUILD_ARGS = "bundle -v"
+
+# agl-app
+#########
+AGL_APP_TEMPLATE = "agl-app-flutter"
+AGL_APP_ID = "flutter_vosk_demo"
+AGL_APP_NAME = "VOSK-DEMO"
+
+RDEPENDS:${PN} = "vosk-grpc-server"
diff --git a/meta-offline-voice-agent/dynamic-layers/meta-agl-demo/recipes-platform/images/agl-demo-platform-voice.bb b/meta-offline-voice-agent/dynamic-layers/meta-agl-demo/recipes-platform/images/agl-demo-platform-voice.bb
deleted file mode 100644 (file)
index 6e39a7f..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-require recipes-platform/images/agl-ivi-demo-platform.bb
-
-IMAGE_INSTALL:append = "python3-vosk-api vosk vosk-server gcc make cmake autoconf automake gcc-c++ boost-dev"
\ No newline at end of file
index 1a77f7d..1cdf89c 100644 (file)
@@ -11,23 +11,18 @@ SRCREV = "70f3d5321a40f2f5dffe9c833bc1fac4b3b451e7"
 
 S = "${WORKDIR}/git"
 
+do_configure[noexec] = "1"
+do_compile[noexec] = "1"
+
+do_install () {
+    install -d ${D}${bindir}
+    cp ${S}/websocket/asr_server.py ${D}${bindir}/vosk-websocket-python.py
+    chmod a+x ${D}${bindir}/vosk-websocket-python.py
+}
+
 RDEPENDS:${PN} += " \
     vosk \
     python3-vosk-api \
     python3-websockets \
     virtual/vosk-model \
-"
-
-do_configure () {
-       :
-}
-
-do_compile () {
-       :
-}
-
-do_install () {
-       install -d ${D}${bindir}
-       cp ${S}/websocket/asr_server.py ${D}${bindir}/vosk-websocket-python.py
-    chmod a+x ${D}${bindir}/vosk-websocket-python.py
-}
+"
\ No newline at end of file
diff --git a/meta-offline-voice-agent/recipes-python/python3-wavio/python3-wavio_0.0.4.bb b/meta-offline-voice-agent/recipes-python/python3-wavio/python3-wavio_0.0.4.bb
new file mode 100644 (file)
index 0000000..6fbb22c
--- /dev/null
@@ -0,0 +1,19 @@
+SUMMARY = "A Python module for reading and writing WAV files using numpy arrays."
+HOMEPAGE = "https://github.com/WarrenWeckesser/wavio"
+
+LICENSE = "BSD-2-Clause"
+LIC_FILES_CHKSUM = "file://${WORKDIR}/git/README.rst;beginline=48;endline=48;md5=bc752f76db0a3e24c17afcc8dda3d553"
+# License listed in README.rst at https://github.com/WarrenWeckesser/wavio
+
+SRC_URI = "git://github.com/WarrenWeckesser/wavio;protocol=https;branch=master"
+
+PV = "0.0.4+git${SRCPV}"
+SRCREV = "54699acdde2cb4f68fbe3dc5847a74ab796662e1"
+
+S = "${WORKDIR}/git"
+
+inherit setuptools3
+
+DEPENDS += "python3-numpy"
+
+RDEPENDS:${PN} += "python3-audio python3-core python3-numpy"
diff --git a/meta-offline-voice-agent/recipes-python/vosk-grpc-custom-server/vosk-grpc-server_git.bb b/meta-offline-voice-agent/recipes-python/vosk-grpc-custom-server/vosk-grpc-server_git.bb
new file mode 100644 (file)
index 0000000..0a32a0c
--- /dev/null
@@ -0,0 +1,36 @@
+DESCRIPTION = "WebSocket, gRPC and WebRTC speech recognition server based on Vosk and Kaldi libraries"
+SUMMARY = "This is a server for highly accurate offline speech recognition using Kaldi and Vosk-API."
+HOMEPAGE = "https://github.com/alphacep/vosk-server"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://../LICENSE;md5=13e8863a069f2c314d9251336e4afcbf"
+
+SRC_URI = "git://github.com/amanarora9848/voicerecognizer-gst-grpc;protocol=https;branch=master"
+
+PV = "1.0+git${SRCPV}"
+SRCREV = "d28da4cd89a5dfff823f1358816d0ff4791f8d28"
+
+S = "${WORKDIR}/git/python-server"
+
+RDEPENDS:${PN} += " \
+    vosk \
+    python3-vosk-api \
+    python3-grpcio \
+    python3-protobuf \
+    virtual/vosk-model \
+    python3-pycairo \
+    python3-pygobject \
+"
+
+do_configure[noexec] = "1"
+do_compile[noexec] = "1"
+
+do_install () {
+    install -d ${D}${libdir}/vosk-grpc-server
+    cp ${S}/record_server_grpc.py ${D}${libdir}/vosk-grpc-server/
+    cp ${S}/recognize_pb2_grpc.py ${D}${libdir}/vosk-grpc-server/
+    cp ${S}/recognize.proto ${D}${libdir}/vosk-grpc-server/
+    cp ${S}/recognize_pb2.py ${D}${libdir}/vosk-grpc-server/
+    chmod a+x ${D}${libdir}/vosk-grpc-server/record_server_grpc.py
+}
+
+FILES:${PN} += " /usr/lib/vosk-grpc-server "
\ No newline at end of file
index 45cf71f..16ed339 100644 (file)
@@ -9,11 +9,13 @@ SRC_URI = "git://github.com/alphacep/kaldi.git;protocol=https;branch=vosk \
            "
 
 PV = "1.0+git${SRCPV}"
-SRCREV = "76cd51d44c0a61e3905c35cadb2ec5f54f3e42d1"
+#SRCREV = "76cd51d44c0a61e3905c35cadb2ec5f54f3e42d1"
+SRCREV = "${AUTOREV}"
 
 S = "${WORKDIR}/git/src"
 
 DEPENDS += "openblas vosk-openfst"
+
 inherit python3native
 
 ALLOW_EMPTY_${PN} = "1"
@@ -22,32 +24,23 @@ MYCONF = "--mathlib=OPENBLAS --static --shared --use-cuda=no --fst-root=${STAGIN
 
 # remove x86-specific optimizations
 do_configure:prepend:aarch64(){
-
 sed -i -e "s#-msse -msse2##g" ${S}/makefiles/linux_openblas.mk
-
 }
 
 do_configure:prepend:arm(){
-
 sed -i -e "s#-msse -msse2##g" ${S}/makefiles/linux_openblas.mk
-
 }
 
 
 do_configure() {
-
   ./configure ${MYCONF}
-
 }
 
 do_compile() {
-
   make ${PARALLEL_MAKE}
-
 }
 
 do_install() {
-
   install -d ${D}${libdir}
 
   for i in lib/*.so ; do
diff --git a/meta-offline-voice-agent/recipes-vosk/vosk-model/vosk-model-small-de_0.15.bb b/meta-offline-voice-agent/recipes-vosk/vosk-model/vosk-model-small-de_0.15.bb
new file mode 100644 (file)
index 0000000..c65d05b
--- /dev/null
@@ -0,0 +1,23 @@
+SUMMARY = "Lightweight wideband model 'de'"
+HOMEPAGE = "https://alphacephei.com/vosk/"
+LICENSE = "Apache-2.0"
+# LIC_URL = "${COMMON_LICENSE_DIR}/Apache-2.0"
+LIC_FILES_CHKSUM = "file://${WORKDIR}/models.md;beginline=64;endline=64;md5=b4197dee31a6934aaf221359839c12e1"
+
+SRC_URI = " \
+           https://alphacephei.com/vosk/models/vosk-model-small-de-0.15.zip;name=model \
+           https://raw.githubusercontent.com/alphacep/vosk-space/master/models.md;name=license \
+          "
+# License listed on https://alphacephei.com/vosk/models
+
+SRC_URI[model.sha256sum] = "b7e53c90b1f0a38456f4cd62b366ecd58803cd97cd42b06438e2c131713d5e43"
+SRC_URI[license.sha256sum] = "3fbe0ee1fa914cb4b1cea2f2d7201a155884727cd0afbb51a267b66a73cb3444"
+
+do_install() {
+    install -d ${D}/usr/share/vosk
+    cp -R ${WORKDIR}/vosk-model-small-de-0.15/ ${D}/usr/share/vosk/
+}
+
+FILES:${PN} += " /usr/share/vosk  /usr/share/vosk/vosk-model-small-de-0.15 "
+
+# RPROVIDES:${PN} += "virtual/vosk-model"
diff --git a/meta-offline-voice-agent/recipes-vosk/vosk-model/vosk-model-small-en-in_0.4.bb b/meta-offline-voice-agent/recipes-vosk/vosk-model/vosk-model-small-en-in_0.4.bb
new file mode 100644 (file)
index 0000000..5a886e0
--- /dev/null
@@ -0,0 +1,23 @@
+SUMMARY = "Lightweight Indian English model for mobile applications"
+HOMEPAGE = "https://alphacephei.com/vosk/"
+LICENSE = "Apache-2.0"
+# LIC_URL = "${COMMON_LICENSE_DIR}/Apache-2.0"
+LIC_FILES_CHKSUM = "file://${WORKDIR}/models.md;beginline=44;endline=44;md5=a9131c3e00accfcddf94bff9e8b43018"
+
+SRC_URI = " \
+           https://alphacephei.com/vosk/models/vosk-model-small-en-in-0.4.zip;name=model \
+           https://raw.githubusercontent.com/alphacep/vosk-space/master/models.md;name=license \
+          "
+# License listed on https://alphacephei.com/vosk/models
+
+SRC_URI[model.sha256sum] = "20663dcac4d5cb783a579c54d98339344a688e4ec6e1b4a4b059fd1235454cc7"
+SRC_URI[license.sha256sum] = "3fbe0ee1fa914cb4b1cea2f2d7201a155884727cd0afbb51a267b66a73cb3444"
+
+do_install() {
+    install -d ${D}/usr/share/vosk
+    cp -R ${WORKDIR}/vosk-model-small-en-in-0.4/ ${D}/usr/share/vosk/
+}
+
+FILES:${PN} += " /usr/share/vosk  /usr/share/vosk/vosk-model-small-en-in-0.4 "
+
+# RPROVIDES:${PN} += "virtual/vosk-model"
@@ -11,7 +11,8 @@ SRC_URI = " \
 # License listed on https://alphacephei.com/vosk/models
 
 SRC_URI[model.sha256sum] = "30f26242c4eb449f948e42cb302dd7a686cb29a3423a8367f99ff41780942498"
-SRC_URI[license.sha256sum] = "3fbe0ee1fa914cb4b1cea2f2d7201a155884727cd0afbb51a267b66a73cb3444"
+SRC_URI[license.sha256sum] = "69e091d43baae61f93c586d939ff7c1997415964621614add8aed06590193f47"
+# SRC_URI[license.sha256sum] = "3fbe0ee1fa914cb4b1cea2f2d7201a155884727cd0afbb51a267b66a73cb3444" (previously)
 
 do_install() {
     install -d ${D}/usr/share/vosk
diff --git a/meta-offline-voice-agent/recipes-vosk/vosk-model/vosk-model-small-es_0.22.bb b/meta-offline-voice-agent/recipes-vosk/vosk-model/vosk-model-small-es_0.22.bb
new file mode 100644 (file)
index 0000000..9798d9a
--- /dev/null
@@ -0,0 +1,23 @@
+SUMMARY = "Lightweight wideband model 'es'"
+HOMEPAGE = "https://alphacephei.com/vosk/"
+LICENSE = "Apache-2.0"
+# LIC_URL = "${COMMON_LICENSE_DIR}/Apache-2.0"
+LIC_FILES_CHKSUM = "file://${WORKDIR}/models.md;beginline=66;endline=66;md5=dafff175a878d17393d30812eac57e87"
+
+SRC_URI = " \
+           https://alphacephei.com/vosk/models/vosk-model-small-es-0.22.zip;name=model \
+           https://raw.githubusercontent.com/alphacep/vosk-space/master/models.md;name=license \
+          "
+# License listed on https://alphacephei.com/vosk/models
+
+SRC_URI[model.sha256sum] = "97d2b9f062a4d363ad1d71f011cc77e073773d749f1e5cd21a172c8ca28b0a56"
+SRC_URI[license.sha256sum] = "3fbe0ee1fa914cb4b1cea2f2d7201a155884727cd0afbb51a267b66a73cb3444"
+
+do_install() {
+    install -d ${D}/usr/share/vosk
+    cp -R ${WORKDIR}/vosk-model-small-es-0.22/ ${D}/usr/share/vosk/
+}
+
+FILES:${PN} += " /usr/share/vosk  /usr/share/vosk/vosk-model-small-es-0.22 "
+
+# RPROVIDES:${PN} += "virtual/vosk-model"
diff --git a/meta-offline-voice-agent/recipes-vosk/vosk-model/vosk-model-small-fr_0.22.bb b/meta-offline-voice-agent/recipes-vosk/vosk-model/vosk-model-small-fr_0.22.bb
new file mode 100644 (file)
index 0000000..0157a22
--- /dev/null
@@ -0,0 +1,23 @@
+SUMMARY = "Lightweight wideband model 'fr'"
+HOMEPAGE = "https://alphacephei.com/vosk/"
+LICENSE = "Apache-2.0"
+# LIC_URL = "${COMMON_LICENSE_DIR}/Apache-2.0"
+LIC_FILES_CHKSUM = "file://${WORKDIR}/models.md;beginline=56;endline=56;md5=b49bbab5d6832157cad0e0dbb924a5b2"
+
+SRC_URI = " \
+           https://alphacephei.com/vosk/models/vosk-model-small-fr-0.22.zip;name=model \
+           https://raw.githubusercontent.com/alphacep/vosk-space/master/models.md;name=license \
+          "
+# License listed on https://alphacephei.com/vosk/models
+
+SRC_URI[model.sha256sum] = "cabf6180e177eb9b3a9a9d43a437bd5e549f3a7d09525e5d69a3fed787be12ad"
+SRC_URI[license.sha256sum] = "3fbe0ee1fa914cb4b1cea2f2d7201a155884727cd0afbb51a267b66a73cb3444"
+
+do_install() {
+    install -d ${D}/usr/share/vosk
+    cp -R ${WORKDIR}/vosk-model-small-fr-0.22/ ${D}/usr/share/vosk/
+}
+
+FILES:${PN} += " /usr/share/vosk  /usr/share/vosk/vosk-model-small-fr-0.22 "
+
+# RPROVIDES:${PN} += "virtual/vosk-model"
diff --git a/meta-offline-voice-agent/recipes-vosk/vosk-model/vosk-model-small-it_0.22.bb b/meta-offline-voice-agent/recipes-vosk/vosk-model/vosk-model-small-it_0.22.bb
new file mode 100644 (file)
index 0000000..e7d1c43
--- /dev/null
@@ -0,0 +1,23 @@
+SUMMARY = "Lightweight wideband model 'en-us'"
+HOMEPAGE = "https://alphacephei.com/vosk/"
+LICENSE = "Apache-2.0"
+# LIC_URL = "${COMMON_LICENSE_DIR}/Apache-2.0"
+LIC_FILES_CHKSUM = "file://${WORKDIR}/models.md;beginline=77;endline=77;md5=5738be531d1fac9b1088702e7d1f9499"
+
+SRC_URI = " \
+           https://alphacephei.com/vosk/models/vosk-model-small-it-0.22.zip;name=model \
+           https://raw.githubusercontent.com/alphacep/vosk-space/master/models.md;name=license \
+          "
+# License listed on https://alphacephei.com/vosk/models
+
+SRC_URI[model.sha256sum] = "9ec65e75861d1c6c2e457cccd932705340dcdf233f5b239f00733b4de0bf3267"
+SRC_URI[license.sha256sum] = "3fbe0ee1fa914cb4b1cea2f2d7201a155884727cd0afbb51a267b66a73cb3444"
+
+do_install() {
+    install -d ${D}/usr/share/vosk
+    cp -R ${WORKDIR}/vosk-model-small-it-0.22/ ${D}/usr/share/vosk/
+}
+
+FILES:${PN} += " /usr/share/vosk  /usr/share/vosk/vosk-model-small-it-0.22 "
+
+# RPROVIDES:${PN} += "virtual/vosk-model"
diff --git a/meta-offline-voice-agent/recipes-vosk/vosk-model/vosk-model-small-ja_0.22.bb b/meta-offline-voice-agent/recipes-vosk/vosk-model/vosk-model-small-ja_0.22.bb
new file mode 100644 (file)
index 0000000..dc2292d
--- /dev/null
@@ -0,0 +1,23 @@
+SUMMARY = "Lightweight wideband model for Japanese"
+HOMEPAGE = "https://alphacephei.com/vosk/"
+LICENSE = "Apache-2.0"
+# LIC_URL = "${COMMON_LICENSE_DIR}/Apache-2.0"
+LIC_FILES_CHKSUM = "file://${WORKDIR}/models.md;beginline=105;endline=105;md5=d6585d5b106f271e40f0f6befafc9da9"
+
+SRC_URI = " \
+           https://alphacephei.com/vosk/models/vosk-model-small-ja-0.22.zip;name=model \
+           https://raw.githubusercontent.com/alphacep/vosk-space/master/models.md;name=license \
+          "
+# License listed on https://alphacephei.com/vosk/models
+
+SRC_URI[model.sha256sum] = "efa092d280153a77615e9e0c7d7283e93e600de3d19d3bec686c57ef19d52eac"
+SRC_URI[license.sha256sum] = "3fbe0ee1fa914cb4b1cea2f2d7201a155884727cd0afbb51a267b66a73cb3444"
+
+do_install() {
+    install -d ${D}/usr/share/vosk
+    cp -R ${WORKDIR}/vosk-model-small-ja-0.22/ ${D}/usr/share/vosk/
+}
+
+FILES:${PN} += " /usr/share/vosk  /usr/share/vosk/vosk-model-small-ja-0.22 "
+
+# RPROVIDES:${PN} += "virtual/vosk-model"
index 337cee4..b0efcae 100644 (file)
@@ -29,4 +29,4 @@ do_install () {
        cp websocket-cpp/vosk-websocket-cpp ${D}${bindir}
 }
 
-RDEPENDS:${PN} += "virtual/vosk-model"
\ No newline at end of file
+RDEPENDS:${PN} += "virtual/vosk-model"
index bf4ffe3..a563c6f 100644 (file)
@@ -14,24 +14,18 @@ S = "${WORKDIR}/git/src"
 
 DEPENDS += " vosk-kaldi vosk-openfst openblas"
 
-RDEPENDS:${PN} += " \
-"
+#RDEPENDS:${PN} += ""
 
 CFLAGS:append = " -I${STAGING_INCDIR}/kaldi -g "
 LDFLAGS:remove = "-Wl,--as-needed"
 
-do_configure(){
-    :
-}
+do_configure[noexec] = "1"
 
 do_compile(){
-
     make KALDI_ROOT=${STAGING_INCDIR}/kaldi/ OPENFST_ROOT=${STAGING_INCDIR} OPENBLAS_ROOT=${STAGING_INCDIR} USE_SHARED=1 EXTRA_CFLAGS="${CFLAGS}" EXTRA_LDFLAGS="${LDFLAGS}" ${PARALLEL_MAKE}
-
 }
 
 do_install(){
-
     install -d ${D}${libdir}
     install -m 0644 libvosk.so.0.3.42 ${D}${libdir}
     cd ${D}${libdir}
@@ -41,9 +35,8 @@ do_install(){
 
     install -d ${D}${includedir}/vosk
     for i in *.h ; do
-       install -m 0644 $i ${D}${includedir}/vosk/
+        install -m 0644 $i ${D}${includedir}/vosk/
     done
-
 }
 
 ERROR_QA:remove = "dev-deps"
index 581ad97..6276b07 100644 (file)
@@ -6,9 +6,6 @@ RUNTIMETARGET:append:pn-gcc-runtime = " libquadmath"
 # FIXME check if needed and/or submit upstream
 BBCLASSEXTEND:pn-python3-charset-normalizer = "native nativesdk"
 
-IMAGE_INSTALL:append = " python3-vosk-api vosk-kaldi vosk vosk-server python3-vosk-websocket-server python3-sounddevice ptest-runner"
+IMAGE_INSTALL:append = " python3-vosk-api vosk-kaldi vosk vosk-server python3-vosk-websocket-server python3-sounddevice flutter-vosk-demo"
 
 PREFERRED_PROVIDER_virtual/vosk-model ?= "vosk-model-small-en-us"
-
-DISTRO_FEATURES:append = " ptest"
-EXTRA_IMAGE_FEATURES += "ptest-pkgs"