aboutsummaryrefslogtreecommitdiffstats
path: root/meta-multimedia
diff options
context:
space:
mode:
authorAlistair Francis <alistair.francis@wdc.com>2019-04-05 14:41:54 +0000
committerKhem Raj <raj.khem@gmail.com>2019-04-06 08:22:22 -0700
commitfb097550fdc5e8a7de6bdceb87d8aa161b94eb06 (patch)
tree73a0e690aee2c7923e4531ac92eba0076fc105a2 /meta-multimedia
parent47f4a924102d014fcd5e68170b98392cfa1f5f44 (diff)
downloadmeta-openembedded-contrib-fb097550fdc5e8a7de6bdceb87d8aa161b94eb06.tar.gz
mycroft: Initial commit
Mycroft is an open source speech assistant. It traditionally runs inside Python virtual env and installs all of the pip and native packages and programs that is needs at setup. This generally includes a native gcc build for some of the binaries in the pip packages. This patch adds Mycroft support and edits the source to remove the Python venv usage so we can just run in standard Python world. This allows us to use the preinstalled Python packages where avaliable and avoid installing too much on the target at runtime. At the moment we still require a few simple Python packages to be installed but we don't requrie any target compilation. Hopefully in the future we can remove all of the runtime install requirements by adding all the Python packages to the rootFS pre-boot and setting up the other files/directories as required during the build process. This patch also adds two systemd services. The first will setup mycroft on boot, the second will start the mycroft voice assistant. Signed-off-by: Alistair Francis <alistair.francis@wdc.com> Signed-off-by: Khem Raj <raj.khem@gmail.com>
Diffstat (limited to 'meta-multimedia')
-rw-r--r--meta-multimedia/recipes-multimedia/mycroft/files/0001-Remove-python-venv.patch192
-rw-r--r--meta-multimedia/recipes-multimedia/mycroft/files/0002-pip-requirements-Remove-ones-installed-by-OE.patch62
-rw-r--r--meta-multimedia/recipes-multimedia/mycroft/files/0003-Use-python3-and-pip3-instead-of-python-and-pip.patch135
-rw-r--r--meta-multimedia/recipes-multimedia/mycroft/files/0004-dev_setup.sh-Remove-the-git-dependency.patch48
-rw-r--r--meta-multimedia/recipes-multimedia/mycroft/files/0005-dev_setup.sh-Remove-the-test-setup-dependency.patch31
-rw-r--r--meta-multimedia/recipes-multimedia/mycroft/files/dev_opts.json1
-rw-r--r--meta-multimedia/recipes-multimedia/mycroft/files/mycroft-setup.service11
-rw-r--r--meta-multimedia/recipes-multimedia/mycroft/files/mycroft.service13
-rw-r--r--meta-multimedia/recipes-multimedia/mycroft/mycroft_19.2.2.bb73
9 files changed, 566 insertions, 0 deletions
diff --git a/meta-multimedia/recipes-multimedia/mycroft/files/0001-Remove-python-venv.patch b/meta-multimedia/recipes-multimedia/mycroft/files/0001-Remove-python-venv.patch
new file mode 100644
index 0000000000..c03bccd3da
--- /dev/null
+++ b/meta-multimedia/recipes-multimedia/mycroft/files/0001-Remove-python-venv.patch
@@ -0,0 +1,192 @@
+From 6272f36080bd440a5825b526f4c06223c5bb9fbb Mon Sep 17 00:00:00 2001
+From: Alistair Francis <alistair.francis@wdc.com>
+Date: Mon, 18 Mar 2019 16:30:45 -0700
+Subject: [PATCH 1/5] Remove python venv
+
+Remove the python venv requirements and instead just use the native
+python and pip pacakges.
+
+Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
+Upstream-Status: Inappropriate [embedded specific]
+---
+ dev_setup.sh | 36 ------------------------------------
+ start-mycroft.sh | 13 -------------
+ venv-activate.sh | 44 +-------------------------------------------
+ 3 files changed, 1 insertion(+), 92 deletions(-)
+
+diff --git a/dev_setup.sh b/dev_setup.sh
+index e0b07bf25cf..aed54b2167a 100755
+--- a/dev_setup.sh
++++ b/dev_setup.sh
+@@ -310,18 +310,6 @@ function install_deps() {
+ fi
+ }
+
+-VIRTUALENV_ROOT=${VIRTUALENV_ROOT:-"${TOP}/.venv"}
+-
+-function install_venv() {
+- ${opt_python} -m venv "${VIRTUALENV_ROOT}/" --without-pip
+- # Force version of pip for reproducability, but there is nothing special
+- # about this version. Update whenever a new version is released and
+- # verified functional.
+- curl https://bootstrap.pypa.io/3.3/get-pip.py | "${VIRTUALENV_ROOT}/bin/python" - 'pip==18.0.0'
+- # Function status depending on if pip exists
+- [ -x "${VIRTUALENV_ROOT}/bin/pip" ]
+-}
+-
+ install_deps
+
+ # Configure to use the standard commit template for
+@@ -355,15 +343,7 @@ else
+ fi
+ fi
+
+-if [ ! -x "${VIRTUALENV_ROOT}/bin/activate" ] ; then
+- if ! install_venv ; then
+- echo "Failed to set up virtualenv for mycroft, exiting setup."
+- exit 1
+- fi
+-fi
+-
+ # Start the virtual environment
+-source "${VIRTUALENV_ROOT}/bin/activate"
+ cd "${TOP}"
+
+ # Install pep8 pre-commit hook
+@@ -380,22 +360,6 @@ fi
+
+ PYTHON=$( python -c "import sys;print('python{}.{}'.format(sys.version_info[0], sys.version_info[1]))" )
+
+-# Add mycroft-core to the virtualenv path
+-# (This is equivalent to typing 'add2virtualenv $TOP', except
+-# you can't invoke that shell function from inside a script)
+-VENV_PATH_FILE="${VIRTUALENV_ROOT}/lib/$PYTHON/site-packages/_virtualenv_path_extensions.pth"
+-if [ ! -f "$VENV_PATH_FILE" ] ; then
+- echo "import sys; sys.__plen = len(sys.path)" > "$VENV_PATH_FILE" || return 1
+- echo "import sys; new=sys.path[sys.__plen:]; del sys.path[sys.__plen:]; p=getattr(sys,'__egginsert',0); sys.path[p:p]=new; sys.__egginsert = p+len(new)" >> "$VENV_PATH_FILE" || return 1
+-fi
+-
+-if ! grep -q "$TOP" $VENV_PATH_FILE ; then
+- echo "Adding mycroft-core to virtualenv path"
+- sed -i.tmp '1 a\
+-'"$TOP"'
+-' "${VENV_PATH_FILE}"
+-fi
+-
+ # install required python modules
+ if ! pip install -r requirements.txt ; then
+ echo "Warning: Failed to install all requirements. Continue? y/N"
+diff --git a/start-mycroft.sh b/start-mycroft.sh
+index b9514a61ba5..64e0216a62f 100755
+--- a/start-mycroft.sh
++++ b/start-mycroft.sh
+@@ -20,7 +20,6 @@ script=${0}
+ script=${script##*/}
+ cd -P "$( dirname "$SOURCE" )"
+ DIR="$( pwd )"
+-VIRTUALENV_ROOT=${VIRTUALENV_ROOT:-"${DIR}/.venv"}
+
+ function help() {
+ echo "${script}: Mycroft command/service launcher"
+@@ -76,19 +75,11 @@ function name-to-script-path() {
+ esac
+ }
+
+-function source-venv() {
+- # Enter Python virtual environment, unless under Docker
+- if [ ! -f "/.dockerenv" ] ; then
+- source ${VIRTUALENV_ROOT}/bin/activate
+- fi
+-}
+-
+ first_time=true
+ function init-once() {
+ if ($first_time) ; then
+ echo "Initializing..."
+ "${DIR}/scripts/prepare-msm.sh"
+- source-venv
+ first_time=false
+ fi
+ }
+@@ -225,15 +216,12 @@ case ${_opt} in
+ # launch-background ${_opt}
+ # ;;
+ "unittest")
+- source-venv
+ pytest test/unittests/ --cov=mycroft "$@"
+ ;;
+ "singleunittest")
+- source-venv
+ pytest "$@"
+ ;;
+ "skillstest")
+- source-venv
+ pytest test/integrationtests/skills/discover_tests.py "$@"
+ ;;
+ "audiotest")
+@@ -243,7 +231,6 @@ case ${_opt} in
+ launch-process ${_opt}
+ ;;
+ "sdkdoc")
+- source-venv
+ cd doc
+ make ${opt}
+ cd ..
+diff --git a/venv-activate.sh b/venv-activate.sh
+index d1e7bcb44e7..10b46d4de3b 100644
+--- a/venv-activate.sh
++++ b/venv-activate.sh
+@@ -22,49 +22,7 @@
+
+ # wrap in function to allow local variables, since this file will be source'd
+ function main() {
+- local quiet=0
+-
+- for arg in "$@"
+- do
+- case $arg in
+- "-q"|"--quiet" )
+- quiet=1
+- ;;
+-
+- "-h"|"--help" )
+- echo "venv-activate.sh: Enter the Mycroft virtual environment"
+- echo "Usage:"
+- echo " source venv-activate.sh"
+- echo "or"
+- echo " . venv-activate.sh"
+- echo ""
+- echo "Options:"
+- echo " -q | --quiet Don't show instructions."
+- echo " -h | --help Show help."
+- return 0
+- ;;
+-
+- *)
+- echo "ERROR: Unrecognized option: $@"
+- return 1
+- ;;
+- esac
+- done
+-
+- if [ "$0" == "$BASH_SOURCE" ] ; then
+- # Prevent running in script then exiting immediately
+- echo "ERROR: Invoke with 'source venv-activate.sh' or '. venv-activate.sh'"
+- else
+- local SRC_DIR="$( builtin cd "$( dirname "${BASH_SOURCE}" )" ; pwd -P )"
+- source ${SRC_DIR}/.venv/bin/activate
+-
+- # Provide an easier to find "mycroft-" prefixed command.
+- unalias mycroft-venv-activate 2>/dev/null
+- alias mycroft-venv-deactivate="deactivate && unalias mycroft-venv-deactivate 2>/dev/null && alias mycroft-venv-activate=\"source '${SRC_DIR}/venv-activate.sh'\""
+- if [ $quiet -eq 0 ] ; then
+- echo "Entering Mycroft virtual environment. Run 'mycroft-venv-deactivate' to exit"
+- fi
+- fi
++ echo "Not entering Python VENV"
+ }
+
+ main $@
+--
+2.21.0
+
diff --git a/meta-multimedia/recipes-multimedia/mycroft/files/0002-pip-requirements-Remove-ones-installed-by-OE.patch b/meta-multimedia/recipes-multimedia/mycroft/files/0002-pip-requirements-Remove-ones-installed-by-OE.patch
new file mode 100644
index 0000000000..ca79d00b42
--- /dev/null
+++ b/meta-multimedia/recipes-multimedia/mycroft/files/0002-pip-requirements-Remove-ones-installed-by-OE.patch
@@ -0,0 +1,62 @@
+From 142bc3912ea9e1a4ecf4db0e2bec3049aa416464 Mon Sep 17 00:00:00 2001
+From: Alistair Francis <alistair.francis@wdc.com>
+Date: Tue, 19 Mar 2019 13:32:54 -0700
+Subject: [PATCH 2/5] pip requirements: Remove ones installed by OE
+
+Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
+Upstream-Status: Inappropriate [embedded specific]
+---
+ requirements.txt | 14 --------------
+ test-requirements.txt | 1 -
+ 2 files changed, 15 deletions(-)
+
+diff --git a/requirements.txt b/requirements.txt
+index 7e4faf48182..29536e990ac 100644
+--- a/requirements.txt
++++ b/requirements.txt
+@@ -1,20 +1,10 @@
+-six==1.10.0
+-requests==2.20.0
+ gTTS==2.0.3
+ gTTS-token==1.1.3
+-PyAudio==0.2.11
+ pyee==5.0.0
+ SpeechRecognition==3.8.1
+-tornado==4.5.3
+ websocket-client==0.54.0
+ requests-futures==0.9.5
+-pyalsaaudio==0.8.2
+ xmlrunner==1.7.7
+-pyserial==3.0
+-psutil==5.2.1
+-pocketsphinx==0.1.0
+-inflection==0.3.1
+-pillow==4.1.1
+ python-dateutil==2.6.0
+ pychromecast==0.7.7
+ python-vlc==1.1.2
+@@ -26,10 +16,6 @@ msm==0.7.3
+ msk==0.3.12
+ adapt-parser==0.3.2
+ padatious==0.4.6
+-fann2==1.0.7
+ padaos==0.1.9
+ precise-runner==0.2.1
+ petact==0.1.2
+-
+-# dev setup tools
+-pep8==1.7.0
+diff --git a/test-requirements.txt b/test-requirements.txt
+index 8ada8157c95..eb4e364a9b4 100644
+--- a/test-requirements.txt
++++ b/test-requirements.txt
+@@ -1,6 +1,5 @@
+ pep8==1.7.0
+ coveralls==1.5.0
+-pytest==3.5.0
+ pytest-cov==2.5.1
+ cov-core==1.15.0
+ mock==2.0.0
+--
+2.21.0
+
diff --git a/meta-multimedia/recipes-multimedia/mycroft/files/0003-Use-python3-and-pip3-instead-of-python-and-pip.patch b/meta-multimedia/recipes-multimedia/mycroft/files/0003-Use-python3-and-pip3-instead-of-python-and-pip.patch
new file mode 100644
index 0000000000..a1f04b4b47
--- /dev/null
+++ b/meta-multimedia/recipes-multimedia/mycroft/files/0003-Use-python3-and-pip3-instead-of-python-and-pip.patch
@@ -0,0 +1,135 @@
+From 87b94e54fefa1f83b41030444fc87b421c97b2c5 Mon Sep 17 00:00:00 2001
+From: Alistair Francis <alistair.francis@wdc.com>
+Date: Tue, 19 Mar 2019 13:38:44 -0700
+Subject: [PATCH 3/5] Use python3 and pip3 instead of python and pip
+
+Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
+Upstream-Status: Inappropriate [embedded specific]
+---
+ bin/mycroft-cli-client | 2 +-
+ bin/mycroft-pip | 2 +-
+ bin/mycroft-say-to | 2 +-
+ bin/mycroft-skill-testrunner | 4 ++--
+ bin/mycroft-speak | 2 +-
+ dev_setup.sh | 10 +++++-----
+ scripts/install-pocketsphinx.sh | 2 +-
+ 7 files changed, 12 insertions(+), 12 deletions(-)
+
+diff --git a/bin/mycroft-cli-client b/bin/mycroft-cli-client
+index f40a316e3f6..de2040d9e67 100755
+--- a/bin/mycroft-cli-client
++++ b/bin/mycroft-cli-client
+@@ -21,4 +21,4 @@ DIR="$( dirname "$SOURCE" )"
+ source "$DIR/../venv-activate.sh" -q
+
+ # Invoke the Command Line Interface
+-python -m mycroft.client.text $@
++python3 -m mycroft.client.text $@
+diff --git a/bin/mycroft-pip b/bin/mycroft-pip
+index a42b16b847a..81bd5bfb3cf 100755
+--- a/bin/mycroft-pip
++++ b/bin/mycroft-pip
+@@ -21,4 +21,4 @@ DIR="$( dirname "$SOURCE" )"
+ source "$DIR/../venv-activate.sh" -q
+
+ # Install pip packages within the Mycroft venv
+-pip $@
+\ No newline at end of file
++pip3 $@
+\ No newline at end of file
+diff --git a/bin/mycroft-say-to b/bin/mycroft-say-to
+index 964e16eb0c5..5575969715c 100755
+--- a/bin/mycroft-say-to
++++ b/bin/mycroft-say-to
+@@ -22,4 +22,4 @@ DIR="$( pwd )"
+ source "$DIR/../venv-activate.sh" -q
+
+ # Send a message to be spoken
+-output=$(python -m mycroft.messagebus.send "recognizer_loop:utterance" "{\"utterances\": [\"$@\"], \"lang\": \"en-us\"}")
++output=$(python3 -m mycroft.messagebus.send "recognizer_loop:utterance" "{\"utterances\": [\"$@\"], \"lang\": \"en-us\"}")
+diff --git a/bin/mycroft-skill-testrunner b/bin/mycroft-skill-testrunner
+index 9699a4d138f..282f5ca65b0 100755
+--- a/bin/mycroft-skill-testrunner
++++ b/bin/mycroft-skill-testrunner
+@@ -22,7 +22,7 @@ source "$DIR/../venv-activate.sh" -q
+
+ # Invoke the individual skill tester
+ if [ "$#" -eq 0 ] ; then
+- python -m test.integrationtests.skills.runner .
++ python3 -m test.integrationtests.skills.runner .
+ else
+- python -m test.integrationtests.skills.runner $@
++ python3 -m test.integrationtests.skills.runner $@
+ fi
+\ No newline at end of file
+diff --git a/bin/mycroft-speak b/bin/mycroft-speak
+index 51facf29189..c65556f1173 100755
+--- a/bin/mycroft-speak
++++ b/bin/mycroft-speak
+@@ -22,4 +22,4 @@ DIR="$( pwd )"
+ source "$DIR/../venv-activate.sh" -q
+
+ # Send a message to be spoken
+-output=$(python -m mycroft.messagebus.send "speak" "{\"utterance\": \"$@\"}")
+\ No newline at end of file
++output=$(python3 -m mycroft.messagebus.send "speak" "{\"utterance\": \"$@\"}")
+\ No newline at end of file
+diff --git a/dev_setup.sh b/dev_setup.sh
+index aed54b2167a..dd391181f19 100755
+--- a/dev_setup.sh
++++ b/dev_setup.sh
+@@ -48,7 +48,7 @@ param=""
+
+ for var in "$@" ; do
+ # Check if parameter should be read
+- if [[ ${param} == "python" ]] ; then
++ if [[ ${param} == "python3" ]] ; then
+ opt_python=${var}
+ param=""
+ continue
+@@ -351,17 +351,17 @@ if [ -z ${INSTALL_PRECOMMIT_HOOK} ] ; then
+ HOOK_FILE="./.git/hooks/pre-commit"
+ if [ ! -f ${HOOK_FILE} ] || grep -q "MYCROFT DEV SETUP" ${HOOK_FILE} ; then
+ echo "Installing PEP8 check as precommit-hook"
+- echo "#! $( which python )" > ${HOOK_FILE}
++ echo "#! $( which python3 )" > ${HOOK_FILE}
+ echo "# MYCROFT DEV SETUP" >> ${HOOK_FILE}
+ cat ./scripts/pre-commit >> ${HOOK_FILE}
+ chmod +x ${HOOK_FILE}
+ fi
+ fi
+
+-PYTHON=$( python -c "import sys;print('python{}.{}'.format(sys.version_info[0], sys.version_info[1]))" )
++PYTHON=$( python3 -c "import sys;print('python{}.{}'.format(sys.version_info[0], sys.version_info[1]))" )
+
+ # install required python modules
+-if ! pip install -r requirements.txt ; then
++if ! pip3 install -r requirements.txt ; then
+ echo "Warning: Failed to install all requirements. Continue? y/N"
+ read -n1 continue
+ if [[ "$continue" != "y" ]] ; then
+@@ -369,7 +369,7 @@ if ! pip install -r requirements.txt ; then
+ fi
+ fi
+
+-if ! pip install -r test-requirements.txt ; then
++if ! pip3 install -r test-requirements.txt ; then
+ echo "Warning test requirements wasn't installed, Note: normal operation should still work fine..."
+ fi
+
+diff --git a/scripts/install-pocketsphinx.sh b/scripts/install-pocketsphinx.sh
+index 44d329b7985..d45f5c22747 100755
+--- a/scripts/install-pocketsphinx.sh
++++ b/scripts/install-pocketsphinx.sh
+@@ -47,7 +47,7 @@ function install_pocketsphinx() {
+
+ # build and install pocketsphinx python bindings
+ cd ${TOP}/pocketsphinx-python
+- python setup.py install
++ python3 setup.py install
+ }
+
+ if [ "$1" = "-q" ] ; then
+--
+2.21.0
+
diff --git a/meta-multimedia/recipes-multimedia/mycroft/files/0004-dev_setup.sh-Remove-the-git-dependency.patch b/meta-multimedia/recipes-multimedia/mycroft/files/0004-dev_setup.sh-Remove-the-git-dependency.patch
new file mode 100644
index 0000000000..b7ca16013f
--- /dev/null
+++ b/meta-multimedia/recipes-multimedia/mycroft/files/0004-dev_setup.sh-Remove-the-git-dependency.patch
@@ -0,0 +1,48 @@
+From a480dde949f820fda6e46c13261883e851f5a430 Mon Sep 17 00:00:00 2001
+From: Alistair Francis <alistair.francis@wdc.com>
+Date: Fri, 29 Mar 2019 16:09:57 -0700
+Subject: [PATCH 4/5] dev_setup.sh: Remove the git dependency
+
+Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
+Upstream-Status: Inappropriate [embedded specific]
+---
+ dev_setup.sh | 16 ----------------
+ 1 file changed, 16 deletions(-)
+
+diff --git a/dev_setup.sh b/dev_setup.sh
+index dd391181f19..c6aa783e1ef 100755
+--- a/dev_setup.sh
++++ b/dev_setup.sh
+@@ -312,10 +312,6 @@ function install_deps() {
+
+ install_deps
+
+-# Configure to use the standard commit template for
+-# this repo only.
+-git config commit.template .gitmessage
+-
+ # Check whether to build mimic (it takes a really long time!)
+ build_mimic="n"
+ if [[ ${opt_forcemimicbuild} == true ]] ; then
+@@ -346,18 +342,6 @@ fi
+ # Start the virtual environment
+ cd "${TOP}"
+
+-# Install pep8 pre-commit hook
+-if [ -z ${INSTALL_PRECOMMIT_HOOK} ] ; then
+- HOOK_FILE="./.git/hooks/pre-commit"
+- if [ ! -f ${HOOK_FILE} ] || grep -q "MYCROFT DEV SETUP" ${HOOK_FILE} ; then
+- echo "Installing PEP8 check as precommit-hook"
+- echo "#! $( which python3 )" > ${HOOK_FILE}
+- echo "# MYCROFT DEV SETUP" >> ${HOOK_FILE}
+- cat ./scripts/pre-commit >> ${HOOK_FILE}
+- chmod +x ${HOOK_FILE}
+- fi
+-fi
+-
+ PYTHON=$( python3 -c "import sys;print('python{}.{}'.format(sys.version_info[0], sys.version_info[1]))" )
+
+ # install required python modules
+--
+2.21.0
+
diff --git a/meta-multimedia/recipes-multimedia/mycroft/files/0005-dev_setup.sh-Remove-the-test-setup-dependency.patch b/meta-multimedia/recipes-multimedia/mycroft/files/0005-dev_setup.sh-Remove-the-test-setup-dependency.patch
new file mode 100644
index 0000000000..5ae8683764
--- /dev/null
+++ b/meta-multimedia/recipes-multimedia/mycroft/files/0005-dev_setup.sh-Remove-the-test-setup-dependency.patch
@@ -0,0 +1,31 @@
+From 7fc38ae0dec30789fa0d365f1764f4950b700a98 Mon Sep 17 00:00:00 2001
+From: Alistair Francis <alistair.francis@wdc.com>
+Date: Tue, 2 Apr 2019 16:52:44 -0700
+Subject: [PATCH 5/5] dev_setup.sh: Remove the test setup dependency
+
+Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
+Upstream-Status: Inappropriate [embedded specific]
+
+Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
+---
+ dev_setup.sh | 4 ----
+ 1 file changed, 4 deletions(-)
+
+diff --git a/dev_setup.sh b/dev_setup.sh
+index c6aa783e1ef..bcfaa0c16c2 100755
+--- a/dev_setup.sh
++++ b/dev_setup.sh
+@@ -353,10 +353,6 @@ if ! pip3 install -r requirements.txt ; then
+ fi
+ fi
+
+-if ! pip3 install -r test-requirements.txt ; then
+- echo "Warning test requirements wasn't installed, Note: normal operation should still work fine..."
+-fi
+-
+ SYSMEM=$( free | awk '/^Mem:/ { print $2 }' )
+ MAXCORES=$(($SYSMEM / 512000))
+ MINCORES=1
+--
+2.21.0
+
diff --git a/meta-multimedia/recipes-multimedia/mycroft/files/dev_opts.json b/meta-multimedia/recipes-multimedia/mycroft/files/dev_opts.json
new file mode 100644
index 0000000000..5ed85faf41
--- /dev/null
+++ b/meta-multimedia/recipes-multimedia/mycroft/files/dev_opts.json
@@ -0,0 +1 @@
+{"use_branch": "dev", "auto_update": false} \ No newline at end of file
diff --git a/meta-multimedia/recipes-multimedia/mycroft/files/mycroft-setup.service b/meta-multimedia/recipes-multimedia/mycroft/files/mycroft-setup.service
new file mode 100644
index 0000000000..07598235ee
--- /dev/null
+++ b/meta-multimedia/recipes-multimedia/mycroft/files/mycroft-setup.service
@@ -0,0 +1,11 @@
+[Unit]
+Description=Mycroft Setup
+DefaultDependencies=no
+After=systemd-user-sessions.service
+
+[Service]
+Type=oneshot
+ExecStart=@LIBDIR@/mycroft/dev_setup.sh --allow-root
+
+[Install]
+WantedBy=multi-user.target
diff --git a/meta-multimedia/recipes-multimedia/mycroft/files/mycroft.service b/meta-multimedia/recipes-multimedia/mycroft/files/mycroft.service
new file mode 100644
index 0000000000..04cf436204
--- /dev/null
+++ b/meta-multimedia/recipes-multimedia/mycroft/files/mycroft.service
@@ -0,0 +1,13 @@
+[Unit]
+Description=Mycroft
+DefaultDependencies=no
+After=mycroft-setup
+
+[Service]
+Type=forking
+ExecStartPre=mkdir -p /var/log/mycroft
+ExecStart=@LIBDIR@/mycroft/start-mycroft.sh all
+ExecStop=@LIBDIR@/mycroft/stop-mycroft.sh all
+
+[Install]
+WantedBy=multi-user.target
diff --git a/meta-multimedia/recipes-multimedia/mycroft/mycroft_19.2.2.bb b/meta-multimedia/recipes-multimedia/mycroft/mycroft_19.2.2.bb
new file mode 100644
index 0000000000..c8ae534681
--- /dev/null
+++ b/meta-multimedia/recipes-multimedia/mycroft/mycroft_19.2.2.bb
@@ -0,0 +1,73 @@
+SUMMARY = "Mycroft is a hackable open source voice assistant."
+DESCRIPTION = "Mycroft is the world’s first open source assistant. "
+HOMEPAGE = "https://mycroft.ai/"
+SECTION = "multimedia"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE.md;md5=79aa497b11564d1d419ee889e7b498f6"
+
+SRCREV = "6706c377820912f83c1838d9eb32950ca9e39ec7"
+SRC_URI = "git://github.com/MycroftAI/mycroft-core.git;branch=master \
+ file://0001-Remove-python-venv.patch \
+ file://0002-pip-requirements-Remove-ones-installed-by-OE.patch \
+ file://0003-Use-python3-and-pip3-instead-of-python-and-pip.patch \
+ file://0004-dev_setup.sh-Remove-the-git-dependency.patch \
+ file://0005-dev_setup.sh-Remove-the-test-setup-dependency.patch \
+ file://dev_opts.json \
+ file://mycroft-setup.service \
+ file://mycroft.service \
+ "
+
+S = "${WORKDIR}/git"
+
+inherit systemd
+
+# Mycroft installs itself on the host
+# Just copy the setup files to the rootfs
+do_install() {
+ install -d ${D}${libdir}/
+ cp -r ${B} ${D}${libdir}/mycroft
+ rm -r ${D}${libdir}/mycroft/.git
+
+ # Install the dev opts so it doesn't ask us on initial setup.
+ install -m 644 ${WORKDIR}/dev_opts.json ${D}${libdir}/mycroft/.dev_opts.json
+
+ if ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'true', 'false', d)}; then
+ install -d ${D}${systemd_unitdir}/system
+ install -m 644 ${WORKDIR}/mycroft-setup.service ${D}${systemd_unitdir}/system
+ sed -i -e 's,@LIBDIR@,${libdir},g' ${D}${systemd_unitdir}/system/mycroft-setup.service
+ fi
+
+ if ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'true', 'false', d)}; then
+ install -d ${D}${systemd_unitdir}/system
+ install -m 644 ${WORKDIR}/mycroft.service ${D}${systemd_unitdir}/system
+ sed -i -e 's,@LIBDIR@,${libdir},g' ${D}${systemd_unitdir}/system/mycroft.service
+ fi
+}
+
+FILES_${PN} += "${libdir}/mycroft"
+
+RDEPENDS_${PN} = "python3"
+
+# Install as many Python packages as we can.
+# We don't yet have all the packages in meta-python.
+# Install as many as we can and we will install the rest on the target with pip.
+# TODO: Add all the remaining packages and remove pip
+RDEPENDS_${PN} += "python3-pip \
+ python3-requests python3-pillow \
+ python3-tornado python3-pyyaml \
+ python3-pyalsaaudio python3-inflection \
+ python3-pyserial python3-psutil \
+ python3-pyaudio python3-fann2 \
+ python3-pocketsphinx \
+ python3-xxhash \
+ "
+
+# Mycroft uses Alsa and PulseAudio
+RDEPENDS_${PN} += "alsa-oss alsa-utils alsa-plugins alsa-tools"
+RDEPENDS_${PN} += "pulseaudio pulseaudio-misc pulseaudio-server"
+
+# Mycroft can do this itself on the target, but it's quicker to do it here
+RDEPENDS_${PN} += "mimic"
+
+SYSTEMD_SERVICE_${PN} = "mycroft-setup.service mycroft.service"