Compare commits
45 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 0c37c88e61 | |||
| 50f05506a2 | |||
| b62068da69 | |||
| f69d7484ba | |||
| e478765b4e | |||
| 8bf673c412 | |||
| 8854f26dc1 | |||
| cf8f2319b8 | |||
| 782721fab3 | |||
| 43dc7a07c9 | |||
| be42447620 | |||
| 3a884888c4 | |||
| 3133666390 | |||
| ff0aea4177 | |||
| fa418d3129 | |||
| d4314a85d9 | |||
| 3d42551bfc | |||
| 6411924cf2 | |||
| 77d2196f00 | |||
| 3c53cd0236 | |||
| 46a75ec83e | |||
| 3e9c4bef68 | |||
| 465d1e61e0 | |||
| 563fcfcd49 | |||
| 0ff965a965 | |||
| 998eff8708 | |||
| 1dcf984669 | |||
| 21c2b2ef9d | |||
| 958c12cfb4 | |||
| 04efe9f151 | |||
| 6dbc8dc35e | |||
| 2cac48292a | |||
| a4528d40fb | |||
| 4cd8b307c7 | |||
| de0824e49a | |||
| 74ba8c1c4a | |||
| 9428abdd40 | |||
| a6c425d65f | |||
| 015c37fa5d | |||
| 32f7e37657 | |||
| 54063feb03 | |||
| 3bc36f2fb1 | |||
| e0401d4c18 | |||
| 73124075ae | |||
| c410f4eea7 |
+4
-5
@@ -1,14 +1,13 @@
|
||||
*
|
||||
!etc/qemu-*
|
||||
|
||||
!download/rhasspy-tools*
|
||||
!download/pocketsphinx-python.tar.gz
|
||||
!download/snowboy*
|
||||
!download/kaldi*
|
||||
!download/
|
||||
|
||||
!requirements.txt
|
||||
!dist/
|
||||
!etc/wav
|
||||
!etc/shflags
|
||||
!create-venv.sh
|
||||
!download-dependencies.sh
|
||||
|
||||
!docker/run.sh
|
||||
!docker/rhasspy
|
||||
|
||||
@@ -1,3 +1,17 @@
|
||||
## [2.4.20] - 2020 Apr 10
|
||||
|
||||
### Added
|
||||
|
||||
- libasound2-plugins to Docker image (for Hass.IO)
|
||||
- MQTT TLS support (thanks https://github.com/ofekd)
|
||||
- Mycroft Precise 0.3.0 added to Docker image
|
||||
|
||||
### Changed
|
||||
|
||||
- Properly accept websocket connections
|
||||
- Don't error out on missing porcupine files
|
||||
- Fix rawValue in MQTT messages
|
||||
|
||||
## [2.4.19] - 2020 Mar 04
|
||||
|
||||
### Added
|
||||
|
||||
+80
@@ -0,0 +1,80 @@
|
||||
FROM ubuntu:eoan as build
|
||||
ARG TARGETPLATFORM
|
||||
ARG TARGETARCH
|
||||
ARG TARGETVARIANT
|
||||
|
||||
ENV LANG C.UTF-8
|
||||
ENV RHASSPY_APP /usr/share/rhasspy
|
||||
ENV RHASSPY_VENV ${RHASSPY_APP}/.venv
|
||||
|
||||
WORKDIR /
|
||||
|
||||
RUN apt-get update && \
|
||||
apt-get install --no-install-recommends --yes \
|
||||
python3 python3-dev python3-setuptools python3-pip python3-venv \
|
||||
build-essential swig portaudio19-dev libatlas-base-dev
|
||||
|
||||
COPY etc/shflags ${RHASSPY_APP}/etc/
|
||||
COPY download/rhasspy-tools_*.tar.gz \
|
||||
download/kaldi_*.tar.gz \
|
||||
download/pocketsphinx-python.tar.gz \
|
||||
download/snowboy-1.3.0.tar.gz \
|
||||
download/precise-engine_0.3.0_*.tar.gz \
|
||||
${RHASSPY_APP}/download/
|
||||
COPY create-venv.sh download-dependencies.sh requirements.txt ${RHASSPY_APP}/
|
||||
RUN cd ${RHASSPY_APP} && ./create-venv.sh --nosystem --noweb
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
FROM ubuntu:eoan
|
||||
ARG TARGETPLATFORM
|
||||
ARG TARGETARCH
|
||||
ARG TARGETVARIANT
|
||||
|
||||
ENV LANG C.UTF-8
|
||||
ENV RHASSPY_APP /usr/share/rhasspy
|
||||
ENV RHASSPY_VENV ${RHASSPY_APP}/.venv
|
||||
|
||||
WORKDIR /
|
||||
|
||||
COPY --from=build ${RHASSPY_VENV} ${RHASSPY_VENV}
|
||||
COPY --from=build ${RHASSPY_APP}/opt/kaldi/ ${RHASSPY_APP}/opt/kaldi/
|
||||
|
||||
RUN apt-get update && \
|
||||
apt-get install --no-install-recommends --yes \
|
||||
python3 python3-dev python3-setuptools python3-pip python3-venv \
|
||||
bash jq unzip curl perl \
|
||||
libportaudio2 libatlas3-base \
|
||||
libgfortran4 ca-certificates \
|
||||
sox espeak flite libttspico-utils alsa-utils lame \
|
||||
libasound2-plugins \
|
||||
libfreetype6-dev libpng-dev pkg-config libffi-dev libssl-dev \
|
||||
gstreamer1.0-tools gstreamer1.0-plugins-good \
|
||||
mosquitto-clients
|
||||
|
||||
# Web interface
|
||||
ADD download/rhasspy-web-dist.tar.gz ${RHASSPY_APP}/
|
||||
|
||||
RUN ldconfig
|
||||
|
||||
# Copy script to run
|
||||
COPY docker/run.sh /run.sh
|
||||
RUN chmod +x /run.sh
|
||||
|
||||
COPY profiles/ ${RHASSPY_APP}/profiles/
|
||||
|
||||
COPY profiles/defaults.json ${RHASSPY_APP}/profiles/
|
||||
COPY docker/rhasspy ${RHASSPY_APP}/bin/
|
||||
COPY dist/ ${RHASSPY_APP}/dist/
|
||||
COPY etc/wav/* ${RHASSPY_APP}/etc/wav/
|
||||
COPY rhasspy/profile_schema.json ${RHASSPY_APP}/rhasspy/
|
||||
COPY rhasspy/train/jsgf2fst/*.py ${RHASSPY_APP}/rhasspy/train/jsgf2fst/
|
||||
COPY rhasspy/train/*.py ${RHASSPY_APP}/rhasspy/train/
|
||||
COPY *.py ${RHASSPY_APP}/
|
||||
COPY rhasspy/*.py ${RHASSPY_APP}/rhasspy/
|
||||
COPY VERSION ${RHASSPY_APP}/
|
||||
|
||||
ENV CONFIG_PATH /data/options.json
|
||||
ENV KALDI_PREFIX ${RHASSPY_APP}/opt
|
||||
|
||||
ENTRYPOINT ["/run.sh"]
|
||||
@@ -1,49 +1,19 @@
|
||||
.PHONY: web-dist docker manifest docs-uml g2p check
|
||||
SHELL := bash
|
||||
|
||||
DOCKER_PLATFORMS = linux/amd64,linux/arm64,linux/arm/v7
|
||||
|
||||
all: docker
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Docker
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
docker: web-dist docker-amd64 docker-armhf docker-aarch64
|
||||
|
||||
docker-deploy: docker-push manifest
|
||||
|
||||
docker-amd64:
|
||||
docker build . -f docker/templates/dockerfiles/Dockerfile.prebuilt.alsa.all \
|
||||
--build-arg BUILD_ARCH=amd64 \
|
||||
--build-arg CPU_ARCH=x86_64 \
|
||||
--build-arg BUILD_FROM=ubuntu:bionic \
|
||||
-t synesthesiam/rhasspy-server:amd64
|
||||
|
||||
docker-armhf:
|
||||
docker build . -f docker/templates/dockerfiles/Dockerfile.prebuilt.alsa.all \
|
||||
--build-arg BUILD_ARCH=armhf \
|
||||
--build-arg CPU_ARCH=armv7l \
|
||||
--build-arg BUILD_FROM=arm32v7/ubuntu:bionic \
|
||||
-t synesthesiam/rhasspy-server:armhf
|
||||
|
||||
docker-aarch64:
|
||||
docker build . -f docker/templates/dockerfiles/Dockerfile.prebuilt.alsa.all \
|
||||
--build-arg BUILD_ARCH=aarch64 \
|
||||
--build-arg CPU_ARCH=arm64v8 \
|
||||
--build-arg BUILD_FROM=arm64v8/ubuntu:bionic \
|
||||
-t synesthesiam/rhasspy-server:aarch64
|
||||
|
||||
docker-push:
|
||||
docker push synesthesiam/rhasspy-server:amd64
|
||||
docker push synesthesiam/rhasspy-server:armhf
|
||||
docker push synesthesiam/rhasspy-server:aarch64
|
||||
|
||||
manifest:
|
||||
docker manifest push --purge synesthesiam/rhasspy-server:latest
|
||||
docker manifest create --amend synesthesiam/rhasspy-server:latest \
|
||||
synesthesiam/rhasspy-server:amd64 \
|
||||
synesthesiam/rhasspy-server:armhf \
|
||||
synesthesiam/rhasspy-server:aarch64
|
||||
docker manifest annotate synesthesiam/rhasspy-server:latest synesthesiam/rhasspy-server:armhf --os linux --arch arm
|
||||
docker manifest annotate synesthesiam/rhasspy-server:latest synesthesiam/rhasspy-server:aarch64 --os linux --arch arm64
|
||||
docker manifest push synesthesiam/rhasspy-server:latest
|
||||
docker: web-dist
|
||||
docker buildx build . \
|
||||
--platform $(DOCKER_PLATFORMS) \
|
||||
--tag synesthesiam/rhasspy-server:latest \
|
||||
--push
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Yarn (Vue)
|
||||
|
||||
@@ -1,8 +1,14 @@
|
||||

|
||||
# Rhasspy has [moved and improved!](https://github.com/rhasspy/rhasspy)
|
||||
|
||||
Rhasspy (pronounced RAH-SPEE) is an offline voice assistant toolkit inspired by [Jasper](https://jasperproject.github.io/) [supports many languages](#supported-languages). It works well with [Home Assistant](https://www.home-assistant.io/), [Hass.io](https://www.home-assistant.io/hassio/), and [Node-RED](https://nodered.org).
|
||||
This repository contains code for an older version of Rhasspy (2.4).
|
||||
|
||||
* [Documentation](https://rhasspy.readthedocs.io/)
|
||||
---
|
||||
|
||||
Rhasspy (pronounced RAH-SPEE) is an offline voice assistant toolkit inspired by [Jasper](https://jasperproject.github.io/) that [supports many languages](#supported-languages). It works well with [Home Assistant](https://www.home-assistant.io/), [Hass.io](https://www.home-assistant.io/hassio/), and [Node-RED](https://nodered.org).
|
||||
|
||||
**A newer version of Rhasspy (2.5) is available at [https://github.com/rhasspy/rhasspy](https://github.com/rhasspy/rhasspy)**
|
||||
|
||||
* [Documentation](https://rhasspy.readthedocs.io/en/v2.4.20/)
|
||||
* [Discussion](https://community.rhasspy.org)
|
||||
* [Video Introduction](https://www.youtube.com/watch?v=ijKTR_GqWwA)
|
||||
* [Hass.IO Add-On Repository](https://github.com/synesthesiam/hassio-addons)
|
||||
|
||||
@@ -1243,6 +1243,8 @@ def api_websocket(func):
|
||||
async def api_events_intent(queue) -> None:
|
||||
"""Websocket endpoint to receive intents as JSON."""
|
||||
# Add new queue for websocket
|
||||
await websocket.accept()
|
||||
|
||||
while True:
|
||||
message_type, text = await queue.get()
|
||||
if message_type == "intent":
|
||||
@@ -1253,6 +1255,8 @@ async def api_events_intent(queue) -> None:
|
||||
@api_websocket
|
||||
async def api_events_text(queue) -> None:
|
||||
"""Websocket endpoint for transcriptions."""
|
||||
await websocket.accept()
|
||||
|
||||
while True:
|
||||
message_type, text = await queue.get()
|
||||
if message_type == "transcription":
|
||||
@@ -1263,6 +1267,8 @@ async def api_events_text(queue) -> None:
|
||||
@api_websocket
|
||||
async def api_events_wake(queue) -> None:
|
||||
"""Websocket endpoint to report wake up."""
|
||||
await websocket.accept()
|
||||
|
||||
while True:
|
||||
message_type, text = await queue.get()
|
||||
if message_type == "wake":
|
||||
@@ -1272,6 +1278,8 @@ async def api_events_wake(queue) -> None:
|
||||
@app.websocket("/api/events/log")
|
||||
async def api_events_log() -> None:
|
||||
"""Websocket endpoint to receive logging messages as text."""
|
||||
await websocket.accept()
|
||||
|
||||
# Add new queue for websocket
|
||||
q: asyncio.Queue = asyncio.Queue()
|
||||
logging_queues.add(q)
|
||||
|
||||
+43
-21
@@ -11,10 +11,12 @@ DEFINE_string 'venv' "${this_dir}/.venv" 'Path to create virtual environment'
|
||||
DEFINE_string 'download-dir' "${this_dir}/download" 'Directory to cache downloaded files'
|
||||
DEFINE_boolean 'system' true 'Install system dependencies'
|
||||
DEFINE_boolean 'flair' false 'Install flair'
|
||||
DEFINE_boolean 'precise' false 'Install Mycroft Precise'
|
||||
DEFINE_boolean 'precise' true 'Install Mycroft Precise'
|
||||
DEFINE_boolean 'adapt' true 'Install Mycroft Adapt'
|
||||
DEFINE_boolean 'google' false 'Install Google Text to Speech'
|
||||
DEFINE_boolean 'google' true 'Install Google Text to Speech'
|
||||
DEFINE_boolean 'kaldi' true 'Install Kaldi'
|
||||
DEFINE_boolean 'tools' true 'Install Rhasspy tools'
|
||||
DEFINE_boolean 'web' true 'Install web UI'
|
||||
DEFINE_boolean 'offline' false "Don't download anything"
|
||||
DEFINE_integer 'make-threads' 4 'Number of threads to use with make' 'j'
|
||||
DEFINE_string 'python' '' 'Path to Python executable'
|
||||
@@ -60,6 +62,14 @@ if [[ "${FLAGS_offline}" -eq "${FLAGS_TRUE}" ]]; then
|
||||
offline='true'
|
||||
fi
|
||||
|
||||
if [[ "${FLAGS_tools}" -eq "${FLAGS_FALSE}" ]]; then
|
||||
no_tools='true'
|
||||
fi
|
||||
|
||||
if [[ "${FLAGS_web}" -eq "${FLAGS_FALSE}" ]]; then
|
||||
no_web='true'
|
||||
fi
|
||||
|
||||
make_threads="${FLAGS_make_threads}"
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
@@ -160,7 +170,7 @@ case "${CPU_ARCH}" in
|
||||
FRIENDLY_ARCH=armhf
|
||||
;;
|
||||
|
||||
arm64v8)
|
||||
aarch64|arm64v8)
|
||||
FRIENDLY_ARCH=aarch64
|
||||
;;
|
||||
|
||||
@@ -183,6 +193,14 @@ if [[ -n "${no_kaldi}" ]]; then
|
||||
download_args+=('--nokaldi')
|
||||
fi
|
||||
|
||||
if [[ -n "${no_tools}" ]]; then
|
||||
download_args+=('--notools')
|
||||
fi
|
||||
|
||||
if [[ -n "${no_web}" ]]; then
|
||||
download_args+=('--noweb')
|
||||
fi
|
||||
|
||||
bash download-dependencies.sh "${download_args[@]}"
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
@@ -202,10 +220,12 @@ echo "Creating new virtual environment"
|
||||
mkdir -p "${venv}"
|
||||
"${PYTHON}" -m venv "${venv}"
|
||||
|
||||
# Extract Rhasspy tools
|
||||
rhasspy_tools_file="${download_dir}/rhasspy-tools_${FRIENDLY_ARCH}.tar.gz"
|
||||
echo "Extracting tools (${rhasspy_tools_file})"
|
||||
tar -C "${venv}" -xf "${rhasspy_tools_file}"
|
||||
if [[ -z "${no_tools}" ]]; then
|
||||
# Extract Rhasspy tools
|
||||
rhasspy_tools_file="${download_dir}/rhasspy-tools_${FRIENDLY_ARCH}.tar.gz"
|
||||
echo "Extracting tools (${rhasspy_tools_file})"
|
||||
tar -C "${venv}" -xf "${rhasspy_tools_file}"
|
||||
fi
|
||||
|
||||
# Force .venv/lib to be used
|
||||
export LD_LIBRARY_PATH="${venv}/lib:${LD_LIBRARY_PATH}"
|
||||
@@ -214,11 +234,11 @@ export LD_LIBRARY_PATH="${venv}/lib:${LD_LIBRARY_PATH}"
|
||||
source "${venv}/bin/activate"
|
||||
|
||||
echo "Upgrading pip"
|
||||
"${PYTHON}" -m pip install --upgrade pip
|
||||
python3 -m pip install --upgrade pip
|
||||
|
||||
echo "Installing Python requirements"
|
||||
"${PYTHON}" -m pip install wheel setuptools
|
||||
"${PYTHON}" -m pip install requests
|
||||
python3 -m pip install wheel setuptools
|
||||
python3 -m pip install requests
|
||||
|
||||
# pytorch is not available on ARM
|
||||
case "${CPU_ARCH}" in
|
||||
@@ -255,18 +275,18 @@ sed -i '/^openfst/d' "${requirements_file}"
|
||||
python3 -m pip install -r "${requirements_file}"
|
||||
|
||||
# Install Python openfst wrapper
|
||||
"${PYTHON}" -m pip install \
|
||||
--global-option=build_ext \
|
||||
--global-option="-I${venv}/include" \
|
||||
--global-option="-L${venv}/lib" \
|
||||
-r <(grep '^openfst' "${this_dir}/requirements.txt")
|
||||
python3 -m pip install \
|
||||
--global-option=build_ext \
|
||||
--global-option="-I${venv}/include" \
|
||||
--global-option="-L${venv}/lib" \
|
||||
-r <(grep '^openfst' "${this_dir}/requirements.txt")
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Pocketsphinx for Python
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
pocketsphinx_file="${download_dir}/pocketsphinx-python.tar.gz"
|
||||
"${PYTHON}" -m pip install "${pocketsphinx_file}"
|
||||
python3 -m pip install "${pocketsphinx_file}"
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Snowboy
|
||||
@@ -275,7 +295,7 @@ pocketsphinx_file="${download_dir}/pocketsphinx-python.tar.gz"
|
||||
case "${CPU_ARCH}" in
|
||||
x86_64|armv7l)
|
||||
snowboy_file="${download_dir}/snowboy-1.3.0.tar.gz"
|
||||
"${PYTHON}" -m pip install "${snowboy_file}"
|
||||
python3 -m pip install "${snowboy_file}"
|
||||
;;
|
||||
|
||||
*)
|
||||
@@ -288,7 +308,7 @@ esac
|
||||
|
||||
if [[ -z "${no_precise}" && -z "$(command -v precise-engine)" ]]; then
|
||||
case "${CPU_ARCH}" in
|
||||
x86_64|armv7l)
|
||||
x86_64|armv7l|aarch64)
|
||||
echo "Installing Mycroft Precise"
|
||||
precise_file="${download_dir}/precise-engine_0.3.0_${CPU_ARCH}.tar.gz"
|
||||
precise_install="${venv}/lib"
|
||||
@@ -316,9 +336,11 @@ fi
|
||||
# Web Interface
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
rhasspy_web_file="${download_dir}/rhasspy-web-dist.tar.gz"
|
||||
echo "Extracting web interface (${rhasspy_web_file})"
|
||||
tar -C "${this_dir}" -xf "${rhasspy_web_file}"
|
||||
if [[ -z "${no_web}" ]]; then
|
||||
rhasspy_web_file="${download_dir}/rhasspy-web-dist.tar.gz"
|
||||
echo "Extracting web interface (${rhasspy_web_file})"
|
||||
tar -C "${this_dir}" -xf "${rhasspy_web_file}"
|
||||
fi
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
|
||||
+26
-5
@@ -1,5 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
DIR="$( cd "$( dirname "$0" )" && pwd )"
|
||||
|
||||
# Try to detemine where Rhasspy is located
|
||||
if [[ -z "${RHASSPY_APP}" ]]; then
|
||||
@@ -16,13 +15,35 @@ if [[ -f "${CONFIG_PATH}" ]]; then
|
||||
# Hass.IO configuration
|
||||
profile_name="$(jq --raw-output '.profile_name' "${CONFIG_PATH}")"
|
||||
profile_dir="$(jq --raw-output '.profile_dir' "${CONFIG_PATH}")"
|
||||
RHASSPY_ARGS="--profile \"${profile_name}\" --user-profiles \"${profile_dir}\""
|
||||
RHASSPY_ARGS=('--profile' "${profile_name}" '--user-profiles' "${profile_dir}")
|
||||
|
||||
# Copy user-defined asoundrc to root
|
||||
asoundrc="$(jq --raw-output '.asoundrc' "${CONFIG_PATH}")"
|
||||
if [[ ! -z "${asoundrc}" ]]; then
|
||||
echo "${asoundrc}" > /root/.asoundrc
|
||||
fi
|
||||
|
||||
# Add SSL settings
|
||||
ssl="$(jq --raw-output '.ssl' "${CONFIG_PATH}")"
|
||||
if [[ "${ssl}" == 'true' ]]; then
|
||||
certfile="$(jq --raw-output '.certfile' "${CONFIG_PATH}")"
|
||||
keyfile="$(jq --raw-output '.keyfile' "${CONFIG_PATH}")"
|
||||
RHASSPY_ARGS+=('--ssl' "/ssl/${certfile}" "/ssl/${keyfile}")
|
||||
fi
|
||||
fi
|
||||
|
||||
cd "${RHASSPY_APP}"
|
||||
RHASSPY_VENV="${RHASSPY_APP}/.venv"
|
||||
if [[ -d "${RHASSPY_VENV}" ]]; then
|
||||
source "${RHASSPY_VENV}/bin/activate"
|
||||
|
||||
if [[ -z "${RHASSPY_ARGS}" ]]; then
|
||||
# Force .venv/lib to be used
|
||||
export LD_LIBRARY_PATH="${RHASSPY_VENV}/lib:${LD_LIBRARY_PATH}"
|
||||
fi
|
||||
|
||||
cd "${RHASSPY_APP}" || exit 1
|
||||
|
||||
if [[ -z "${RHASSPY_ARGS[*]}" ]]; then
|
||||
python3 app.py "$@"
|
||||
else
|
||||
python3 app.py "${RHASSPY_ARGS}" "$@"
|
||||
python3 app.py "${RHASSPY_ARGS[@]}" "$@"
|
||||
fi
|
||||
|
||||
@@ -1,52 +0,0 @@
|
||||
ARG BUILD_FROM
|
||||
FROM $BUILD_FROM
|
||||
LABEL maintainer="Michael Hansen <hansen.mike@gmail.com>"
|
||||
|
||||
ARG BUILD_ARCH
|
||||
ARG CPU_ARCH
|
||||
ENV LANG C.UTF-8
|
||||
|
||||
ARG MAKE_THREADS=4
|
||||
|
||||
WORKDIR /
|
||||
|
||||
QEMU
|
||||
|
||||
SYSTEM_DEPENDENCIES
|
||||
|
||||
RHASSPY_TOOLS
|
||||
|
||||
PYTHON_REQUIREMENTS
|
||||
|
||||
PYTHON_POCKETSPHINX
|
||||
|
||||
SNOWBOY
|
||||
|
||||
TTS
|
||||
|
||||
KALDI
|
||||
|
||||
RUN ldconfig
|
||||
|
||||
# Copy bw and mllr_solve to /usr/bin
|
||||
RUN find / -name bw -exec cp '{}' /usr/bin/ \;
|
||||
RUN find / -name mllr_solve -exec cp '{}' /usr/bin/ \;
|
||||
|
||||
GSTREAMER
|
||||
|
||||
PULSEAUDIO
|
||||
|
||||
# Copy script to run
|
||||
COPY docker/run.sh /run.sh
|
||||
RUN chmod +x /run.sh
|
||||
|
||||
RHASSPY_USER
|
||||
|
||||
PROFILES
|
||||
|
||||
RHASSPY_CODE
|
||||
|
||||
ENV CONFIG_PATH /data/options.json
|
||||
ENV KALDI_PREFIX /opt
|
||||
|
||||
ENTRYPOINT ["/run.sh"]
|
||||
@@ -1 +0,0 @@
|
||||
COPY profiles/ ${RHASSPY_APP}/profiles/
|
||||
@@ -1 +0,0 @@
|
||||
ENV RHASSPY_APP /usr/share/rhasspy
|
||||
@@ -1,207 +0,0 @@
|
||||
ARG BUILD_FROM
|
||||
FROM $BUILD_FROM
|
||||
LABEL maintainer="Michael Hansen <hansen.mike@gmail.com>"
|
||||
|
||||
ARG BUILD_ARCH
|
||||
ARG CPU_ARCH
|
||||
ENV LANG C.UTF-8
|
||||
|
||||
ARG MAKE_THREADS=4
|
||||
|
||||
WORKDIR /
|
||||
|
||||
COPY etc/qemu-arm-static /usr/bin/
|
||||
COPY etc/qemu-aarch64-static /usr/bin/
|
||||
|
||||
RUN apt-get update && \
|
||||
apt-get install --no-install-recommends --yes \
|
||||
bash jq unzip \
|
||||
python3 python3-pip python3-dev \
|
||||
build-essential portaudio19-dev swig \
|
||||
libatlas-base-dev \
|
||||
sox espeak flite alsa-utils \
|
||||
git curl \
|
||||
autoconf libtool automake bison \
|
||||
sphinxbase-utils sphinxtrain
|
||||
|
||||
COPY download/openfst-1.6.2-1_${BUILD_ARCH}.deb /
|
||||
RUN if [ "$BUILD_ARCH" != "aarch64" ]; then \
|
||||
apt-get install --no-install-recommends --yes libfst-dev libfst-tools; \
|
||||
else \
|
||||
dpkg -i /openfst-1.6.2-1_${BUILD_ARCH}.deb; \
|
||||
rm /openfst*.deb; \
|
||||
fi
|
||||
|
||||
RHASSPY_TOOLS
|
||||
|
||||
# Install Python dependencies
|
||||
RUN python3 -m pip install --no-cache-dir setuptools wheel
|
||||
|
||||
RUN apt-get install -y libfreetype6-dev libpng-dev pkg-config libffi-dev libssl-dev
|
||||
COPY requirements.txt /requirements.txt
|
||||
RUN if [ "$BUILD_ARCH" != "amd64" ]; then \
|
||||
grep -v flair /requirements.txt > /requirements-noflair.txt; \
|
||||
mv /requirements-noflair.txt /requirements.txt; \
|
||||
fi
|
||||
RUN python3 -m pip install --no-cache-dir -r /requirements.txt
|
||||
|
||||
# Install Pocketsphinx Python module with no sound
|
||||
COPY download/pocketsphinx-python.tar.gz /
|
||||
RUN python3 -m pip install --no-cache-dir /pocketsphinx-python.tar.gz && \
|
||||
rm -rf /pocketsphinx-python*
|
||||
|
||||
# Install snowboy
|
||||
COPY download/snowboy-1.3.0.tar.gz /
|
||||
RUN if [ "$BUILD_ARCH" != "aarch64" ]; then pip3 install --no-cache-dir /snowboy-1.3.0.tar.gz; fi
|
||||
|
||||
RUN apt-get install --no-install-recommends --yes flite libttspico-utils
|
||||
|
||||
COPY download/kaldi_${BUILD_ARCH}.tar.gz /kaldi.tar.gz
|
||||
RUN mkdir -p /opt && \
|
||||
tar -C /opt -xzf /kaldi.tar.gz && \
|
||||
rm /kaldi.tar.gz
|
||||
|
||||
RUN ldconfig
|
||||
|
||||
# Copy bw and mllr_solve to /usr/bin
|
||||
RUN find / -name bw -exec cp '{}' /usr/bin/ \;
|
||||
RUN find / -name mllr_solve -exec cp '{}' /usr/bin/ \;
|
||||
|
||||
# Install gstreamer and plugins
|
||||
RUN apt-get install --no-install-recommends --yes gstreamer1.0-tools gstreamer1.0-plugins-good
|
||||
|
||||
ENV RHASSPY_APP /usr/share/rhasspy
|
||||
|
||||
# Copy script to run
|
||||
COPY docker/run.sh /run.sh
|
||||
RUN chmod +x /run.sh
|
||||
|
||||
|
||||
|
||||
COPY profiles/zh/profile.json \
|
||||
profiles/zh/custom_words.txt \
|
||||
profiles/zh/espeak_phonemes.txt \
|
||||
profiles/zh/phoneme_examples.txt \
|
||||
profiles/zh/frequent_words.txt \
|
||||
profiles/zh/sentences.ini \
|
||||
profiles/zh/stop_words.txt ${RHASSPY_APP}/profiles/zh/
|
||||
|
||||
COPY profiles/hi/ \
|
||||
profiles/hi/profile.json \
|
||||
profiles/hi/custom_words.txt \
|
||||
profiles/hi/espeak_phonemes.txt \
|
||||
profiles/hi/phoneme_examples.txt \
|
||||
profiles/hi/frequent_words.txt \
|
||||
profiles/hi/sentences.ini \
|
||||
profiles/hi/stop_words.txt ${RHASSPY_APP}/profiles/hi/
|
||||
|
||||
COPY profiles/el/profile.json \
|
||||
profiles/el/custom_words.txt \
|
||||
profiles/el/espeak_phonemes.txt \
|
||||
profiles/el/phoneme_examples.txt \
|
||||
profiles/el/frequent_words.txt \
|
||||
profiles/el/sentences.ini \
|
||||
profiles/el/stop_words.txt ${RHASSPY_APP}/profiles/el/
|
||||
|
||||
COPY profiles/de/profile.json \
|
||||
profiles/de/custom_words.txt \
|
||||
profiles/de/espeak_phonemes.txt \
|
||||
profiles/de/phoneme_examples.txt \
|
||||
profiles/de/frequent_words.txt \
|
||||
profiles/de/sentences.ini \
|
||||
profiles/de/stop_words.txt ${RHASSPY_APP}/profiles/de/
|
||||
|
||||
COPY profiles/it/profile.json \
|
||||
profiles/it/custom_words.txt \
|
||||
profiles/it/espeak_phonemes.txt \
|
||||
profiles/it/phoneme_examples.txt \
|
||||
profiles/it/frequent_words.txt \
|
||||
profiles/it/sentences.ini \
|
||||
profiles/it/stop_words.txt ${RHASSPY_APP}/profiles/it/
|
||||
|
||||
COPY profiles/es/profile.json \
|
||||
profiles/es/custom_words.txt \
|
||||
profiles/es/espeak_phonemes.txt \
|
||||
profiles/es/phoneme_examples.txt \
|
||||
profiles/es/frequent_words.txt \
|
||||
profiles/es/sentences.ini \
|
||||
profiles/es/stop_words.txt ${RHASSPY_APP}/profiles/es/
|
||||
|
||||
COPY profiles/fr/profile.json \
|
||||
profiles/fr/custom_words.txt \
|
||||
profiles/fr/espeak_phonemes.txt \
|
||||
profiles/fr/phoneme_examples.txt \
|
||||
profiles/fr/frequent_words.txt \
|
||||
profiles/fr/sentences.ini \
|
||||
profiles/fr/stop_words.txt ${RHASSPY_APP}/profiles/fr/
|
||||
|
||||
COPY profiles/ru/profile.json \
|
||||
profiles/ru/custom_words.txt \
|
||||
profiles/ru/espeak_phonemes.txt \
|
||||
profiles/ru/phoneme_examples.txt \
|
||||
profiles/ru/frequent_words.txt \
|
||||
profiles/ru/sentences.ini \
|
||||
profiles/ru/stop_words.txt ${RHASSPY_APP}/profiles/ru/
|
||||
|
||||
COPY profiles/nl/profile.json \
|
||||
profiles/nl/custom_words.txt \
|
||||
profiles/nl/espeak_phonemes.txt \
|
||||
profiles/nl/phoneme_examples.txt \
|
||||
profiles/nl/frequent_words.txt \
|
||||
profiles/nl/sentences.ini \
|
||||
profiles/nl/stop_words.txt ${RHASSPY_APP}/profiles/nl/
|
||||
|
||||
COPY profiles/vi/profile.json \
|
||||
profiles/vi/custom_words.txt \
|
||||
profiles/vi/espeak_phonemes.txt \
|
||||
profiles/vi/phoneme_examples.txt \
|
||||
profiles/vi/frequent_words.txt \
|
||||
profiles/vi/sentences.ini \
|
||||
profiles/vi/stop_words.txt ${RHASSPY_APP}/profiles/vi/
|
||||
|
||||
COPY profiles/pt/profile.json \
|
||||
profiles/pt/custom_words.txt \
|
||||
profiles/pt/espeak_phonemes.txt \
|
||||
profiles/pt/phoneme_examples.txt \
|
||||
profiles/pt/frequent_words.txt \
|
||||
profiles/pt/sentences.ini \
|
||||
profiles/pt/stop_words.txt ${RHASSPY_APP}/profiles/pt/
|
||||
|
||||
COPY profiles/sv/profile.json \
|
||||
profiles/sv/custom_words.txt \
|
||||
profiles/sv/espeak_phonemes.txt \
|
||||
profiles/sv/phoneme_examples.txt \
|
||||
profiles/sv/frequent_words.txt \
|
||||
profiles/sv/sentences.ini \
|
||||
profiles/sv/stop_words.txt ${RHASSPY_APP}/profiles/sv/
|
||||
|
||||
COPY profiles/ca/profile.json \
|
||||
profiles/ca/custom_words.txt \
|
||||
profiles/ca/espeak_phonemes.txt \
|
||||
profiles/ca/phoneme_examples.txt \
|
||||
profiles/ca/frequent_words.txt \
|
||||
profiles/ca/sentences.ini \
|
||||
profiles/ca/stop_words.txt ${RHASSPY_APP}/profiles/ca/
|
||||
|
||||
COPY profiles/en/profile.json \
|
||||
profiles/en/custom_words.txt \
|
||||
profiles/en/espeak_phonemes.txt \
|
||||
profiles/en/phoneme_examples.txt \
|
||||
profiles/en/frequent_words.txt \
|
||||
profiles/en/sentences.ini \
|
||||
profiles/en/stop_words.txt ${RHASSPY_APP}/profiles/en/
|
||||
|
||||
COPY profiles/defaults.json ${RHASSPY_APP}/profiles/
|
||||
COPY docker/rhasspy ${RHASSPY_APP}/bin/
|
||||
COPY dist/ ${RHASSPY_APP}/dist/
|
||||
COPY etc/wav/* ${RHASSPY_APP}/etc/wav/
|
||||
COPY rhasspy/profile_schema.json ${RHASSPY_APP}/rhasspy/
|
||||
COPY rhasspy/train/jsgf2fst/*.py ${RHASSPY_APP}/rhasspy/train/jsgf2fst/
|
||||
COPY rhasspy/train/*.py ${RHASSPY_APP}/rhasspy/train/
|
||||
COPY *.py ${RHASSPY_APP}/
|
||||
COPY rhasspy/*.py ${RHASSPY_APP}/rhasspy/
|
||||
|
||||
ENV CONFIG_PATH /data/options.json
|
||||
ENV KALDI_PREFIX /opt
|
||||
|
||||
ENTRYPOINT ["/run.sh"]
|
||||
@@ -1,96 +0,0 @@
|
||||
ARG BUILD_FROM
|
||||
FROM $BUILD_FROM
|
||||
LABEL maintainer="Michael Hansen <hansen.mike@gmail.com>"
|
||||
|
||||
ARG BUILD_ARCH
|
||||
ARG CPU_ARCH
|
||||
ENV LANG C.UTF-8
|
||||
|
||||
ARG MAKE_THREADS=4
|
||||
|
||||
WORKDIR /
|
||||
|
||||
COPY etc/qemu-arm-static /usr/bin/
|
||||
COPY etc/qemu-aarch64-static /usr/bin/
|
||||
|
||||
RUN apt-get update && \
|
||||
apt-get install --no-install-recommends --yes \
|
||||
bash jq unzip \
|
||||
python3 python3-pip python3-dev \
|
||||
build-essential portaudio19-dev swig \
|
||||
libatlas-base-dev \
|
||||
sox espeak flite alsa-utils \
|
||||
git curl \
|
||||
autoconf libtool automake bison \
|
||||
sphinxbase-utils sphinxtrain
|
||||
|
||||
COPY download/openfst-1.6.2-1_${BUILD_ARCH}.deb /
|
||||
RUN if [ "$BUILD_ARCH" != "aarch64" ]; then \
|
||||
apt-get install --no-install-recommends --yes libfst-dev libfst-tools; \
|
||||
else \
|
||||
dpkg -i /openfst-1.6.2-1_${BUILD_ARCH}.deb; \
|
||||
rm /openfst*.deb; \
|
||||
fi
|
||||
|
||||
RHASSPY_TOOLS
|
||||
|
||||
# Install Python dependencies
|
||||
RUN python3 -m pip install --no-cache-dir setuptools wheel
|
||||
|
||||
RUN apt-get install -y libfreetype6-dev libpng-dev pkg-config libffi-dev libssl-dev
|
||||
COPY requirements.txt /requirements.txt
|
||||
RUN if [ "$BUILD_ARCH" != "amd64" ]; then \
|
||||
grep -v flair /requirements.txt > /requirements-noflair.txt; \
|
||||
mv /requirements-noflair.txt /requirements.txt; \
|
||||
fi
|
||||
RUN python3 -m pip install --no-cache-dir -r /requirements.txt
|
||||
|
||||
# Install Pocketsphinx Python module with no sound
|
||||
COPY download/pocketsphinx-python.tar.gz /
|
||||
RUN python3 -m pip install --no-cache-dir /pocketsphinx-python.tar.gz && \
|
||||
rm -rf /pocketsphinx-python*
|
||||
|
||||
# Install snowboy
|
||||
COPY download/snowboy-1.3.0.tar.gz /
|
||||
RUN if [ "$BUILD_ARCH" != "aarch64" ]; then pip3 install --no-cache-dir /snowboy-1.3.0.tar.gz; fi
|
||||
|
||||
RUN apt-get install --no-install-recommends --yes flite libttspico-utils
|
||||
|
||||
COPY download/kaldi_${BUILD_ARCH}.tar.gz /kaldi.tar.gz
|
||||
RUN mkdir -p /opt && \
|
||||
tar -C /opt -xzf /kaldi.tar.gz && \
|
||||
rm /kaldi.tar.gz
|
||||
|
||||
RUN ldconfig
|
||||
|
||||
# Copy bw and mllr_solve to /usr/bin
|
||||
RUN find / -name bw -exec cp '{}' /usr/bin/ \;
|
||||
RUN find / -name mllr_solve -exec cp '{}' /usr/bin/ \;
|
||||
|
||||
# Install gstreamer and plugins
|
||||
RUN apt-get install --no-install-recommends --yes gstreamer1.0-tools gstreamer1.0-plugins-good
|
||||
|
||||
ENV RHASSPY_APP /usr/share/rhasspy
|
||||
|
||||
# Copy script to run
|
||||
COPY docker/run.sh /run.sh
|
||||
RUN chmod +x /run.sh
|
||||
|
||||
|
||||
|
||||
COPY profiles/en/ ${RHASSPY_APP}/profiles/en/
|
||||
|
||||
COPY profiles/defaults.json ${RHASSPY_APP}/profiles/
|
||||
COPY docker/rhasspy ${RHASSPY_APP}/bin/
|
||||
COPY dist/ ${RHASSPY_APP}/dist/
|
||||
COPY etc/wav/* ${RHASSPY_APP}/etc/wav/
|
||||
COPY rhasspy/profile_schema.json ${RHASSPY_APP}/rhasspy/
|
||||
COPY rhasspy/train/jsgf2fst/*.py ${RHASSPY_APP}/rhasspy/train/jsgf2fst/
|
||||
COPY rhasspy/train/*.py ${RHASSPY_APP}/rhasspy/train/
|
||||
COPY *.py ${RHASSPY_APP}/
|
||||
COPY rhasspy/*.py ${RHASSPY_APP}/rhasspy/
|
||||
|
||||
ENV CONFIG_PATH /data/options.json
|
||||
ENV KALDI_PREFIX /opt
|
||||
|
||||
ENTRYPOINT ["/run.sh"]
|
||||
@@ -1,113 +0,0 @@
|
||||
ARG BUILD_FROM
|
||||
FROM $BUILD_FROM
|
||||
LABEL maintainer="Michael Hansen <hansen.mike@gmail.com>"
|
||||
|
||||
ARG BUILD_ARCH
|
||||
ARG CPU_ARCH
|
||||
ENV LANG C.UTF-8
|
||||
|
||||
ARG MAKE_THREADS=4
|
||||
|
||||
WORKDIR /
|
||||
|
||||
COPY etc/qemu-arm-static /usr/bin/
|
||||
COPY etc/qemu-aarch64-static /usr/bin/
|
||||
|
||||
RUN apt-get update && \
|
||||
apt-get install --no-install-recommends --yes \
|
||||
bash jq unzip \
|
||||
python3 python3-pip python3-dev \
|
||||
build-essential portaudio19-dev swig \
|
||||
libatlas-base-dev \
|
||||
sox espeak flite alsa-utils \
|
||||
git curl \
|
||||
autoconf libtool automake bison \
|
||||
sphinxbase-utils sphinxtrain
|
||||
|
||||
COPY download/openfst-1.6.2-1_${BUILD_ARCH}.deb /
|
||||
RUN if [ "$BUILD_ARCH" != "aarch64" ]; then \
|
||||
apt-get install --no-install-recommends --yes libfst-dev libfst-tools; \
|
||||
else \
|
||||
dpkg -i /openfst-1.6.2-1_${BUILD_ARCH}.deb; \
|
||||
rm /openfst*.deb; \
|
||||
fi
|
||||
|
||||
RHASSPY_TOOLS
|
||||
|
||||
# Install Python dependencies
|
||||
RUN python3 -m pip install --no-cache-dir setuptools wheel
|
||||
|
||||
RUN apt-get install -y libfreetype6-dev libpng-dev pkg-config libffi-dev libssl-dev
|
||||
COPY requirements.txt /requirements.txt
|
||||
RUN if [ "$BUILD_ARCH" != "amd64" ]; then \
|
||||
grep -v flair /requirements.txt > /requirements-noflair.txt; \
|
||||
mv /requirements-noflair.txt /requirements.txt; \
|
||||
fi
|
||||
RUN python3 -m pip install --no-cache-dir -r /requirements.txt
|
||||
|
||||
# Install Pocketsphinx Python module with no sound
|
||||
COPY download/pocketsphinx-python.tar.gz /
|
||||
RUN python3 -m pip install --no-cache-dir /pocketsphinx-python.tar.gz && \
|
||||
rm -rf /pocketsphinx-python*
|
||||
|
||||
# Install snowboy
|
||||
COPY download/snowboy-1.3.0.tar.gz /
|
||||
RUN if [ "$BUILD_ARCH" != "aarch64" ]; then pip3 install --no-cache-dir /snowboy-1.3.0.tar.gz; fi
|
||||
|
||||
RUN apt-get install --no-install-recommends --yes flite libttspico-utils
|
||||
|
||||
COPY download/kaldi_${BUILD_ARCH}.tar.gz /kaldi.tar.gz
|
||||
RUN mkdir -p /opt && \
|
||||
tar -C /opt -xzf /kaldi.tar.gz && \
|
||||
rm /kaldi.tar.gz
|
||||
|
||||
RUN ldconfig
|
||||
|
||||
# Copy bw and mllr_solve to /usr/bin
|
||||
RUN find / -name bw -exec cp '{}' /usr/bin/ \;
|
||||
RUN find / -name mllr_solve -exec cp '{}' /usr/bin/ \;
|
||||
|
||||
# Install gstreamer and plugins
|
||||
RUN apt-get install --no-install-recommends --yes gstreamer1.0-tools gstreamer1.0-plugins-good
|
||||
|
||||
RUN apt-get install -y pulseaudio
|
||||
COPY etc/pulseaudio.client.conf /etc/pulse/client.conf
|
||||
|
||||
# Create new user
|
||||
ENV UNAME=rhasspy
|
||||
RUN export UNAME=$UNAME UID=1000 GID=1000 && \
|
||||
mkdir -p "/home/${UNAME}" && \
|
||||
echo "${UNAME}:x:${UID}:${GID}:${UNAME} User,,,:/home/${UNAME}:/bin/bash" >> /etc/passwd && \
|
||||
echo "${UNAME}:x:${UID}:" >> /etc/group && \
|
||||
mkdir -p /etc/sudoers.d && \
|
||||
echo "${UNAME} ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/${UNAME} && \
|
||||
chmod 0440 /etc/sudoers.d/${UNAME} && \
|
||||
chown ${UID}:${GID} -R /home/${UNAME} && \
|
||||
gpasswd -a ${UNAME} audio
|
||||
|
||||
ENV RHASSPY_APP /home/${UNAME}
|
||||
|
||||
# Copy script to run
|
||||
COPY docker/run.sh /run.sh
|
||||
RUN chmod +x /run.sh
|
||||
|
||||
# Switch to new user
|
||||
USER $UNAME
|
||||
ENV HOME /home/${UNAME}
|
||||
|
||||
COPY profiles/en/ ${RHASSPY_APP}/profiles/en/
|
||||
|
||||
COPY profiles/defaults.json ${RHASSPY_APP}/profiles/
|
||||
COPY docker/rhasspy ${RHASSPY_APP}/bin/
|
||||
COPY dist/ ${RHASSPY_APP}/dist/
|
||||
COPY etc/wav/* ${RHASSPY_APP}/etc/wav/
|
||||
COPY rhasspy/profile_schema.json ${RHASSPY_APP}/rhasspy/
|
||||
COPY rhasspy/train/jsgf2fst/*.py ${RHASSPY_APP}/rhasspy/train/jsgf2fst/
|
||||
COPY rhasspy/train/*.py ${RHASSPY_APP}/rhasspy/train/
|
||||
COPY *.py ${RHASSPY_APP}/
|
||||
COPY rhasspy/*.py ${RHASSPY_APP}/rhasspy/
|
||||
|
||||
ENV CONFIG_PATH /data/options.json
|
||||
ENV KALDI_PREFIX /opt
|
||||
|
||||
ENTRYPOINT ["/run.sh"]
|
||||
@@ -1,91 +0,0 @@
|
||||
ARG BUILD_FROM
|
||||
FROM $BUILD_FROM
|
||||
LABEL maintainer="Michael Hansen <hansen.mike@gmail.com>"
|
||||
|
||||
ARG BUILD_ARCH
|
||||
ARG CPU_ARCH
|
||||
ENV LANG C.UTF-8
|
||||
|
||||
ARG MAKE_THREADS=4
|
||||
|
||||
WORKDIR /
|
||||
|
||||
COPY etc/qemu-arm-static /usr/bin/
|
||||
COPY etc/qemu-aarch64-static /usr/bin/
|
||||
|
||||
RUN apt-get update && \
|
||||
apt-get install --no-install-recommends --yes \
|
||||
bash jq unzip \
|
||||
python3 python3-pip python3-dev \
|
||||
build-essential portaudio19-dev swig \
|
||||
libatlas-base-dev \
|
||||
sox espeak flite alsa-utils \
|
||||
git curl \
|
||||
autoconf libtool automake bison \
|
||||
sphinxbase-utils sphinxtrain
|
||||
|
||||
COPY download/rhasspy-tools_${BUILD_ARCH}.tar.gz /
|
||||
RUN tar -C /usr -xvf /rhasspy-tools_${BUILD_ARCH}.tar.gz && \
|
||||
rm -f /rhasspy-tools_${BUILD_ARCH}.tar.gz
|
||||
|
||||
# Install Python dependencies
|
||||
RUN python3 -m pip install --no-cache-dir setuptools wheel
|
||||
|
||||
RUN apt-get install -y libfreetype6-dev libpng-dev pkg-config libffi-dev libssl-dev
|
||||
COPY requirements.txt /requirements.txt
|
||||
RUN if [ "$BUILD_ARCH" != "amd64" ]; then \
|
||||
grep -v flair /requirements.txt > /requirements-noflair.txt; \
|
||||
mv /requirements-noflair.txt /requirements.txt; \
|
||||
fi
|
||||
RUN python3 -m pip install --no-cache-dir -r /requirements.txt
|
||||
|
||||
# Install Pocketsphinx Python module with no sound
|
||||
COPY download/pocketsphinx-python.tar.gz /
|
||||
RUN python3 -m pip install --no-cache-dir /pocketsphinx-python.tar.gz && \
|
||||
rm -rf /pocketsphinx-python*
|
||||
|
||||
# Install snowboy
|
||||
COPY download/snowboy-1.3.0.tar.gz /
|
||||
RUN if [ "$BUILD_ARCH" != "aarch64" ]; then pip3 install --no-cache-dir /snowboy-1.3.0.tar.gz; fi
|
||||
|
||||
RUN apt-get install --no-install-recommends --yes flite libttspico-utils lame
|
||||
|
||||
COPY download/kaldi_${BUILD_ARCH}.tar.gz /kaldi.tar.gz
|
||||
RUN mkdir -p /opt && \
|
||||
tar -C /opt -xzf /kaldi.tar.gz && \
|
||||
rm /kaldi.tar.gz
|
||||
|
||||
RUN ldconfig
|
||||
|
||||
# Copy bw and mllr_solve to /usr/bin
|
||||
RUN find / -name bw -exec cp '{}' /usr/bin/ \;
|
||||
RUN find / -name mllr_solve -exec cp '{}' /usr/bin/ \;
|
||||
|
||||
# Install gstreamer and plugins
|
||||
RUN apt-get install --no-install-recommends --yes gstreamer1.0-tools gstreamer1.0-plugins-good
|
||||
|
||||
ENV RHASSPY_APP /usr/share/rhasspy
|
||||
|
||||
# Copy script to run
|
||||
COPY docker/run.sh /run.sh
|
||||
RUN chmod +x /run.sh
|
||||
|
||||
|
||||
|
||||
COPY profiles/ ${RHASSPY_APP}/profiles/
|
||||
|
||||
COPY profiles/defaults.json ${RHASSPY_APP}/profiles/
|
||||
COPY docker/rhasspy ${RHASSPY_APP}/bin/
|
||||
COPY dist/ ${RHASSPY_APP}/dist/
|
||||
COPY etc/wav/* ${RHASSPY_APP}/etc/wav/
|
||||
COPY rhasspy/profile_schema.json ${RHASSPY_APP}/rhasspy/
|
||||
COPY rhasspy/train/jsgf2fst/*.py ${RHASSPY_APP}/rhasspy/train/jsgf2fst/
|
||||
COPY rhasspy/train/*.py ${RHASSPY_APP}/rhasspy/train/
|
||||
COPY *.py ${RHASSPY_APP}/
|
||||
COPY rhasspy/*.py ${RHASSPY_APP}/rhasspy/
|
||||
COPY VERSION ${RHASSPY_APP}/
|
||||
|
||||
ENV CONFIG_PATH /data/options.json
|
||||
ENV KALDI_PREFIX /opt
|
||||
|
||||
ENTRYPOINT ["/run.sh"]
|
||||
@@ -1,91 +0,0 @@
|
||||
ARG BUILD_FROM
|
||||
FROM $BUILD_FROM
|
||||
LABEL maintainer="Michael Hansen <hansen.mike@gmail.com>"
|
||||
|
||||
ARG BUILD_ARCH
|
||||
ARG CPU_ARCH
|
||||
ENV LANG C.UTF-8
|
||||
|
||||
ARG MAKE_THREADS=4
|
||||
|
||||
WORKDIR /
|
||||
|
||||
COPY etc/qemu-arm-static /usr/bin/
|
||||
COPY etc/qemu-aarch64-static /usr/bin/
|
||||
|
||||
RUN apt-get update && \
|
||||
apt-get install --no-install-recommends --yes \
|
||||
bash jq unzip \
|
||||
python3 python3-pip python3-dev \
|
||||
build-essential portaudio19-dev swig \
|
||||
libfst-dev libfst-tools \
|
||||
libatlas-base-dev \
|
||||
sox espeak flite alsa-utils \
|
||||
git curl \
|
||||
autoconf libtool automake bison \
|
||||
sphinxbase-utils sphinxtrain
|
||||
|
||||
COPY download/rhasspy-tools_${BUILD_ARCH}.tar.gz /
|
||||
RUN tar -C /usr -xvf /rhasspy-tools_${BUILD_ARCH}.tar.gz && \
|
||||
rm -f /rhasspy-tools_${BUILD_ARCH}.tar.gz
|
||||
|
||||
# Install Python dependencies
|
||||
RUN python3 -m pip install --no-cache-dir setuptools wheel
|
||||
|
||||
RUN apt-get install -y libfreetype6-dev libpng-dev pkg-config libffi-dev libssl-dev
|
||||
COPY requirements.txt /requirements.txt
|
||||
RUN if [ "$BUILD_ARCH" != "amd64" ]; then \
|
||||
grep -v flair /requirements.txt > /requirements-noflair.txt; \
|
||||
mv /requirements-noflair.txt /requirements.txt; \
|
||||
fi
|
||||
RUN python3 -m pip install --no-cache-dir -r /requirements.txt
|
||||
|
||||
# Install Pocketsphinx Python module with no sound
|
||||
COPY download/pocketsphinx-python.tar.gz /
|
||||
RUN python3 -m pip install --no-cache-dir /pocketsphinx-python.tar.gz && \
|
||||
rm -rf /pocketsphinx-python*
|
||||
|
||||
# Install snowboy
|
||||
COPY download/snowboy-1.3.0.tar.gz /
|
||||
RUN if [ "$BUILD_ARCH" != "aarch64" ]; then pip3 install --no-cache-dir /snowboy-1.3.0.tar.gz; fi
|
||||
|
||||
RUN apt-get install --no-install-recommends --yes flite libttspico-utils
|
||||
|
||||
COPY download/kaldi_${BUILD_ARCH}.tar.gz /kaldi.tar.gz
|
||||
RUN mkdir -p /opt && \
|
||||
tar -C /opt -xzf /kaldi.tar.gz && \
|
||||
rm /kaldi.tar.gz
|
||||
|
||||
RUN ldconfig
|
||||
|
||||
# Copy bw and mllr_solve to /usr/bin
|
||||
RUN find / -name bw -exec cp '{}' /usr/bin/ \;
|
||||
RUN find / -name mllr_solve -exec cp '{}' /usr/bin/ \;
|
||||
|
||||
# Install gstreamer and plugins
|
||||
RUN apt-get install --no-install-recommends --yes gstreamer1.0-tools gstreamer1.0-plugins-good
|
||||
|
||||
ENV RHASSPY_APP /usr/share/rhasspy
|
||||
|
||||
# Copy script to run
|
||||
COPY docker/run.sh /run.sh
|
||||
RUN chmod +x /run.sh
|
||||
|
||||
|
||||
|
||||
COPY profiles/en/ ${RHASSPY_APP}/profiles/en/
|
||||
|
||||
COPY profiles/defaults.json ${RHASSPY_APP}/profiles/
|
||||
COPY docker/rhasspy ${RHASSPY_APP}/bin/
|
||||
COPY dist/ ${RHASSPY_APP}/dist/
|
||||
COPY etc/wav/* ${RHASSPY_APP}/etc/wav/
|
||||
COPY rhasspy/profile_schema.json ${RHASSPY_APP}/rhasspy/
|
||||
COPY rhasspy/train/jsgf2fst/*.py ${RHASSPY_APP}/rhasspy/train/jsgf2fst/
|
||||
COPY rhasspy/train/*.py ${RHASSPY_APP}/rhasspy/train/
|
||||
COPY *.py ${RHASSPY_APP}/
|
||||
COPY rhasspy/*.py ${RHASSPY_APP}/rhasspy/
|
||||
|
||||
ENV CONFIG_PATH /data/options.json
|
||||
ENV KALDI_PREFIX /opt
|
||||
|
||||
ENTRYPOINT ["/run.sh"]
|
||||
@@ -1,108 +0,0 @@
|
||||
ARG BUILD_FROM
|
||||
FROM $BUILD_FROM
|
||||
LABEL maintainer="Michael Hansen <hansen.mike@gmail.com>"
|
||||
|
||||
ARG BUILD_ARCH
|
||||
ARG CPU_ARCH
|
||||
ENV LANG C.UTF-8
|
||||
|
||||
ARG MAKE_THREADS=4
|
||||
|
||||
WORKDIR /
|
||||
|
||||
COPY etc/qemu-arm-static /usr/bin/
|
||||
COPY etc/qemu-aarch64-static /usr/bin/
|
||||
|
||||
RUN apt-get update && \
|
||||
apt-get install --no-install-recommends --yes \
|
||||
bash jq unzip \
|
||||
python3 python3-pip python3-dev \
|
||||
build-essential portaudio19-dev swig \
|
||||
libfst-dev libfst-tools \
|
||||
libatlas-base-dev \
|
||||
sox espeak flite alsa-utils \
|
||||
git curl \
|
||||
autoconf libtool automake bison \
|
||||
sphinxbase-utils sphinxtrain
|
||||
|
||||
COPY download/rhasspy-tools_${BUILD_ARCH}.tar.gz /
|
||||
RUN tar -C /usr -xvf /rhasspy-tools_${BUILD_ARCH}.tar.gz && \
|
||||
rm -f /rhasspy-tools_${BUILD_ARCH}.tar.gz
|
||||
|
||||
# Install Python dependencies
|
||||
RUN python3 -m pip install --no-cache-dir setuptools wheel
|
||||
|
||||
RUN apt-get install -y libfreetype6-dev libpng-dev pkg-config libffi-dev libssl-dev
|
||||
COPY requirements.txt /requirements.txt
|
||||
RUN if [ "$BUILD_ARCH" != "amd64" ]; then \
|
||||
grep -v flair /requirements.txt > /requirements-noflair.txt; \
|
||||
mv /requirements-noflair.txt /requirements.txt; \
|
||||
fi
|
||||
RUN python3 -m pip install --no-cache-dir -r /requirements.txt
|
||||
|
||||
# Install Pocketsphinx Python module with no sound
|
||||
COPY download/pocketsphinx-python.tar.gz /
|
||||
RUN python3 -m pip install --no-cache-dir /pocketsphinx-python.tar.gz && \
|
||||
rm -rf /pocketsphinx-python*
|
||||
|
||||
# Install snowboy
|
||||
COPY download/snowboy-1.3.0.tar.gz /
|
||||
RUN if [ "$BUILD_ARCH" != "aarch64" ]; then pip3 install --no-cache-dir /snowboy-1.3.0.tar.gz; fi
|
||||
|
||||
RUN apt-get install --no-install-recommends --yes flite libttspico-utils
|
||||
|
||||
COPY download/kaldi_${BUILD_ARCH}.tar.gz /kaldi.tar.gz
|
||||
RUN mkdir -p /opt && \
|
||||
tar -C /opt -xzf /kaldi.tar.gz && \
|
||||
rm /kaldi.tar.gz
|
||||
|
||||
RUN ldconfig
|
||||
|
||||
# Copy bw and mllr_solve to /usr/bin
|
||||
RUN find / -name bw -exec cp '{}' /usr/bin/ \;
|
||||
RUN find / -name mllr_solve -exec cp '{}' /usr/bin/ \;
|
||||
|
||||
# Install gstreamer and plugins
|
||||
RUN apt-get install --no-install-recommends --yes gstreamer1.0-tools gstreamer1.0-plugins-good
|
||||
|
||||
RUN apt-get install -y pulseaudio
|
||||
COPY etc/pulseaudio.client.conf /etc/pulse/client.conf
|
||||
|
||||
# Create new user
|
||||
ENV UNAME=rhasspy
|
||||
RUN export UNAME=$UNAME UID=1000 GID=1000 && \
|
||||
mkdir -p "/home/${UNAME}" && \
|
||||
echo "${UNAME}:x:${UID}:${GID}:${UNAME} User,,,:/home/${UNAME}:/bin/bash" >> /etc/passwd && \
|
||||
echo "${UNAME}:x:${UID}:" >> /etc/group && \
|
||||
mkdir -p /etc/sudoers.d && \
|
||||
echo "${UNAME} ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/${UNAME} && \
|
||||
chmod 0440 /etc/sudoers.d/${UNAME} && \
|
||||
chown ${UID}:${GID} -R /home/${UNAME} && \
|
||||
gpasswd -a ${UNAME} audio
|
||||
|
||||
ENV RHASSPY_APP /home/${UNAME}
|
||||
|
||||
# Copy script to run
|
||||
COPY docker/run.sh /run.sh
|
||||
RUN chmod +x /run.sh
|
||||
|
||||
# Switch to new user
|
||||
USER $UNAME
|
||||
ENV HOME /home/${UNAME}
|
||||
|
||||
COPY profiles/en/ ${RHASSPY_APP}/profiles/en/
|
||||
|
||||
COPY profiles/defaults.json ${RHASSPY_APP}/profiles/
|
||||
COPY docker/rhasspy ${RHASSPY_APP}/bin/
|
||||
COPY dist/ ${RHASSPY_APP}/dist/
|
||||
COPY etc/wav/* ${RHASSPY_APP}/etc/wav/
|
||||
COPY rhasspy/profile_schema.json ${RHASSPY_APP}/rhasspy/
|
||||
COPY rhasspy/train/jsgf2fst/*.py ${RHASSPY_APP}/rhasspy/train/jsgf2fst/
|
||||
COPY rhasspy/train/*.py ${RHASSPY_APP}/rhasspy/train/
|
||||
COPY *.py ${RHASSPY_APP}/
|
||||
COPY rhasspy/*.py ${RHASSPY_APP}/rhasspy/
|
||||
|
||||
ENV CONFIG_PATH /data/options.json
|
||||
ENV KALDI_PREFIX /opt
|
||||
|
||||
ENTRYPOINT ["/run.sh"]
|
||||
@@ -1 +0,0 @@
|
||||
COPY profiles/en/ ${RHASSPY_APP}/profiles/en/
|
||||
@@ -1,7 +0,0 @@
|
||||
COPY download/phonetisaurus-2019.tar.gz /phonetisaurus.tar.gz
|
||||
RUN cd / && tar -xf phonetisaurus.tar.gz
|
||||
RUN cd /phonetisaurus && \
|
||||
./configure && \
|
||||
make -j $MAKE_THREADS && \
|
||||
make install && \
|
||||
rm -rf /phonetisaurus*
|
||||
@@ -1,18 +0,0 @@
|
||||
RUN apt-get update && \
|
||||
apt-get install --no-install-recommends --yes \
|
||||
bash jq unzip \
|
||||
python3 python3-pip python3-dev \
|
||||
build-essential portaudio19-dev swig \
|
||||
libatlas-base-dev \
|
||||
sox espeak flite alsa-utils \
|
||||
git curl \
|
||||
autoconf libtool automake bison \
|
||||
sphinxbase-utils sphinxtrain
|
||||
|
||||
COPY download/openfst-1.6.2-1_${BUILD_ARCH}.deb /
|
||||
RUN if [ "$BUILD_ARCH" != "aarch64" ]; then \
|
||||
apt-get install --no-install-recommends --yes libfst-dev libfst-tools; \
|
||||
else \
|
||||
dpkg -i /openfst-1.6.2-1_${BUILD_ARCH}.deb; \
|
||||
rm /openfst*.deb; \
|
||||
fi
|
||||
@@ -1,67 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Directory of *this* script
|
||||
DIR="$( cd "$( dirname "$0" )" && pwd )"
|
||||
template="$DIR/Dockerfile.template"
|
||||
out="$DIR/dockerfiles"
|
||||
mkdir -p "$out"
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
# Uppercases an input string
|
||||
function upper {
|
||||
tr '[[:lower:]]' '[[:upper:]]'
|
||||
}
|
||||
|
||||
# Creates m4 "define" statements from text files in one or more directories.
|
||||
# The contents of dir/file.txt will be the value of variable FILE.
|
||||
function set_variables {
|
||||
echo "divert(-1)"
|
||||
while [[ ! -z "$1" ]]; do
|
||||
if [[ -d "$1" ]]; then
|
||||
for var_file in $(find "$1" -type f -name "*.txt"); do
|
||||
var_name=$(basename "$var_file" .txt | upper)
|
||||
echo "define(\`$var_name', \`$(cat $var_file)')"
|
||||
done
|
||||
elif [[ -f "$1" ]]; then
|
||||
var_file="$1"
|
||||
var_name=$(basename "$var_file" .txt | upper)
|
||||
echo "define(\`$var_name', \`$(cat $var_file)')"
|
||||
fi
|
||||
|
||||
shift
|
||||
done
|
||||
echo "divert(0)dnl"
|
||||
}
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
#------------
|
||||
# From source
|
||||
#------------
|
||||
# set_variables "$DIR/shared/" "$DIR/from-source/" \
|
||||
# "$DIR/alsa/" "$DIR/en_profile/" \
|
||||
# | cat - "$template" | m4 > "$out/Dockerfile.from-source.alsa.en"
|
||||
|
||||
# set_variables "$DIR/shared/" "$DIR/from-source/" \
|
||||
# "$DIR/pulseaudio/" "$DIR/en_profile/" \
|
||||
# | cat - "$template" | m4 > "$out/Dockerfile.from-source.pulseaudio.en"
|
||||
|
||||
# set_variables "$DIR/shared/" "$DIR/from-source/" \
|
||||
# "$DIR/alsa/" "$DIR/all_profiles/" \
|
||||
# | cat - "$template" | m4 > "$out/Dockerfile.from-source.alsa.all"
|
||||
|
||||
#-----------
|
||||
# Pre-built
|
||||
#-----------
|
||||
# set_variables "$DIR/shared/" "$DIR/prebuilt/" \
|
||||
# "$DIR/alsa/" "$DIR/en_profile/" \
|
||||
# | cat - "$template" | m4 > "$out/Dockerfile.prebuilt.alsa.en"
|
||||
|
||||
# set_variables "$DIR/shared/" "$DIR/prebuilt/" \
|
||||
# "$DIR/pulseaudio/" "$DIR/en_profile/" \
|
||||
# | cat - "$template" | m4 > "$out/Dockerfile.prebuilt.pulseaudio.en"
|
||||
|
||||
set_variables "$DIR/shared/" "$DIR/prebuilt/" \
|
||||
"$DIR/alsa/" "$DIR/all_profiles/" \
|
||||
| cat - "$template" | m4 > "$out/Dockerfile.prebuilt.alsa.all"
|
||||
@@ -1,3 +0,0 @@
|
||||
COPY download/phonetisaurus-2019_${BUILD_ARCH}.deb /phonetisaurus.deb
|
||||
RUN dpkg -i /phonetisaurus.deb && \
|
||||
rm /phonetisaurus.deb
|
||||
@@ -1,3 +0,0 @@
|
||||
COPY download/rhasspy-tools_${BUILD_ARCH}.tar.gz /
|
||||
RUN tar -C /usr -xvf /rhasspy-tools_${BUILD_ARCH}.tar.gz && \
|
||||
rm -f /rhasspy-tools_${BUILD_ARCH}.tar.gz
|
||||
@@ -1,10 +0,0 @@
|
||||
RUN apt-get update && \
|
||||
apt-get install --no-install-recommends --yes \
|
||||
bash jq unzip \
|
||||
python3 python3-pip python3-dev \
|
||||
build-essential portaudio19-dev swig \
|
||||
libatlas-base-dev \
|
||||
sox espeak flite alsa-utils \
|
||||
git curl \
|
||||
autoconf libtool automake bison \
|
||||
sphinxbase-utils sphinxtrain
|
||||
@@ -1,16 +0,0 @@
|
||||
RUN apt-get install -y pulseaudio
|
||||
COPY etc/pulseaudio.client.conf /etc/pulse/client.conf
|
||||
|
||||
# Create new user
|
||||
ENV UNAME=rhasspy
|
||||
RUN export UNAME=$UNAME UID=1000 GID=1000 && \
|
||||
mkdir -p "/home/${UNAME}" && \
|
||||
echo "${UNAME}:x:${UID}:${GID}:${UNAME} User,,,:/home/${UNAME}:/bin/bash" >> /etc/passwd && \
|
||||
echo "${UNAME}:x:${UID}:" >> /etc/group && \
|
||||
mkdir -p /etc/sudoers.d && \
|
||||
echo "${UNAME} ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/${UNAME} && \
|
||||
chmod 0440 /etc/sudoers.d/${UNAME} && \
|
||||
chown ${UID}:${GID} -R /home/${UNAME} && \
|
||||
gpasswd -a ${UNAME} audio
|
||||
|
||||
ENV RHASSPY_APP /home/${UNAME}
|
||||
@@ -1,3 +0,0 @@
|
||||
# Switch to new user
|
||||
USER $UNAME
|
||||
ENV HOME /home/${UNAME}
|
||||
@@ -1,2 +0,0 @@
|
||||
# Install gstreamer and plugins
|
||||
RUN apt-get install --no-install-recommends --yes gstreamer1.0-tools gstreamer1.0-plugins-good
|
||||
@@ -1,4 +0,0 @@
|
||||
COPY download/kaldi_${BUILD_ARCH}.tar.gz /kaldi.tar.gz
|
||||
RUN mkdir -p /opt && \
|
||||
tar -C /opt -xzf /kaldi.tar.gz && \
|
||||
rm /kaldi.tar.gz
|
||||
@@ -1,9 +0,0 @@
|
||||
# Install mitlm
|
||||
RUN apt-get install --no-install-recommends --yes gfortran
|
||||
COPY download/mitlm-0.4.2.tar.xz /
|
||||
RUN cd / && tar -xf mitlm-0.4.2.tar.xz && cd mitlm-0.4.2/ && \
|
||||
./configure && \
|
||||
make -j $MAKE_THREADS && \
|
||||
make install && \
|
||||
rm -rf /mitlm-0.4.2*
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
# Install Mycroft Precise
|
||||
COPY download/precise-engine_0.3.0_${CPU_ARCH}.tar.gz /precise-engine.tar.gz
|
||||
RUN if [ "$BUILD_ARCH" != "aarch64" ]; then \
|
||||
cd / && tar -xzf /precise-engine.tar.gz && \
|
||||
ln -s /precise-engine/precise-engine /usr/bin/precise-engine && \
|
||||
rm /precise-engine.tar.gz; \
|
||||
fi
|
||||
@@ -1,9 +0,0 @@
|
||||
# Install Opengrm
|
||||
COPY download/opengrm-ngram-1.3.3.tar.gz /
|
||||
RUN cd / && tar -xf opengrm-ngram-1.3.3.tar.gz && \
|
||||
cd opengrm-ngram-1.3.3 && \
|
||||
./configure && \
|
||||
make -j $MAKE_THREADS && \
|
||||
make install && \
|
||||
ldconfig && \
|
||||
rm -rf /opengrm*
|
||||
@@ -1,4 +0,0 @@
|
||||
# Install Pocketsphinx Python module with no sound
|
||||
COPY download/pocketsphinx-python.tar.gz /
|
||||
RUN python3 -m pip install --no-cache-dir /pocketsphinx-python.tar.gz && \
|
||||
rm -rf /pocketsphinx-python*
|
||||
@@ -1,10 +0,0 @@
|
||||
# Install Python dependencies
|
||||
RUN python3 -m pip install --no-cache-dir setuptools wheel
|
||||
|
||||
RUN apt-get install -y libfreetype6-dev libpng-dev pkg-config libffi-dev libssl-dev
|
||||
COPY requirements.txt /requirements.txt
|
||||
RUN if [ "$BUILD_ARCH" != "amd64" ]; then \
|
||||
grep -v flair /requirements.txt > /requirements-noflair.txt; \
|
||||
mv /requirements-noflair.txt /requirements.txt; \
|
||||
fi
|
||||
RUN python3 -m pip install --no-cache-dir -r /requirements.txt
|
||||
@@ -1,2 +0,0 @@
|
||||
COPY etc/qemu-arm-static /usr/bin/
|
||||
COPY etc/qemu-aarch64-static /usr/bin/
|
||||
@@ -1,10 +0,0 @@
|
||||
COPY profiles/defaults.json ${RHASSPY_APP}/profiles/
|
||||
COPY docker/rhasspy ${RHASSPY_APP}/bin/
|
||||
COPY dist/ ${RHASSPY_APP}/dist/
|
||||
COPY etc/wav/* ${RHASSPY_APP}/etc/wav/
|
||||
COPY rhasspy/profile_schema.json ${RHASSPY_APP}/rhasspy/
|
||||
COPY rhasspy/train/jsgf2fst/*.py ${RHASSPY_APP}/rhasspy/train/jsgf2fst/
|
||||
COPY rhasspy/train/*.py ${RHASSPY_APP}/rhasspy/train/
|
||||
COPY *.py ${RHASSPY_APP}/
|
||||
COPY rhasspy/*.py ${RHASSPY_APP}/rhasspy/
|
||||
COPY VERSION ${RHASSPY_APP}/
|
||||
@@ -1,3 +0,0 @@
|
||||
# Install snowboy
|
||||
COPY download/snowboy-1.3.0.tar.gz /
|
||||
RUN if [ "$BUILD_ARCH" != "aarch64" ]; then pip3 install --no-cache-dir /snowboy-1.3.0.tar.gz; fi
|
||||
@@ -1 +0,0 @@
|
||||
RUN apt-get install --no-install-recommends --yes flite libttspico-utils lame
|
||||
+9
-1
@@ -69,7 +69,15 @@ Add to your [profile](profiles.md):
|
||||
"username": "",
|
||||
"port": 1883,
|
||||
"password": "",
|
||||
"site_id": "default"
|
||||
"site_id": "default",
|
||||
"tls": {
|
||||
"enabled": false,
|
||||
"ca_certs": "",
|
||||
"cert_reqs": "CERT_REQUIRED",
|
||||
"certfile": "",
|
||||
"ciphers": "",
|
||||
"keyfile": ""
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
@@ -44,7 +44,15 @@ Add to your [profile](profiles.md):
|
||||
"username": "",
|
||||
"port": 1883,
|
||||
"password": "",
|
||||
"site_id": "default"
|
||||
"site_id": "default",
|
||||
"tls": {
|
||||
"enabled": false,
|
||||
"ca_certs": "",
|
||||
"cert_reqs": "CERT_REQUIRED",
|
||||
"certfile": "",
|
||||
"ciphers": "",
|
||||
"keyfile": ""
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
@@ -86,7 +86,15 @@ Add to your [profile](profiles.md):
|
||||
"username": "",
|
||||
"port": 1883,
|
||||
"password": "",
|
||||
"site_id": "default"
|
||||
"site_id": "default",
|
||||
"tls": {
|
||||
"enabled": false,
|
||||
"ca_certs": "",
|
||||
"cert_reqs": "CERT_REQUIRED",
|
||||
"certfile": "",
|
||||
"ciphers": "",
|
||||
"keyfile": ""
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
+35
-8
@@ -65,6 +65,25 @@ In order to do something with the `rhasspy_ChangeLightColor` event, create an au
|
||||
|
||||
See the documentation on [actions](https://www.home-assistant.io/docs/automation/action/) for the different things you can do with Home Assistant.
|
||||
|
||||
### Intents
|
||||
|
||||
More recent versions of Home Assistant can accept intents directly. Add the following to your `configuration.yaml` file:
|
||||
|
||||
```yaml
|
||||
intent:
|
||||
```
|
||||
|
||||
This will enable intents over the HTTP API. Next, write [intent scripts](https://www.home-assistant.io/integrations/intent_script) to handle each Rhasspy intent:
|
||||
|
||||
```yaml
|
||||
intent_script:
|
||||
ChangeLightColor:
|
||||
action:
|
||||
...
|
||||
```
|
||||
|
||||
The possible [actions](https://www.home-assistant.io/docs/automation/action/) are the same as in automations.
|
||||
|
||||
### MQTT
|
||||
|
||||
In addition to events, Rhasspy can also publish intents through MQTT ([Hermes protocol](https://docs.snips.ai/reference/dialogue#intent)).
|
||||
@@ -74,14 +93,22 @@ Add to your [profile](profiles.md):
|
||||
|
||||
```json
|
||||
"mqtt": {
|
||||
"enabled": true,
|
||||
"host": "localhost",
|
||||
"username": "",
|
||||
"password": "",
|
||||
"port": 1883,
|
||||
"reconnect_sec": 5,
|
||||
"site_id": "default",
|
||||
"publish_intents": true
|
||||
"enabled": true,
|
||||
"host": "localhost",
|
||||
"username": "",
|
||||
"password": "",
|
||||
"port": 1883,
|
||||
"reconnect_sec": 5,
|
||||
"site_id": "default",
|
||||
"publish_intents": true,
|
||||
"tls": {
|
||||
"enabled": false,
|
||||
"ca_certs": "",
|
||||
"cert_reqs": "CERT_REQUIRED",
|
||||
"certfile": "",
|
||||
"ciphers": "",
|
||||
"keyfile": ""
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
@@ -55,7 +55,7 @@ See `rhasspy.intent.FuzzyWuzzyRecognizer` for details.
|
||||
|
||||
## Mycroft Adapt
|
||||
|
||||
Recognizes intents using [Mycroft Adapt](https://github.com/MycroftAI/adapt). Works best when you have a medium number of sentences (hundreds to thousands) and need to be able to recognize sentences not seen during training (no new words, though).
|
||||
Recognizes intents using [Mycroft Adapt](https://github.com/MycroftAI/adapt). Works best when you have a medium number of sentences (hundreds to thousands) and need to be able to recognize sentences not seen during training (no new words, though). This recognizer does not support converters, i.e. numbers are not converted back to integers.
|
||||
|
||||
Add to your [profile](profiles.md):
|
||||
|
||||
|
||||
+1
-1
@@ -52,7 +52,7 @@ Application authors may want to use the [rhasspy-client](https://pypi.org/projec
|
||||
* `?nohass=true` - stop Rhasspy from handling the intent
|
||||
* `?timeout=<seconds>` - override default command timeout
|
||||
* `?entity=<entity>&value=<value>` - set custom entity/value in recognized intent
|
||||
* `/api/listen-for-wake-word`
|
||||
* `/api/listen-for-wake`
|
||||
* POST "on" to have Rhasspy listen for a wake word
|
||||
* POST "off" to disable wake word
|
||||
* `/api/lookup`
|
||||
|
||||
+9
-1
@@ -181,7 +181,15 @@ Add to your [profile](profiles.md):
|
||||
"username": "",
|
||||
"port": 1883,
|
||||
"password": "",
|
||||
"site_id": "default"
|
||||
"site_id": "default",
|
||||
"tls": {
|
||||
"enabled": false,
|
||||
"ca_certs": "",
|
||||
"cert_reqs": "CERT_REQUIRED",
|
||||
"certfile": "",
|
||||
"ciphers": "",
|
||||
"keyfile": ""
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
@@ -11,6 +11,7 @@ cpu_arch=$(uname --m)
|
||||
DEFINE_string 'download-dir' "${this_dir}/download" 'Directory to cache downloaded files'
|
||||
DEFINE_boolean 'precise' true 'Install Mycroft Precise'
|
||||
DEFINE_boolean 'kaldi' true 'Install Kaldi'
|
||||
DEFINE_boolean 'web' true "Install web UI"
|
||||
DEFINE_boolean 'offline' false "Don't download anything"
|
||||
DEFINE_boolean 'all-cpu' false 'Download dependencies for all CPU architectures'
|
||||
DEFINE_string 'cpu-arch' "${cpu_arch}" 'CPU architecture (x86_64, armv7l, arm64v8, armv6l)'
|
||||
@@ -44,6 +45,10 @@ if [[ "${FLAGS_kaldi}" -eq "${FLAGS_FALSE}" ]]; then
|
||||
no_kaldi='true'
|
||||
fi
|
||||
|
||||
if [[ "${FLAGS_web}" -eq "${FLAGS_FALSE}" ]]; then
|
||||
no_web='true'
|
||||
fi
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
function maybe_download {
|
||||
@@ -65,8 +70,15 @@ declare -A CPU_TO_FRIENDLY
|
||||
CPU_TO_FRIENDLY["x86_64"]="amd64"
|
||||
CPU_TO_FRIENDLY["armv7l"]="armhf"
|
||||
CPU_TO_FRIENDLY["arm64v8"]="aarch64"
|
||||
CPU_TO_FRIENDLY["aarch64"]="aarch64"
|
||||
CPU_TO_FRIENDLY["armv6l"]="armv6l"
|
||||
|
||||
declare -A FRIENDLY_TO_DOCKER
|
||||
FRIENDLY_TO_DOCKER["amd64"]="amd64"
|
||||
FRIENDLY_TO_DOCKER["armhf"]="armv7"
|
||||
FRIENDLY_TO_DOCKER["aarch64"]="arm64"
|
||||
FRIENDLY_TO_DOCKER["armv6l"]="armv6"
|
||||
|
||||
# CPU architecture
|
||||
if [[ -n "${all_cpu}" ]]; then
|
||||
CPU_ARCHS=("x86_64" "armv7l" "arm64v8")
|
||||
@@ -81,12 +93,32 @@ fi
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
for FRIENDLY_ARCH in "${FRIENDLY_ARCHS[@]}"; do
|
||||
rhasspy_files=("rhasspy-tools_${FRIENDLY_ARCH}.tar.gz" "rhasspy-web-dist.tar.gz")
|
||||
rhasspy_files=()
|
||||
|
||||
if [[ -z "${no_tools}" ]]; then
|
||||
# Install Rhasspy tools
|
||||
rhasspy_files+=("rhasspy-tools_${FRIENDLY_ARCH}.tar.gz")
|
||||
fi
|
||||
|
||||
if [[ -z "${no_web}" ]]; then
|
||||
# Install web UI
|
||||
rhasspy_files+=('rhasspy-web-dist.tar.gz')
|
||||
fi
|
||||
|
||||
for rhasspy_file_name in "${rhasspy_files[@]}"; do
|
||||
rhasspy_file="${download_dir}/${rhasspy_file_name}"
|
||||
rhasspy_file_url="https://github.com/synesthesiam/rhasspy/releases/download/v2.0/${rhasspy_file_name}"
|
||||
maybe_download "${rhasspy_file_url}" "${rhasspy_file}"
|
||||
done
|
||||
|
||||
if [[ -z "${no_tools}" ]]; then
|
||||
# Create link for docker buildx
|
||||
DOCKER_ARCH="${FRIENDLY_TO_DOCKER[${FRIENDLY_ARCH}]}"
|
||||
if [[ "${FRIENDLY_ARCH}" != "${DOCKER_ARCH}" ]]; then
|
||||
ln -f "${download_dir}/rhasspy-tools_${FRIENDLY_ARCH}.tar.gz" \
|
||||
"${download_dir}/rhasspy-tools_${DOCKER_ARCH}.tar.gz"
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
@@ -112,10 +144,18 @@ maybe_download "${snowboy_url}" "${snowboy_file}"
|
||||
if [[ -z "${no_precise}" ]]; then
|
||||
for CPU_ARCH in "${CPU_ARCHS[@]}"; do
|
||||
case $CPU_ARCH in
|
||||
x86_64|armv7l)
|
||||
x86_64|armv7l|aarch64)
|
||||
precise_file="${download_dir}/precise-engine_0.3.0_${CPU_ARCH}.tar.gz"
|
||||
precise_url="https://github.com/MycroftAI/mycroft-precise/releases/download/v0.3.0/precise-engine_0.3.0_${CPU_ARCH}.tar.gz"
|
||||
maybe_download "${precise_url}" "${precise_file}"
|
||||
|
||||
# Create link for docker buildx
|
||||
FRIENDLY_ARCH="${CPU_TO_FRIENDLY[${CPU_ARCH}]}"
|
||||
DOCKER_ARCH="${FRIENDLY_TO_DOCKER[${FRIENDLY_ARCH}]}"
|
||||
if [[ "${CPU_ARCH}" != "${DOCKER_ARCH}" ]]; then
|
||||
ln -f "${download_dir}/precise-engine_0.3.0_${CPU_ARCH}.tar.gz" \
|
||||
"${download_dir}/precise-engine_0.3.0_${DOCKER_ARCH}.tar.gz"
|
||||
fi
|
||||
esac
|
||||
done
|
||||
fi
|
||||
@@ -126,10 +166,19 @@ fi
|
||||
|
||||
if [[ -z "${no_kaldi}" ]]; then
|
||||
for FRIENDLY_ARCH in "${FRIENDLY_ARCHS[@]}"; do
|
||||
# Install pre-built package
|
||||
kaldi_file="${download_dir}/kaldi_${FRIENDLY_ARCH}.tar.gz"
|
||||
kaldi_url="https://github.com/synesthesiam/kaldi-docker/releases/download/v1.0/kaldi_${FRIENDLY_ARCH}.tar.gz"
|
||||
maybe_download "${kaldi_url}" "${kaldi_file}"
|
||||
if [[ "${FRIENDLY_ARCH}" != "armv6l" ]]; then
|
||||
# Install pre-built package
|
||||
kaldi_file="${download_dir}/kaldi_${FRIENDLY_ARCH}.tar.gz"
|
||||
kaldi_url="https://github.com/synesthesiam/kaldi-docker/releases/download/v1.0/kaldi_${FRIENDLY_ARCH}.tar.gz"
|
||||
maybe_download "${kaldi_url}" "${kaldi_file}"
|
||||
|
||||
# Create link for docker buildx
|
||||
DOCKER_ARCH="${FRIENDLY_TO_DOCKER[${FRIENDLY_ARCH}]}"
|
||||
if [[ "${FRIENDLY_ARCH}" != "${DOCKER_ARCH}" ]]; then
|
||||
ln -f "${download_dir}/kaldi_${FRIENDLY_ARCH}.tar.gz" \
|
||||
"${download_dir}/kaldi_${DOCKER_ARCH}.tar.gz"
|
||||
fi
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
|
||||
@@ -119,7 +119,15 @@
|
||||
"publish_intents": true,
|
||||
"reconnect_sec": 5,
|
||||
"site_id": "default",
|
||||
"username": ""
|
||||
"username": "",
|
||||
"tls": {
|
||||
"enabled": false,
|
||||
"ca_certs": "",
|
||||
"cert_reqs": "CERT_REQUIRED",
|
||||
"certfile": "",
|
||||
"ciphers": "",
|
||||
"keyfile": ""
|
||||
}
|
||||
},
|
||||
"rhasspy": {
|
||||
"listen_on_start": true,
|
||||
|
||||
+2
-1
@@ -2,8 +2,8 @@ adapt-parser==0.3.4
|
||||
aiohttp==3.6.2
|
||||
doit==0.31.1
|
||||
fuzzywuzzy[speedup]==0.17.0
|
||||
google-cloud-texttospeech==0.5.0
|
||||
google-cloud-speech==1.3.1
|
||||
google-cloud-texttospeech==0.5.0
|
||||
html5lib==1.0.1
|
||||
json5==0.7.0
|
||||
multidict==4.6.1
|
||||
@@ -11,6 +11,7 @@ networkx>=2.0
|
||||
num2words==0.5.10
|
||||
openfst==1.6.9
|
||||
paho-mqtt==1.5.0
|
||||
precise-runner==0.3.1
|
||||
PyAudio==0.2.11
|
||||
pydash==4.7.6
|
||||
quart==0.6.15
|
||||
|
||||
+5
-2
@@ -5,6 +5,7 @@ import logging
|
||||
import os
|
||||
import platform
|
||||
import shutil
|
||||
import ssl
|
||||
import tempfile
|
||||
from collections import defaultdict
|
||||
from pathlib import Path
|
||||
@@ -86,6 +87,8 @@ class RhasspyCore:
|
||||
self.defaults = Profile.load_defaults(system_profiles_dir)
|
||||
|
||||
self.loop = asyncio.get_event_loop()
|
||||
|
||||
self.ssl_context = ssl.SSLContext()
|
||||
self._session: Optional[aiohttp.ClientSession] = aiohttp.ClientSession()
|
||||
self.dialogue_manager: Optional[RhasspyActor] = None
|
||||
|
||||
@@ -523,7 +526,7 @@ class RhasspyCore:
|
||||
self._logger.debug(status)
|
||||
os.makedirs(os.path.dirname(filename), exist_ok=True)
|
||||
|
||||
async with self.session.get(url) as response:
|
||||
async with self.session.get(url, ssl=self.ssl_context) as response:
|
||||
with open(filename, "wb") as out_file:
|
||||
async for chunk in response.content.iter_chunked(chunk_size):
|
||||
out_file.write(chunk)
|
||||
@@ -581,7 +584,7 @@ class RhasspyCore:
|
||||
src_path = dest_path
|
||||
|
||||
# Check if file is already in cache
|
||||
if os.path.exists(src_path) and (os.path.getsize(src_path) > 0):
|
||||
if not delete and os.path.exists(src_path) and (os.path.getsize(src_path) > 0):
|
||||
self._logger.debug(
|
||||
"Using cached %s for %s", src_path, dest_name
|
||||
)
|
||||
|
||||
@@ -77,10 +77,12 @@ class HomeAssistantIntentHandler(RhasspyActor):
|
||||
self.event_type_format = ""
|
||||
self.pem_file = ""
|
||||
self.handle_type: HomeAssistantHandleType = HomeAssistantHandleType.EVENT
|
||||
self.speech_actor: Optional[RhasspyActor] = None
|
||||
|
||||
def to_started(self, from_state: str) -> None:
|
||||
"""Transition to started state."""
|
||||
self.hass_config = self.profile.get("home_assistant", {})
|
||||
self.speech_actor = self.config.get("speech")
|
||||
|
||||
# Python format string for generating event type name
|
||||
self.event_type_format = self.hass_config.get(
|
||||
@@ -170,6 +172,15 @@ class HomeAssistantIntentHandler(RhasspyActor):
|
||||
kwargs["verify"] = self.pem_file
|
||||
|
||||
response = requests.post(post_url, **kwargs)
|
||||
response.raise_for_status()
|
||||
|
||||
intent = response.json()
|
||||
self._logger.debug(intent)
|
||||
|
||||
# Check for speech
|
||||
speech_text = intent.get("speech", {}).get("plain", {}).get("speech", "")
|
||||
if speech_text and self.speech_actor:
|
||||
self.send(self.speech_actor, SpeakSentence(speech_text))
|
||||
else:
|
||||
# Send event
|
||||
post_url = urljoin(self.hass_config["url"], "api/events/" + event_type)
|
||||
@@ -184,7 +195,7 @@ class HomeAssistantIntentHandler(RhasspyActor):
|
||||
response = requests.post(post_url, **kwargs)
|
||||
self._logger.debug("POSTed intent to %s", post_url)
|
||||
|
||||
response.raise_for_status()
|
||||
response.raise_for_status()
|
||||
|
||||
# -------------------------------------------------------------------------
|
||||
|
||||
|
||||
+33
-4
@@ -10,8 +10,13 @@ from typing import Any, Dict, List
|
||||
import pydash
|
||||
|
||||
from rhasspy.actor import RhasspyActor
|
||||
from rhasspy.events import (MqttConnected, MqttDisconnected, MqttMessage,
|
||||
MqttPublish, MqttSubscribe)
|
||||
from rhasspy.events import (
|
||||
MqttConnected,
|
||||
MqttDisconnected,
|
||||
MqttMessage,
|
||||
MqttPublish,
|
||||
MqttSubscribe,
|
||||
)
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Events
|
||||
@@ -48,6 +53,7 @@ class HermesMqtt(RhasspyActor):
|
||||
self.password = None
|
||||
self.reconnect_sec = 5
|
||||
self.publish_intents = True
|
||||
self.tls = {"enabled": False}
|
||||
|
||||
# -------------------------------------------------------------------------
|
||||
|
||||
@@ -66,6 +72,7 @@ class HermesMqtt(RhasspyActor):
|
||||
self.password = self.profile.get("mqtt.password", None)
|
||||
self.reconnect_sec = self.profile.get("mqtt.reconnect_sec", 5)
|
||||
self.publish_intents = self.profile.get("mqtt.publish_intents", True)
|
||||
self.tls = self.profile.get("mqtt.tls", {"enabled": False})
|
||||
|
||||
if self.profile.get("mqtt.enabled", False):
|
||||
self.transition("connecting")
|
||||
@@ -84,6 +91,28 @@ class HermesMqtt(RhasspyActor):
|
||||
self.client.on_message = self.on_message
|
||||
self.client.on_disconnect = self.on_disconnect
|
||||
|
||||
if pydash.get(self.tls, "enabled", False):
|
||||
import ssl
|
||||
|
||||
allowed_cert_reqs = {
|
||||
"CERT_REQUIRED": ssl.CERT_REQUIRED,
|
||||
"CERT_OPTIONAL": ssl.CERT_OPTIONAL,
|
||||
"CERT_NONE": ssl.CERT_NONE,
|
||||
}
|
||||
|
||||
self.client.tls_set(
|
||||
ca_certs=pydash.get(self.tls, "ca_certs", None),
|
||||
cert_reqs=pydash.get(
|
||||
allowed_cert_reqs,
|
||||
pydash.get(self.tls, "cert_reqs", "CERT_REQUIRED"),
|
||||
ssl.CERT_REQUIRED,
|
||||
),
|
||||
certfile=pydash.get(self.tls, "certfile", None),
|
||||
ciphers=pydash.get(self.tls, "ciphers", None),
|
||||
keyfile=pydash.get(self.tls, "keyfile", None),
|
||||
tls_version=ssl.PROTOCOL_TLS,
|
||||
)
|
||||
|
||||
if self.username:
|
||||
self._logger.debug("Logging in as %s", self.username)
|
||||
self.client.username_pw_set(self.username, self.password)
|
||||
@@ -259,12 +288,12 @@ class HermesMqtt(RhasspyActor):
|
||||
"slotName": ev["entity"],
|
||||
"confidence": 1,
|
||||
"value": {"kind": ev["entity"], "value": ev["value"]},
|
||||
"rawValue": ev["value"],
|
||||
"rawValue": ev.get("raw_value", ev["value"]),
|
||||
}
|
||||
for ev in intent.get("entities", [])
|
||||
],
|
||||
"asrTokens": [],
|
||||
"asrConfidence": 1
|
||||
"asrConfidence": 1,
|
||||
}
|
||||
).encode()
|
||||
|
||||
|
||||
@@ -417,7 +417,18 @@
|
||||
"reconnect_sec": { "type": "integer", "min": 0 },
|
||||
"site_id": { "type": "string" },
|
||||
"username": { "type": "string" },
|
||||
"publish_intents": { "type": "boolean" }
|
||||
"publish_intents": { "type": "boolean" },
|
||||
"tls": {
|
||||
"type": "dict",
|
||||
"schema": {
|
||||
"enabled": { "type": "boolean" },
|
||||
"ca_certs": { "type": "string" },
|
||||
"cert_reqs": { "type": "string" },
|
||||
"certfile": { "type": "string" },
|
||||
"ciphers": { "type": "string" },
|
||||
"keyfile": { "type": "string" }
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
+15
-10
@@ -10,9 +10,6 @@ from typing import Any, Dict, Iterable, List, Optional, Tuple, Type
|
||||
from urllib.parse import urljoin
|
||||
|
||||
import requests
|
||||
from google.cloud import speech
|
||||
from google.cloud.speech import enums
|
||||
from google.cloud.speech import types
|
||||
|
||||
from rhasspy.actor import RhasspyActor
|
||||
from rhasspy.events import TranscribeWav, WavTranscription
|
||||
@@ -343,10 +340,13 @@ class GoogleCloudDecoder(RhasspyActor):
|
||||
|
||||
def to_started(self, from_state: str) -> None:
|
||||
"""Transition to started state."""
|
||||
from google.cloud import speech
|
||||
|
||||
credentials_file = self.profile.get("speech_to_text.google.credentials")
|
||||
self.min_confidence = self.profile.get("speech_to_text.google.min_confidence")
|
||||
self.language_code = self.profile.get("locale").replace('_', '-')
|
||||
self.language_code = self.profile.get("locale").replace("_", "-")
|
||||
from google.auth import environment_vars
|
||||
|
||||
os.environ[environment_vars.CREDENTIALS] = credentials_file
|
||||
self.client = speech.SpeechClient()
|
||||
|
||||
@@ -361,7 +361,7 @@ class GoogleCloudDecoder(RhasspyActor):
|
||||
WavTranscription(
|
||||
text, confidence=confidence, handle=message.handle
|
||||
),
|
||||
)
|
||||
)
|
||||
except Exception:
|
||||
self._logger.exception("transcribing wav")
|
||||
|
||||
@@ -369,11 +369,13 @@ class GoogleCloudDecoder(RhasspyActor):
|
||||
self.send(
|
||||
message.receiver or sender,
|
||||
WavTranscription("", confidence=0, handle=message.handle),
|
||||
)
|
||||
)
|
||||
|
||||
def transcribe_wav(self, wav_data: bytes) -> Tuple[str, float]:
|
||||
"""POST to remote server and return response."""
|
||||
headers = {"Content-Type": "audio/wav"}
|
||||
from google.cloud.speech import enums
|
||||
from google.cloud.speech import types
|
||||
|
||||
self._logger.debug(
|
||||
"POSTing %d byte(s) of WAV data to Google Cloud STT", len(wav_data)
|
||||
)
|
||||
@@ -382,8 +384,9 @@ class GoogleCloudDecoder(RhasspyActor):
|
||||
config = types.RecognitionConfig(
|
||||
encoding=enums.RecognitionConfig.AudioEncoding.LINEAR16,
|
||||
sample_rate_hertz=16000,
|
||||
model='command_and_search',
|
||||
language_code=self.language_code)
|
||||
model="command_and_search",
|
||||
language_code=self.language_code,
|
||||
)
|
||||
|
||||
response = self.client.recognize(config, audio)
|
||||
if len(response.results) == 0:
|
||||
@@ -650,7 +653,9 @@ class HomeAssistantSTTIntegration(RhasspyActor):
|
||||
audio_data = audio_data[self.chunk_size :]
|
||||
|
||||
# POST WAV data to STT
|
||||
response = requests.post(stt_url, data=generate_chunks(), **kwargs) # type: ignore
|
||||
response = requests.post(
|
||||
stt_url, data=generate_chunks(), **kwargs
|
||||
) # type: ignore
|
||||
response.raise_for_status()
|
||||
|
||||
response_json = response.json()
|
||||
|
||||
+2
-1
@@ -925,7 +925,8 @@ class PorcupineWakeListener(RhasspyActor):
|
||||
"""Load porcupine library."""
|
||||
if self.handle is None:
|
||||
for kw_path in self.keyword_paths:
|
||||
assert kw_path.is_file(), f"Missing {kw_path}"
|
||||
if not kw_path.is_file():
|
||||
self._logger.error("Missing porcupine keyword at {kw_path}")
|
||||
|
||||
from porcupine import Porcupine
|
||||
|
||||
|
||||
@@ -109,7 +109,15 @@ const profileDefaults = {
|
||||
"reconnect_sec": 5,
|
||||
"site_id": "default",
|
||||
"username": "",
|
||||
"publish_intents": true
|
||||
"publish_intents": true,
|
||||
"tls": {
|
||||
"enabled": false,
|
||||
"ca_certs": "",
|
||||
"cert_reqs": "CERT_REQUIRED",
|
||||
"certfile": "",
|
||||
"ciphers": "",
|
||||
"keyfile": ""
|
||||
}
|
||||
},
|
||||
"rhasspy": {
|
||||
"default_profile": "en",
|
||||
|
||||
@@ -86,7 +86,7 @@
|
||||
<div class="form-row">
|
||||
<div class="col">
|
||||
<p class="text-muted">
|
||||
Requires the <a href="https://www.home-assistant.io/integrations/intent/">intent component</a> in your <tt>configuration.yaml</tt>
|
||||
Requires the <tt>intent</tt> component and <a href="https://www.home-assistant.io/integrations/intent_script">intent scripts</a> in your <tt>configuration.yaml</tt>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -70,6 +70,58 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="form-row">
|
||||
<input id="mqtt-tls-enabled" type="checkbox" v-model="profile.mqtt.tls.enabled" :disabled="!profile.mqtt.enabled">
|
||||
<label for="mqtt-tls-enabled" class="col-form-label">Enable MQTT over TLS</label>
|
||||
</div>
|
||||
</div>
|
||||
<template v-if="profile.mqtt.tls.enabled">
|
||||
<div class="form-group">
|
||||
<div class="form-row">
|
||||
<label for="mqtt-tls-ca_certs" class="col-form-label">ca_certs</label>
|
||||
<div class="col-sm-auto">
|
||||
<input id="mqtt-tls-ca_certs" type="text" class="form-control" v-model="profile.mqtt.tls.ca_certs" :disabled="!profile.mqtt.enabled">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="form-row">
|
||||
<label for="mqtt-tls-cert_reqs" class="col-form-label">cert_reqs</label>
|
||||
<div class="col-sm-auto">
|
||||
<select id="mqtt-tls-cert_reqs" v-model="profile.mqtt.tls.cert_reqs" :disabled="!profile.mqtt.enabled">
|
||||
<option value="CERT_REQUIRED" default>CERT_REQUIRED</option>
|
||||
<option value="CERT_OPTIONAL">CERT_OPTIONAL</option>
|
||||
<option value="CERT_NONE">CERT_NONE</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="form-row">
|
||||
<label for="mqtt-tls-certfile" class="col-form-label">certfile</label>
|
||||
<div class="col-sm-auto">
|
||||
<input id="mqtt-tls-certfile" type="text" class="form-control" v-model="profile.mqtt.tls.certfile" :disabled="!profile.mqtt.enabled">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="form-row">
|
||||
<label for="mqtt-tls-ciphers" class="col-form-label">ciphers</label>
|
||||
<div class="col-sm-auto">
|
||||
<input id="mqtt-tls-ciphers" type="text" class="form-control" v-model="profile.mqtt.tls.ciphers" :disabled="!profile.mqtt.enabled">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="form-row">
|
||||
<label for="mqtt-tls-keyfile" class="col-form-label">keyfile</label>
|
||||
<div class="col-sm-auto">
|
||||
<input id="mqtt-tls-keyfile" type="text" class="form-control" v-model="profile.mqtt.tls.keyfile" :disabled="!profile.mqtt.enabled">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<div class="form-group">
|
||||
<div class="form-row">
|
||||
<input type="checkbox" id="mqtt-publish_intents" v-model="profile.mqtt.publish_intents" :disabled="!profile.mqtt.enabled">
|
||||
|
||||
@@ -89,28 +89,44 @@
|
||||
</p>
|
||||
</div>
|
||||
<hr>
|
||||
<!-- <div class="form-group"> -->
|
||||
<!-- <div class="form-row"> -->
|
||||
<!-- <div class="form-check"> -->
|
||||
<!-- <input class="form-check-input" type="radio" name="wake-system" id="wake-system-precise" value="precise" v-model="profile.wake.system"> -->
|
||||
<!-- <label class="form-check-label" for="wake-system-precise"> -->
|
||||
<!-- Use <a href="https://github.com/MycroftAI/mycroft-precise">Mycroft Precise</a> on this device -->
|
||||
<!-- </label> -->
|
||||
<!-- </div> -->
|
||||
<!-- </div> -->
|
||||
<!-- </div> -->
|
||||
<!-- <div class="form-group"> -->
|
||||
<!-- <div class="form-row"> -->
|
||||
<!-- <label for="precise-model" class="col-form-label">Model Name</label> -->
|
||||
<!-- <div class="col-sm-auto"> -->
|
||||
<!-- <input id="precise-model" type="text" class="form-control" v-model="profile.wake.precise.model" :disabled="profile.wake.system != 'precise'"> -->
|
||||
<!-- </div> -->
|
||||
<!-- <div class="col text-muted"> -->
|
||||
<!-- Put models in your profile directory -->
|
||||
<!-- </div> -->
|
||||
<!-- </div> -->
|
||||
<!-- </div> -->
|
||||
<!-- <hr> -->
|
||||
<div class="form-group">
|
||||
<div class="form-row">
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="radio" name="wake-system" id="wake-system-precise" value="precise" v-model="profile.wake.system">
|
||||
<label class="form-check-label" for="wake-system-precise">
|
||||
Use <a href="https://github.com/MycroftAI/mycroft-precise">Mycroft Precise</a> on this device
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="form-row">
|
||||
<label for="precise-model" class="col-form-label">Model Name</label>
|
||||
<div class="col-sm-auto">
|
||||
<input id="precise-model" type="text" class="form-control" v-model="profile.wake.precise.model" :disabled="profile.wake.system != 'precise'">
|
||||
</div>
|
||||
<div class="col text-muted">
|
||||
Put models in the <tt>precise</tt> directory in your profile
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="form-row">
|
||||
<label for="wake-precise-sensitivity" class="col-form-label">Sensitivity</label>
|
||||
<div class="col-sm-auto">
|
||||
<input id="wake-precise-sensitivity" type="text" class="form-control" v-model="profile.wake.precise.sensitivity" :disabled="profile.wake.system != 'precise'">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="form-row">
|
||||
<label for="wake-precise-trigger-level" class="col-form-label">Trigger Level</label>
|
||||
<div class="col-sm-auto">
|
||||
<input id="wake-precise-trigger-level" type="text" class="form-control" v-model="profile.wake.precise.trigger_level" :disabled="profile.wake.system != 'precise'">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<hr>
|
||||
<div class="form-group">
|
||||
<div class="form-row">
|
||||
<div class="form-check">
|
||||
|
||||
Reference in New Issue
Block a user