From 3a42759e1e69580e42991a00895044d61c91069c Mon Sep 17 00:00:00 2001 From: Ingmar Steiner Date: Thu, 8 Dec 2022 13:19:53 +0100 Subject: [PATCH 01/41] Streamline Actions --- .github/workflows/main.yml | 48 +++++++++++--------------------------- 1 file changed, 13 insertions(+), 35 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 73230f5..8600e91 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -14,7 +14,7 @@ jobs: os: - ubuntu-latest - macos-latest - java-version: + java_version: - 8 - 11 - 13 @@ -26,45 +26,23 @@ jobs: runs-on: ${{ matrix.os }} steps: - # https://github.com/actions/checkout - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - # https://github.com/gradle/wrapper-validation-action - - uses: gradle/wrapper-validation-action@v1 - - # https://github.com/actions/setup-java - uses: actions/setup-java@v2 with: - distribution: adopt - java-version: ${{ matrix.java-version }} - - # https://github.com/actions/cache - - name: Cache Gradle packages - uses: actions/cache@v2 - with: - path: | - ~/.gradle/caches - ~/.gradle/wrapper - key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} - restore-keys: | - ${{ runner.os }}-gradle- + distribution: zulu + java-version: ${{ matrix.java_version }} - - name: Install Linux prerequisites - if: ${{ runner.os == 'Linux' }} + - if: runner.os == 'Linux' + env: + DEBIAN_FRONTEND: noninteractive run: | - sudo apt update - sudo apt -y install sox speech-tools + sudo apt-get -qq update + sudo apt-get -qq install sox speech-tools - - name: Install macOS prerequisites - if: ${{ runner.os == 'macOS' }} + - if: runner.os == 'macOS' run: brew install speech-tools - - name: Build with Gradle - env: - GRADLE_OPTS: -Dorg.gradle.daemon=false - run: ./gradlew build - - - name: Cleanup Gradle Cache - run: | - rm -f ~/.gradle/caches/modules-2/modules-2.lock - rm -f ~/.gradle/caches/modules-2/gc.properties + - uses: gradle/gradle-build-action@v2 + with: + arguments: build --warning-mode all From 127ab489a83fdfa7832069e324af9ee4fbb2bc4d Mon Sep 17 00:00:00 2001 From: Ingmar Steiner Date: Thu, 8 Dec 2022 13:26:30 +0100 Subject: [PATCH 02/41] Upgradle to v7.5.1 --- gradle/wrapper/gradle-wrapper.jar | Bin 58694 -> 60756 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 263 ++++++++++++++--------- gradlew.bat | 34 +-- 4 files changed, 172 insertions(+), 127 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 490fda8577df6c95960ba7077c43220e5bb2c0d9..249e5832f090a2944b7473328c07c9755baa3196 100644 GIT binary patch delta 21909 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 SzbncTHUVZ3=*-w}@BaX!LSYdA delta 19715 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index a4b4429..ae04661 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 2fe81a7..a69d9cb 100755 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ -#!/usr/bin/env sh +#!/bin/sh # -# Copyright 2015 the original author or authors. +# Copyright © 2015-2021 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -17,78 +17,113 @@ # ############################################################################## -## -## Gradle start up script for UN*X -## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# ############################################################################## # Attempt to set APP_HOME + # Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` +APP_BASE_NAME=${0##*/} # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +MAX_FD=maximum warn () { echo "$*" -} +} >&2 die () { echo echo "$*" echo exit 1 -} +} >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -97,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" + JAVACMD=java which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the @@ -105,79 +140,101 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac fi -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. # For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) fi - i=`expr $i + 1` + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac fi -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=`save "$@"` +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index 62bd9b9..f127cfd 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -14,7 +14,7 @@ @rem limitations under the License. @rem -@if "%DEBUG%" == "" @echo off +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -25,7 +25,7 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @@ -40,7 +40,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init +if %ERRORLEVEL% equ 0 goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -54,7 +54,7 @@ goto fail set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe -if exist "%JAVA_EXE%" goto init +if exist "%JAVA_EXE%" goto execute echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% @@ -64,38 +64,26 @@ echo location of your Java installation. goto fail -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - :execute @rem Setup the command line set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +if %ERRORLEVEL% equ 0 goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal From d955a17788e24de6002b1286beaba205f48b282b Mon Sep 17 00:00:00 2001 From: Ingmar Steiner Date: Thu, 8 Dec 2022 13:27:25 +0100 Subject: [PATCH 03/41] Drop Java 13, add Java 17 in CI --- .github/workflows/main.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 8600e91..03ead85 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -17,12 +17,12 @@ jobs: java_version: - 8 - 11 - - 13 + - 17 exclude: - os: macos-latest java_version: 8 - os: macos-latest - java_version: 13 + java_version: 17 runs-on: ${{ matrix.os }} steps: From f6879973f85d9945a5ec69e4dfcc831b6f52ab69 Mon Sep 17 00:00:00 2001 From: Ingmar Steiner Date: Thu, 8 Dec 2022 13:31:15 +0100 Subject: [PATCH 04/41] Rename CI Action --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 03ead85..f17f5a2 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -1,4 +1,4 @@ -name: Build +name: CI on: push: From 5a5ac630b5268acdef1a9358e1380d0741d560c2 Mon Sep 17 00:00:00 2001 From: Ingmar Steiner Date: Thu, 8 Dec 2022 13:31:29 +0100 Subject: [PATCH 05/41] Tweak apt install step --- .github/workflows/main.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index f17f5a2..13c2e68 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -36,8 +36,8 @@ jobs: - if: runner.os == 'Linux' env: DEBIAN_FRONTEND: noninteractive - run: | - sudo apt-get -qq update + run: > + sudo apt-get -qq update && sudo apt-get -qq install sox speech-tools - if: runner.os == 'macOS' From 0c743f4e8d0fe2db8a668ae60e60b1569451830b Mon Sep 17 00:00:00 2001 From: Ingmar Steiner Date: Sun, 11 Dec 2022 07:31:46 +0100 Subject: [PATCH 06/41] Don't fail fast in build matrix --- .github/workflows/main.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 13c2e68..5edaaab 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -23,6 +23,7 @@ jobs: java_version: 8 - os: macos-latest java_version: 17 + fail-fast: false runs-on: ${{ matrix.os }} steps: From 51cc0f579fd01dd5139ef5ddb8870ed0ed005081 Mon Sep 17 00:00:00 2001 From: Ingmar Steiner Date: Sun, 11 Dec 2022 08:10:41 +0100 Subject: [PATCH 07/41] Streamline source JAR build logic --- build.gradle | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/build.gradle b/build.gradle index 5d84f4b..76dd430 100644 --- a/build.gradle +++ b/build.gradle @@ -76,6 +76,10 @@ dependencies { testImplementation group: 'xmlunit', name: 'xmlunit', version: '1.6' } +java { + withSourcesJar() +} + processResources { doLast { file("$destinationDir/maryttsVersion.txt").text = maryttsVersion @@ -102,17 +106,10 @@ test { } } -task sourceJar(type: Jar) { - from sourceSets.main.allJava -} - publishing { publications { mavenJava(MavenPublication) { from components.java - artifact sourceJar { - classifier 'sources' - } } } repositories { From 92001b1ba6116be9c08836ef2d133167bf088534 Mon Sep 17 00:00:00 2001 From: Ingmar Steiner Date: Sun, 11 Dec 2022 08:30:05 +0100 Subject: [PATCH 08/41] Use version catalog to manage MaryTTS version --- build.gradle | 6 +++--- gradle.properties | 1 - settings.gradle | 7 +++++++ 3 files changed, 10 insertions(+), 4 deletions(-) delete mode 100644 gradle.properties diff --git a/build.gradle b/build.gradle index 76dd430..90e66ca 100644 --- a/build.gradle +++ b/build.gradle @@ -64,7 +64,7 @@ repositories { dependencies { implementation localGroovy() - implementation group: 'de.dfki.mary', name: 'marytts-runtime', version: maryttsVersion, { + implementation group: 'de.dfki.mary', name: 'marytts-runtime', version: libs.versions.marytts.get(), { exclude group: '*', module: 'groovy-all' exclude group: '*', module: 'mwdumper' exclude group: '*', module: 'sgt' @@ -82,7 +82,7 @@ java { processResources { doLast { - file("$destinationDir/maryttsVersion.txt").text = maryttsVersion + file("$destinationDir/maryttsVersion.txt").text = libs.versions.marytts.get() } } @@ -102,7 +102,7 @@ test { // path to shared testkit gradle home systemProperty 'testProjectDir', temporaryDir // dynamic marytts version - systemProperty 'maryVersion', maryttsVersion + systemProperty 'maryVersion', libs.versions.marytts.get() } } diff --git a/gradle.properties b/gradle.properties deleted file mode 100644 index 712b52d..0000000 --- a/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -maryttsVersion = 5.2 diff --git a/settings.gradle b/settings.gradle index dbacb32..26d2ada 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1,8 @@ rootProject.name = 'gradle-marytts-voicebuilding-plugin' +dependencyResolutionManagement { + versionCatalogs { + libs { + version('marytts', '5.2') + } + } +} From eab28f09aef74b8a92296b053373d71569f71f54 Mon Sep 17 00:00:00 2001 From: Ingmar Steiner Date: Sun, 11 Dec 2022 08:44:21 +0100 Subject: [PATCH 09/41] DRY on project dir creation in GenerateBasenamesList functional test --- .../GenerateBasenamesListFunctionalTest.groovy | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/test/groovy/de/dfki/mary/voicebuilding/tasks/GenerateBasenamesListFunctionalTest.groovy b/src/test/groovy/de/dfki/mary/voicebuilding/tasks/GenerateBasenamesListFunctionalTest.groovy index 9825a88..0f85336 100644 --- a/src/test/groovy/de/dfki/mary/voicebuilding/tasks/GenerateBasenamesListFunctionalTest.groovy +++ b/src/test/groovy/de/dfki/mary/voicebuilding/tasks/GenerateBasenamesListFunctionalTest.groovy @@ -8,7 +8,7 @@ class GenerateBasenamesListFunctionalTest { @Test void 'Given data directories, When basenames list is generated, Then basenames are in sort order'() { - def projectDir = File.createTempDir() + def projectDir = createProjectDir() def basenames = generateBasenames(5) createDataDirectories(projectDir, basenames) @@ -23,7 +23,7 @@ class GenerateBasenamesListFunctionalTest { @Test void 'Given data directories with some missing files, When basenames list is generated, Then basenames exclude them'() { - def projectDir = File.createTempDir() + def projectDir = createProjectDir() def basenames = generateBasenames(6) createDataDirectories(projectDir, basenames) @@ -42,7 +42,7 @@ class GenerateBasenamesListFunctionalTest { @Test void 'Given data directories, When custom list is provided, Then basenames are in custom order'() { - def projectDir = File.createTempDir() + def projectDir = createProjectDir() def basenames = generateBasenames(5) createDataDirectories(projectDir, basenames) @@ -65,7 +65,7 @@ class GenerateBasenamesListFunctionalTest { @Test void 'Given data directories, When custom list with comments is provided, Then basenames are in custom order'() { - def projectDir = File.createTempDir() + def projectDir = createProjectDir() def basenames = generateBasenames(5) createDataDirectories(projectDir, basenames) @@ -91,7 +91,7 @@ class GenerateBasenamesListFunctionalTest { @Test void 'Given data directories with some missing files, When custom list is provided, Then basenames exclude them and are in custom order'() { - def projectDir = File.createTempDir() + def projectDir = createProjectDir() def basenames = generateBasenames(6) createDataDirectories(projectDir, basenames) @@ -116,6 +116,10 @@ class GenerateBasenamesListFunctionalTest { assert expected == actual } + private static File createProjectDir() { + File.createTempDir() + } + private static List generateBasenames(int n) { (1..n).collect { i -> String.format('test_%04d', i) From eacbe400cacdede33fdd42cd3d07b3baa98ab57e Mon Sep 17 00:00:00 2001 From: Ingmar Steiner Date: Sun, 11 Dec 2022 08:54:39 +0100 Subject: [PATCH 10/41] Refactor to create settings.gradle in functional test project dirs --- .../BasePluginFunctionalTest.groovy | 1 + .../DataPluginFunctionalTest.groovy | 1 + .../FestvoxPluginFunctionalTest.groovy | 1 + .../LegacyPluginFunctionalTest.groovy | 1 + .../LegacyPluginLegacyGradleTest.groovy | 1 + .../LegacyPluginOneShotFunctionalTest.groovy | 1 + .../GenerateBasenamesListFunctionalTest.groovy | 16 +++++++++------- 7 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/test/groovy/de/dfki/mary/voicebuilding/BasePluginFunctionalTest.groovy b/src/test/groovy/de/dfki/mary/voicebuilding/BasePluginFunctionalTest.groovy index 8ea180c..edc91c0 100644 --- a/src/test/groovy/de/dfki/mary/voicebuilding/BasePluginFunctionalTest.groovy +++ b/src/test/groovy/de/dfki/mary/voicebuilding/BasePluginFunctionalTest.groovy @@ -16,6 +16,7 @@ class BasePluginFunctionalTest { @BeforeSuite void setup() { def projectDir = File.createTempDir() + new File(projectDir, 'settings.gradle').createNewFile() gradle = GradleRunner.create() .withProjectDir(projectDir) diff --git a/src/test/groovy/de/dfki/mary/voicebuilding/DataPluginFunctionalTest.groovy b/src/test/groovy/de/dfki/mary/voicebuilding/DataPluginFunctionalTest.groovy index baf44c5..0b37b4f 100644 --- a/src/test/groovy/de/dfki/mary/voicebuilding/DataPluginFunctionalTest.groovy +++ b/src/test/groovy/de/dfki/mary/voicebuilding/DataPluginFunctionalTest.groovy @@ -16,6 +16,7 @@ class DataPluginFunctionalTest { @BeforeSuite void setup() { def projectDir = File.createTempDir() + new File(projectDir, 'settings.gradle').createNewFile() gradle = GradleRunner.create() .withProjectDir(projectDir) diff --git a/src/test/groovy/de/dfki/mary/voicebuilding/FestvoxPluginFunctionalTest.groovy b/src/test/groovy/de/dfki/mary/voicebuilding/FestvoxPluginFunctionalTest.groovy index 173b4e4..74b301e 100644 --- a/src/test/groovy/de/dfki/mary/voicebuilding/FestvoxPluginFunctionalTest.groovy +++ b/src/test/groovy/de/dfki/mary/voicebuilding/FestvoxPluginFunctionalTest.groovy @@ -16,6 +16,7 @@ class FestvoxPluginFunctionalTest { @BeforeSuite void setup() { def projectDir = File.createTempDir() + new File(projectDir, 'settings.gradle').createNewFile() gradle = GradleRunner.create() .withProjectDir(projectDir) diff --git a/src/test/groovy/de/dfki/mary/voicebuilding/LegacyPluginFunctionalTest.groovy b/src/test/groovy/de/dfki/mary/voicebuilding/LegacyPluginFunctionalTest.groovy index ccc2636..ca9cfb1 100644 --- a/src/test/groovy/de/dfki/mary/voicebuilding/LegacyPluginFunctionalTest.groovy +++ b/src/test/groovy/de/dfki/mary/voicebuilding/LegacyPluginFunctionalTest.groovy @@ -16,6 +16,7 @@ class LegacyPluginFunctionalTest { @BeforeSuite void setup() { def projectDir = File.createTempDir() + new File(projectDir, 'settings.gradle').createNewFile() gradle = GradleRunner.create() .withProjectDir(projectDir) diff --git a/src/test/groovy/de/dfki/mary/voicebuilding/LegacyPluginLegacyGradleTest.groovy b/src/test/groovy/de/dfki/mary/voicebuilding/LegacyPluginLegacyGradleTest.groovy index ff5a6f3..ee9d64c 100644 --- a/src/test/groovy/de/dfki/mary/voicebuilding/LegacyPluginLegacyGradleTest.groovy +++ b/src/test/groovy/de/dfki/mary/voicebuilding/LegacyPluginLegacyGradleTest.groovy @@ -13,6 +13,7 @@ class LegacyPluginLegacyGradleTest { @BeforeSuite void setup() { def projectDir = File.createTempDir() + new File(projectDir, 'settings.gradle').createNewFile() gradle = GradleRunner.create() .withProjectDir(projectDir) .withPluginClasspath() diff --git a/src/test/groovy/de/dfki/mary/voicebuilding/LegacyPluginOneShotFunctionalTest.groovy b/src/test/groovy/de/dfki/mary/voicebuilding/LegacyPluginOneShotFunctionalTest.groovy index 0c7cde2..c33e377 100644 --- a/src/test/groovy/de/dfki/mary/voicebuilding/LegacyPluginOneShotFunctionalTest.groovy +++ b/src/test/groovy/de/dfki/mary/voicebuilding/LegacyPluginOneShotFunctionalTest.groovy @@ -14,6 +14,7 @@ class LegacyPluginOneShotFunctionalTest { @BeforeSuite void setup() { def projectDir = File.createTempDir() + new File(projectDir, 'settings.gradle').createNewFile() gradle = GradleRunner.create() .withProjectDir(projectDir) diff --git a/src/test/groovy/de/dfki/mary/voicebuilding/tasks/GenerateBasenamesListFunctionalTest.groovy b/src/test/groovy/de/dfki/mary/voicebuilding/tasks/GenerateBasenamesListFunctionalTest.groovy index 0f85336..94cf9a7 100644 --- a/src/test/groovy/de/dfki/mary/voicebuilding/tasks/GenerateBasenamesListFunctionalTest.groovy +++ b/src/test/groovy/de/dfki/mary/voicebuilding/tasks/GenerateBasenamesListFunctionalTest.groovy @@ -8,7 +8,7 @@ class GenerateBasenamesListFunctionalTest { @Test void 'Given data directories, When basenames list is generated, Then basenames are in sort order'() { - def projectDir = createProjectDir() + def projectDir = createProjectDirWithSettingsFile() def basenames = generateBasenames(5) createDataDirectories(projectDir, basenames) @@ -23,7 +23,7 @@ class GenerateBasenamesListFunctionalTest { @Test void 'Given data directories with some missing files, When basenames list is generated, Then basenames exclude them'() { - def projectDir = createProjectDir() + def projectDir = createProjectDirWithSettingsFile() def basenames = generateBasenames(6) createDataDirectories(projectDir, basenames) @@ -42,7 +42,7 @@ class GenerateBasenamesListFunctionalTest { @Test void 'Given data directories, When custom list is provided, Then basenames are in custom order'() { - def projectDir = createProjectDir() + def projectDir = createProjectDirWithSettingsFile() def basenames = generateBasenames(5) createDataDirectories(projectDir, basenames) @@ -65,7 +65,7 @@ class GenerateBasenamesListFunctionalTest { @Test void 'Given data directories, When custom list with comments is provided, Then basenames are in custom order'() { - def projectDir = createProjectDir() + def projectDir = createProjectDirWithSettingsFile() def basenames = generateBasenames(5) createDataDirectories(projectDir, basenames) @@ -91,7 +91,7 @@ class GenerateBasenamesListFunctionalTest { @Test void 'Given data directories with some missing files, When custom list is provided, Then basenames exclude them and are in custom order'() { - def projectDir = createProjectDir() + def projectDir = createProjectDirWithSettingsFile() def basenames = generateBasenames(6) createDataDirectories(projectDir, basenames) @@ -116,8 +116,10 @@ class GenerateBasenamesListFunctionalTest { assert expected == actual } - private static File createProjectDir() { - File.createTempDir() + private static File createProjectDirWithSettingsFile() { + def projectDir = File.createTempDir() + new File(projectDir, 'settings.gradle').createNewFile() + projectDir } private static List generateBasenames(int n) { From 923c093269cc6bbe6e684c7d82b2a391178bd66a Mon Sep 17 00:00:00 2001 From: Ingmar Steiner Date: Sun, 11 Dec 2022 08:58:30 +0100 Subject: [PATCH 11/41] Fix running functional tests under build/tmp/test --- build.gradle | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 90e66ca..cda1ab9 100644 --- a/build.gradle +++ b/build.gradle @@ -99,8 +99,7 @@ test { } failFast = true doFirst { - // path to shared testkit gradle home - systemProperty 'testProjectDir', temporaryDir + systemProperty 'java.io.tmpdir', temporaryDir // dynamic marytts version systemProperty 'maryVersion', libs.versions.marytts.get() } From ee4845c476c6553f2fc1c8332e08ac4d261aed21 Mon Sep 17 00:00:00 2001 From: Ingmar Steiner Date: Sun, 11 Dec 2022 08:59:10 +0100 Subject: [PATCH 12/41] Streamline system properties for test task --- build.gradle | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/build.gradle b/build.gradle index cda1ab9..690998c 100644 --- a/build.gradle +++ b/build.gradle @@ -98,11 +98,8 @@ test { } } failFast = true - doFirst { - systemProperty 'java.io.tmpdir', temporaryDir - // dynamic marytts version - systemProperty 'maryVersion', libs.versions.marytts.get() - } + systemProperty 'java.io.tmpdir', temporaryDir + systemProperty 'maryVersion', libs.versions.marytts.get() } publishing { From 87f4a1a47c9e18e9aa5dbaa2ad81f96ba0409837 Mon Sep 17 00:00:00 2001 From: Ingmar Steiner Date: Sun, 11 Dec 2022 20:08:48 +0100 Subject: [PATCH 13/41] Upgrade TestNG to latest version supporting Java 8 --- build.gradle | 2 +- .../de/dfki/mary/voicebuilding/VoicebuildingBasePlugin.groovy | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 690998c..055e9ac 100644 --- a/build.gradle +++ b/build.gradle @@ -72,7 +72,7 @@ dependencies { implementation group: 'de.dfki.mary', name: 'gradle-marytts-component-plugin', version: '0.2.2' implementation group: 'org.m2ci.msp', name: 'gradle-praat-wrapper-plugin', version: '0.6' implementation group: 'org.m2ci.msp', name: 'jtgt', version: '0.6.1' - testImplementation group: 'org.testng', name: 'testng', version: '7.0.0' + testImplementation group: 'org.testng', name: 'testng', version: '7.5' testImplementation group: 'xmlunit', name: 'xmlunit', version: '1.6' } diff --git a/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingBasePlugin.groovy b/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingBasePlugin.groovy index 739d599..13e74bb 100644 --- a/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingBasePlugin.groovy +++ b/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingBasePlugin.groovy @@ -42,7 +42,7 @@ class VoicebuildingBasePlugin implements Plugin { } testImplementation group: 'junit', name: 'junit', version: '4.13' integrationTestImplementation localGroovy() - integrationTestImplementation group: 'org.testng', name: 'testng', version: '7.0.0' + integrationTestImplementation group: 'org.testng', name: 'testng', version: '7.5' } project.afterEvaluate { From 95dba86c35efd15994da36a5b1c6dd6a542d1ad1 Mon Sep 17 00:00:00 2001 From: Ingmar Steiner Date: Sun, 11 Dec 2022 20:09:27 +0100 Subject: [PATCH 14/41] Upgrade JUnit to latest legacy release --- .../de/dfki/mary/voicebuilding/VoicebuildingBasePlugin.groovy | 2 +- .../de/dfki/mary/voicebuilding/VoicebuildingLegacyPlugin.groovy | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingBasePlugin.groovy b/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingBasePlugin.groovy index 13e74bb..2175ed9 100644 --- a/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingBasePlugin.groovy +++ b/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingBasePlugin.groovy @@ -40,7 +40,7 @@ class VoicebuildingBasePlugin implements Plugin { api group: 'de.dfki.mary', name: 'marytts-runtime', version: project.marytts.version, { exclude group: '*', module: 'groovy-all' } - testImplementation group: 'junit', name: 'junit', version: '4.13' + testImplementation group: 'junit', name: 'junit', version: '4.13.2' integrationTestImplementation localGroovy() integrationTestImplementation group: 'org.testng', name: 'testng', version: '7.5' } diff --git a/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingLegacyPlugin.groovy b/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingLegacyPlugin.groovy index 68b8603..3a3cc4e 100644 --- a/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingLegacyPlugin.groovy +++ b/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingLegacyPlugin.groovy @@ -408,7 +408,7 @@ class VoicebuildingLegacyPlugin implements Plugin { api "de.dfki.mary:marytts-lang-$project.marytts.voice.language:$project.marytts.version", { exclude group: '*', module: 'groovy-all' } - testImplementation "junit:junit:4.13" + testImplementation "junit:junit:4.13.2" } } } From 0e41e5885624733e7685e1c81161e5e68eb29dea Mon Sep 17 00:00:00 2001 From: Ingmar Steiner Date: Tue, 13 Dec 2022 12:26:40 +0100 Subject: [PATCH 15/41] Upgrade MaryTTS to v5.2.1, related dependencies to latest release, resolve from Maven Central --- build.gradle | 24 +++++++++++++------ settings.gradle | 2 +- .../VoicebuildingBasePlugin.groovy | 4 ++++ .../VoicebuildingDataPlugin.groovy | 4 +++- .../VoicebuildingLegacyPlugin.groovy | 2 ++ ...basePluginFunctionalTestBuildScript.gradle | 18 +++++++++++++- ...gacyPluginFunctionalTestBuildScript.gradle | 2 +- 7 files changed, 45 insertions(+), 11 deletions(-) diff --git a/build.gradle b/build.gradle index 055e9ac..0536165 100644 --- a/build.gradle +++ b/build.gradle @@ -58,20 +58,30 @@ pluginBundle { } repositories { - jcenter() - gradlePluginPortal() + mavenCentral() + exclusiveContent { + forRepository { + maven { + name 'DFKI-MLT' + url 'https://mlt.jfrog.io/artifactory/mlt-mvn-releases-local' + } + } + filter { + includeGroup 'de.dfki.lt.jtok' + } + } } dependencies { implementation localGroovy() implementation group: 'de.dfki.mary', name: 'marytts-runtime', version: libs.versions.marytts.get(), { exclude group: '*', module: 'groovy-all' - exclude group: '*', module: 'mwdumper' - exclude group: '*', module: 'sgt' + exclude group: 'com.twmacinta', module: 'fast-md5' + exclude group: 'gov.nist.math', module: 'Jampack' } - implementation group: 'de.dfki.mary', name: 'gradle-marytts-component-plugin', version: '0.2.2' - implementation group: 'org.m2ci.msp', name: 'gradle-praat-wrapper-plugin', version: '0.6' - implementation group: 'org.m2ci.msp', name: 'jtgt', version: '0.6.1' + implementation group: 'de.dfki.mary', name: 'gradle-marytts-component-plugin', version: '0.3.0' + implementation group: 'io.github.m2ci-msp', name: 'gradle-praat-wrapper-plugin', version: '0.7.0' + implementation group: 'io.github.m2ci-msp', name: 'jtgt', version: '0.7.0' testImplementation group: 'org.testng', name: 'testng', version: '7.5' testImplementation group: 'xmlunit', name: 'xmlunit', version: '1.6' } diff --git a/settings.gradle b/settings.gradle index 26d2ada..132aa25 100644 --- a/settings.gradle +++ b/settings.gradle @@ -2,7 +2,7 @@ rootProject.name = 'gradle-marytts-voicebuilding-plugin' dependencyResolutionManagement { versionCatalogs { libs { - version('marytts', '5.2') + version('marytts', '5.2.1') } } } diff --git a/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingBasePlugin.groovy b/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingBasePlugin.groovy index 2175ed9..eb250ef 100644 --- a/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingBasePlugin.groovy +++ b/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingBasePlugin.groovy @@ -39,6 +39,8 @@ class VoicebuildingBasePlugin implements Plugin { project.dependencies { api group: 'de.dfki.mary', name: 'marytts-runtime', version: project.marytts.version, { exclude group: '*', module: 'groovy-all' + exclude group: 'com.twmacinta', module: 'fast-md5' + exclude group: 'gov.nist.math', module: 'Jampack' } testImplementation group: 'junit', name: 'junit', version: '4.13.2' integrationTestImplementation localGroovy() @@ -49,6 +51,8 @@ class VoicebuildingBasePlugin implements Plugin { project.dependencies { runtimeOnly "de.dfki.mary:marytts-lang-$project.marytts.voice.language:$project.marytts.version", { exclude group: '*', module: 'groovy-all' + exclude group: 'com.twmacinta', module: 'fast-md5' + exclude group: 'gov.nist.math', module: 'Jampack' } } } diff --git a/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingDataPlugin.groovy b/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingDataPlugin.groovy index 148efe1..765da0b 100644 --- a/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingDataPlugin.groovy +++ b/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingDataPlugin.groovy @@ -26,9 +26,11 @@ class VoicebuildingDataPlugin implements Plugin { project.afterEvaluate { marytts group: 'de.dfki.mary', name: "marytts-lang-$project.marytts.voice.locale.language", version: project.marytts.version, { exclude group: '*', module: 'groovy-all' + exclude group: 'com.twmacinta', module: 'fast-md5' + exclude group: 'gov.nist.math', module: 'Jampack' } } - marytts group: 'de.dfki.mary', name: "marytts-voicebuilding", version: '0.1' + marytts group: 'de.dfki.mary', name: 'marytts-voicebuilding', version: '0.2.0' } def templateTask = project.task('templates', type: CopyClasspathResources) { diff --git a/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingLegacyPlugin.groovy b/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingLegacyPlugin.groovy index 3a3cc4e..f941086 100644 --- a/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingLegacyPlugin.groovy +++ b/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingLegacyPlugin.groovy @@ -407,6 +407,8 @@ class VoicebuildingLegacyPlugin implements Plugin { project.dependencies { api "de.dfki.mary:marytts-lang-$project.marytts.voice.language:$project.marytts.version", { exclude group: '*', module: 'groovy-all' + exclude group: 'com.twmacinta', module: 'fast-md5' + exclude group: 'gov.nist.math', module: 'Jampack' } testImplementation "junit:junit:4.13.2" } diff --git a/src/test/resources/de/dfki/mary/voicebuilding/basePluginFunctionalTestBuildScript.gradle b/src/test/resources/de/dfki/mary/voicebuilding/basePluginFunctionalTestBuildScript.gradle index 3a936ab..6ba1e23 100644 --- a/src/test/resources/de/dfki/mary/voicebuilding/basePluginFunctionalTestBuildScript.gradle +++ b/src/test/resources/de/dfki/mary/voicebuilding/basePluginFunctionalTestBuildScript.gradle @@ -1,6 +1,6 @@ buildscript { repositories { - jcenter() + mavenCentral() } dependencies { classpath group: 'xmlunit', name: 'xmlunit', version: '1.6' @@ -151,6 +151,14 @@ task testGeneratePomFileForMavenJavaPublication(group: 'Verification') { artifactId 'groovy-all' groupId '*' } + exclusion { + artifactId 'fast-md5' + groupId 'com.twmacinta' + } + exclusion { + artifactId 'Jampack' + groupId 'gov.nist.math' + } } } dependency { @@ -163,6 +171,14 @@ task testGeneratePomFileForMavenJavaPublication(group: 'Verification') { artifactId 'groovy-all' groupId '*' } + exclusion { + artifactId 'fast-md5' + groupId 'com.twmacinta' + } + exclusion { + artifactId 'Jampack' + groupId 'gov.nist.math' + } } } } diff --git a/src/test/resources/de/dfki/mary/voicebuilding/legacyPluginFunctionalTestBuildScript.gradle b/src/test/resources/de/dfki/mary/voicebuilding/legacyPluginFunctionalTestBuildScript.gradle index 449c1ef..01257a1 100644 --- a/src/test/resources/de/dfki/mary/voicebuilding/legacyPluginFunctionalTestBuildScript.gradle +++ b/src/test/resources/de/dfki/mary/voicebuilding/legacyPluginFunctionalTestBuildScript.gradle @@ -1,6 +1,6 @@ buildscript { repositories { - jcenter() + mavenCentral() } dependencies { classpath group: 'xmlunit', name: 'xmlunit', version: '1.6' From 9218d27eb1651ace24f6281c1207c9f4aca3f2d6 Mon Sep 17 00:00:00 2001 From: Ingmar Steiner Date: Tue, 13 Dec 2022 12:32:45 +0100 Subject: [PATCH 16/41] Require Gradle v7.0 or higher --- CHANGELOG.md | 4 ++++ README.md | 2 +- .../LegacyPluginLegacyGradleTest.groovy | 12 ++++++------ 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fd8cbb9..d9f99da 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,10 @@ Gradle MaryTTS voicebuilding plugin - Plugin usage documented in readme - Testing on OpenJDK 11 and 13 +### Removed + +- Support for Gradle versions older than v7.0 + ### Changed - Migrate testing from Travis CI to GitHub Actions diff --git a/README.md b/README.md index c15829d..791c90c 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ plugins { ``` For details, see https://plugins.gradle.org/plugin/de.dfki.mary.voicebuilding-legacy. -Note that Gradle v6.2 or higher is required. +Note that Gradle v7.0 or higher is required. Prerequisites ------------- diff --git a/src/test/groovy/de/dfki/mary/voicebuilding/LegacyPluginLegacyGradleTest.groovy b/src/test/groovy/de/dfki/mary/voicebuilding/LegacyPluginLegacyGradleTest.groovy index ee9d64c..184f171 100644 --- a/src/test/groovy/de/dfki/mary/voicebuilding/LegacyPluginLegacyGradleTest.groovy +++ b/src/test/groovy/de/dfki/mary/voicebuilding/LegacyPluginLegacyGradleTest.groovy @@ -26,14 +26,14 @@ class LegacyPluginLegacyGradleTest { } @Test - void 'Gradle v6-1 cannot apply plugin'() { - gradle.withGradleVersion('6.1').buildAndFail() + void 'Gradle v6-9 cannot apply plugin'() { + gradle.withGradleVersion('6.9').buildAndFail() } @Test - void 'Gradle v6-2 can apply plugin'() { - if (JavaVersion.current() > JavaVersion.VERSION_13) - throw new SkipException('Gradle v6.2 does not support Java versions higher than 13') - gradle.withGradleVersion('6.2').build() + void 'Gradle v7-0 can apply plugin'() { + if (JavaVersion.current() > JavaVersion.VERSION_16) + throw new SkipException('Gradle v7.0 does not support Java versions higher than 16') + gradle.withGradleVersion('7.0').build() } } From 33677345db06f3d622f03c8553078149d60e2e00 Mon Sep 17 00:00:00 2001 From: Ingmar Steiner Date: Tue, 13 Dec 2022 12:40:53 +0100 Subject: [PATCH 17/41] Fix Gradle deprecations --- .../de/dfki/mary/voicebuilding/VoicebuildingBasePlugin.groovy | 2 +- .../de/dfki/mary/voicebuilding/tasks/FeatureListerTask.groovy | 2 +- .../dfki/mary/voicebuilding/tasks/MaryInterfaceBatchTask.groovy | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingBasePlugin.groovy b/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingBasePlugin.groovy index eb250ef..94f4e48 100644 --- a/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingBasePlugin.groovy +++ b/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingBasePlugin.groovy @@ -127,7 +127,7 @@ class VoicebuildingBasePlugin implements Plugin { project.task('run', type: JavaExec) { classpath = project.configurations.runtimeClasspath + project.sourceSets.main.output - main = 'marytts.server.Mary' + mainClass = 'marytts.server.Mary' systemProperty 'log4j.logger.marytts', 'INFO,stderr' } } diff --git a/src/main/groovy/de/dfki/mary/voicebuilding/tasks/FeatureListerTask.groovy b/src/main/groovy/de/dfki/mary/voicebuilding/tasks/FeatureListerTask.groovy index 3981d95..0cc5b57 100644 --- a/src/main/groovy/de/dfki/mary/voicebuilding/tasks/FeatureListerTask.groovy +++ b/src/main/groovy/de/dfki/mary/voicebuilding/tasks/FeatureListerTask.groovy @@ -14,7 +14,7 @@ class FeatureListerTask extends DefaultTask { void generate() { project.javaexec { classpath project.configurations.marytts - main 'marytts.FeatureLister' + mainClass = 'marytts.FeatureLister' systemProperties = [ locale : project.marytts.voice.maryLocale, outputFile: destFile.get().asFile diff --git a/src/main/groovy/de/dfki/mary/voicebuilding/tasks/MaryInterfaceBatchTask.groovy b/src/main/groovy/de/dfki/mary/voicebuilding/tasks/MaryInterfaceBatchTask.groovy index 216732a..03df0d5 100644 --- a/src/main/groovy/de/dfki/mary/voicebuilding/tasks/MaryInterfaceBatchTask.groovy +++ b/src/main/groovy/de/dfki/mary/voicebuilding/tasks/MaryInterfaceBatchTask.groovy @@ -66,7 +66,7 @@ class MaryInterfaceBatchTask extends DefaultTask { batchFile.text = new JsonBuilder(batch).toPrettyString() project.javaexec { classpath project.configurations.marytts - main 'marytts.BatchProcessor' + mainClass = 'marytts.BatchProcessor' args batchFile systemProperties << maryttsProperties.getOrElse([:]) } From 285cca220a51c07670c5125fb107dc0a21386208 Mon Sep 17 00:00:00 2001 From: Ingmar Steiner Date: Wed, 14 Dec 2022 20:00:58 +0100 Subject: [PATCH 18/41] Fix main source compile test --- .../mary/voicebuilding/BasePluginFunctionalTest.groovy | 5 ++--- .../basePluginFunctionalTestBuildScript.gradle | 7 ++++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/test/groovy/de/dfki/mary/voicebuilding/BasePluginFunctionalTest.groovy b/src/test/groovy/de/dfki/mary/voicebuilding/BasePluginFunctionalTest.groovy index edc91c0..1e0801e 100644 --- a/src/test/groovy/de/dfki/mary/voicebuilding/BasePluginFunctionalTest.groovy +++ b/src/test/groovy/de/dfki/mary/voicebuilding/BasePluginFunctionalTest.groovy @@ -55,9 +55,8 @@ class BasePluginFunctionalTest { ['testJavaCompatibility', false], ['generateConfig', false], ['generateVoiceSource', false], - // ['compileTestJava', true], - ['compileGroovy', true], - // NOTE: no need for now, but in case it is needed for the future ['compileJava', true], + ['compileJava', true], + ['compileTestGroovy', true], ['compileIntegrationTestGroovy', true], ['testGeneratePomFileForMavenJavaPublication', false], ['generatePomProperties', true], diff --git a/src/test/resources/de/dfki/mary/voicebuilding/basePluginFunctionalTestBuildScript.gradle b/src/test/resources/de/dfki/mary/voicebuilding/basePluginFunctionalTestBuildScript.gradle index 6ba1e23..cc16b18 100644 --- a/src/test/resources/de/dfki/mary/voicebuilding/basePluginFunctionalTestBuildScript.gradle +++ b/src/test/resources/de/dfki/mary/voicebuilding/basePluginFunctionalTestBuildScript.gradle @@ -61,10 +61,11 @@ task testGenerateVoiceSource(group: 'Verification') { } } -task testCompileGroovy(group: 'Verification') { - dependsOn compileGroovy +task testCompileJava(group: 'Verification') { + dependsOn compileJava doLast { - assert file("$buildDir/classes/groovy/main/marytts/voice/$marytts.voice.nameCamelCase/${marytts.voice.nameCamelCase}Config.class").exists() + assert fileTree(sourceSets.main.java.classesDirectory) + .contains(file("$buildDir/classes/java/main/marytts/voice/$marytts.voice.nameCamelCase/${marytts.voice.nameCamelCase}Config.class")) } } From b39490bce5e13ed86d498a27b7a2d00f03c241ca Mon Sep 17 00:00:00 2001 From: Ingmar Steiner Date: Thu, 15 Dec 2022 19:43:36 +0100 Subject: [PATCH 19/41] Drop redundant dependencies --- .../voicebuilding/VoicebuildingBasePlugin.groovy | 13 +------------ .../voicebuilding/VoicebuildingLegacyPlugin.groovy | 11 ----------- 2 files changed, 1 insertion(+), 23 deletions(-) diff --git a/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingBasePlugin.groovy b/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingBasePlugin.groovy index 94f4e48..dc801f5 100644 --- a/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingBasePlugin.groovy +++ b/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingBasePlugin.groovy @@ -37,7 +37,7 @@ class VoicebuildingBasePlugin implements Plugin { } project.dependencies { - api group: 'de.dfki.mary', name: 'marytts-runtime', version: project.marytts.version, { + api group: 'de.dfki.mary', name: "marytts-lang-$project.marytts.voice.language", version: project.marytts.version, { exclude group: '*', module: 'groovy-all' exclude group: 'com.twmacinta', module: 'fast-md5' exclude group: 'gov.nist.math', module: 'Jampack' @@ -47,17 +47,6 @@ class VoicebuildingBasePlugin implements Plugin { integrationTestImplementation group: 'org.testng', name: 'testng', version: '7.5' } - project.afterEvaluate { - project.dependencies { - runtimeOnly "de.dfki.mary:marytts-lang-$project.marytts.voice.language:$project.marytts.version", { - exclude group: '*', module: 'groovy-all' - exclude group: 'com.twmacinta', module: 'fast-md5' - exclude group: 'gov.nist.math', module: 'Jampack' - } - } - } - - project.tasks.register 'generateVoiceConfig', GenerateVoiceConfig, { } diff --git a/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingLegacyPlugin.groovy b/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingLegacyPlugin.groovy index f941086..c7ce32e 100644 --- a/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingLegacyPlugin.groovy +++ b/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingLegacyPlugin.groovy @@ -402,17 +402,6 @@ class VoicebuildingLegacyPlugin implements Plugin { } } } - - project.afterEvaluate { - project.dependencies { - api "de.dfki.mary:marytts-lang-$project.marytts.voice.language:$project.marytts.version", { - exclude group: '*', module: 'groovy-all' - exclude group: 'com.twmacinta', module: 'fast-md5' - exclude group: 'gov.nist.math', module: 'Jampack' - } - testImplementation "junit:junit:4.13.2" - } - } } } From 59a0bf3640f1bf750b6b5ce72c2990aa0aa63e99 Mon Sep 17 00:00:00 2001 From: Ingmar Steiner Date: Thu, 15 Dec 2022 18:46:12 +0100 Subject: [PATCH 20/41] Streamline POM metadata generation --- .../mary/voicebuilding/VoicebuildingBasePlugin.groovy | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingBasePlugin.groovy b/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingBasePlugin.groovy index dc801f5..f6c42ea 100644 --- a/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingBasePlugin.groovy +++ b/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingBasePlugin.groovy @@ -82,13 +82,10 @@ class VoicebuildingBasePlugin implements Plugin { from project.components.java pom { description = project.marytts.voice.description - // TODO: Properties not being resolved lazily in nested license extension, so... - project.afterEvaluate { - licenses { - license { - name = project.marytts.voice.license.name - url = project.marytts.voice.license.url - } + licenses { + license { + name = project.marytts.voice.license.name + url = project.marytts.voice.license.url } } } From 97cf3ffd08df1b6e35c1ea5de489af87fc6430a1 Mon Sep 17 00:00:00 2001 From: Ingmar Steiner Date: Thu, 15 Dec 2022 19:39:18 +0100 Subject: [PATCH 21/41] Add group to voicebuilding tasks --- .../VoicebuildingBasePlugin.groovy | 5 ++- .../VoicebuildingDataPlugin.groovy | 10 +++++ .../VoicebuildingFestvoxPlugin.groovy | 2 + .../VoicebuildingLegacyPlugin.groovy | 43 +++++++++++++++++++ 4 files changed, 59 insertions(+), 1 deletion(-) diff --git a/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingBasePlugin.groovy b/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingBasePlugin.groovy index f6c42ea..9da5f14 100644 --- a/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingBasePlugin.groovy +++ b/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingBasePlugin.groovy @@ -48,10 +48,11 @@ class VoicebuildingBasePlugin implements Plugin { } project.tasks.register 'generateVoiceConfig', GenerateVoiceConfig, { - + group = 'MaryTTS Voicebuilding Base' } project.tasks.register 'generateVoiceSource', GenerateVoiceSource, { + group = 'MaryTTS Voicebuilding Base' dependsOn "generateSource", "generateConfig" testDirectory = project.file("$project.buildDir/generatedSrc/test/groovy/voice") integrationTestDirectory = project.file("$project.buildDir/generatedSrc/integrationTest/groovy/voice") @@ -94,6 +95,7 @@ class VoicebuildingBasePlugin implements Plugin { } project.task('generatePomProperties', type: WriteProperties) { + group = 'MaryTTS Voicebuilding Base' outputFile = project.layout.buildDirectory.file('pom.properties') properties = [ groupId : project.group, @@ -112,6 +114,7 @@ class VoicebuildingBasePlugin implements Plugin { } project.task('run', type: JavaExec) { + group = 'MaryTTS Voicebuilding Base' classpath = project.configurations.runtimeClasspath + project.sourceSets.main.output mainClass = 'marytts.server.Mary' systemProperty 'log4j.logger.marytts', 'INFO,stderr' diff --git a/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingDataPlugin.groovy b/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingDataPlugin.groovy index 765da0b..a656ea2 100644 --- a/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingDataPlugin.groovy +++ b/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingDataPlugin.groovy @@ -34,18 +34,21 @@ class VoicebuildingDataPlugin implements Plugin { } def templateTask = project.task('templates', type: CopyClasspathResources) { + group = 'MaryTTS Voicebuilding Data' destDir = project.layout.buildDirectory.dir('templates') resources.add '/de/dfki/mary/voicebuilding/templates/extractPitch.praat' resources.add '/de/dfki/mary/voicebuilding/templates/pitchmarks.praat' } def wavTask = project.task('wav', type: ProcessWav) { + group = 'MaryTTS Voicebuilding Data' dependsOn project.processDataResources srcDir = project.processDataResources.destinationDir destDir = project.layout.buildDirectory.dir('wav') } def basenamesTask = project.task('basenames', type: GenerateBasenamesList) { + group = 'MaryTTS Voicebuilding Data' wavDir = wavTask.destDir textDir = project.layout.buildDirectory.dir('text') labDir = project.layout.buildDirectory.dir('lab') @@ -53,6 +56,7 @@ class VoicebuildingDataPlugin implements Plugin { } def praatPitchExtractorTask = project.task('praatPitchExtractor', type: PraatExtractPitch) { + group = 'MaryTTS Voicebuilding Data' dependsOn project.praat, templateTask basenamesFile = basenamesTask.destFile scriptFile = templateTask.destDir.file('extractPitch.praat') @@ -61,6 +65,7 @@ class VoicebuildingDataPlugin implements Plugin { } def praatPitchmarkerTask = project.task('praatPitchmarker', type: PraatExtractPitchmarks) { + group = 'MaryTTS Voicebuilding Data' dependsOn project.praat, templateTask basenamesFile = basenamesTask.destFile scriptFile = templateTask.destDir.file('pitchmarks.praat') @@ -70,12 +75,14 @@ class VoicebuildingDataPlugin implements Plugin { } def pitchmarkConverterTask = project.task('pitchmarkConverter', type: PitchmarkConverter) { + group = 'MaryTTS Voicebuilding Data' basenamesFile = basenamesTask.destFile srcDir = praatPitchmarkerTask.destDir destDir = project.layout.buildDirectory.dir('pm') } project.task('mcepExtractor', type: ExtractMcep) { + group = 'MaryTTS Voicebuilding Data' basenamesFile = basenamesTask.destFile wavDir = wavTask.destDir pmDir = pitchmarkConverterTask.destDir @@ -83,6 +90,7 @@ class VoicebuildingDataPlugin implements Plugin { } def generateAllophonesTask = project.task('generateAllophones', type: MaryInterfaceBatchTask) { + group = 'MaryTTS Voicebuilding Data' srcDir = project.layout.buildDirectory.dir('text') destDir = project.layout.buildDirectory.dir('prompt_allophones') inputType = 'TEXT' @@ -93,6 +101,7 @@ class VoicebuildingDataPlugin implements Plugin { } project.task('generatePhoneFeatures', type: MaryInterfaceBatchTask) { + group = 'MaryTTS Voicebuilding Data' srcDir = generateAllophonesTask.destDir destDir = project.layout.buildDirectory.dir('phonefeatures') inputType = 'ALLOPHONES' @@ -103,6 +112,7 @@ class VoicebuildingDataPlugin implements Plugin { } project.task('generateHalfPhoneFeatures', type: MaryInterfaceBatchTask) { + group = 'MaryTTS Voicebuilding Data' srcDir = generateAllophonesTask.destDir destDir = project.layout.buildDirectory.dir('halfphonefeatures') inputType = 'ALLOPHONES' diff --git a/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingFestvoxPlugin.groovy b/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingFestvoxPlugin.groovy index 5656367..1ca50e1 100644 --- a/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingFestvoxPlugin.groovy +++ b/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingFestvoxPlugin.groovy @@ -28,12 +28,14 @@ class VoicebuildingFestvoxPlugin implements Plugin { } project.task('text', type: FestvoxExtractText) { + group = 'MaryTTS Voicebuilding FestVox' dependsOn project.tasks.findByName('processDataResources') srcFile = project.file("$project.sourceSets.data.output.resourcesDir/txt.done.data") destDir = project.layout.buildDirectory.dir('text') } project.task('lab', type: FestvoxExtractLab) { + group = 'MaryTTS Voicebuilding FestVox' srcFiles = project.files(project.tasks.getByName('processDataResources')) destDir = project.layout.buildDirectory.dir('lab') mapping = [ diff --git a/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingLegacyPlugin.groovy b/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingLegacyPlugin.groovy index c7ce32e..d17e44c 100644 --- a/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingLegacyPlugin.groovy +++ b/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingLegacyPlugin.groovy @@ -18,12 +18,14 @@ class VoicebuildingLegacyPlugin implements Plugin { } project.task('processPhoneLabels', type: ProcessPhoneLabels) { + group = 'MaryTTS Voicebuilding Legacy' basenamesFile = project.basenames.destFile srcDir = project.layout.buildDirectory.dir('lab') destDir = project.layout.buildDirectory.dir('lab_processed') } project.task('alignLabelsWithPrompts', type: AlignLabelsWithPrompts) { + group = 'MaryTTS Voicebuilding Legacy' basenamesFile = project.basenames.destFile labDir = project.layout.buildDirectory.dir('lab') maryXmlDir = project.tasks.getByName('generateAllophones').destDir @@ -31,12 +33,14 @@ class VoicebuildingLegacyPlugin implements Plugin { } project.task('splitPhoneLabelsIntoHalfPhones', type: SplitPhoneLabelsIntoHalfPhones) { + group = 'MaryTTS Voicebuilding Legacy' basenamesFile = project.basenames.destFile srcDir = project.processPhoneLabels.destDir destDir = project.layout.buildDirectory.dir('halfphonelab_aligned') } project.task('phoneUnitFileMaker', type: PhoneUnitFileMaker) { + group = 'MaryTTS Voicebuilding Legacy' basenamesFile = project.basenames.destFile srcDir = project.processPhoneLabels.destDir srcExt = 'lab' @@ -46,6 +50,7 @@ class VoicebuildingLegacyPlugin implements Plugin { } project.task('halfPhoneUnitFileMaker', type: PhoneUnitFileMaker) { + group = 'MaryTTS Voicebuilding Legacy' basenamesFile = project.basenames.destFile srcDir = project.splitPhoneLabelsIntoHalfPhones.destDir srcExt = 'hplab' @@ -55,10 +60,12 @@ class VoicebuildingLegacyPlugin implements Plugin { } def featureListerTask = project.task('featureLister', type: FeatureListerTask) { + group = 'MaryTTS Voicebuilding Legacy' destFile = project.legacyBuildDir.get().file('features.txt') } def phoneUnitFeatureListerTask = project.task('phoneUnitFeatureLister', type: PhoneUnitFeatureLister) { + group = 'MaryTTS Voicebuilding Legacy' srcFile = featureListerTask.destFile destFile = project.layout.buildDirectory.file('phoneUnitFeatures.txt') featureToListFirst = 'phone' @@ -66,6 +73,7 @@ class VoicebuildingLegacyPlugin implements Plugin { } project.task('phoneUnitFeatureComputer', type: MaryInterfaceBatchTask) { + group = 'MaryTTS Voicebuilding Legacy' srcDir = project.alignLabelsWithPrompts.destDir destDir = project.layout.buildDirectory.dir('phonefeatures') inputType = 'ALLOPHONES' @@ -76,18 +84,21 @@ class VoicebuildingLegacyPlugin implements Plugin { } project.task('generatePhoneFeatureDefinitionFile', type: GeneratePhoneFeatureDefinitionFile) { + group = 'MaryTTS Voicebuilding Legacy' srcDir = project.phoneUnitFeatureComputer.destDir srcExt = project.phoneUnitFeatureComputer.outputExt destFile = project.legacyBuildDir.get().file('phoneUnitFeatureDefinition.txt') } def halfPhoneUnitFeatureListerTask = project.task('halfPhoneUnitFeatureLister', type: PhoneUnitFeatureLister) { + group = 'MaryTTS Voicebuilding Legacy' srcFile = featureListerTask.destFile destFile = project.layout.buildDirectory.file('halfPhoneUnitFeatures.txt') featureToListFirst = 'halfphone_unitname' } project.task('halfPhoneUnitFeatureComputer', type: MaryInterfaceBatchTask) { + group = 'MaryTTS Voicebuilding Legacy' dependsOn featureListerTask srcDir = project.alignLabelsWithPrompts.destDir destDir = project.layout.buildDirectory.dir('halfphonefeatures') @@ -99,12 +110,14 @@ class VoicebuildingLegacyPlugin implements Plugin { } project.task('generateHalfPhoneFeatureDefinitionFile', type: GeneratePhoneFeatureDefinitionFile) { + group = 'MaryTTS Voicebuilding Legacy' srcDir = project.halfPhoneUnitFeatureComputer.destDir srcExt = project.halfPhoneUnitFeatureComputer.outputExt destFile = project.legacyBuildDir.get().file('halfphoneUnitFeatureDefinition.txt') } project.task('makeBasenameDatagrams', type: MakeBasenameDatagrams) { + group = 'MaryTTS Voicebuilding Legacy' basenamesFile = project.basenames.destFile sampleRate = project.marytts.voice.samplingRate pmDir = project.tasks.getByName('pitchmarkConverter').destDir @@ -112,6 +125,7 @@ class VoicebuildingLegacyPlugin implements Plugin { } project.task('basenameTimelineMaker', type: TimelineMaker) { + group = 'MaryTTS Voicebuilding Legacy' basenamesFile = project.basenames.destFile sampleRate = project.marytts.voice.samplingRate idxIntervalInSeconds = 2.0 @@ -120,6 +134,7 @@ class VoicebuildingLegacyPlugin implements Plugin { } project.task('makeWaveDatagrams', type: MakeWaveDatagrams) { + group = 'MaryTTS Voicebuilding Legacy' basenamesFile = project.basenames.destFile sampleRate = project.marytts.voice.samplingRate wavDir = project.wav.destDir @@ -128,6 +143,7 @@ class VoicebuildingLegacyPlugin implements Plugin { } project.task('waveTimelineMaker', type: TimelineMaker) { + group = 'MaryTTS Voicebuilding Legacy' basenamesFile = project.basenames.destFile sampleRate = project.marytts.voice.samplingRate idxIntervalInSeconds = 0.1 @@ -136,6 +152,7 @@ class VoicebuildingLegacyPlugin implements Plugin { } project.task('makeMcepDatagrams', type: MakeMcepDatagrams) { + group = 'MaryTTS Voicebuilding Legacy' basenamesFile = project.basenames.destFile sampleRate = project.marytts.voice.samplingRate mcepDir = project.mcepExtractor.destDir @@ -143,11 +160,13 @@ class VoicebuildingLegacyPlugin implements Plugin { } project.task('generateMcepTimelineHeader', type: GenerateMcepTimelineHeader) { + group = 'MaryTTS Voicebuilding Legacy' srcDir = project.mcepExtractor.destDir destFile = project.legacyBuildDir.get().file('timeline_mcep.properties') } project.task('mcepTimelineMaker', type: McepTimelineMaker) { + group = 'MaryTTS Voicebuilding Legacy' basenamesFile = project.basenames.destFile headerFile = project.generateMcepTimelineHeader.destFile sampleRate = project.marytts.voice.samplingRate @@ -157,6 +176,7 @@ class VoicebuildingLegacyPlugin implements Plugin { } project.task('phoneFeatureFileMaker', type: PhoneFeatureFileMaker) { + group = 'MaryTTS Voicebuilding Legacy' basenamesFile = project.basenames.destFile srcDir = project.phoneUnitFeatureComputer.destDir srcExt = project.phoneUnitFeatureComputer.outputExt @@ -166,6 +186,7 @@ class VoicebuildingLegacyPlugin implements Plugin { } project.task('halfPhoneFeatureFileMaker', type: PhoneFeatureFileMaker) { + group = 'MaryTTS Voicebuilding Legacy' basenamesFile = project.basenames.destFile srcDir = project.halfPhoneUnitFeatureComputer.destDir srcExt = project.halfPhoneUnitFeatureComputer.outputExt @@ -175,6 +196,7 @@ class VoicebuildingLegacyPlugin implements Plugin { } project.task('f0ContourFeatureFileMaker', type: F0ContourFeatureFileMaker) { + group = 'MaryTTS Voicebuilding Legacy' featureFile = project.halfPhoneFeatureFileMaker.destFile timelineFile = project.waveTimelineMaker.destFile unitFile = project.halfPhoneUnitFileMaker.destFile @@ -183,11 +205,13 @@ class VoicebuildingLegacyPlugin implements Plugin { } project.task('generateAcousticFeatureDefinitionFile', type: GenerateAcousticFeatureDefinitionFile) { + group = 'MaryTTS Voicebuilding Legacy' srcFile = project.halfPhoneFeatureFileMaker.destFile destFile = project.legacyBuildDir.get().file('halfphoneUnitFeatureDefinition_ac.txt') } project.task('acousticFeatureFileMaker', type: AcousticFeatureFileMaker) { + group = 'MaryTTS Voicebuilding Legacy' featureDefinitionFile = project.generateAcousticFeatureDefinitionFile.destFile unitFile = project.halfPhoneUnitFileMaker.destFile contourFile = project.f0ContourFeatureFileMaker.destFile @@ -196,10 +220,12 @@ class VoicebuildingLegacyPlugin implements Plugin { } project.task('generateJoinCostWeights', type: GenerateJoinCostWeights) { + group = 'MaryTTS Voicebuilding Legacy' destFile = project.legacyBuildDir.get().file('joinCostWeights.txt') } project.task('joinCostFileMaker', type: JoinCostFileMaker) { + group = 'MaryTTS Voicebuilding Legacy' weightsFile = project.generateJoinCostWeights.destFile mcepFile = project.mcepTimelineMaker.destFile unitFile = project.halfPhoneUnitFileMaker.destFile @@ -208,35 +234,41 @@ class VoicebuildingLegacyPlugin implements Plugin { } project.task('generateFeatureSequence', type: GenerateFeatureSequence) { + group = 'MaryTTS Voicebuilding Legacy' features = ['phone'] destFile = project.legacyBuildDir.get().file('featureSequence.txt') } project.task('cartBuilder', type: CartBuilder) { + group = 'MaryTTS Voicebuilding Legacy' featureFile = project.acousticFeatureFileMaker.destFile featureSequenceFile = project.generateFeatureSequence.destFile destFile = project.legacyBuildDir.get().file('cart.mry') } project.task('generateDurationFeatureDescription', type: GenerateProsodyFeatureDescription) { + group = 'MaryTTS Voicebuilding Legacy' srcFile = project.phoneFeatureFileMaker.destFile targetFeatures = ['segment_duration'] destFile = project.layout.buildDirectory.dir('prosody').get().file('dur.desc') } project.task('generateF0FeatureDescription', type: GenerateProsodyFeatureDescription) { + group = 'MaryTTS Voicebuilding Legacy' srcFile = project.phoneFeatureFileMaker.destFile targetFeatures = ['leftF0', 'midF0', 'rightF0'] destFile = project.layout.buildDirectory.dir('prosody').get().file('f0.desc') } project.task('extractDurationFeatures', type: ExtractDurationFeatures) { + group = 'MaryTTS Voicebuilding Legacy' unitFile = project.phoneUnitFileMaker.destFile featureFile = project.phoneFeatureFileMaker.destFile destFile = project.layout.buildDirectory.dir('prosody').get().file('dur.feats') } project.task('extractF0Features', type: ExtractF0Features) { + group = 'MaryTTS Voicebuilding Legacy' unitFile = project.phoneUnitFileMaker.destFile featureFile = project.phoneFeatureFileMaker.destFile timelineFile = project.waveTimelineMaker.destFile @@ -244,6 +276,7 @@ class VoicebuildingLegacyPlugin implements Plugin { } project.task('trainDurationCart', type: TrainProsodyCart) { + group = 'MaryTTS Voicebuilding Legacy' dataFile = project.extractDurationFeatures.destFile descriptionFile = project.generateDurationFeatureDescription.destFile predictee = 'segment_duration' @@ -251,6 +284,7 @@ class VoicebuildingLegacyPlugin implements Plugin { } project.task('trainF0LeftCart', type: TrainProsodyCart) { + group = 'MaryTTS Voicebuilding Legacy' dataFile = project.extractF0Features.destFile descriptionFile = project.generateF0FeatureDescription.destFile predictee = 'leftF0' @@ -259,6 +293,7 @@ class VoicebuildingLegacyPlugin implements Plugin { } project.task('trainF0MidCart', type: TrainProsodyCart) { + group = 'MaryTTS Voicebuilding Legacy' dataFile = project.extractF0Features.destFile descriptionFile = project.generateF0FeatureDescription.destFile predictee = 'midF0' @@ -267,6 +302,7 @@ class VoicebuildingLegacyPlugin implements Plugin { } project.task('trainF0RightCart', type: TrainProsodyCart) { + group = 'MaryTTS Voicebuilding Legacy' dataFile = project.extractF0Features.destFile descriptionFile = project.generateF0FeatureDescription.destFile predictee = 'rightF0' @@ -275,24 +311,28 @@ class VoicebuildingLegacyPlugin implements Plugin { } project.task('convertDurationCart', type: ConvertProsodyCart) { + group = 'MaryTTS Voicebuilding Legacy' srcFile = project.trainDurationCart.destFile featureFile = project.phoneFeatureFileMaker.destFile destFile = project.legacyBuildDir.get().file('dur.tree') } project.task('convertF0LeftCart', type: ConvertProsodyCart) { + group = 'MaryTTS Voicebuilding Legacy' srcFile = project.trainF0LeftCart.destFile featureFile = project.phoneFeatureFileMaker.destFile destFile = project.legacyBuildDir.get().file('f0.left.tree') } project.task('convertF0MidCart', type: ConvertProsodyCart) { + group = 'MaryTTS Voicebuilding Legacy' srcFile = project.trainF0MidCart.destFile featureFile = project.phoneFeatureFileMaker.destFile destFile = project.legacyBuildDir.get().file('f0.mid.tree') } project.task('convertF0RightCart', type: ConvertProsodyCart) { + group = 'MaryTTS Voicebuilding Legacy' srcFile = project.trainF0RightCart.destFile featureFile = project.phoneFeatureFileMaker.destFile destFile = project.legacyBuildDir.get().file('f0.right.tree') @@ -357,6 +397,7 @@ class VoicebuildingLegacyPlugin implements Plugin { } project.task('processLegacyResources', type: Copy) { + group = 'MaryTTS Voicebuilding Legacy' from project.waveTimelineMaker, project.basenameTimelineMaker, project.halfPhoneUnitFileMaker, @@ -377,6 +418,7 @@ class VoicebuildingLegacyPlugin implements Plugin { } def legacyZipTask = project.task('legacyZip', type: Zip) { + group = 'Publishing' from project.processLegacyResources from project.jar, { rename { "lib/$it" } @@ -385,6 +427,7 @@ class VoicebuildingLegacyPlugin implements Plugin { } project.task('legacyDescriptor', type: LegacyDescriptorTask) { + group = 'Publishing' srcFile = legacyZipTask.archiveFile def destFileName = legacyZipTask.archiveFileName.get() - '.zip' + '-component-descriptor.xml' destFile = project.distsDirectory.get().file(destFileName) From f6c0ddd39dbafba645c32b48dd08f19e411f9498 Mon Sep 17 00:00:00 2001 From: Ingmar Steiner Date: Fri, 16 Dec 2022 20:56:23 +0100 Subject: [PATCH 22/41] Fix source generation logic, functional tests --- .../VoicebuildingBasePlugin.groovy | 26 +++------------ .../tasks/GenerateServiceLoader.groovy | 16 ---------- .../tasks/GenerateVoiceSource.groovy | 32 ------------------- .../tasks/LoadVoiceIT.groovy | 0 .../VoiceConfigTest.java} | 0 .../BasePluginFunctionalTest.groovy | 1 - ...basePluginFunctionalTestBuildScript.gradle | 13 +++----- 7 files changed, 9 insertions(+), 79 deletions(-) delete mode 100644 src/main/groovy/de/dfki/mary/voicebuilding/tasks/GenerateServiceLoader.groovy delete mode 100644 src/main/groovy/de/dfki/mary/voicebuilding/tasks/GenerateVoiceSource.groovy rename src/main/resources/de/dfki/mary/{voicebuilding => }/tasks/LoadVoiceIT.groovy (100%) rename src/main/resources/de/dfki/mary/{voicebuilding/tasks/ConfigTest.java => tasks/VoiceConfigTest.java} (100%) diff --git a/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingBasePlugin.groovy b/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingBasePlugin.groovy index 9da5f14..9869d53 100644 --- a/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingBasePlugin.groovy +++ b/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingBasePlugin.groovy @@ -2,7 +2,6 @@ package de.dfki.mary.voicebuilding import de.dfki.mary.ComponentPlugin -import de.dfki.mary.voicebuilding.tasks.GenerateVoiceSource import de.dfki.mary.voicebuilding.tasks.GenerateVoiceConfig import org.gradle.api.Plugin import org.gradle.api.Project @@ -12,7 +11,6 @@ import org.gradle.api.publish.maven.MavenPublication import org.gradle.api.publish.maven.plugins.MavenPublishPlugin import org.gradle.api.tasks.JavaExec import org.gradle.api.tasks.WriteProperties -import org.gradle.api.tasks.testing.Test class VoicebuildingBasePlugin implements Plugin { @@ -51,32 +49,18 @@ class VoicebuildingBasePlugin implements Plugin { group = 'MaryTTS Voicebuilding Base' } - project.tasks.register 'generateVoiceSource', GenerateVoiceSource, { - group = 'MaryTTS Voicebuilding Base' - dependsOn "generateSource", "generateConfig" - testDirectory = project.file("$project.buildDir/generatedSrc/test/groovy/voice") - integrationTestDirectory = project.file("$project.buildDir/generatedSrc/integrationTest/groovy/voice") + project.tasks.named('unpackTestSourceTemplates').configure { + resourceNames.add 'VoiceConfigTest.java' + } + project.tasks.named('unpackIntegrationTestSourceTemplates').configure { + resourceNames.add 'LoadVoiceIT.groovy' } project.generateConfig { dependsOn project.tasks.named("generateVoiceConfig") } - project.sourceSets { - test { - groovy { - srcDirs += project.generateVoiceSource.testDirectory.get() - } - } - integrationTest { - groovy { - srcDirs += project.generateVoiceSource.integrationTestDirectory.get() - } - } - } - - project.publishing { publications { mavenJava(MavenPublication) { diff --git a/src/main/groovy/de/dfki/mary/voicebuilding/tasks/GenerateServiceLoader.groovy b/src/main/groovy/de/dfki/mary/voicebuilding/tasks/GenerateServiceLoader.groovy deleted file mode 100644 index 09ca235..0000000 --- a/src/main/groovy/de/dfki/mary/voicebuilding/tasks/GenerateServiceLoader.groovy +++ /dev/null @@ -1,16 +0,0 @@ -package de.dfki.mary.voicebuilding.tasks - -import org.gradle.api.DefaultTask -import org.gradle.api.file.RegularFileProperty -import org.gradle.api.tasks.* - -class GenerateServiceLoader extends DefaultTask { - - @OutputFile - final RegularFileProperty destFile = project.objects.fileProperty() - - @TaskAction - void generate() { - destFile.get().asFile.text = "marytts.voice.${project.marytts.voice.nameCamelCase}.Config" - } -} diff --git a/src/main/groovy/de/dfki/mary/voicebuilding/tasks/GenerateVoiceSource.groovy b/src/main/groovy/de/dfki/mary/voicebuilding/tasks/GenerateVoiceSource.groovy deleted file mode 100644 index 8da4f77..0000000 --- a/src/main/groovy/de/dfki/mary/voicebuilding/tasks/GenerateVoiceSource.groovy +++ /dev/null @@ -1,32 +0,0 @@ -package de.dfki.mary.voicebuilding.tasks - -import org.gradle.api.DefaultTask -import org.gradle.api.file.DirectoryProperty -import org.gradle.api.tasks.* - -class GenerateVoiceSource extends DefaultTask { - - @OutputDirectory - final DirectoryProperty testDirectory = project.objects.directoryProperty() - - @OutputDirectory - final DirectoryProperty integrationTestDirectory = project.objects.directoryProperty() - - @TaskAction - void generate() { - def engine = new groovy.text.GStringTemplateEngine() - def binding = [ project: project ] - - def templateStream = new InputStreamReader(getClass().getResourceAsStream('ConfigTest.java')) - def template = engine.createTemplate(templateStream).make(binding) - def configTestFile = new File(testDirectory.get().asFile, "${project.marytts.component.packagePath}/VoiceConfigTest.groovy") - configTestFile.parentFile.mkdirs() - configTestFile.text = template.toString() - - templateStream = new InputStreamReader(getClass().getResourceAsStream('LoadVoiceIT.groovy')) - template = engine.createTemplate(templateStream).make(binding) - def integrationTestFile = new File(integrationTestDirectory.get().asFile, "${project.marytts.component.packagePath}/LoadVoiceIT.groovy") - integrationTestFile.parentFile.mkdirs() - integrationTestFile.text = template.toString() - } -} diff --git a/src/main/resources/de/dfki/mary/voicebuilding/tasks/LoadVoiceIT.groovy b/src/main/resources/de/dfki/mary/tasks/LoadVoiceIT.groovy similarity index 100% rename from src/main/resources/de/dfki/mary/voicebuilding/tasks/LoadVoiceIT.groovy rename to src/main/resources/de/dfki/mary/tasks/LoadVoiceIT.groovy diff --git a/src/main/resources/de/dfki/mary/voicebuilding/tasks/ConfigTest.java b/src/main/resources/de/dfki/mary/tasks/VoiceConfigTest.java similarity index 100% rename from src/main/resources/de/dfki/mary/voicebuilding/tasks/ConfigTest.java rename to src/main/resources/de/dfki/mary/tasks/VoiceConfigTest.java diff --git a/src/test/groovy/de/dfki/mary/voicebuilding/BasePluginFunctionalTest.groovy b/src/test/groovy/de/dfki/mary/voicebuilding/BasePluginFunctionalTest.groovy index 1e0801e..be1ce1e 100644 --- a/src/test/groovy/de/dfki/mary/voicebuilding/BasePluginFunctionalTest.groovy +++ b/src/test/groovy/de/dfki/mary/voicebuilding/BasePluginFunctionalTest.groovy @@ -54,7 +54,6 @@ class BasePluginFunctionalTest { ['testVoiceProps', false], ['testJavaCompatibility', false], ['generateConfig', false], - ['generateVoiceSource', false], ['compileJava', true], ['compileTestGroovy', true], ['compileIntegrationTestGroovy', true], diff --git a/src/test/resources/de/dfki/mary/voicebuilding/basePluginFunctionalTestBuildScript.gradle b/src/test/resources/de/dfki/mary/voicebuilding/basePluginFunctionalTestBuildScript.gradle index cc16b18..e14dabc 100644 --- a/src/test/resources/de/dfki/mary/voicebuilding/basePluginFunctionalTestBuildScript.gradle +++ b/src/test/resources/de/dfki/mary/voicebuilding/basePluginFunctionalTestBuildScript.gradle @@ -54,13 +54,6 @@ task testJavaCompatibility(group: 'Verification') { } } -task testGenerateVoiceSource(group: 'Verification') { - dependsOn generateSource - doLast { - // TODO: assert file("$buildDir/generatedSrc/main/java/marytts/voice/$marytts.voice.nameCamelCase/Config.java").exists() - } -} - task testCompileJava(group: 'Verification') { dependsOn compileJava doLast { @@ -72,14 +65,16 @@ task testCompileJava(group: 'Verification') { task testCompileTestGroovy(group: 'Verification') { dependsOn compileTestGroovy doLast { - assert file("$buildDir/classes/groovy/test/marytts/voice/$marytts.voice.nameCamelCase/ConfigTest.class").exists() + assert fileTree(sourceSets.test.groovy.classesDirectory) + .contains(file("$buildDir/classes/groovy/test/marytts/voice/$marytts.voice.nameCamelCase/VoiceConfigTest.class")) } } task testCompileIntegrationTestGroovy(group: 'Verification') { dependsOn compileIntegrationTestGroovy doLast { - assert file("$buildDir/classes/groovy/integrationTest/marytts/voice/$marytts.voice.nameCamelCase/LoadVoiceIT.class").exists() + assert fileTree(sourceSets.integrationTest.groovy.classesDirectory) + .contains(file("$buildDir/classes/groovy/integrationTest/marytts/voice/$marytts.voice.nameCamelCase/LoadVoiceIT.class")) } } From 50b9a7773063ac029ce8ac9514cffe11b129e4e4 Mon Sep 17 00:00:00 2001 From: Ingmar Steiner Date: Fri, 16 Dec 2022 21:09:40 +0100 Subject: [PATCH 23/41] Fix dependency scope, POM generation functional test --- .../VoicebuildingBasePlugin.groovy | 16 +++++++++------- .../basePluginFunctionalTestBuildScript.gradle | 18 +++++++++--------- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingBasePlugin.groovy b/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingBasePlugin.groovy index 9869d53..08200a6 100644 --- a/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingBasePlugin.groovy +++ b/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingBasePlugin.groovy @@ -35,7 +35,7 @@ class VoicebuildingBasePlugin implements Plugin { } project.dependencies { - api group: 'de.dfki.mary', name: "marytts-lang-$project.marytts.voice.language", version: project.marytts.version, { + runtimeOnly group: 'de.dfki.mary', name: "marytts-lang-$project.marytts.voice.language", version: project.marytts.version, { exclude group: '*', module: 'groovy-all' exclude group: 'com.twmacinta', module: 'fast-md5' exclude group: 'gov.nist.math', module: 'Jampack' @@ -65,12 +65,14 @@ class VoicebuildingBasePlugin implements Plugin { publications { mavenJava(MavenPublication) { from project.components.java - pom { - description = project.marytts.voice.description - licenses { - license { - name = project.marytts.voice.license.name - url = project.marytts.voice.license.url + project.afterEvaluate { + pom { + description = project.marytts.voice.description + licenses { + license { + name = project.marytts.voice.license.name + url = project.marytts.voice.license.url + } } } } diff --git a/src/test/resources/de/dfki/mary/voicebuilding/basePluginFunctionalTestBuildScript.gradle b/src/test/resources/de/dfki/mary/voicebuilding/basePluginFunctionalTestBuildScript.gradle index e14dabc..3762669 100644 --- a/src/test/resources/de/dfki/mary/voicebuilding/basePluginFunctionalTestBuildScript.gradle +++ b/src/test/resources/de/dfki/mary/voicebuilding/basePluginFunctionalTestBuildScript.gradle @@ -124,7 +124,7 @@ task testGeneratePomFileForMavenJavaPublication(group: 'Verification') { def pomXml = new groovy.xml.StreamingMarkupBuilder().bind { project(xmlns: "http://maven.apache.org/POM/4.0.0", 'xmlns:xsi': "http://www.w3.org/2001/XMLSchema-instance", - 'xsi:schemaLocation': "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd") { + 'xsi:schemaLocation': "http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd") { modelVersion '4.0.0' groupId project.group artifactId projectDir.name @@ -144,16 +144,16 @@ task testGeneratePomFileForMavenJavaPublication(group: 'Verification') { scope 'compile' exclusions { exclusion { - artifactId 'groovy-all' - groupId '*' + artifactId 'Jampack' + groupId 'gov.nist.math' } exclusion { artifactId 'fast-md5' groupId 'com.twmacinta' } exclusion { - artifactId 'Jampack' - groupId 'gov.nist.math' + artifactId 'groovy-all' + groupId '*' } } } @@ -164,16 +164,16 @@ task testGeneratePomFileForMavenJavaPublication(group: 'Verification') { scope 'runtime' exclusions { exclusion { - artifactId 'groovy-all' - groupId '*' + artifactId 'Jampack' + groupId 'gov.nist.math' } exclusion { artifactId 'fast-md5' groupId 'com.twmacinta' } exclusion { - artifactId 'Jampack' - groupId 'gov.nist.math' + artifactId 'groovy-all' + groupId '*' } } } From 527633e8a7b351f24e5d9e8854c7f4c44563c20b Mon Sep 17 00:00:00 2001 From: Ingmar Steiner Date: Fri, 16 Dec 2022 21:11:18 +0100 Subject: [PATCH 24/41] Drop redundant plugins --- .../mary/voicebuilding/VoicebuildingBasePlugin.groovy | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingBasePlugin.groovy b/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingBasePlugin.groovy index 08200a6..ed9e242 100644 --- a/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingBasePlugin.groovy +++ b/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingBasePlugin.groovy @@ -5,8 +5,6 @@ import de.dfki.mary.ComponentPlugin import de.dfki.mary.voicebuilding.tasks.GenerateVoiceConfig import org.gradle.api.Plugin import org.gradle.api.Project -import org.gradle.api.plugins.GroovyPlugin -import org.gradle.api.plugins.JavaLibraryPlugin import org.gradle.api.publish.maven.MavenPublication import org.gradle.api.publish.maven.plugins.MavenPublishPlugin import org.gradle.api.tasks.JavaExec @@ -16,10 +14,8 @@ class VoicebuildingBasePlugin implements Plugin { @Override void apply(Project project) { - project.plugins.apply JavaLibraryPlugin - project.plugins.apply GroovyPlugin - project.plugins.apply MavenPublishPlugin - project.plugins.apply ComponentPlugin + project.plugins.apply(ComponentPlugin) + project.plugins.apply(MavenPublishPlugin) project.sourceCompatibility = '1.8' From a200c314f3c42493b65d989e587c7f9a227673e5 Mon Sep 17 00:00:00 2001 From: Ingmar Steiner Date: Fri, 16 Dec 2022 21:15:09 +0100 Subject: [PATCH 25/41] Tweak Groovy syntax, use Provider API --- .../voicebuilding/VoicebuildingBasePlugin.groovy | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingBasePlugin.groovy b/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingBasePlugin.groovy index ed9e242..27dffc9 100644 --- a/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingBasePlugin.groovy +++ b/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingBasePlugin.groovy @@ -19,8 +19,8 @@ class VoicebuildingBasePlugin implements Plugin { project.sourceCompatibility = '1.8' - project.marytts.extensions.create 'voice', VoiceExtension, project - project.marytts.voice.extensions.create 'license', VoiceLicenseExtension, project + project.marytts.extensions.create('voice', VoiceExtension, project) + project.marytts.voice.extensions.create('license', VoiceLicenseExtension, project) project.marytts { component { @@ -41,7 +41,7 @@ class VoicebuildingBasePlugin implements Plugin { integrationTestImplementation group: 'org.testng', name: 'testng', version: '7.5' } - project.tasks.register 'generateVoiceConfig', GenerateVoiceConfig, { + project.tasks.register('generateVoiceConfig', GenerateVoiceConfig) { group = 'MaryTTS Voicebuilding Base' } @@ -53,7 +53,7 @@ class VoicebuildingBasePlugin implements Plugin { resourceNames.add 'LoadVoiceIT.groovy' } - project.generateConfig { + project.tasks.named('generateConfig').configure { dependsOn project.tasks.named("generateVoiceConfig") } @@ -76,7 +76,7 @@ class VoicebuildingBasePlugin implements Plugin { } } - project.task('generatePomProperties', type: WriteProperties) { + project.tasks.register('generatePomProperties', WriteProperties) { group = 'MaryTTS Voicebuilding Base' outputFile = project.layout.buildDirectory.file('pom.properties') properties = [ @@ -86,7 +86,7 @@ class VoicebuildingBasePlugin implements Plugin { ] } - project.processResources { + project.tasks.named('processResources').configure { from project.generatePomProperties, { rename { "META-INF/maven/$project.group/voice-$project.marytts.voice.name/pom.xml" } } @@ -95,10 +95,10 @@ class VoicebuildingBasePlugin implements Plugin { } } - project.task('run', type: JavaExec) { + project.tasks.register('run', JavaExec) { group = 'MaryTTS Voicebuilding Base' classpath = project.configurations.runtimeClasspath + project.sourceSets.main.output - mainClass = 'marytts.server.Mary' + mainClass.set 'marytts.server.Mary' systemProperty 'log4j.logger.marytts', 'INFO,stderr' } } From abc9e1bffe984e9958a8a5aee5714a4d2d5f2ab5 Mon Sep 17 00:00:00 2001 From: Sebastien Le Maguer Date: Sun, 20 Sep 2020 09:35:26 +0200 Subject: [PATCH 26/41] Trying to ignore duration == -1 --- .../voicebuilding/tasks/F0ContourFeatureFileMaker.groovy | 7 ++++++- .../mary/voicebuilding/tasks/PhoneUnitFileMaker.groovy | 2 ++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/groovy/de/dfki/mary/voicebuilding/tasks/F0ContourFeatureFileMaker.groovy b/src/main/groovy/de/dfki/mary/voicebuilding/tasks/F0ContourFeatureFileMaker.groovy index 56158aa..75345bb 100644 --- a/src/main/groovy/de/dfki/mary/voicebuilding/tasks/F0ContourFeatureFileMaker.groovy +++ b/src/main/groovy/de/dfki/mary/voicebuilding/tasks/F0ContourFeatureFileMaker.groovy @@ -239,7 +239,9 @@ class F0ContourFeatureFileMaker extends DefaultTask { private List fitPolynomialsToSyllables(Sentence s, double[] logF0, int polynomOrder, UnitFileReader units) { List poly = new ArrayList(); for (Syllable syl : s) { + Pair syllableIndices = getSyllableIndicesInSentenceArray(s, syl, logF0.length, units); + double[] sylLogF0 = new double[syllableIndices.getSecond() - syllableIndices.getFirst()]; System.arraycopy(logF0, syllableIndices.getFirst(), sylLogF0, 0, sylLogF0.length); double[] coeffs = Polynomial.fitPolynomial(sylLogF0, polynomOrder); @@ -272,7 +274,10 @@ class F0ContourFeatureFileMaker extends DefaultTask { assert tsSylStart >= tsSentenceStart; long tsSylEnd = units.getUnit(syl.getLastUnitIndex()).startTime + units.getUnit(syl.getLastUnitIndex()).duration; assert tsSylEnd >= tsSylStart; - assert tsSylEnd <= tsSentenceEnd; + if (tsSylEnd > tsSentenceEnd) { + tsSylEnd = tsSentenceEnd; + } + // TODO: check if should be kept: assert tsSylEnd <= tsSentenceEnd; // Now map time to position in logF0 array: double factor = (double) arrayLength / (double) tsSentenceDuration; int iSylStart = (int) (factor * (tsSylStart - tsSentenceStart)); diff --git a/src/main/groovy/de/dfki/mary/voicebuilding/tasks/PhoneUnitFileMaker.groovy b/src/main/groovy/de/dfki/mary/voicebuilding/tasks/PhoneUnitFileMaker.groovy index 76f85ff..98b4720 100644 --- a/src/main/groovy/de/dfki/mary/voicebuilding/tasks/PhoneUnitFileMaker.groovy +++ b/src/main/groovy/de/dfki/mary/voicebuilding/tasks/PhoneUnitFileMaker.groovy @@ -54,9 +54,11 @@ class PhoneUnitFileMaker extends DefaultTask { unitStartSample = unitEndSample numUnits++ } + /* out.writeLong(utteranceEndSample + unitStartSample) out.writeInt(-1) numUnits++ + */ def utteranceEndTime = pm.timeSpan utteranceEndSample += (utteranceEndTime * sampleRate.get()) as long } From 7cf3d6fbdf4228059874fd6d3840ab4b7e207a9c Mon Sep 17 00:00:00 2001 From: Sebastien Le Maguer Date: Thu, 15 Oct 2020 09:03:30 +0200 Subject: [PATCH 27/41] Fix features/units pause misalaignment --- .../VoicebuildingLegacyPlugin.groovy | 2 +- .../tasks/PhoneUnitFileMaker.groovy | 25 +++++++++++++------ .../tasks/ProcessPhoneLabels.groovy | 6 ++++- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingLegacyPlugin.groovy b/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingLegacyPlugin.groovy index d17e44c..aa7b71f 100644 --- a/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingLegacyPlugin.groovy +++ b/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingLegacyPlugin.groovy @@ -27,7 +27,7 @@ class VoicebuildingLegacyPlugin implements Plugin { project.task('alignLabelsWithPrompts', type: AlignLabelsWithPrompts) { group = 'MaryTTS Voicebuilding Legacy' basenamesFile = project.basenames.destFile - labDir = project.layout.buildDirectory.dir('lab') + labDir = project.tasks.getByName("processPhoneLabels").destDir maryXmlDir = project.tasks.getByName('generateAllophones').destDir destDir = project.layout.buildDirectory.dir('allophones') } diff --git a/src/main/groovy/de/dfki/mary/voicebuilding/tasks/PhoneUnitFileMaker.groovy b/src/main/groovy/de/dfki/mary/voicebuilding/tasks/PhoneUnitFileMaker.groovy index 98b4720..f0fa0d4 100644 --- a/src/main/groovy/de/dfki/mary/voicebuilding/tasks/PhoneUnitFileMaker.groovy +++ b/src/main/groovy/de/dfki/mary/voicebuilding/tasks/PhoneUnitFileMaker.groovy @@ -36,29 +36,40 @@ class PhoneUnitFileMaker extends DefaultTask { def out = new DataOutputStream(baos) def utteranceEndSample = 0 def numUnits = 0 + basenamesFile.get().asFile.eachLine('UTF-8') { basename -> def pmFile = pmDir.file("${basename}.pm").get().asFile def pm = new ESTTrackReader(pmFile.path) + + // Insert start edge out.writeLong(utteranceEndSample) out.writeInt(-1) numUnits++ + def srcFile = srcDir.file("${basename}.${srcExt.get()}").get().asFile def unitStartSample = 0 labSerializer.fromString(srcFile.text).tiers[0].annotations.each { segment -> def unitEndTime = pm.getClosestTime(segment.end) def unitEndSample = (unitEndTime * sampleRate.get()) as long def unitNumSamples = unitEndSample - unitStartSample - // TODO: skip units with zero duration - out.writeLong(utteranceEndSample + unitStartSample) - out.writeInt(unitNumSamples as int) - unitStartSample = unitEndSample - numUnits++ + if (unitNumSamples > 0) { + out.writeLong(utteranceEndSample + unitStartSample) + out.writeInt(unitNumSamples as int) + unitStartSample = unitEndSample + numUnits++ + } else { // skip units with zero duration + println("$basename, $segment => ${unitNumSamples}") + out.writeLong(utteranceEndSample + unitStartSample) + out.writeInt(unitNumSamples as int) + unitStartSample = unitEndSample + numUnits++ + } } - /* + out.writeLong(utteranceEndSample + unitStartSample) out.writeInt(-1) numUnits++ - */ + def utteranceEndTime = pm.timeSpan utteranceEndSample += (utteranceEndTime * sampleRate.get()) as long } diff --git a/src/main/groovy/de/dfki/mary/voicebuilding/tasks/ProcessPhoneLabels.groovy b/src/main/groovy/de/dfki/mary/voicebuilding/tasks/ProcessPhoneLabels.groovy index 3d33d88..bf221f2 100644 --- a/src/main/groovy/de/dfki/mary/voicebuilding/tasks/ProcessPhoneLabels.groovy +++ b/src/main/groovy/de/dfki/mary/voicebuilding/tasks/ProcessPhoneLabels.groovy @@ -28,17 +28,21 @@ class ProcessPhoneLabels extends DefaultTask { basenamesFile.get().asFile.eachLine('UTF-8') { basename -> def srcFile = srcDir.file("${basename}.lab").get().asFile def phoneTier = labSerializer.fromString(srcFile.getText('UTF-8')).tiers.first() + + // merge duplicate pauses def phoneIterator = phoneTier.annotations.listIterator() def phone = phoneIterator.next() while (phoneIterator.hasNext()) { def nextPhone = phoneIterator.next() - // merge duplicate pauses if (phone.text == nextPhone.text && phone.text == '_') { phone.end = nextPhone.end phoneIterator.remove() } + phone = nextPhone } + + destDir.file("${basename}.lab").get().asFile.withWriter('UTF-8') { dest -> def textGrid = new TextGrid(phoneTier.start, phoneTier.end, [phoneTier]) dest << labSerializer.toString(textGrid, tierName) From 495273d659e3b4466037ad03d6e97f1ce6473443 Mon Sep 17 00:00:00 2001 From: Ingmar Steiner Date: Sun, 18 Dec 2022 08:42:21 +0100 Subject: [PATCH 28/41] Fix dependencies, POM metadata via configuration in afterEvaluate block --- .../VoicebuildingBasePlugin.groovy | 37 +++++++++++-------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingBasePlugin.groovy b/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingBasePlugin.groovy index 27dffc9..17376bf 100644 --- a/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingBasePlugin.groovy +++ b/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingBasePlugin.groovy @@ -7,6 +7,7 @@ import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.api.publish.maven.MavenPublication import org.gradle.api.publish.maven.plugins.MavenPublishPlugin +import org.gradle.api.publish.maven.tasks.GenerateMavenPom import org.gradle.api.tasks.JavaExec import org.gradle.api.tasks.WriteProperties @@ -31,11 +32,6 @@ class VoicebuildingBasePlugin implements Plugin { } project.dependencies { - runtimeOnly group: 'de.dfki.mary', name: "marytts-lang-$project.marytts.voice.language", version: project.marytts.version, { - exclude group: '*', module: 'groovy-all' - exclude group: 'com.twmacinta', module: 'fast-md5' - exclude group: 'gov.nist.math', module: 'Jampack' - } testImplementation group: 'junit', name: 'junit', version: '4.13.2' integrationTestImplementation localGroovy() integrationTestImplementation group: 'org.testng', name: 'testng', version: '7.5' @@ -61,17 +57,6 @@ class VoicebuildingBasePlugin implements Plugin { publications { mavenJava(MavenPublication) { from project.components.java - project.afterEvaluate { - pom { - description = project.marytts.voice.description - licenses { - license { - name = project.marytts.voice.license.name - url = project.marytts.voice.license.url - } - } - } - } } } } @@ -101,5 +86,25 @@ class VoicebuildingBasePlugin implements Plugin { mainClass.set 'marytts.server.Mary' systemProperty 'log4j.logger.marytts', 'INFO,stderr' } + + project.afterEvaluate { + project.dependencies { + runtimeOnly group: 'de.dfki.mary', name: "marytts-lang-$project.marytts.voice.language", version: project.marytts.version, { + exclude group: '*', module: 'groovy-all' + exclude group: 'com.twmacinta', module: 'fast-md5' + exclude group: 'gov.nist.math', module: 'Jampack' + } + } + + project.tasks.withType(GenerateMavenPom).configureEach { + pom.description = project.marytts.voice.description + pom.licenses { + license { + name = project.marytts.voice.license.name + url = project.marytts.voice.license.url + } + } + } + } } } From ded47810e03c9ac91dd37025945c6838360c87a3 Mon Sep 17 00:00:00 2001 From: Ingmar Steiner Date: Sun, 18 Dec 2022 09:23:40 +0100 Subject: [PATCH 29/41] Upgrade to latest component plugin snapshot, resolve from OSSRH --- build.gradle | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 0536165..fa35549 100644 --- a/build.gradle +++ b/build.gradle @@ -70,6 +70,17 @@ repositories { includeGroup 'de.dfki.lt.jtok' } } + exclusiveContent { + forRepository { + maven { + name 'OSSRH-snapshots' + url 'https://oss.sonatype.org/content/repositories/snapshots' + } + } + filter { + includeModule 'de.dfki.mary', 'gradle-marytts-component-plugin' + } + } } dependencies { @@ -79,7 +90,7 @@ dependencies { exclude group: 'com.twmacinta', module: 'fast-md5' exclude group: 'gov.nist.math', module: 'Jampack' } - implementation group: 'de.dfki.mary', name: 'gradle-marytts-component-plugin', version: '0.3.0' + implementation group: 'de.dfki.mary', name: 'gradle-marytts-component-plugin', version: '0.4.0-SNAPSHOT' implementation group: 'io.github.m2ci-msp', name: 'gradle-praat-wrapper-plugin', version: '0.7.0' implementation group: 'io.github.m2ci-msp', name: 'jtgt', version: '0.7.0' testImplementation group: 'org.testng', name: 'testng', version: '7.5' From 41bd08445a5111bca8f6ba6909f1defd198ab322 Mon Sep 17 00:00:00 2001 From: Ingmar Steiner Date: Wed, 11 Jan 2023 05:33:42 +0100 Subject: [PATCH 30/41] Resolve latest marytts-voicebuilding snapshot from OSSRH --- .../voicebuilding/VoicebuildingDataPlugin.groovy | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingDataPlugin.groovy b/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingDataPlugin.groovy index a656ea2..459c72d 100644 --- a/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingDataPlugin.groovy +++ b/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingDataPlugin.groovy @@ -22,6 +22,19 @@ class VoicebuildingDataPlugin implements Plugin { create 'data' } + project.repositories { + exclusiveContent { + forRepository { + maven { + url 'https://oss.sonatype.org/content/repositories/snapshots' + } + } + filter { + includeModule 'de.dfki.mary', 'marytts-voicebuilding' + } + } + } + project.dependencies { project.afterEvaluate { marytts group: 'de.dfki.mary', name: "marytts-lang-$project.marytts.voice.locale.language", version: project.marytts.version, { @@ -30,7 +43,7 @@ class VoicebuildingDataPlugin implements Plugin { exclude group: 'gov.nist.math', module: 'Jampack' } } - marytts group: 'de.dfki.mary', name: 'marytts-voicebuilding', version: '0.2.0' + marytts group: 'de.dfki.mary', name: 'marytts-voicebuilding', version: '0.3.0-SNAPSHOT' } def templateTask = project.task('templates', type: CopyClasspathResources) { From 64f45b342520162ca115c120ae1aa7e68727beb2 Mon Sep 17 00:00:00 2001 From: Ingmar Steiner Date: Wed, 11 Jan 2023 05:34:23 +0100 Subject: [PATCH 31/41] Fix JavaExec errors under Java 17 --- .../mary/voicebuilding/tasks/FeatureListerTask.groovy | 8 ++++++++ .../voicebuilding/tasks/MaryInterfaceBatchTask.groovy | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/src/main/groovy/de/dfki/mary/voicebuilding/tasks/FeatureListerTask.groovy b/src/main/groovy/de/dfki/mary/voicebuilding/tasks/FeatureListerTask.groovy index 0cc5b57..fcc815d 100644 --- a/src/main/groovy/de/dfki/mary/voicebuilding/tasks/FeatureListerTask.groovy +++ b/src/main/groovy/de/dfki/mary/voicebuilding/tasks/FeatureListerTask.groovy @@ -1,6 +1,7 @@ package de.dfki.mary.voicebuilding.tasks import org.gradle.api.DefaultTask +import org.gradle.api.JavaVersion import org.gradle.api.file.RegularFileProperty import org.gradle.api.tasks.OutputFile import org.gradle.api.tasks.TaskAction @@ -19,6 +20,13 @@ class FeatureListerTask extends DefaultTask { locale : project.marytts.voice.maryLocale, outputFile: destFile.get().asFile ] + if (JavaVersion.current().java9Compatible) { + jvmArgs = [ + '--add-opens', 'java.base/java.io=ALL-UNNAMED', + '--add-opens', 'java.base/java.lang=ALL-UNNAMED', + '--add-opens', 'java.base/java.util=ALL-UNNAMED' + ] + } } } } diff --git a/src/main/groovy/de/dfki/mary/voicebuilding/tasks/MaryInterfaceBatchTask.groovy b/src/main/groovy/de/dfki/mary/voicebuilding/tasks/MaryInterfaceBatchTask.groovy index 03df0d5..b28946c 100644 --- a/src/main/groovy/de/dfki/mary/voicebuilding/tasks/MaryInterfaceBatchTask.groovy +++ b/src/main/groovy/de/dfki/mary/voicebuilding/tasks/MaryInterfaceBatchTask.groovy @@ -2,6 +2,7 @@ package de.dfki.mary.voicebuilding.tasks import groovy.json.JsonBuilder import org.gradle.api.DefaultTask +import org.gradle.api.JavaVersion import org.gradle.api.file.DirectoryProperty import org.gradle.api.file.RegularFileProperty import org.gradle.api.provider.ListProperty @@ -69,6 +70,13 @@ class MaryInterfaceBatchTask extends DefaultTask { mainClass = 'marytts.BatchProcessor' args batchFile systemProperties << maryttsProperties.getOrElse([:]) + if (JavaVersion.current().java9Compatible) { + jvmArgs = [ + '--add-opens', 'java.base/java.io=ALL-UNNAMED', + '--add-opens', 'java.base/java.lang=ALL-UNNAMED', + '--add-opens', 'java.base/java.util=ALL-UNNAMED' + ] + } } } } From e4ed1248504200ac3b158158283c12435f321478 Mon Sep 17 00:00:00 2001 From: Ingmar Steiner Date: Wed, 11 Jan 2023 11:59:42 +0100 Subject: [PATCH 32/41] Upgrade marytts-voicebuilding to latest release This reverts commit 41bd08445a5111bca8f6ba6909f1defd198ab322. --- .../voicebuilding/VoicebuildingDataPlugin.groovy | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingDataPlugin.groovy b/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingDataPlugin.groovy index 459c72d..dcfcab7 100644 --- a/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingDataPlugin.groovy +++ b/src/main/groovy/de/dfki/mary/voicebuilding/VoicebuildingDataPlugin.groovy @@ -22,19 +22,6 @@ class VoicebuildingDataPlugin implements Plugin { create 'data' } - project.repositories { - exclusiveContent { - forRepository { - maven { - url 'https://oss.sonatype.org/content/repositories/snapshots' - } - } - filter { - includeModule 'de.dfki.mary', 'marytts-voicebuilding' - } - } - } - project.dependencies { project.afterEvaluate { marytts group: 'de.dfki.mary', name: "marytts-lang-$project.marytts.voice.locale.language", version: project.marytts.version, { @@ -43,7 +30,7 @@ class VoicebuildingDataPlugin implements Plugin { exclude group: 'gov.nist.math', module: 'Jampack' } } - marytts group: 'de.dfki.mary', name: 'marytts-voicebuilding', version: '0.3.0-SNAPSHOT' + marytts group: 'de.dfki.mary', name: 'marytts-voicebuilding', version: '0.2.1' } def templateTask = project.task('templates', type: CopyClasspathResources) { From 36ad1b591c9515457b3db7a3df7dcc39d9d3eefa Mon Sep 17 00:00:00 2001 From: Ingmar Steiner Date: Sat, 20 Jan 2024 15:53:26 +0100 Subject: [PATCH 33/41] Upgradle to v7.6.3 --- gradle/wrapper/gradle-wrapper.jar | Bin 60756 -> 61624 bytes gradle/wrapper/gradle-wrapper.properties | 3 ++- gradlew | 12 ++++++++---- gradlew.bat | 1 + 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 249e5832f090a2944b7473328c07c9755baa3196..afba109285af78dbd2a1d187e33ac4f87c76e392 100644 GIT binary patch delta 36621 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%0A;APSd3WM%p;X}YQ z_l^I}#dN^i^EY{*M9rzRiDU#5HXb)Z8b{}B2E)#MG`cF4@`I><s*TzV;S1HvrWxlyO7oO14DFcLQgh*so92D&+67+aAtniim2ga9rPhDQ zk{QUeGX$XlQb=R}32^3-jQKdXDM+133PbX}J2D_#)W^8m9ZJF7tAc&Ab{ugStrHOnwtx3Fg8i1c|lre!Dq#SVt=9oBWO3ZoP`HZ?ns)JfQp_u z_q22vtfGHIL#?2!v&dv|evtlGrfU#J2_XOD6$k+W!uEd`4@P3>00XB*V~hYrS`2tM zKcK?N7>Y|sqsmV1fHm2|aHzc;OV|1iJV%Y3kKJES$)9BIzt#s~!u`Y+0!~v@_!QE~ z&wh`*b3U^^Tf2aOZ!qV;v{;TRF18BGyJ1O0CB{qb3UoGR!83_^n9ARWp~jxUg>u?g zzZV6&ab66bL>~QT0V$mWzh0?DefaVyW=^N!VLQwUMYW#DP+i!53}v-E{7}Q0`s_Wx zIb9`X5&YM1U-On=N6knhI>l7Avgw@A;mqzzZ(K`?isKWpr3ZC;e3^t`$FNX*C{WTu^$ASE{eH?gvpn`p%of@2g2}xHv<0W7wj2nc~r>oI>8zMLat{$ z1^5|(XXTa#rFA_^E~2Yl&$#!KYZ5X7hCWYGk2~kJEJ~>X_818co+TqE3)B#ueIt5s ze;t-bxL?2#K;lr^dYKoX|8+DDG&>(Rw}j30@&p}ZOQYYMl4ew#vJF-yyBa}ZhoQ80 z=<|1oC3%^S5(%urWvUDGaHt&+AANU->IC+sewp(y<0gButt>@FRA)W~nL3Pl9WS}j zGHOcg_oCMCMeopBU=7+K@gdiiLdok4m!^C+eOu!I*>g}hb`t>fe^J>={R!In4;4FT z5D?-2i%PSE7HloP5j?l!_9=EVx@097T+w^)wGkQ!$Qf-ii5_OMGAC-X@DUUsSI5U# zeWl~ae`0!jVg^!_q@QMLoNOb626Ye*i&GX14`PT+F)7=8oCV#IN_4v-*rRe}wKmv; zwzjOz7Lqei<=pN<)vmftsJ2(rXzRsKPOH`dQ|F!kKjYCdDLV4Y?3(u_=f>|u4{*Zo zWhnIhXad51TuIP!sC0g3_4Epej{EIburEgF=vQ!9|0;cQyUX!uFeL1HM|vnT7*-rDb}4) zmyM(<33E8a9wA}LTX~xS@snxcc%MLZw zbp~xN7Ee_gQ%ry=^w+fitUscP(->$mOqJ%9ZOukDlydd`j$l+&z4Z|T86xt<3OjJZ zl8H*>ws7#fSsG6LG+zF>07S^aT1>8xjw$km)u>hL0$y`Xj<8@%*qt=!p)$tHZO9{D zHWWCCwpFP1%o$iW*c1yXokQI3gXxM&I=-UStwm#oc^m+njrd%*F%OOr$v6{(sXH)D zJWGL6*sJPdd)r!4i&j+R`(9d&q=gR!vFc^Gfc`HQ#mPiIX`O>T+{LxB;J`-M1=P9T za(+l_4R0(m?-AEik18QF7nuJ>8x=b)A3kI={8EMODKq8kd>cDM5PBMB4rfJ@8uT!4 zhxfEIyBQ!muF?cWJSnjZ;hdxw0=AB80aqVi<}#O1nLv`ia**cql({=ZDhFe^HY~D+ zo>;#}eq_`fN?c2djV6cT8s&g4Fd|V$jbE)_w`#&7_*l$Ph=N-2Tn<%KoGj3EWxqEx zQu!e4`<#J4V5WI8p=H`PCR?Yn$7A`g;HN?*}hRffnY)o z-O-1o>}bZ3yXy~HI<#o+_Oe6xp~_S5v?Dwlsaq9ijiv z(h#5oH;bD3$ey6Z3lSNcA zvyzK;odts8GqzbSdorE}&Its4;LOr%rU7(LYZ9{vid6IYOVu(fp|i54we8PqaM>Z2 z;Gm^~$cPqnwk#iOb80p7cvDirC!;8$d85L-h|)L8I}C}>Vz?T)RR0KAf|R?CjP=*9 zTkKJ7+wV9XdB`}7IOOVO}PH@rE74bU%yG)s~s4lRdCtQM8YDH}}qNmsM zI{QSV40o3)C)FBH4cDjC!gr0er*_9+iov9$`InB3e-GKAiE3aqjckbr+oCFZCZ{+eXZ zeT4PaMA~IuPWs<}1+iW-BhDkPk*dC3sNp8k_9;S!8Ukb0kx@6?00T@;g?A0-QIx5o z-iuJStK4&!bW)?_u4GxN2KH@7E^4rN9bWN&U(BrGmuZ5yRq9g3K}=!O2$2BQz96Fm z2eIqKYzUU43)lLBm8y9$RzUa6;{(i{l*uIo=n8cRU6d(@j*ZY-;t z95pgMC)&FGq9!YVyP=^lRXBJCSh}(hqoIcA5V@CkrEP*;Sr)c9H z6yD8nr>M|F(BF(G=hpC{m5LneM^3iI5m^k-3zXYawp@zLKhw(%L-NV~;g?#$G0ggX zw^dJsTAC5#FXtYWh8v@ZBNE{Pq)LkwA(D*I9}*#Gh`&|x*=eGacQzuDbY{7K4@}Pi zkn!NQ^N;NMYYGdW1LFbUViIxR`7jWr`6px?DQ1)p526zjXN0QEeaJX9Qwhf}Cb*ci zQ;y~5+#%CoOZ%CWwrFbadx_SEu)~)fHn>m9Mcwpx+HJly!MXHfm{_?r2M@U=f7QAF zG|pnX&$b{JlHh&9@w~P^BiOZn2B|g_z?InxQHk}GFfWhPFrome+1p2InQ3Y+^-V4; z+)WbId~(`(=T|DOw->zc-?fxamA&gUjF8&g?|IIp5*{I7ZJ}^ZjkJsod3Tq~J~N7E zTf}RyFjjf6riRpc$}1aIMZy5b!I!U)7T%`p7UmanlQE>*>mU9#^TGR;ZrPokT@|Xa zu2!+lww;hdns@*>EdGvv57)WbJh7(O74UV`#uhX#Ly0dklY&imqvVx#o`uDyLwYkj z^yNZ#9$n{fnQ-L-r0m;xPR)ZUP~)+o7i9Y-;13LwC3sUQejBxLx{6*=g5~|Q|0bsQ zY+@z(_*WrTgx=0{>U(7>c(R4ORjJ9Eh^;A<1np*rW~u;Ug>%2K$|4jYRlVL5anI}k zq$-n-@wzi@|Y4`MA}bay!!@R-|;8~|6h z4R%ryUp+-PQF+(BV6xy) z*_gpA-j z5 z^y;xJisDk*8|880MAaWRjvUkb!g(;o}eTMw(dg`AKlJ;`@Z6sqJ@oSX5O>fN;d zVI0vUYg~@l+m3LTruWItnO9P4pVOutd+@uJd<@5THYPMlcLF2d9Od!lnIuZ|n6d#X zYyN(cI>@s${@YO~m`WcilP6&~5z#DRk;<_eJjB=!9eAKMCa(IyOdQ7it8AF7tky>)vpUw66+LJ#Rli7NgnGA*(ixf z?&B-#WZdL*$fQ*9w_mjOsaErp%zFShAI!D!n??hnexx^;wW)HTNZesr4MSO3)Rz=X zlBmc3|O{U45Dpt1Qp=0u$f**Y6a6>|iZ=zTwUab!E%Z$up z)GZnjS*|4RWvij>GifL9Kao~}Sf}O_&5e|4q37p46U%L$H}Kw&8#eCpaVG%HN%3^w zSkjrJihsP|agfhAe;gVjFP^9Mx)(+>N6dXbr~jo2Mw1r;r=RU9pKN5D@c^piAvF)< z1&qLDnMDVp`o{(!IG}Og8cPa8)q13^Ji*}8TNqZ*xkW$$75kK84Edewu+`P)A3* zd1(d+Xn#bpggu|MM;Tmif`HPXGpD;6*w~@|%X}SuJn@KTjm_-9mI&kyaiH|~A~iEZ z^zTXQ)w<7|Ja+{%bnnS*$(=&bPjKLfdFSm2zVG%I zbh@5i4)j0Uq=4~vV?vvr`Y~Pew2H*79L^Euik$YaS#zbPJyvooWMOC&r3{taggGv$ zNOQ;0t1FtmX0;*MmIokA2(u2FW#hyHtXzyIV!D&H(y7yU?=dpM@9(D@@`1p$D5@>S z7IuQ&-CuCVA3r3ZAFt3C3e&jeBfDSSXYl9oGkvjGE?288fU;6bBAoI}d__*W3KNJq zu0bGfP@3IXlvaZSEFo_-FKrqp)wgDBhv04H_#s^>%SEn;3tqpo1oT_40&lKfNdtzh1Blh` z1gzYEyAa*R3$-N}J1L_>{s{1_oY$_jhQsk1LQ`840wy;WpP_}hS2iq;h^?@l`6QmpwIzah%eMB+`l!|IEhl;)+c1LQzwqf`5* zk4&(H+^#0cGfL;Rw214`k2j_41?}fhdv zsm=_i(xjFk%n~<9vic{~b-jG{=FiK{_S)zN3BbRc!39{-_IMk7DXSG^H)v?j$ml#% zT{xjBe%79ZFJ7?BWpkWGYQC4wWs6WNpWYv)ZI13$ ze@hckYdO5tg`QARXZb}flc}SDW5aY zr~zP%;5Ujs?h}VtT?}T4&bP=|6T}Mx&v2^&s3Qqvn$4~|gY*U|4l!5yZ7yxO_RQ2> zwf60eSEjyUa$~9X^#>o?ZCcGe;a8rnM6=KE_VpINx%BY->(>-tPxgJ*q{rFb5EID{ zO3g5OO2|lfM*iFJ|6N*({kNB52T5l5M*uK!w^nyG@w9MtGqD%5wlK4^aAh*HH*s@I zRhRSK62}lk-$=Bl_pb=0vVkS@r_hXC#!?**NjfM~c3uihPH8b=bt!Ap)nOy&C8g*3 zjC@6II0MrLzU_fOf6@qDk2{`YHUEnC+4eojb2ECsxH0+xaVFe7N(@UM5>4KJO57X+~&A#46^X(v)Drirvz_DtT}Rl&i{9d zdrh};0@XXOVu@pTFDBeEQ80tSjmuVQt;LeV@KLDk!08#Pf5HzcQ{$?BJV2G++xZfj zS#mvwV91-qSx@!mNYbr&0G&rnB?<@^xLx&DHA?qW8qa_(?W_>ObWI$Hc{3|?ukIEJ zV46$GzZJZO6sYk@6@NEzXnb`-1r4w4;gsf9mGOQ$6a0Ib$bUSBzhBK$9O6vGmQyWh zGWf;PdnKo$K<3jh`SOXU^hskr{&oj0ydC>|$RTH*UoXz6gX!fL#x6u7sRh{2;E8XS zpDq|@c|v=2MEQe<>^PxYO*&|P+*M`mnYeu>ch_i(XWBm=~$Btu=2))jQmUFwK6KdeGmdz;k9YAP#v!RY&ucAeYzT zu*TU~*phYOxO84>y7q+gNCWW1EQ(V=M|M^jTcc{bogXGosOb)GMO0x47ppC+&!(wt(vg0tHE7i{bG^w97k@Y%6 zHqb3fvWf$@e3z8INEF3G3YF0(vSPAC=|by7vclXwD>TBn=*DKY$^j&UVH9*yAEIgA z+uX=sT;K=8{2Vtr70mEuS+T1!ojxt>lpc8@U-A*8-3k}ZbOa#^)f=27*lH~&&Y;-7 z@$CiWoiZmdVi7nWh?{At6Q6OH|A(t@3eJTG*R5A=+qP}nwr%TcyK39E+g01PZQJJg z_r5!OCYjtPGjHBJO6rMfEaMmMN8XHrX+ep;!W_JAsm7vc!P==Ga+)N3B8`rFuAwEm zH{&h}l^KBb)YY)bY51Qr-qB{dbG5KHCWUV!+~hxTZceB01d?pt;M{j4tm}2A4=^$C zDPjZ+3(7kv-4e~(c?SEIxN%*ABqM7(y9{o@Y2mmjgi+IK6|fa?b)OT>GM@U4rnnhG4tK+iD$f%m|9EyFsGsc0Ew8$(|i645ue~9oh214jbGDq=?h?$gk ztuCiYvcJJi@S=54f-C1V4Y<;*a^z&Len9^Rl};)+!EP+E6M+OLoJ37wPP%r}0KjF* zNs0&;%zM#Z`agrL)gCd}|O7?Ju(0i~=*Y`*y5tJS)%Ta}}i&xLBQ z?Ia>`b>6kmkfIxw#KKE!NCnxW=qfF;+LwuxDW z&*Mph98E-_4*NCuV&l;7iSb;WmRo49l>emd+K*8NR&0s-u4y!~@cT?OpnXF%8(B9eM>$%_MPk~3sXn#GkcZ#mP65_#QCnki+7`s{5nVrXN0Nmm5cb)K z8|XEseLiRogna&FpB5}il@S~PR=UWzpuh~~(^glF(M}&6t)(U^AUEz@6Cr=vQMh)) z^=Z95^iYS!ca;h;jn&t9PvyTVie+#8mQD03P$^&ddS{;I@W`Aqvq#g!@i!42?Sl8o zsvyj|vjdi7T0GHmNnbw#u)ZgsaSHLmML)S+$mGm0NAsS0tXgruBHP(-;h=Q981fys zi9<>0rO14cp38{}C^Hdge$PCul?jVS-*lNuFQiIFd#pVx5EgohZ!lI`?}+7Od0Mbb z2fGgm3O>W^_(3kTvV;xqDPWTPvCk&;iTt5k><~6#ZiGt3+7cvWX#yrIvL$?z6n~Dl z3zL4)i2R15d&6V;5|RWUr9 zXE8%HflO#A*UiFN3a%S)MsXx%+z&Ac9Rz0}j(dnQs}vLO*|kegtEAqwlAQT#ExbS2 z=aE;hH_9^s$^?6`OfaQO4vxx>@)bIB5$;{TOvJ#n=E~GL2O>?eRRTmEOBMFSFHZ?z z1jCrorO~U15So}wD?#?9Cc$Ei6WUV3s9flSs8KRhr{TKMV-`~7k+|Kf;&-LAvi=(S z`jN)Y(AEC$3E>?JPfp1kSKu5L5P_OM zt|#%oYoBNa8*{J?5bFX_2#q)_ft0QB7-FwG6dWsqgi4&gU(KXL5Xvf~Vo8 zYjXCmT4T*T%c$tu?Ob~mkx1u)lUuG@oR;OvfxC%T;slc0h&w4T%b0!bljE&k#fcd9OX+fSm{G)l5MJ*zRDQV5k%#A5|Wzgu>*!U#9O{3f8$Z)P*XA zqWsCniuP&+oMb#imZZmC+nT9C;MVPPjxs&bRE#l&VBt05<{8DB;KOjEbEP`!jl#v6 zZJD0g%zi0PH^?j;YW7p(rEbgR9J-i!Mjf)>Fb-|PVZmE$dV(Lj2(od4t*ADUk4lkZ zHT>2QV8-6$&b2VjB}j!TN-GhR*=HshESsi8qqEZhBA3|tmbX;t!bo-ERkM#K_b}n7 zXQsC_%{iYN{Id#4D=|(Zo0f3VY7iqiE@8JX3a{9mZsB{Hr{g>fBQ6+ZRn)7-=Xu#I zU;fh`Z~9HQUg2&dJP%L?i`a`R`^4?w$Q3;=Z9i`3ltwmlmQ*S!i|RHGW;Ay$Jn7)F zr-p+9cIm2N90neT$oXU|o}>da{qr2vq0h-+7kIWL9N3~pm+6S9z~uC(FOF8FctkSA z8xycTfVItG3LK;s83j!+i~>eI|BB;}LCEjXWe!$0;^6;~(aE~dsYtx>;C?`$OX<0t z4Ntw!;S)X}&L7iZinzH_aKgC_`41Vv_2ydutlu=EuR)_)2TCRUMKlh^ot7`jw|+6oegiA zq7gsQb%`L8WH}W}DhDrNSCpRrLN=W;x;@$c{(#2)<;1mSWR!v+8rCqkgt7fksnv=k z0#_!DU20t~h%LlkE=*rPbtp%9OH{dqxo(9@|2<5Cs!veL@Y4H#{JvrJsvq0`(ar%> zKtM!5Nd;#lfN59F#k(jC>k1&!ZabZEagy!17eElKN7*OG$9uKTcs8I!?Ms;D*ULBfKh=a01`KrfS z2TQgoe$cb`bG-cHgD&r;2zaMn#_0@mU&frnB6hx&17%cQeIij_1!3s-#0cGkQN!*T zm=kJ%+PgU&U8+!OCe^3{aoA>j?<|GaJ7j(8P!?4E(uWLu?U_kE(jPPwv^!}1^8$`{ z+LTLP-Px+4f@P2f?R|)l*%w6;9#wt`-_`H}rDO7Yy(;I%H}r5E9aMdaH9dwQ40oIxwGtWz(w2cbD3+9sUPd zUflyYv;n2yrdp4rnO;E}>dyW?|Bc2vq6aJ`Z~0yPgiwk{WtYrx{KR0;Xnj7ul9%Xl zlv->huFAS9SM7tnlVjX~58BRXadYUPcoS9esIhpo)sMD`U|iT#a{}MKqUh}|Y78tu zJVvvc4wD6rkl71(qtiid3zvDoyk3EW1W5k!d~I#My~O16}Fo`wryeYX|gn|93|CtHG(!8PDQEYyu0b1E`>2$AON56Jij(Ek2<`;j8Uy{W5hwIntGC)Pp$ zPvk&oI|cIgG9E5Fu@g#R9dzhlb5IqNb<~EuvFGEgjBL3Ce~~+USRB0jeLV3don0j6 z;0O{wZ_7q}xX5NW*Gv&1N$&^M36NR2UxOKKaGS;t;{9z!d&9(1j5IS!mTn~j{&5ic zHYe1;J?oYpmPRIYNya-~60B7~+DQ*yWf%&fFPM0$^GggVnrhzVkF1Wz&6?Fy#&Z(U zz)A?P%I#)|%L97|gW4N&2!n;S08^mCT19R8f*?SaG#hdlN*$@i?`d|d56W7q-s?C| zMS&R-|8r6!`N)Mn$c>OQT$STr&{*^(C5ohV?=-G-!u9-^eKVh4&C4*LU(!y7(NuDq z#v9O!2t>t*gJxE^8=lc$@8_ZPq6OyixWjKEYJ1@5lxS|V##(5^7Yurzj-r@Dd>yao1E{ym};f$--w(%qkYB3MPXGsMx*ucMzA2gTKO4v;< z7oZ|wm%34I*r$sirF+Ul=r3VH25Q$d|M8uUACuA@))sI4B;WyvOoOESy&xmkc-~Yxo7+tk_V&p5F z=W|tron70~UaeU*5ouGl#a(!V=uz6wV*O#=t-h!8tr`L3?Qf=+o>HD-@6NPZeQA9t z9`X!b$^YPD&r=P}ovD9Bi?_}uyp0v&Yy2|h2&>5 z%_LzXA%2B+vG&E-joBj2|Hq2?ksJANbYg(mDY5Uv))Uv8fB*dzFoGb=^8^xO{Uq{{ zFoJMDDESK*$6caishH2psECJVVR1c4Z8N|O?=8PC`brnSUGTyF4&@Jy0UummU|{<} zCYXDh{6dTAr4Ai^hl(3htf!QT$Wsp&`?u-ZcP+t#5Xl0G3&L$sEdtNMVm5=1w_^MpnwN z*b#v}0$~8(Hr+A}+Yiz&Ck%s^t9Pt-{}IMqH=9qG2pdn({!eCeM@5#WGpp7t$+-zh zTVIo=ji?D}E;okhhaPf`?kb;EDU$whh26 z0h=dE^Sp!=r)|8JeV_zTc;87}YxZ8gZij&~t-mg2oY{;kFOn=-JyNNMKh@CJK}$hF z7rjg${XU64a&Zhe#!`vdJ6d6@$S`jki=!|dn5Dfe3k@wRSP9;r7Y)pzJTzwDC|Iq|`Rp#TaX4 zqcu2JAwDae@wU&r0AQ$zX)$f&JQyJ#brA?9mEI-VsO_cH4}dOYcvo11H;1klDY}^0 zZ4o^>Uqq2s!*wMWsohRK*U|$)gpr2Is~AutB3@h8U=J@YP`umMYXGX>U|+aGtVjU* zYOZ1T;icL{>0;%KcSf6hhcUzw$$noyQgiJ_Im);fS&S9*inFaYqDV*JQaU9+N6nsE zarrSemoM(8Uw2u@YjMxBf;BJ#sY?5*;p%F*fw_!{#6IuI$HvGo2jvRIVyDlA(NgE{=+<*E8WRw1Z7<9 z;D>hyQFBki$($V4rGkl{%g6`%L*y#;iT=G|%I@Yh!%p@?6aa($PJrS5b^v=;aViR^ zGwf#AlR$lQOitdnOik5U?b&F8M>bZ;nV$~954h-$K_QEyE!K9NR!E3E!rb47IS22v0O88b@Ga-_{ckya(7%~Ra*#A=EEJB*W%S%~sb zT6tyT3=sgL>w$RvH>FI@ud#^>>IsC;kjE^|8hAu;dk$RW;Ia$}D@s~^!O$7Vs=?!| zr5blVyn>m{Ku?fpJeHGz_Zrj)2l8b{?Wzx&3e+`)Ax)X=%Ajs@>xlq?a)x5DCoykX z=eCF*(LZ-;R(yV18z(dmp}aVkRecRFHv>C|Yc>GlQ;8$BGpLYU+%jip>ZjypWyvC5 zEJPqzqR8$uUrB5hR1FloT7zul(3)!@9S2!*lfXicJ8`fx|Ic(NRq~ujnF8CBl3( zbROUlak~1h9Ue&|TFJ`6Y?*SJTeOkJyaOQtVa#PAo1xG*nl8TwzVSIeKgE0wVrW)e zTh>lh?z#z#9a*`iwY;QQJ2TPRO1iRysv@b$&>o*yB0A?kf4`P5wJlM(M<%`0xq z{?TJ1rV8dGM&b~zPXW|@*se?4-%H(;Fe{-T^p*BeOQl;(x*PEQ1|{m-yLJ>+rBgt4 z`4bVa>VU7BTjcC{%?lM&aO7OG@(mqje6ox=fnSg9hqR9pzKI zuXWJOnO<(*E1{ladMer3lux;1bn2_OM)bl&Q3*K9pVu;TA*0EfPOUC%@eQV}pUx>AGZWG}XMd8|D?l@tvTwUj&nPK+Oyqk`wi-oqr9LU4s@OJ?CI28ksBlRU$}|>cO}#OEMYMX0Ks4RO zrSm2OpZLGG7AV558oXeZTKI%8nl-$h!LILKxb*XXz_9Stb^yTt@Li3!FYn;NfvR29 zSzi7^ZD^e$H=}3u>r0e)XaorhuDv6}5e$uob8;p6Eu0?duDQuu)kcZ^1b06eKFO8C z8C?k5c#-v_#!}~F3BM~TA()d$tqT4$<_EeUG3y~ZK~{W92cM}y$`{l<76h*Mz0rKw zY$=MA&F>nXfB{U|k^6T0gGA>3fpxO|}AOGVI-*_xJ684Kvo(-)HVOA$qu`jl6Z&LuzJ zh21iHnr(Q`4kLXQn($C`6DWkJx*Rxhh;OCMqx$EQ$wOMznN-~}ew=G7^im3zFzGjL zmZMV3AXTI1>}O?t{i3g4EiKVM5-nKQmxpy0(h2Up&99NKao-NwZEcp{x~3N*Q~{4$ zI*Cx42?U_Y)DLrYF!aZL@kCL2LYE%hbOlD1?a=BNTp44P{9#xac#PlrRkJR}20z;^ z7FS<1|L|C+Z7xFlM3~ZTv*7xsFuyTQ`HA}3WVfa3Ato*nwF=!rZeuK(cA9q}+voit z;QC>pMkNC0+8=lelaaZHXoIE~K-jGcEa1ugE*I$jD9}$9*1mKDT>s zZ(nzEKW{}4Ks7@EGeR)5_{zLp>3_1qSP^2Q)lErp6OaY~^}$8Vrly`w(Y^L?`((Vm z$sYP6gOgsIGlO=_iJl?R_Fai#o2Ps5U6H-|bcbwhNm4h7P8|9;1DEMf&qQ5;X5C67 zS$F0;UNU4i{W=+Uc3r+cWX7HnWCxxU2qZ*Xlbf&Oo)|lHMR_%n2YkF;8Uvrgo&ZP! z$o;=WzLMeq6#l6{1V&aAq`s;n+FJ}sVFXEcPEZtNzQXw*;nuWl)#=t(t1289q2!FM zE{c4G;%+n(mvA5{vM8&I@}2fDQ?qrp-2#VasqLfeIgr$?|wB{LM&!Qvh z8S;i&Wo8tGP&zR<+OBKrDpb?4FWxRXL{#@-GRsc@*z&5C>g#b*aBE((P;2r+K2byR zaH2EVv-1)faP+jr1*1~DWyW;-BKwOO^FSVA79{jP1zXg&mt;I_+ZSd&;9qv?*@gUd zDjdzVvJD1}9#!AjVVUysllsdmUOAgjjcFj#VOEKrB64MH+WKsNDP*$7tpubBY1JfB zQ^+*{^L!00z;x`S`$@G|6**C)bPS#G$-(3D%xn=P2HE?>XEy!C3$Zzyu_H~Y^rOzo z&0(yYBz4Sebh-Aep>l)DheK_7^{MIzHrFMZD!4Su6?pTo10-Aq*HUFJBpXsqq-`yn zuA|EDcgtyW_O$S$<_9$wPD^WZ@NCBol5fd?U=?J1LK_M>1sP5{M=$<#dvT8!1Z$=h zzA_1g^va}vQroHLVBipnZbQs1H5u|vF+pP&6Kf=|npixgUP2S6r4i$hteaEmMkP?v zJggRdkuq;hL4TMk4RP#M>yffhZBO>S+JySiZPn&N-N82#$h1N#QKOC0`UaH4?WfNG z;<}A!(TCANVUDQ}8>VnnZ?JW(hmFwqBf&wl_jg`9pCCQudophgL3Mjo$UUWdmz-sL zIB%uF5~#i~anx_@$PsQw1$tGg-S4V^lxfPmHK2+vlwb@9lAgg-D5hqExHhN1fQImmy%$X(e zup*_yhAZD>-6-fnRS&0<;EnW}iddaa5IQp+yLEi78i9A>Ez&CF%tjfrx^C`x%k2{K z<^}5P4miygDZ64O< zr!qQ{L(5K8ivW9b8t6(@Uw_5op6cv7bG)VZqzc=`tA-4Fo&|k!Z8RbI)dBnwgXqy0GhY zW0u|k@Ap080tJqNUGW|7E@Ff@w&J4RhSG(d|6X z!LTX(11fK zc9~|O#1dq_f!KA9H$^ad%%dJ{(hn)jx}3`$6T)hcAeMf1>CIQb_A3047qHtJvGU_Y zd!fx6RDdO?$!i4=t`fMKjX*wZW0uf%K|^9ScVa^_Q@X|D4;v2qwx}NptKUs>mvh)T zaH6$yQ^=#4!-o7bv!@-1WP4C|3C71DQqzx2hNO%PpO}@)#wE7D$C>(^>uF9*!4)qi zfAr~4hM{1Try0)w z5C3ym9TyR>=@`WsE{Gt*MGD}0S^?e$>2{hTjt#Dnab_a1SpmSda&>9Kozn5Rn#qT20k-2w!I5zN~q3-Pb&n$Yd91jl64`AF40LT@>%@*QC*i-=MBpKlVog( z>v--4+wq79`$`Ly^Z>Lprw`NBYrkbt;B zk}rWn-4?FdeN!uu)PdH4&O{u>lnN&oOL8c|2OvnpvC7R(t>?UQ-L7YB{}<@+1)|t* z0_ucnmad>kIbKh=D28XoMUN$!UucriZ|UhfipHQ57G%`WF}v$BX{Ch|OOrbnqIc7V zr(g@cdkUwW0Hxm6wO(&+H*3XinSx(y%xJ*&&F-=N%x6SU-bB^qmiF0mhqdxxu^eJO z39!)&gu47Y8W$UE5t6(`7;|BHS%XK-tmc+^;CAY$y^oPT($g z=|9>+Wu!TscjK6SabG6CXeD5hjujMbSt)P6=>xBZTNbqc=C;q(8M|f_egbogsoc!o ziopJ^w3ghjM$um4oKcY6%c$ExOfcyu2oM8N9|eLXh@rRC3R)R~$l(_nx7Vqx(=V09 zZdM;{458f=FpNSrKESTcN*^LaAy+1cC6(J6!Na40b-{2oJ%F&ExCPl z45Bkm)Pl}{Gff|%6PzZ^uE?-u7Z&h-Fv`GSo$#qR(6H<+u*u68i#r!~?XxlKv!Mq2 z&npj`aO9Gj+s9XleODciL9+SpP@^EX5i}d~Mg~5D!0;qGeF|2fe*OU0Tq3*(14ZEK z+SA|*FX3^BiY)ii?j=7xhXVeEtIinMs`>M2oEXyX{|4u98&4SQq5=VhC+(F{0<@rf zb=8&yC>p!QpWI}!T0}4)EH|p=z=f37 zO_dObsfm^IrDOtv2zkQW{ss^i5@*rm3-04di+9ZAMbWUph{ui|AfbaJo zKoD-p--}YL$E%cSY(*}`qLoP%0$s z@iqu-pAc&&q&>b_@-7*ldl+Z^#S}9ezsmC06&puLd$I<*72K*@(O~i#nEkj&Br|*@ zM`&Y84_o4|FM1xG9Id2I34j8>_?nll56X+YBm%5GYZj^=?Fe-M!faA5}Mb*xbX zj9cSSPv`=<%Kd&+VqWJ9%4%luElDWyu`KAzYKP9DZ1QT>(zj)C7m zEr_t2uIDWA#I8s2kipUyDQPEOa$THOebuZbr-mP;R1JegnTll?6`-xw+u`nVSjwW# z#_F)KR`2{+8u~0}VOzf46k1V!PiqpUgvWxMvpn5`Cg-}s7*i_)-5uOL99}XFWH5CU zN5;b=7iDE_vT#v-(-i%ZuGPKB+|eml)u9AuY?ja0&VnR^eJ#tfMb2J55e<`OKX_9a z5`MpuuE;-c*B|=D1<-WOUSC9)DJ$feTAokW+FUU&RlbZ4E-9vH6>!jIoWQ?$jqnN93?^tVR!NNxVNwgEUjWQBD=2<*%?kv39 zV%3<5tt0ZQpJs;J)J2n9mz~sQTf5-hpNqA$*kHc0WL8o+0dVqVR-?_KA|`HDIA_Y=UjYCFYlpt_-|(mJDof^ z76(YQy-vc__Nt*y)s$!`mhxvhjC<%d=yvPL9F5&483axs#2FC#U4$j9dh;Ra2^2XxHw( zS9WpQbMDz91c(1FM#`B*=7_qDy5051h9Y~En9nMFBJgYr6t{I8Hr;+mj>QW@@k2=x|Gz#Qr7yqVHcV1y81Dt`;X zgNCWv{r{+%e~K?!dL&v+*ejG?pf{(}sm@oN{~?fDS2S(t6O#3S*y$;bG6P>hZEimV z|8ZPB`|sn298M1Cm^hD^Mqh-tsbIV3lk9xh=#u3z<7ehVcSBQnijs3jae6(;Ez|Rw zS-@o)DV1swNW-|7>m|y0TgK!AK3RcAxJiHedNr3CZWvs@X)nN-e?aNU_J z!*j$r1{{5qFy-Sd@^itFCtrXL$oPdO;!E#SKl1xaP2z}YcdOixWKQmCP7B3g|Ij|mv z6p&ebYbz$*`(Eu{-7bnHu+XhN&$Ok)IrjMu=U+g-nx}t^ly5eO0cI*qa%T6A z4TE-8ZG!4o6lE_JX>~T|K@JsMB?=Kj|H2kLFc(LoG@8w(NsAzgEmq%5$GM#$czSqEHii^ zU8&qNj`!hdu)_RoX>yPi0Gz{HxJtCy283ZsyJ7=m6^Wwk1)(L}DMV#Fr;{zRIao^i zz!{D;)aVkhXJ3d0Q6H9w1~`jQJlGsAZqZ=d|JgYq8XaoPu(}h2-28*}=iZh4Wlu+s zuc0{ObJNlxTf|W^IMG2A3L`mn!P&vK*HuF5YG`sr$B(ocEE8q~07BJ)6Dr)l$$2a9 z79ej@Hz`CaV`h);Bd$MOzrv8;%9#dmO4J%$7hg92!Zog_lwPu~nhMbJXJ*Hmun2U) ztiP&fdXGzsj}o}ZO@baeOu1KTiT{`}8#C%qgmwObId+s-hzutC?aIHub^Yn) z6qhMIAys6u{wkaS0QS;Ye~M-p9`js(Sbo6=d2&9KPc`1^xO*q+3X0w6id?;u3|8Oa zoQ|@-TB}1OmgKpA^_*V?Tz@EfiywQ3wiiQrOupld9i{!bX9$o5zI3)8Qsr;w0IvR7 z4j|YFy-=-s-8Mriw}F8`szb zlTdZG@@I*mam27=wN_b_ZE0n<#Q2BqrUIc{dkB|KJt3+ss|}H60u62UFK@GndMPgq zbQBrAI?4fw2A)N%QRkc|f$eEjI24_nD(4G0{UtCa1`j!xpI_a2xaJKdnp1tLkC-W` zx|QdtQpZ3&0J`B2@LX-}Uq_HyA`Ef)bs%sFA)ykXLOARhm-bLfo&mN53`!deUpoUW zat?*_8~4FfY*;+_BVW6JrqFypFS4SZGLuKz)?ahB6}3td>*H*HTcw6e;A$}+4t1BU zJg9786#nJlR+Oc##AN4n22}EPx!W&-x--*+q023g0y^!o{lD?7Efgurk%n60n(C|G z+Bf`imu@IJBi)`(c^#;|>8mdTDI_#$Pc2&O4KidmAc2c~@Sq#aH|uTh`!uOOv1438 zh69^d1ZQDiH*@+a$In>=Tv~A1zt7z6vrhBr6L2*yjAhypooje-wx?=2o)>ocMA( zRSo0GIH++F`V~^K+Q}W^lV$t0WmRL$94XOtz-_^1(4r2BhrxP~RE~KZwPK@&d%>W- z#u%DxgNvoydQ>I%jcE^DhH$RciqgO8ab;(B%XQ5oc_$Z_n>Z~mP&Vo;HgXT*8l1%6 z2HuC$wg*U41gpgP2l6F1EOi#*A<+i)`MsD5;sVY;Ck3v;CGYY$-WBXElae(u+U9;! zfapOULpExom$i)9efx=HBsg^!d(uaRpU56(!-4RMYmcN5lhhRE>@jqSGpZsHvC76R z0)fqTX9TzdmmxK6x1Qn9tu;J)L|>kNQW>rw*M-c)4@%+uQhCIs3Wrqz?kWjehI`$T zwJb}IkFJ5<`jQ5HE+8lRq8LTr#6A4r0BC()i_}*Yqjw;1ok;PRvanC7U5TPenwJE1 z{r0%8W3^AqDgEJn8Ot~lfekNBEjbh`ep5|B7E7WW(Wo=z=wu$&^T{VP;%9Q^f8Hn+ z&`Vik$3nLn=gLpvte;ep*ts;+AC_0#tcRHsxA{z-SOoW>U4E*l_v0qQLvcUz0HR+Y zIa?}(caffn$Vz|enhdeCF+v5xH0g>hHnoWdjBL&wSS_8|JANuq?Q z-k@5r6vCzt?CPWb4d;%?+7NSWP6KUNcjbEMv`;IBV4pJ#939svV%->$+#r&?DGFJWD;TY@g5iv{tmYrT72->$}@ zFjju9iLc(+Xb&-2n-VOop}q@h4bQ#;w_H!f^;vE-!MHGo*&x6Q1=`O~0Ln(Y0^=s0 z{1y4BGjP|LkSLG&`zNPNxx9R7ZiGws!SuZT%5BxSQ*6!_sM>Al)|P>P+W|TZK(AJU z*TPSFg+C~6eZ^v|Q9W`T1Dr&2U+~v~RGs%fdYIZpc0lv5jMTNAyr-Fy=j52!M&Q)D zWmzd#c|`}oYl7*FfRovfMF^Vith{n*zexIO08 zE9DG#{4t}g;zs^y=2oh&@GDuuVFi`@BDtWfWdT4+LXZBH{*Xy0@L8mwkM?TJfN%zLC87*P- zH)m+j)Z+kCI6cssx{~LBgAAa3GHC-cqZxBN=+f#P_`VkKd}s1)DbV`$iux}-%;$w| z%+(Y#vn%}Qi0hHWQ$1)K*Sj_kEAnay;#a>6PCwM>AwD-X1Z6ufGlA(i&ni+z3|+a$ zfcX%eD0D07n#dD$00TEVN9$WxA&wQQA`=om zn(S1N0LET>vVB>~QW>ir@QX}fF+l|wdt~a|w`WqZO4?#iEWTpIe_!HB!YpmZsWI-B zDpUMofIV)16Y?d`-y!BAx7+-@HM9xp$k){Y&0Ah+z!2T1FB&KgsIMfq{eK_UA; z=FIWDQ!mhnYyfL33CfT08E|ct{1N<>PsgHyjZFvPnEHF4HZL^h$}w;rm@RWU?+NY? z$AYmi_yma>V9F)7YQBZrC+%b}G*co!%XfwpLNn$9Ss^nSIw%x_Ka4Oa$^y2Ny9Gop zP?~sl_~sXs3ve|Cf_S2tza2Gqnov91<`GQNp^oHVQfR(xvkFjedAlv`Kv$Tj_Utal z=MTHo;CNlEkblwtdlfUa=!jN>pWjRe>Z%>(%ki?<;cp#Dm{k{6!_gP|!_VDKhU^(n z9@bPCBOe?LGVQn2g{Gw>+f`wOAm=h>-%s-r_WiWa53v641%FV$=niQY(DL^{B9ebY zf&c~cU|z!FX+FcJK#oay1-wa%k3sCh(XcIsyuc50#UJd&2ln&$F#VpC@C_w$PNn`# zf$7x>Y;yM8_5<8~*TCreG5-mtxYJ@U5MjDtF1yan z4cjm)f=5A;8_Ez-0VOu#Z`~cU@loFWuW;U?qr~aZ5o^&afDMlD=}INT%6Rlg~rgdrs1LnXVc?ZGZPg zAif5dHSm0_uYQ2W{6@RdFL8Rp4!U+jRdDEoa#+yyWhiZR?pF`Z0OY3`?hq$aHXwM_ z18Q-pyQ)R&#xuG?e~M-4Pw?b&U&|$n1RkF}1d9cKx{@n^Zw5UORp{~a>DRxDV3iO8<2)4&4kWo&7zT@EIL*}HKgTKB_UsbpZ zQ>s3UBqT4(a*%QOd@Nl_^LK;;|N6k|0ia^LmBmpfWXchxR$;O|6hWNH0wlfAjsNb( zoZ72ece=D&lQ_fA1DHPWozdJ?NTZPH^U1CXRMupkuZq}k^X+hp;a3XgEv5G|MjFFL z=jibz@{aDCaAsldy27K9D>y(-$(CTtx}ZO4h2HNoD~nnRVtw&y=lkd&Uccn_0bd8% z^9-fE7A;Lt=LFEFA(Z?-Qoli24O+8W?+(?dt4oOx^GF8R-Ou=R%ariC1R#%Jit$1g zqD8GxY{I*ns&53;iekd{QERa7|8am==WhPq6kbmE_09509wWfLWr^Npe$qig%0%SlGS*9LcB$N%GZrzoISbMkLw9U+bX#eLI9eM_`z0zkL2hZAHW z9;z~@{F;*-zqs_iV(If$Ajdl9?st5nUB!WK;ECD$_CQvFqN5JOE$V2PrJWj3;V6f(2sGy($%5SX~P zMb6*0x9H-sXguw@0L*E0R z=3%{Bh({r05DW~^T%_GxsszyKu(*O0mAD)?5?@x*5u`+Aff46C>kTVI4Q=Iy7Ooyc zuRL*YzRLfbg(T%^rM8%u*zhh{CMEQpr`M(EaQ2b7ACejTaxG_5D>6eN6a)F8lUu!_ z4eWP4Ne^JKSW-l#x9aHFwN_VqRIFgfB|KEM!lfw{&+C@U^DET?V+N27R!_RARIsVO zFR0SftE%|lo@5sQmM-X23Ig8X_dBdlJ8MZ2XX-JKTh>Y~J37M}MzCmJ{ZKUAw>>ag zJ*UTA9T;Xex&>DTxA82zc}f}WpXovrpZBfBiK-s^YuZlqhyB8h&GIscV&Td#o4sjz zToZbv%Z;0+RNNGbKml2Ma%LI&fsjdzVuqT|W)*VT?GcaOT07%u&=e9W!tY1R z{hL9MOyMZ$N0Lz;W;8JnfeBT3A3n{Zl7hOysBk8#Jj3%RF*4molx#>NM#906qGFN@ zC&RyA%|sW|jtG^f7Zq?Gcb%|@5_Ek)ZbQpJB_7TLlTr+2T>#z_v!Om*2;n;DLsot@ zr#!c7gaObem=x3QCS(Mfxw=|BXzNW#C6++~g)*nSrE z#2vYgIOa?!#kr3&Nlc3y@lT*b4y&R57A~bCysmV)5+oYg!#BVibac%^UHwp8oi61W z9=OW(X{Ul3Pk_p^{#V05&;t`8^ftn%_>;glO++X*89%|Z>a%_<`tZIWS{ETw{{PnM zeDh`m$pKKUgP`bo!b{!wPv3YXbW>2aEI+|S{4r2^$pG+iXQ9-0LSS@L47PTDLMjB& zlOQmycs}|u5q`;daIct54nM&W-gpVlKK=OpI@mFOb_`QA{MP_kH@_izNi4P$e!?e& zzxZ7zmMg#iCm6L=Guvwu3J9ng4G4%bX>S@YiSZg9kfPybh<4x41iPKpTG zVVrE{K@_Qkh&)Y!>i#&+ zln80;hAZn}ELlPdWyv~}HA|$dW2da4iAYbD^jz6u?5472kR?kIl0?cj#!h34c|<9{ z{H}SPeqQtZ&Ohg#d*AatXU?2I?z!{5pO2eH#g!xHmA2cNL#D-8f0#1}wWAn>x;$0C zA7;pHlhh5f(0RMy>Xmo4AuvFAlz2j8WD-(jpCk^Co>dSR84o7ZUGjd98KrEc`XWXt zwH!;TnWHbt-Bx|=OY+dRwuh<$b)OF2HaovURH*u->tLpDg7qaSy!h*BDfHl!#Idku zxOD`7=*CZV8FtN7<9b|Q^lI~ePO=>pZ&Ht7WYiExdSsp=RUgrm&mVmTrH^E8walEc zyXZ7C=Iq*Cb0dCGff#NIsCb@GcTa?rr`_ylS7*~yvj&LYZ0(c#YW+hyO=Iv^JnOEy zFPhC}cs|H}w27^09<3sK+y4{~I`{TvF59!~mAK>miZB)*B?BWugQNb%HIzv*dFYnv ztHwJ`y)|j0C3c4@Nv3tghv;7-nhtF(%(}}Kb!iiy%IC+gt1Ks$U9C*7s?kAXhvkS8 z+66AAxX8uvM?=>u7-3tn+R6UvXE`51|D6rWMiCz1vjwmyh3-5z!+PPyUiOqvt6MLB zi8G4(^OOaltdRFCtc2xfEnN$Wy$fL(<;#Gh!vgS;V*5M8P$o2Q;JS|VnZUJ@W3*w_1@#CKl z-S(QTCi~2%Z7-HKayL~PxTJnM^SO`L(@JQNIg?;oKFWw{kTvo=-|F3m?qzd2C4z1( z)^fa(nipco^u;|~>5PGqft|m7$nyv9IlbQ?jE#%1^_Gt}qL5>l$>u)I8(Vcw# zMD^DXJ0H3q8@(;_H2B(VWiRu%#Mri3Y`oJd65({!)2X;G2v=M@lS#H2NIJ&dOtw^f z+33Y*j-{wX=ENr6SPCml8@7%-FliMi<7Y#WOS9@6z>jiDx4Z);uR4S28Cm`0LuhUZ z>&W4kBb74|y(JS~a~50-qzCI!C6IT|6y0vh;j_*S`_x1m*U>$}>xl4M-F4Yo=WTj87?MPcFDLGKv9t_b8707;Be~`tqge*Wp{~) zT@JJ;ybvmXo!l1d_9f8o6^DN%<8(|NXp^txFG}yi*rlcXC_VJ(>*%|lI zXSZ`^b?`j*_mfo;t&j)S!h%fY(>s`L$2Sg1+`RmF)WgV+HdZbZ_Zv83IB%#{5}NX2 zp4+OO>&XR+`kx5u_p#&Wnpxs!ZZ&av3}CfVan;5gm+`5--S0~d78q^muPh2gDr&|q zdl~6SYvyk-Sal6UuIklwgDwg3X&*SNpLFA{ahx_~Gz{uj)kCUSwXkgWE!ay8pNpDA z_OhFJn1pn^x;{BJm!V7{&Nw2ktwst-5`5N|n{PhXSbX?AF4(ulKg;e;Pr-Ubml`$) zY-t!a8$-MMMrFsvl4~>Y6)w4j%zxHr{5tk7|Lh%R`zl0E&6rN9bWr~f1a33Z-hZ=< zci{A*os;3RfW|Vire%Q8k~-vw3+B4o5{@~x@YWzPNN~XR0(Q-UPqwU3bgZa{()uXIG!*R$wZ$+zvK)fvGj}b1NZ!Rxc zz2aXPPbu~yo+cNc*UHf+K`#Kwq?^mRejH@#I4l-@v24BDxZZsQ{=!1$NYFQRonkC!>EmdV$%$X2vUm|-?JEoIB0j8HM`8u!DE4nbEojWrv zkq)H9r+B8KtQhG+$YYIUBSTwFQMH5Qfg z2;*SrA`?wG#-2}fKDiN&?To%!6s{0JIC;(#5KX?H=m->;n3|J}ehkcZmA`+eTpcVT zDL8C1^zClf0g>SY942$)8>?Tog>x%4e8Sim6XN~zSpy>F64n)GmRdZ&X!*A;tL-<#2ua%2#HBnHEQ%HS;CBJ;Ax2r*Rxahp2(8aJ z$#HUH`1MS=WK}eO_hBCm3;M`X#`+2-2b+TxVpF{JZ9g5S7%|*jdd9`t+~J?Hw9r$^ zUiL5pPCUB_;26nN>-S8}y2t#9l_1*C2%e?G+=uK{_#!_10?rb^>$XTb*V@IIS66V{ zSI=?GK`cB(GG~rXt|I{>FI;V-y@`l*8|N-VRx~ACT`K%BWm#T;_G4~zye8FVI=`Z6 zF`XWvneQ#P^kHd9bozD7E^ZeFYK;SglVb>a<~!u!P)W#%{4y_SPsG3ySwLA9B)CYF zhV8I`*(@>;DGk$O1%1ZVVL_~5E*k=rW90|Op|iVeP*W2+goD;3e)=jffOHwA&kdSu z0^kbi6s&}YdiZ$`0G%fIVJiUC6ay;(M)3OrT!8%DvlR_(-&&ztQFX|1=XWWJ9tQg- z&I5a%=mk*nl?0^Uf8zH=s4j|*5CI1!q(J9ML4d}Hng;R{r}ow|DFaYVXrV}JkZFWI z4fI-y3Q0|=08}ecD9=lRosLeE1`3j)LfKQY0F5ad4OE~+g&3!0fPJ&8e@DtwfgluQ zeFdpMPQwrGc@Ba3(>$~Ubewo*x9|C0-WC2=`< z7PVl5Aa#U`4}?KIXoRVY{IIbs>Z$b%esFS88ivcEHiegj0Gc-`_TxfByo;kk0T4u+ z1MI-T4sBK9a_+J{D937qTJ_AKse)3NwMo@HF0mjryZL&49g2Btuu$q@({<149 zqaCV5LDY%@Y^nzWl)$7FII#cxW-q&PzZ6BUzXzw^$%DjYI6$*m-DjYl%?BX}fcCEZ O%nF=zbk|6GSN{tyrB9>) delta 35860 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 Date: Sun, 21 Jan 2024 15:54:15 +0100 Subject: [PATCH 34/41] Upgrade Checkout action to v4.1.1 --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 5edaaab..d07b6cb 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -27,7 +27,7 @@ jobs: runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4.1.1 - uses: actions/setup-java@v2 with: From db0ee0981df773ea99bdfa1fc178eb5034d09311 Mon Sep 17 00:00:00 2001 From: Ingmar Steiner Date: Tue, 23 Jan 2024 15:55:43 +0100 Subject: [PATCH 35/41] Upgrade Setup Java action to v4.0.0 --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index d07b6cb..dbf503b 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -29,7 +29,7 @@ jobs: steps: - uses: actions/checkout@v4.1.1 - - uses: actions/setup-java@v2 + - uses: actions/setup-java@v4.0.0 with: distribution: zulu java-version: ${{ matrix.java_version }} From adcf6b89df244a23748b5d3fab828407ae4303d0 Mon Sep 17 00:00:00 2001 From: Ingmar Steiner Date: Sun, 28 Jan 2024 15:57:02 +0100 Subject: [PATCH 36/41] Upgrade Gradle build action to v2.12.0 Fixes CVE-2023-30853 --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index dbf503b..d8352c4 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -44,6 +44,6 @@ jobs: - if: runner.os == 'macOS' run: brew install speech-tools - - uses: gradle/gradle-build-action@v2 + - uses: gradle/gradle-build-action@v2.12.0 with: arguments: build --warning-mode all From 60f292dad07350e8e95b633daa0a22a78d33230b Mon Sep 17 00:00:00 2001 From: Ingmar Steiner Date: Wed, 21 Feb 2024 16:00:00 +0100 Subject: [PATCH 37/41] Replace DFKI MLT repo for JTok Because free JFrog hosting is dead --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index fa35549..5d610c2 100644 --- a/build.gradle +++ b/build.gradle @@ -63,7 +63,7 @@ repositories { forRepository { maven { name 'DFKI-MLT' - url 'https://mlt.jfrog.io/artifactory/mlt-mvn-releases-local' + url 'https://raw.githubusercontent.com/DFKI-MLT/Maven-Repository/main' } } filter { From a44d1afbf5e966fbd7ac70c78a178024ec42b69e Mon Sep 17 00:00:00 2001 From: Ingmar Steiner Date: Thu, 22 Feb 2024 16:09:42 +0100 Subject: [PATCH 38/41] Upgrade component plugin to v0.3.2 Fixes CVE-2022-1471 via transitive dependency upgrade --- build.gradle | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/build.gradle b/build.gradle index 5d610c2..75bf196 100644 --- a/build.gradle +++ b/build.gradle @@ -72,10 +72,7 @@ repositories { } exclusiveContent { forRepository { - maven { - name 'OSSRH-snapshots' - url 'https://oss.sonatype.org/content/repositories/snapshots' - } + gradlePluginPortal() } filter { includeModule 'de.dfki.mary', 'gradle-marytts-component-plugin' @@ -90,7 +87,7 @@ dependencies { exclude group: 'com.twmacinta', module: 'fast-md5' exclude group: 'gov.nist.math', module: 'Jampack' } - implementation group: 'de.dfki.mary', name: 'gradle-marytts-component-plugin', version: '0.4.0-SNAPSHOT' + implementation group: 'de.dfki.mary', name: 'gradle-marytts-component-plugin', version: '0.3.2' implementation group: 'io.github.m2ci-msp', name: 'gradle-praat-wrapper-plugin', version: '0.7.0' implementation group: 'io.github.m2ci-msp', name: 'jtgt', version: '0.7.0' testImplementation group: 'org.testng', name: 'testng', version: '7.5' From 54ce6cd4ef4f6e7b3291f6ba2c6bd2e6cd3cd2ed Mon Sep 17 00:00:00 2001 From: Ingmar Steiner Date: Sat, 24 Feb 2024 16:11:17 +0100 Subject: [PATCH 39/41] Upgrade TestNG to v7.5.1 Fixes CVE-2022-4065 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 75bf196..5a0ed38 100644 --- a/build.gradle +++ b/build.gradle @@ -90,7 +90,7 @@ dependencies { implementation group: 'de.dfki.mary', name: 'gradle-marytts-component-plugin', version: '0.3.2' implementation group: 'io.github.m2ci-msp', name: 'gradle-praat-wrapper-plugin', version: '0.7.0' implementation group: 'io.github.m2ci-msp', name: 'jtgt', version: '0.7.0' - testImplementation group: 'org.testng', name: 'testng', version: '7.5' + testImplementation group: 'org.testng', name: 'testng', version: '7.5.1' testImplementation group: 'xmlunit', name: 'xmlunit', version: '1.6' } From e40a19f7988aa342eca39d54d980fe475004fb2e Mon Sep 17 00:00:00 2001 From: Ingmar Steiner Date: Tue, 22 Oct 2024 07:43:53 +0200 Subject: [PATCH 40/41] Upgradle to v7.6.4 --- gradle/wrapper/gradle-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index b1624c4..c7d437b 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.4-bin.zip networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From 6be61f84b4a61741d19da04d923fda4b29c90ea4 Mon Sep 17 00:00:00 2001 From: Ingmar Steiner Date: Sun, 27 Oct 2024 20:18:21 +0100 Subject: [PATCH 41/41] Install SoX in macOS environment GitHub Actions --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index d8352c4..509ab87 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -42,7 +42,7 @@ jobs: sudo apt-get -qq install sox speech-tools - if: runner.os == 'macOS' - run: brew install speech-tools + run: brew install sox speech-tools - uses: gradle/gradle-build-action@v2.12.0 with: