pull/2802/merge
Bart Ribbers 2022-11-23 15:53:13 +09:30 committed by GitHub
commit bd71c77f9c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 315 additions and 85 deletions

View File

@ -32,29 +32,49 @@ Mycroft is a hackable open source voice assistant.
## Getting Started
First, get the code on your system! The simplest method is via git ([git installation instructions](https://gist.github.com/derhuerst/1b15ff4652a867391f03)):
- `cd ~/`
- `git clone https://github.com/MycroftAI/mycroft-core.git`
- `cd mycroft-core`
- `bash dev_setup.sh`
Mycroft might be packaged by your distribution already, in that case installing it might be as simple as `apk add mycroft-core` or equivalent for your distribution.
Otherwise, the simplest method is downloading the latest release on the [Github releases page](https://github.com/MycroftAI/mycroft-core/releases) and unpacking it somewhere.
Then run the following commands in the unpacked directory.
```sh
pip install . # This actually installs Mycroft and it's dependencies
```
This script sets up dependencies and a [virtualenv][about-virtualenv]. If running in an environment besides Ubuntu/Debian, Arch or Fedora you may need to manually install packages as instructed by dev_setup.sh.
For development on Mycroft it's recommended to use Git instead ([git installation instructions](https://gist.github.com/derhuerst/1b15ff4652a867391f03)).
```sh
cd ~/
git clone https://github.com/MycroftAI/mycroft-core.git
cd mycroft-core
./dev_setup.sh
```
This script sets up dependencies and a [virtualenv][about-virtualenv]. If running in an environment besides Ubuntu/Debian, Arch or Fedora you may need to manually install packages as instructed by `dev_setup.sh`.
[about-virtualenv]:https://virtualenv.pypa.io/en/stable/
NOTE: The default branch for this repository is 'dev', which should be considered a work-in-progress. If you want to clone a more stable version, switch over to the 'master' branch.
**NOTE:** The default branch for this repository is 'dev', which should be considered a work-in-progress. If you want to clone a more stable version, switch over to the 'master' branch.
## Running Mycroft
Mycroft provides `start-mycroft.sh` to perform common tasks. This script uses a virtualenv created by `dev_setup.sh`. Assuming you installed mycroft-core in your home directory run:
- `cd ~/mycroft-core`
- `./start-mycroft.sh debug`
Mycroft provides `mycroft-start` to perform common tasks. Assuming you installed mycroft-core via your systems package manager or via `setup.py`:
The "debug" command will start the background services (microphone listener, skill, messagebus, and audio subsystems) as well as bringing up a text-based Command Line Interface (CLI) you can use to interact with Mycroft and see the contents of the various logs. Alternatively you can run `./start-mycroft.sh all` to begin the services without the command line interface. Later you can bring up the CLI using `./start-mycroft.sh cli`.
```sh
mycroft-start debug
```
The "debug" command will start the background services (microphone listener, skill, messagebus, and audio subsystems) as well as bringing up a text-based Command Line Interface (CLI) you can use to interact with Mycroft and see the contents of the various logs.
Alternatively you can run `mycroft-start all` to begin the services without the command line interface.
Later you can bring up the CLI using `mycroft-start cli`.
The background services can be stopped as a group with:
- `./stop-mycroft.sh`
```sh
mycroft-stop
```
If you want to develop for Mycroft, please use `start-mycroft.sh` and `stop-mycroft.sh` instead of the aforementioned commands.
These provide extra options for development purposes.
## Using Mycroft

View File

@ -1,4 +1,4 @@
#!/usr/bin/env bash
#!/bin/sh
# Copyright 2019 Mycroft AI Inc.
#
@ -14,8 +14,155 @@
# See the License for the specific language governing permissions and
# limitations under the License.
SOURCE="${BASH_SOURCE[0]}"
cd -P "$( dirname "$SOURCE" )"/.. || exit
DIR="$( pwd )"
script=${0}
script=${script##*/}
. "$DIR/start-mycroft.sh" "$@"
help() {
echo "${script}: Mycroft command/service launcher"
echo "usage: ${script} [COMMAND] [restart] [params]"
echo
echo "Services COMMANDs:"
echo " all runs core services: bus, audio, skills, voice"
echo " debug runs core services, then starts the CLI"
echo " audio the audio playback service"
echo " bus the messagebus service"
echo " skills the skill service"
echo " voice voice capture service"
echo " enclosure mark_1 enclosure service"
echo
echo "Tool COMMANDs:"
echo " cli the Command Line Interface"
echo
echo "Options:"
echo " restart (optional) Force the service to restart if running"
echo
echo "Examples:"
echo " ${script} all"
echo " ${script} all restart"
echo " ${script} bus"
echo " ${script} voice"
exit 1
}
name_to_script_path() {
case ${1} in
"bus") _module="mycroft.messagebus.service" ;;
"skills") _module="mycroft.skills" ;;
"audio") _module="mycroft.audio" ;;
"voice") _module="mycroft.client.speech" ;;
"cli") _module="mycroft.client.text" ;;
"enclosure") _module="mycroft.client.enclosure" ;;
*)
echo "Error: Unknown name '${1}'"
exit 1
esac
}
require_process() {
name_to_script_path "${1}"
if ! pgrep -f "python3 (.*)-m ${_module}" > /dev/null; then
launch_background "${1}"
fi
}
launch_process() {
name_to_script_path "${1}"
# Launch process in foreground
echo "Starting $1"
python3 -m ${_module} "$_params"
}
launch_background() {
name_to_script_path "${1}"
if pgrep -f "python3 (.*)-m ${_module}" > /dev/null; then
if ($_force_restart); then
echo "Restarting: ${1}"
mycroft-stop "${1}"
else
# Already running, no need to restart
return
fi
else
echo "Starting background service $1"
fi
# Security warning/reminder for the user
if [ "${1}" = "bus" ] ; then
echo "CAUTION: The Mycroft bus is an open websocket with no built-in security"
echo " measures. You are responsible for protecting the local port"
echo " 8181 with a firewall as appropriate."
fi
# Launch process in background
# Send logs to XDG Base Directories cache location
logdir="${XDG_STATE_HOME:-$HOME/.local/state}/mycroft"
if [ ! -d "$logdir" ]; then
mkdir -p "$logdir"
fi
python3 -m ${_module} "$_params" >> "$logdir/${1}.log" 2>&1 &
}
launch_all() {
echo "Starting all mycroft-core services"
launch_background bus
launch_background skills
launch_background audio
launch_background voice
launch_background enclosure
}
_opt=$1
_force_restart=false
if [ $# -gt 0 ]; then
shift
fi
if [ "${1}" = "restart" ] || [ "${_opt}" = "restart" ]; then
_force_restart=true
if [ "${_opt}" = "restart" ]; then
# Support "start-mycroft restart all" as well as "start-mycroft all restart"
_opt=$1
fi
shift
fi
_params=$*
case ${_opt} in
"all")
launch_all
;;
"bus")
launch_background "${_opt}"
;;
"audio")
launch_background "${_opt}"
;;
"skills")
launch_background "${_opt}"
;;
"voice")
launch_background "${_opt}"
;;
"debug")
launch_all
launch_process cli
;;
"cli")
require_process bus
require_process skills
launch_process "${_opt}"
;;
"enclosure")
launch_background "${_opt}"
;;
*)
help
;;
esac

View File

@ -1,4 +1,4 @@
#!/usr/bin/env bash
#!/bin/sh
# Copyright 2019 Mycroft AI Inc.
#
@ -14,8 +14,110 @@
# See the License for the specific language governing permissions and
# limitations under the License.
SOURCE="${BASH_SOURCE[0]}"
cd -P "$( dirname "$SOURCE" )"/.. || exit
DIR="$( pwd )"
script=${0}
script=${script##*/}
. "$DIR/stop-mycroft.sh" "$@"
help() {
echo "${script}: Mycroft service stopper"
echo "usage: ${script} [service]"
echo
echo "Service:"
echo " all ends core services: bus, audio, skills, voice"
echo " (none) same as \"all\""
echo " bus stop the Mycroft messagebus service"
echo " audio stop the audio playback service"
echo " skills stop the skill service"
echo " voice stop voice capture service"
echo " enclosure stop enclosure (hardware/gui interface) service"
echo
echo "Examples:"
echo " ${script}"
echo " ${script} audio"
exit 0
}
process_running() {
if [ "$( pgrep -f "python3 (.*)-m mycroft.*${1}" )" ]; then
return 0
else
return 1
fi
}
end_process() {
if process_running "$1"; then
# Find the process by name, only returning the oldest if it has children
pid=$( pgrep -o -f "python3 (.*)-m mycroft.*${1}" )
echo "Stopping $1 (${pid})..."
kill -s INT "${pid}"
# Wait up to 5 seconds (50 * 0.1) for process to stop
c=1
while [ $c -le 50 ]; do
if process_running "$1"; then
sleep 0.1
c=$((c + 1))
else
c=999 # end loop
fi
done
if process_running "$1"; then
echo "Failed to stop."
pid=$( pgrep -o -f "python3 (.*)-m mycroft.*${1}" )
echo " Killing $1 (${pid})..."
kill -9 "${pid}"
echo "Killed."
result=120
else
echo "Stopped."
if [ $result -eq 0 ] ; then
result=100
fi
fi
fi
}
result=0 # default, no change
OPT=$1
if [ $# -gt 0 ]; then
shift
fi
case ${OPT} in
"all"|"")
echo "Stopping all mycroft-core services"
end_process "skills"
end_process "audio"
end_process "speech"
end_process "enclosure"
end_process "messagebus.service"
;;
"bus")
end_process "messagebus.service"
;;
"audio")
end_process "audio"
;;
"skills")
end_process "skills"
;;
"voice")
end_process "speech"
;;
"enclosure")
end_process "enclosure"
;;
*)
help
;;
esac
# Exit codes:
# 0 if nothing changed (e.g. --help or no process was running)
# 100 at least one process was stopped
# 120 if any process had to be killed
exit $result

View File

@ -26,6 +26,8 @@ ROOT_DIRNAME=$(dirname "$0")
cd "$ROOT_DIRNAME"
TOP=$(pwd -L)
logdir="${XDG_CACHE_HOME:-$HOME/.cache}/mycroft"
function clean_mycroft_files() {
echo '
This will completely remove any files installed by mycroft (including pairing
@ -39,12 +41,21 @@ Do you wish to continue? (y/n)'
read -rN1 -s key
case $key in
[Yy])
sudo rm -rf /var/log/mycroft
rm -rf "$logdir"
rm -f /var/tmp/mycroft_web_cache.json
rm -rf "${TMPDIR:-/tmp}/mycroft"
rm -rf "$HOME/.mycroft"
rm -f "skills" # The Skills directory symlink
sudo rm -rf "/opt/mycroft"
# If the following directories don't exist anyway we don't have to use sudo
# These directories aren't used anymore anyway and are only leftovers
if [ -d "/var/log/mycroft" ]; then
sudo rm -rf /var/log/mycroft
fi
if [ -d "/opt/mycroft" ]; then
sudo rm -rf /opt/mycroft
fi
"${VIRTUALENV}"/bin/pip uninstall .
exit 0
;;
[Nn])
@ -271,35 +282,6 @@ locally?'
fi
echo
# Add mycroft-core/bin to the .bashrc PATH?
sleep 0.5
echo '
There are several Mycroft helper commands in the bin folder. These
can be added to your system PATH, making it simpler to use Mycroft.
Would you like this to be added to your PATH in the .profile?'
if get_YN ; then
echo -e "$HIGHLIGHT Y - Adding Mycroft commands to your PATH $RESET" | tee -a /var/log/mycroft/setup.log
if [[ ! -f ~/.profile_mycroft ]] ; then
# Only add the following to the .profile if .profile_mycroft
# doesn't exist, indicating this script has not been run before
{
echo ''
echo '# include Mycroft commands'
echo 'source ~/.profile_mycroft'
} >> ~/.profile
fi
echo "
# WARNING: This file may be replaced in future, do not customize.
# set path so it includes Mycroft utilities
if [ -d \"${TOP}/bin\" ] ; then
PATH=\"\$PATH:${TOP}/bin\"
fi" > ~/.profile_mycroft
echo -e "Type ${CYAN}mycroft-help$RESET to see available commands."
else
echo -e "$HIGHLIGHT N - PATH left unchanged $RESET" | tee -a /var/log/mycroft/setup.log
fi
# Create a link to the 'skills' folder.
sleep 0.5
@ -378,18 +360,15 @@ Please review the following package changes carefully."
fi
}
function open_suse_install() {
$SUDO zypper install -y git python3 python3-devel libtool libffi-devel libopenssl-devel autoconf automake bison swig portaudio-devel mpg123 flac curl libicu-devel pkg-config libjpeg-devel libfann-devel python3-curses pulseaudio
$SUDO zypper install -y -t pattern devel_C_C++
}
function fedora_install() {
$SUDO dnf install -y git python3 python3-devel python3-pip python3-setuptools python3-virtualenv pygobject3-devel libtool libffi-devel openssl-devel autoconf bison swig glib2-devel portaudio-devel mpg123 mpg123-plugins-pulseaudio screen curl pkgconfig libicu-devel automake libjpeg-turbo-devel fann-devel gcc-c++ redhat-rpm-config jq make pulseaudio-utils
}
function arch_install() {
pkgs=( git python python-pip python-setuptools python-virtualenv python-gobject libffi swig portaudio mpg123 screen flac curl icu libjpeg-turbo base-devel jq )
@ -410,7 +389,6 @@ function arch_install() {
)
}
function centos_install() {
$SUDO yum install epel-release
redhat_common_install
@ -599,30 +577,8 @@ if ! grep -q "$TOP" "$VENV_PATH_FILE" ; then
sed -i.tmp "1 a$TOP" "$VENV_PATH_FILE"
fi
# install required python modules
if ! pip install -r requirements/requirements.txt ; then
echo 'Warning: Failed to install required dependencies. Continue? y/N' | tee -a /var/log/mycroft/setup.log
read -rn1 continue
if [[ $continue != 'y' ]] ; then
exit 1
fi
fi
# install optional python modules
if [[ ! $(pip install -r requirements/extra-audiobackend.txt) ||
! $(pip install -r requirements/extra-stt.txt) ||
! $(pip install -r requirements/extra-mark1.txt) ]] ; then
echo 'Warning: Failed to install some optional dependencies. Continue? y/N' | tee -a /var/log/mycroft/setup.log
read -rn1 continue
if [[ $continue != 'y' ]] ; then
exit 1
fi
fi
if ! pip install -r requirements/tests.txt ; then
echo "Warning: Test requirements failed to install. Note: normal operation should still work fine..." | tee -a /var/log/mycroft/setup.log
fi
# Actually install Mycroft and it's deps
pip install -e ".[test,audio-backend,stt,mark1]"
SYSMEM=$(free | awk '/^Mem:/ { print $2 }')
MAXCORES=$((SYSMEM / 2202010))

View File

@ -5,8 +5,8 @@ pytest-cov==2.8.1
cov-core==1.15.0
sphinx==2.2.1
sphinx-rtd-theme==0.4.3
https://github.com/krisgesling/tag-expressions-python/tarball/master/
https://github.com/krisgesling/behave/tarball/master/
cucumber-tag-expressions @ git+https://github.com/krisgesling/tag-expressions-python@master
behave @ git+https://github.com/krisgesling/behave@master
allure-behave==2.8.10
python-vlc==1.1.2

View File

@ -64,7 +64,8 @@ setup(
extras_require={
'audio-backend': required('requirements/extra-audiobackend.txt'),
'mark1': required('requirements/extra-mark1.txt'),
'stt': required('requirements/extra-stt.txt')
'stt': required('requirements/extra-stt.txt'),
'test': required('requirements/tests.txt')
},
packages=find_packages(include=['mycroft*']),
include_package_data=True,
@ -80,5 +81,9 @@ setup(
'mycroft-enclosure-client=mycroft.client.enclosure.__main__:main',
'mycroft-cli-client=mycroft.client.text.__main__:main'
]
}
},
scripts=[
'bin/mycroft-start',
'bin/mycroft-stop'
]
)