From d953249fceb2ea28b2846457b0528645d438a63e Mon Sep 17 00:00:00 2001 From: Michael Hansen Date: Thu, 28 Apr 2022 12:17:53 -0400 Subject: [PATCH] Add Docker test for Mycroft TTS plugin --- Makefile | 11 ++- tests/Dockerfile.plugin | 139 +++++++++++++++++++++++++++ tests/Dockerfile.plugin.dockerignore | 38 ++++++++ 3 files changed, 187 insertions(+), 1 deletion(-) create mode 100644 tests/Dockerfile.plugin create mode 100644 tests/Dockerfile.plugin.dockerignore diff --git a/Makefile b/Makefile index f08233c..9cb5ef1 100644 --- a/Makefile +++ b/Makefile @@ -13,7 +13,7 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # -.PHONY: dist install docker docker-gpu debian sample +.PHONY: dist install docker docker-gpu debian sample plugin-test SHELL := bash @@ -63,3 +63,12 @@ debian: while read -r platform; do \ docker buildx build . -f Dockerfile.debian --platform $(DOCKER_PLATFORM) --output "type=local,dest=dist/"; \ done + +# Tests TTS plugin with Mycroft. +# https://github.com/MycroftAI/plugin-tts-mimic3 +# Enable local --output to get generated sample and log. +plugin-test: + echo "$(DOCKER_PLATFORM)" | sed -e 's/,/\n/g' | \ + while read -r platform; do \ + docker buildx build . -f tests/Dockerfile.plugin --platform $(DOCKER_PLATFORM); \ + done diff --git a/tests/Dockerfile.plugin b/tests/Dockerfile.plugin new file mode 100644 index 0000000..5d66d92 --- /dev/null +++ b/tests/Dockerfile.plugin @@ -0,0 +1,139 @@ +# Copyright 2022 Mycroft AI Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +# ----------------------------------------------------------------------------- +# Dockerfile for Mimic 3 (https://github.com/MycroftAI/mimic3) +# +# Tests TTS plugin with Mycroft. +# +# Requires Docker buildx: https://docs.docker.com/buildx/working-with-buildx/ +# ----------------------------------------------------------------------------- +FROM debian:bullseye as build +ARG TARGETARCH +ARG TARGETVARIANT + +ENV LANG C.UTF-8 +ENV DEBIAN_FRONTEND=noninteractive + +RUN echo "Dir::Cache var/cache/apt/${TARGETARCH}${TARGETVARIANT};" > /etc/apt/apt.conf.d/01cache + +RUN --mount=type=cache,id=apt-build,target=/var/cache/apt \ + mkdir -p /var/cache/apt/${TARGETARCH}${TARGETVARIANT}/archives/partial && \ + apt-get update && \ + apt-get install --yes --no-install-recommends \ + python3 python3-venv python3-pip + +WORKDIR /build/mimic3 + +COPY wheels/ ./wheels/ + +COPY opentts-abc/ ./opentts-abc/ +COPY mimic3-http/ ./mimic3-http/ +COPY mimic3-tts/ ./mimic3-tts/ +COPY build-dist.sh ./ + +# Create sdists +RUN ./build-dist.sh + +# ----------------------------------------------------------------------------- + +FROM debian:bullseye as test +ARG TARGETARCH +ARG TARGETVARIANT + +ENV LANG C.UTF-8 +ENV DEBIAN_FRONTEND=noninteractive + +RUN echo "Dir::Cache var/cache/apt/${TARGETARCH}${TARGETVARIANT};" > /etc/apt/apt.conf.d/01cache + +COPY debian/control.in.* ./debian/ + +# Use dependencies from Debian package control file +RUN --mount=type=cache,id=apt-run,target=/var/cache/apt \ + mkdir -p /var/cache/apt/${TARGETARCH}${TARGETVARIANT}/archives/partial && \ + apt-get update && \ + grep 'Depends:' "debian/control.in.${TARGETARCH}${TARGETVARIANT}" | cut -d' ' -f2- | sed -e 's/,/\n/g' | \ + xargs apt-get install --yes --no-install-recommends \ + python3 python3-venv python3-pip \ + build-essential python3-dev \ + git inotify-tools sox + +WORKDIR /test + +# Install Mycroft +RUN git clone https://github.com/MycroftAI/mycroft-core.git + +RUN --mount=type=cache,id=apt-run,target=/var/cache/apt \ + --mount=type=cache,id=pip-requirements,target=/root/.cache/pip \ + cd mycroft-core && \ + CI=true bash dev_setup.sh --allow-root + +COPY wheels/ ./wheels/ + +COPY --from=build /build/mimic3/dist/*.tar.gz ./dist/ + +# Install TTS plugin +RUN --mount=type=cache,id=pip-requirements,target=/root/.cache/pip \ + mycroft-core/bin/mycroft-pip install --upgrade pip && \ + mycroft-core/bin/mycroft-pip install \ + -f wheels/ \ + -f https://synesthesiam.github.io/prebuilt-apps/ \ + -f dist/ \ + plugin-tts-mimic3 + +# Download default voice +COPY voices/ /root/.local/share/mimic3/voices/ +RUN mycroft-core/.venv/bin/mimic3-download 'en_UK/apope_low' + +# Enable plugin +RUN mkdir -p /root/.config/mycroft && \ + echo '{ "tts": { "module": "mimic3_tts_plug" , "mimic3_tts_plug": { "length_scale": 1.0, "noise_scale": 0.0, "noise_w": 0.0, "use_deterministic_compute": true } } }' \ + > /root/.config/mycroft/mycroft.conf + +# Run test +COPY tests/* tests/ + +ENV USER root +ENV MIMIC_DIR /tmp/mycroft/cache/tts/Mimic3TTSPlugin + +# Start relevant services: +# 1. Start message bus, wait for ready message in log +# 2. Start audio service, wait for ready message in log +# 3. Run mycroft-speak with sample text +# 4. Watch cache directory for a file creation +# 5. Copy first WAV file to known location +RUN mycroft-core/bin/mycroft-start bus && \ + tail -f /var/log/mycroft/bus.log | grep -iq 'message bus service started' && \ + mycroft-core/bin/mycroft-start audio && \ + tail -f /var/log/mycroft/audio.log | grep -iq 'audio service is ready' && \ + xargs -a tests/apope_sample.txt mycroft-core/bin/mycroft-speak && \ + mkdir -p "${MIMIC_DIR}" && \ + inotifywait -e create "${MIMIC_DIR}" && \ + find "${MIMIC_DIR}" -name '*.wav' | head -n1 | xargs -I{} mv {} tests/actual_sample.wav + +# Check sample +RUN export expected_sample="tests/apope_sample_${TARGETARCH}${TARGETVARIANT}.wav" && \ + tests/samples_match.py tests/actual_sample.wav "${expected_sample}" + +# ----------------------------------------------------------------------------- + +FROM scratch +ARG TARGETARCH +ARG TARGETVARIANT + +# Ensure test runs +COPY --from=test /test/tests/actual_sample.wav "/apope_sample_${TARGETARCH}${TARGETVARIANT}.wav" + +COPY --from=test /var/log/mycroft/audio.log ./ diff --git a/tests/Dockerfile.plugin.dockerignore b/tests/Dockerfile.plugin.dockerignore new file mode 100644 index 0000000..abd58fb --- /dev/null +++ b/tests/Dockerfile.plugin.dockerignore @@ -0,0 +1,38 @@ +* +!build-dist.sh +!tests/apope_sample.txt +!tests/apope_sample_*.wav +!tests/samples_match.py +!voices/ +!wheels/ +!debian/control.in.* + +# opentts-abc +!opentts-abc/setup.py +!opentts-abc/LICENSE +!opentts-abc/MANIFEST.in +!opentts-abc/opentts_abc/*.py +!opentts-abc/opentts_abc/VERSION +!opentts-abc/opentts_abc/py.typed + +# Mimic 3 TTS +!mimic3-tts/setup.py +!mimic3-tts/LICENSE +!mimic3-tts/MANIFEST.in +!mimic3-tts/requirements.txt +!mimic3-tts/mimic3_tts/*.py +!mimic3-tts/mimic3_tts/voices.json +!mimic3-tts/mimic3_tts/VERSION +!mimic3-tts/mimic3_tts/py.typed + +# HTTP server +!mimic3-http/setup.py +!mimic3-http/LICENSE +!mimic3-http/MANIFEST.in +!mimic3-http/requirements.txt +!mimic3-http/mimic3_http/css/ +!mimic3-http/mimic3_http/img/ +!mimic3-http/mimic3_http/templates/ +!mimic3-http/mimic3_http/*.py +!mimic3-http/mimic3_http/VERSION +!mimic3-http/mimic3_http/py.typed