#!/bin/bash # Execute cli if requested if [ "$1" = "snips" ] then shift exec snips "$@" fi ASSISTANT_FILE=/usr/share/snips/assistant/assistant.json if [ ! -f "$ASSISTANT_FILE" ] then echo "Couldn't find any assistant" exit 1 fi SUPERVISORD_CONF_FILE="/etc/supervisor/conf.d/supervisord.conf" ASR_TYPE=$(jq --raw-output '.asr.type' $ASSISTANT_FILE) ANALYTICS_ENABLED=$(jq --raw-output '.analyticsEnabled' $ASSISTANT_FILE) SNIPS_MOSQUITTO_FLAG="-h localhost -p 1883" if [ -z "$SNIPS_AUDIO_SERVER_MQTT_ARGS" ] then SNIPS_AUDIO_SERVER_MQTT_ARGS="--frame=256" fi if [ -d "/opt/snips/asr" ] then SNIPS_ASR_MODEL="" else SNIPS_ASR_MODEL="" fi if [ -z "$SNIPS_ASR_ARGS" ] then SNIPS_ASR_ARGS="$SNIPS_ASR_MODEL --beam_size=8" fi if [ -z "$SNIPS_ASR_MQTT_ARGS" ] then SNIPS_ASR_MQTT_ARGS="" fi if [ -z "$SNIPS_DIALOGUE_MQTT_ARGS" ] then SNIPS_DIALOGUE_MQTT_ARGS="" fi if [ -z "$SNIPS_ASR_GOOGLE_MQTT_ARGS" ] then SNIPS_ASR_GOOGLE_MQTT_ARGS="" fi if [ -z "$SNIPS_HOTWORD_ARGS" ] then SNIPS_HOTWORD_ARGS="" fi if [ -z "$SNIPS_HOTWORD_MQTT_ARGS" ] then SNIPS_HOTWORD_MQTT_ARGS="" fi if [ -z "$SNIPS_ANALYTICS_MQTT_ARGS" ] then SNIPS_ANALYTICS_MQTT_ARGS="" fi if [ -z "$SNIPS_QUERIES_MQTT_ARGS" ] then SNIPS_QUERIES_MQTT_ARGS="" fi # Read "global" arguments USE_INTERNAL_MQTT=true ALL_SNIPS_COMPONENTS=("snips-asr-google" "snips-asr" "snips-injection" "snips-audio-server" "snips-tts" "snips-hotword" "snips-nlu" "snips-dialogue" "snips-analytics" "snips-debug") declare -A SNIPS_COMPONENTS for c in "${ALL_SNIPS_COMPONENTS[@]}" do SNIPS_COMPONENTS[$c]=true done if [ "$ASR_TYPE" != "google" ] then SNIPS_COMPONENTS["snips-asr-google"]=false elif [ "$ASR_TYPE" != "snips" ] then SNIPS_COMPONENTS["snips-asr"]=false fi if [ "$ANALYTICS_ENABLED" != "true" ] then SNIPS_COMPONENTS["snips-analytics"]=false fi for i in $(seq 1 $#) do j=$((i+1)) TYPE_ARG="${!i}" VALUE_ARG="${!j}" if [[ "$TYPE_ARG" = "--verbose" || "$TYPE_ARG" = "-v" ]] then SNIPS_DEBUG=true fi done if [ "${SNIPS_DEBUG}" == true ] then echo "Execution env:" env LOGLEVEL="-v" SNIPS_COMPONENTS["snips-debug"]=true else LOGLEVEL="" SNIPS_COMPONENTS["snips-debug"]=false fi USE_INCLUDE=false USE_EXCLUDE=false for i in $(seq 1 $#) do j=$((i+1)) TYPE_ARG="${!i}" VALUE_ARG="${!j}" if [ "$TYPE_ARG" = "--exclude-components" ] then USE_EXCLUDE=true if [ "$USE_INCLUDE" = true ] then echo "Cannot use --include-components and --exclude-components simultaneously" exit 1 fi for j in $(echo $VALUE_ARG|tr ',' ' ') do if [ -z ${SNIPS_COMPONENTS[$i]} ] then echo "Unknown snips component $j. Must be one of ${ALL_SNIPS_COMPONENTS[*]}." exit 1 fi unset SNIPS_COMPONENTS["$i"] done elif [ "$TYPE_ARG" = "--include-components" ] then USE_INCLUDE=true if [ "$USE_EXCLUDE" = true ] then echo "Cannot use --include-components and --exclude-components simultaneously" exit 1 elif [ -z "$VALUE_ARG" ] then echo "--include-components must be followed by a command-line list of components to include ${ALL_SNIPS_COMPONENTS[*]}" exit 1 fi for c in "${ALL_SNIPS_COMPONENTS[@]}" do SNIPS_COMPONENTS[$c]=false done for j in $(echo $VALUE_ARG|tr ',' ' ') do if [[ -z "${SNIPS_COMPONENTS[$i]}" && $j != "none" ]] then echo "Unknown snips component $j. Must be one of ${ALL_SNIPS_COMPONENTS[*]}." exit 1 fi SNIPS_COMPONENTS["$i"]=true done elif [ "$TYPE_ARG" = "--mqtt" ] then if [ -z "$VALUE_ARG" ] then echo "':' must be specified when using --mqtt" exit 1 elif [ "$(echo "$VALUE_ARG" | tr -cd ':' | wc -c)" != 1 ] then echo "--mqtt value must follow the pattern ':' with server and port separated by a single ':'" exit 1 elif [ "$(echo "$VALUE_ARG" | tr -cd '#' | wc -c)" != 0 ] then echo "--mqtt value must follow the pattern ':'. '#' character is not allowed." exit 1 fi SNIPS_MQTT_HOST=$(echo "$VALUE_ARG"| cut -d : -f 1) if [ -z "$SNIPS_MQTT_HOST" ] then echo "Must specify a server when using --mqtt" exit 1 fi SNIPS_MQTT_PORT=$(echo "$VALUE_ARG"| cut -d : -f 2) case "$SNIPS_MQTT_PORT" in ''|*[!0-9]*) echo "Must specify a numeric value for port when using --mqtt" exit 1 ;; *) ;; esac USE_INTERNAL_MQTT=false SNIPS_MQTT_FLAG="--mqtt '$SNIPS_MQTT_HOST:$SNIPS_MQTT_PORT'" SNIPS_MOSQUITTO_FLAG="-h $SNIPS_MQTT_HOST -p $SNIPS_MQTT_PORT" fi done # Generate global configuration cat < $SUPERVISORD_CONF_FILE [supervisord] nodaemon=true EOT # Generate snips-asr-google if [ "${SNIPS_COMPONENTS['snips-asr-google']}" = true ] then echo "Spawning /usr/bin/snips-asr-google $LOGLEVEL $SNIPS_ASR_GOOGLE_ARGS $SNIPS_MQTT_FLAG $SNIPS_ASR_GOOGLE_MQTT_ARGS" cat <> $SUPERVISORD_CONF_FILE [program:snips-asr-google] command=/usr/bin/snips-asr-google $LOGLEVEL $SNIPS_ASR_GOOGLE_ARGS $SNIPS_MQTT_FLAG $SNIPS_ASR_GOOGLE_MQTT_ARGS autorestart=true directory=/root environment=RUMQTT_READ_TIMEOUT_MS="50" stderr_logfile=/dev/fd/1 stderr_logfile_maxbytes=0 stdout_logfile=/dev/fd/1 stdout_logfile_maxbytes=0 EOT else echo "snips-asr-google is disabled" fi # Generate snips-asr if [ "${SNIPS_COMPONENTS['snips-asr']}" = true ] then echo "Spawning /usr/bin/snips-asr $LOGLEVEL $SNIPS_ASR_ARGS $SNIPS_MQTT_FLAG $SNIPS_ASR_MQTT_ARGS" cat <> $SUPERVISORD_CONF_FILE [program:snips-asr] command=/usr/bin/snips-asr $LOGLEVEL $SNIPS_ASR_ARGS $SNIPS_MQTT_FLAG $SNIPS_ASR_MQTT_ARGS autorestart=true directory=/root environment=RUMQTT_READ_TIMEOUT_MS="50" stderr_logfile=/dev/fd/1 stderr_logfile_maxbytes=0 stdout_logfile=/dev/fd/1 stdout_logfile_maxbytes=0 EOT else echo "snips-asr is disabled" fi # Generate snips-audio-server if [ "${SNIPS_COMPONENTS['snips-audio-server']}" = true ] then echo "Spawning /usr/bin/snips-audio-server $LOGLEVEL $SNIPS_AUDIO_SERVER_ARGS $SNIPS_MQTT_FLAG $SNIPS_AUDIO_SERVER_MQTT_ARGS" cat <> $SUPERVISORD_CONF_FILE [program:snips-audio-server] command=/usr/bin/snips-audio-server $LOGLEVEL $SNIPS_AUDIO_SERVER_ARGS $SNIPS_MQTT_FLAG $SNIPS_AUDIO_SERVER_MQTT_ARGS autorestart=true directory=/root environment=RUMQTT_READ_TIMEOUT_MS="50" stderr_logfile=/dev/fd/1 stderr_logfile_maxbytes=0 stdout_logfile=/dev/fd/1 stdout_logfile_maxbytes=0 EOT else echo "snips-audio-server is disabled" fi # Generate snips-tts if [ "${SNIPS_COMPONENTS['snips-tts']}" = true ] then echo "Spawning /usr/bin/snips-tts $LOGLEVEL $SNIPS_TTS_ARGS $SNIPS_MQTT_FLAG $SNIPS_TTS_MQTT_FLAG" cat <> $SUPERVISORD_CONF_FILE [program:snips-tts] command=/usr/bin/snips-tts $LOGLEVEL $SNIPS_TTS_ARGS $SNIPS_MQTT_FLAG $SNIPS_TTS_MQTT_FLAG autorestart=true directory=/root environment=RUMQTT_READ_TIMEOUT_MS="50" stderr_logfile=/dev/fd/1 stderr_logfile_maxbytes=0 stdout_logfile=/dev/fd/1 stdout_logfile_maxbytes=0 EOT else echo "snips-tts is disabled" fi # Generate snips-hotword if [ "${SNIPS_COMPONENTS['snips-hotword']}" = true ] then echo "Spawning /usr/bin/snips-hotword $SNIPS_HOTWORD_ARGS $LOGLEVEL $SNIPS_MQTT_FLAG $SNIPS_HOTWORD_MQTT_ARGS" cat <> $SUPERVISORD_CONF_FILE [program:snips-hotword] command=/usr/bin/snips-hotword $SNIPS_HOTWORD_ARGS $LOGLEVEL $SNIPS_MQTT_FLAG $SNIPS_HOTWORD_MQTT_ARGS autorestart=true directory=/root environment=RUMQTT_READ_TIMEOUT_MS="50" stderr_logfile=/dev/fd/1 stderr_logfile_maxbytes=0 stdout_logfile=/dev/fd/1 stdout_logfile_maxbytes=0 EOT else echo "snips-hotword is disabled" fi # Generate snips-nlu if [ "${SNIPS_COMPONENTS['snips-nlu']}" = true ] then echo "Spawning /usr/bin/snips-nlu $LOGLEVEL $SNIPS_MQTT_FLAG $SNIPS_QUERIES_MQTT_ARGS" cat <> $SUPERVISORD_CONF_FILE [program:snips-nlu] command=/usr/bin/snips-nlu $LOGLEVEL $SNIPS_MQTT_FLAG $SNIPS_QUERIES_MQTT_ARGS autorestart=true directory=/root environment=RUMQTT_READ_TIMEOUT_MS="50" stderr_logfile=/dev/fd/1 stderr_logfile_maxbytes=0 stdout_logfile=/dev/fd/1 stdout_logfile_maxbytes=0 EOT else echo "snips-nlu is disabled" fi # Generate snips-dialogue if [ "${SNIPS_COMPONENTS['snips-dialogue']}" = true ] then echo "Spawning /usr/bin/snips-dialogue $LOGLEVEL $SNIPS_DIALOGUE_ARGS $SNIPS_MQTT_FLAG $SNIPS_DIALOGUE_MQTT_ARGS" cat <> $SUPERVISORD_CONF_FILE [program:snips-dialogue] command=/usr/bin/snips-dialogue $LOGLEVEL $SNIPS_DIALOGUE_ARGS $SNIPS_MQTT_FLAG $SNIPS_DIALOGUE_MQTT_ARGS autorestart=true directory=/root environment=RUMQTT_READ_TIMEOUT_MS="50" stderr_logfile=/dev/fd/1 stderr_logfile_maxbytes=0 stdout_logfile=/dev/fd/1 stdout_logfile_maxbytes=0 EOT else echo "snips-dialogue is disabled" fi # Generate snips-analytics if [ "${SNIPS_COMPONENTS['snips-analytics']}" = true ] then echo "Spawning /usr/bin/snips-analytics $LOGLEVEL $SNIPS_MQTT_FLAG $SNIPS_ANALYTICS_MQTT_ARGS" cat <> $SUPERVISORD_CONF_FILE [program:snips-analytics] command=/usr/bin/snips-analytics $LOGLEVEL $SNIPS_MQTT_FLAG $SNIPS_ANALYTICS_MQTT_ARGS autorestart=unexpected directory=/root environment=RUMQTT_READ_TIMEOUT_MS="50" exitcodes=0 stderr_logfile=/dev/fd/1 stderr_logfile_maxbytes=0 stdout_logfile=/dev/fd/1 stdout_logfile_maxbytes=0 EOT else echo "snips-analytics is disabled" fi # Generate snips-debug if [ "${SNIPS_COMPONENTS['snips-debug']}" = true ] then echo Spawning snips-debug cat <> $SUPERVISORD_CONF_FILE [program:snips-debug] command=mosquitto_sub -v $SNIPS_MOSQUITTO_FLAG -t "hermes/#" -T "hermes/audioServer/+/audioFrame" autorestart=true directory=/root stderr_logfile=/dev/fd/1 stderr_logfile_maxbytes=0 stdout_logfile=/dev/fd/1 stdout_logfile_maxbytes=0 EOT else echo "snips-debug is disabled" fi if [ "${USE_INTERNAL_MQTT}" = true ] then service mosquitto start sleep 2 fi export RUMQTT_READ_TIMEOUT_MS=50 /usr/bin/supervisord -c $SUPERVISORD_CONF_FILE