lol

marytts: init at 5.2.1-unstable-2024-10-09, nixos/marytts: init (#351933)

* marytts: init at 5.2.1-unstable-2024-10-09

* nixos/marytts: init module

* nixos/marytts: add tests

authored by pluie.me and committed by

GitHub 68891efe 94b32163

+750
+2
nixos/doc/manual/release-notes/rl-2505.section.md
··· 18 18 19 19 - [Omnom](https://github.com/asciimoo/omnom), a webpage bookmarking and snapshotting service. Available as [services.omnom](options.html#opt-services.omnom.enable). 20 20 21 + - [MaryTTS](https://github.com/marytts/marytts), an open-source, multilingual text-to-speech synthesis system written in pure Java. Available as [services.marytts](options.html#opt-services.marytts). 22 + 21 23 - [Traccar](https://www.traccar.org/), a modern GPS Tracking Platform. Available as [services.traccar](#opt-services.traccar.enable). 22 24 23 25 - [crab-hole](https://github.com/LuckyTurtleDev/crab-hole), a cross platform Pi-hole clone written in Rust using hickory-dns/trust-dns. Available as [services.crab-hole](#opt-services.crab-hole.enable).
+1
nixos/modules/module-list.nix
··· 395 395 ./services/audio/jack.nix 396 396 ./services/audio/jmusicbot.nix 397 397 ./services/audio/liquidsoap.nix 398 + ./services/audio/marytts.nix 398 399 ./services/audio/mopidy.nix 399 400 ./services/audio/mpd.nix 400 401 ./services/audio/mpdscribble.nix
+184
nixos/modules/services/audio/marytts.nix
··· 1 + { 2 + config, 3 + lib, 4 + pkgs, 5 + ... 6 + }: 7 + let 8 + cfg = config.services.marytts; 9 + format = pkgs.formats.javaProperties { }; 10 + in 11 + { 12 + options.services.marytts = { 13 + enable = lib.mkEnableOption "MaryTTS"; 14 + 15 + settings = lib.mkOption { 16 + type = lib.types.submodule { 17 + freeformType = format.type; 18 + }; 19 + default = { }; 20 + description = '' 21 + Settings for MaryTTS. 22 + 23 + See the [default settings](https://github.com/marytts/marytts/blob/master/marytts-runtime/conf/marybase.config) 24 + for a list of possible keys. 25 + ''; 26 + }; 27 + 28 + package = lib.mkPackageOption pkgs "marytts" { }; 29 + 30 + basePath = lib.mkOption { 31 + type = lib.types.path; 32 + default = "/var/lib/marytts"; 33 + description = '' 34 + The base path in which MaryTTS runs. 35 + ''; 36 + }; 37 + 38 + port = lib.mkOption { 39 + type = lib.types.port; 40 + default = 59125; 41 + description = '' 42 + Port to bind the MaryTTS server to. 43 + ''; 44 + }; 45 + 46 + openFirewall = lib.mkOption { 47 + type = lib.types.bool; 48 + default = false; 49 + example = true; 50 + description = '' 51 + Whether to open the port in the firewall for MaryTTS. 52 + ''; 53 + }; 54 + 55 + voices = lib.mkOption { 56 + type = lib.types.listOf lib.types.path; 57 + default = [ ]; 58 + example = lib.literalExpression '' 59 + [ 60 + (pkgs.fetchzip { 61 + url = "https://github.com/marytts/voice-bits1-hsmm/releases/download/v5.2/voice-bits1-hsmm-5.2.zip"; 62 + hash = "sha256-1nK+qZxjumMev7z5lgKr660NCKH5FDwvZ9sw/YYYeaA="; 63 + }) 64 + ] 65 + ''; 66 + description = '' 67 + Paths to the JAR files that contain additional voices for MaryTTS. 68 + 69 + Voices are automatically detected by MaryTTS, so there is no need to alter 70 + your config to make use of new voices. 71 + ''; 72 + }; 73 + 74 + userDictionaries = lib.mkOption { 75 + type = lib.types.listOf lib.types.path; 76 + default = [ ]; 77 + example = lib.literalExpression '' 78 + [ 79 + (pkgs.writeTextFile { 80 + name = "userdict-en_US"; 81 + destination = "/userdict-en_US.txt"; 82 + text = ''' 83 + Nixpkgs | n I k s - ' p { - k @ - dZ @ s 84 + '''; 85 + }) 86 + ] 87 + ''; 88 + description = '' 89 + Paths to the user dictionary files for MaryTTS. 90 + ''; 91 + }; 92 + }; 93 + 94 + config = lib.mkIf cfg.enable { 95 + services.marytts.settings = { 96 + "mary.base" = lib.mkDefault cfg.basePath; 97 + "socket.port" = lib.mkDefault cfg.port; 98 + }; 99 + 100 + environment.systemPackages = [ cfg.package ]; 101 + 102 + systemd.services.marytts = { 103 + description = "MaryTTS server instance"; 104 + after = [ "network.target" ]; 105 + wantedBy = [ "multi-user.target" ]; 106 + 107 + # FIXME: MaryTTS's config loading mechanism appears to be horrendously broken 108 + # and it doesn't seem to actually read config files outside of precompiled JAR files. 109 + # Using system properties directly works for now, but this is really ugly. 110 + script = '' 111 + ${lib.getExe pkgs.marytts} -classpath "${cfg.basePath}/lib/*:${cfg.package}/lib/*" ${ 112 + lib.concatStringsSep " " (lib.mapAttrsToList (n: v: ''-D${n}="${v}"'') cfg.settings) 113 + } 114 + ''; 115 + 116 + restartTriggers = cfg.voices ++ cfg.userDictionaries; 117 + 118 + serviceConfig = { 119 + DynamicUser = true; 120 + User = "marytts"; 121 + RuntimeDirectory = "marytts"; 122 + StateDirectory = "marytts"; 123 + Restart = "on-failure"; 124 + RestartSec = 5; 125 + TimeoutSec = 20; 126 + 127 + # Hardening 128 + ProtectClock = true; 129 + ProtectKernelLogs = true; 130 + ProtectControlGroups = true; 131 + ProtectKernelModules = true; 132 + ProtectHostname = true; 133 + ProtectKernelTunables = true; 134 + ProtectProc = "invisible"; 135 + ProtectHome = true; 136 + ProcSubset = "pid"; 137 + 138 + PrivateTmp = true; 139 + PrivateNetwork = false; 140 + PrivateUsers = cfg.port >= 1024; 141 + PrivateDevices = true; 142 + 143 + RestrictRealtime = true; 144 + RestrictNamespaces = true; 145 + RestrictAddressFamilies = [ 146 + "AF_INET" 147 + "AF_INET6" 148 + ]; 149 + 150 + MemoryDenyWriteExecute = false; # Java does not like w^x :( 151 + LockPersonality = true; 152 + AmbientCapabilities = lib.optional (cfg.port < 1024) "CAP_NET_BIND_SERVICE"; 153 + CapabilityBoundingSet = ""; 154 + SystemCallArchitectures = "native"; 155 + SystemCallFilter = [ 156 + "@system-service" 157 + "~@resources" 158 + "~@privileged" 159 + ]; 160 + UMask = "0027"; 161 + }; 162 + }; 163 + 164 + systemd.tmpfiles.settings."10-marytts" = { 165 + "${cfg.basePath}/lib"."L+".argument = "${pkgs.symlinkJoin { 166 + name = "marytts-lib"; 167 + 168 + # Put user paths before default ones so that user ones have priority 169 + paths = cfg.voices ++ [ "${cfg.package}/lib" ]; 170 + }}"; 171 + 172 + "${cfg.basePath}/user-dictionaries"."L+".argument = "${pkgs.symlinkJoin { 173 + name = "marytts-user-dictionaries"; 174 + 175 + # Put user paths before default ones so that user ones have priority 176 + paths = cfg.userDictionaries ++ [ "${cfg.package}/user-dictionaries" ]; 177 + }}"; 178 + }; 179 + 180 + networking.firewall = lib.mkIf cfg.openFirewall { 181 + allowedTCPPorts = [ cfg.port ]; 182 + }; 183 + }; 184 + }
+1
nixos/tests/all-tests.nix
··· 579 579 mailman = handleTest ./mailman.nix {}; 580 580 man = handleTest ./man.nix {}; 581 581 mariadb-galera = handleTest ./mysql/mariadb-galera.nix {}; 582 + marytts = handleTest ./marytts.nix {}; 582 583 mastodon = pkgs.recurseIntoAttrs (handleTest ./web-apps/mastodon { inherit handleTestOn; }); 583 584 pixelfed = discoverTests (import ./web-apps/pixelfed { inherit handleTestOn; }); 584 585 mate = handleTest ./mate.nix {};
+87
nixos/tests/marytts.nix
··· 1 + import ./make-test-python.nix ( 2 + { lib, ... }: 3 + let 4 + port = 59126; 5 + in 6 + { 7 + name = "marytts"; 8 + meta.maintainers = with lib.maintainers; [ pluiedev ]; 9 + 10 + nodes.machine = 11 + { pkgs, ... }: 12 + { 13 + networking.firewall.enable = false; 14 + networking.useDHCP = false; 15 + 16 + services.marytts = { 17 + enable = true; 18 + inherit port; 19 + 20 + voices = [ 21 + (pkgs.fetchzip { 22 + url = "https://github.com/marytts/voice-bits1-hsmm/releases/download/v5.2/voice-bits1-hsmm-5.2.zip"; 23 + hash = "sha256-1nK+qZxjumMev7z5lgKr660NCKH5FDwvZ9sw/YYYeaA="; 24 + }) 25 + ]; 26 + 27 + userDictionaries = [ 28 + (pkgs.writeTextFile { 29 + name = "userdict-en_US.txt"; 30 + destination = "/userdict-en_US.txt"; 31 + text = '' 32 + amogus | @ - ' m @U - g @ s 33 + Nixpkgs | n I k s - ' p { - k @ - dZ @ s 34 + ''; 35 + }) 36 + ]; 37 + }; 38 + }; 39 + 40 + testScript = '' 41 + from xml.etree import ElementTree 42 + from urllib.parse import urlencode 43 + 44 + machine.wait_for_unit("marytts.service") 45 + 46 + with subtest("Checking health of MaryTTS server"): 47 + machine.wait_for_open_port(${toString port}) 48 + assert 'Mary TTS server' in machine.succeed("curl 'localhost:${toString port}/version'") 49 + 50 + with subtest("Generating example MaryXML"): 51 + query = urlencode({ 52 + 'datatype': 'RAWMARYXML', 53 + 'locale': 'en_US', 54 + }) 55 + xml = machine.succeed(f"curl 'localhost:${toString port}/exampletext?{query}'") 56 + root = ElementTree.fromstring(xml) 57 + text = " ".join(root.itertext()).strip() 58 + assert text == "Welcome to the world of speech synthesis!" 59 + 60 + with subtest("Detecting custom voice"): 61 + assert "bits1-hsmm" in machine.succeed("curl 'localhost:${toString port}/voices'") 62 + 63 + with subtest("Finding user dictionary"): 64 + query = urlencode({ 65 + 'INPUT_TEXT': 'amogus', 66 + 'INPUT_TYPE': 'TEXT', 67 + 'OUTPUT_TYPE': 'PHONEMES', 68 + 'LOCALE': 'en_US', 69 + }) 70 + phonemes = machine.succeed(f"curl 'localhost:${toString port}/process?{query}'") 71 + phonemes_tree = ElementTree.fromstring(phonemes) 72 + print([i.get('ph') for i in phonemes_tree.iter('{http://mary.dfki.de/2002/MaryXML}t')]) 73 + assert ["@ - ' m @U - g @ s"] == [i.get('ph') for i in phonemes_tree.iter('{http://mary.dfki.de/2002/MaryXML}t')] 74 + 75 + with subtest("Synthesizing"): 76 + query = urlencode({ 77 + 'INPUT_TEXT': 'Nixpkgs is a collection of over 100,000 software packages that can be installed with the Nix package manager.', 78 + 'INPUT_TYPE': 'TEXT', 79 + 'OUTPUT_TYPE': 'AUDIO', 80 + 'AUDIO': 'WAVE_FILE', 81 + 'LOCALE': 'en_US', 82 + }) 83 + machine.succeed(f"curl 'localhost:${toString port}/process?{query}' -o ./audio.wav") 84 + machine.copy_from_vm("./audio.wav") 85 + ''; 86 + } 87 + )
+405
pkgs/by-name/ma/marytts/deps.json
··· 1 + { 2 + "!comment": "This is a nixpkgs Gradle dependency lockfile. For more details, refer to the Gradle section in the nixpkgs manual.", 3 + "!version": 1, 4 + "http://opennlp.sourceforge.net/models-1.5": { 5 + "de-pos-maxent": { 6 + "bin": "sha256-dwVfB2b3tv+MhCqZ6/qTQODO7AM2Beo/w86j4uyaNi4=" 7 + }, 8 + "en-pos-maxent": { 9 + "bin": "sha256-ZFoJT0WoZmh6YXOFIz/SOuiw9fqLG3aZZ4GlDBe9zz0=" 10 + } 11 + }, 12 + "https://plugins.gradle.org/m2": { 13 + "de/dfki/mary#gradle-marytts-component-plugin/0.3.2": { 14 + "jar": "sha256-lT4KL7XZHrCI8ByVRlhFIWTskjrjDEtD/xaBtqqMT8E=", 15 + "module": "sha256-yNyDKL1v/dZ+vUslJ9I/XF94Of72LccH+N3N1C0xhDo=", 16 + "pom": "sha256-nNon9HhH3koh6i5ZE1xX5LJHIMh9O3r3roXQAZchHxI=" 17 + }, 18 + "de/dfki/mary/component#de.dfki.mary.component.gradle.plugin/0.3.2": { 19 + "pom": "sha256-Mjtu1BIXUNIUYATIlt3fdiDZXIFE1yy2X2AlZ7RdgYM=" 20 + }, 21 + "org/yaml#snakeyaml/2.2": { 22 + "jar": "sha256-FGeTFEiggXaWrigFt7iyC/sIJlK/nE767VKJMNxJOJs=", 23 + "pom": "sha256-6YLq3HiMac8uTeUKn2MrGCwx26UGEoMNNI/EtLqN19Y=" 24 + } 25 + }, 26 + "https://raw.githubusercontent.com": { 27 + "DFKI-MLT/Maven-Repository/main/de/dfki/lt/jtok#jtok-core/1.9.3": { 28 + "jar": "sha256-v0hxmgOKwRJMzUZzsbPLOIMXTwPFcp1X4g9S688M4Vc=", 29 + "pom": "sha256-VWnKAEhFCLP0bMiESTLx1fHuO2VbqAPIHA9L9biC1IU=" 30 + } 31 + }, 32 + "https://repo.maven.apache.org/maven2": { 33 + "ch/qos/reload4j#reload4j/1.2.22": { 34 + "jar": "sha256-Ii+Q0+aVQSGO9ucFR3SdaTvUwYRoF+W9eUmz4olQ+Z8=", 35 + "pom": "sha256-8Tj74PC/646UKudkhCloKL2a77Z6qztIceyFhzdn5Pw=" 36 + }, 37 + "com/beust#jcommander/1.78": { 38 + "jar": "sha256-eJHeu4S1+D6b1XWT6+zjOZq74P2TjPMGs1NMV5E7lhU=", 39 + "pom": "sha256-b+4jHAru5t4SVra1WQzp5vbPbDl5ftZoVzUgvDQS4qc=" 40 + }, 41 + "com/fasterxml#oss-parent/58": { 42 + "pom": "sha256-VnDmrBxN3MnUE8+HmXpdou+qTSq+Q5Njr57xAqCgnkA=" 43 + }, 44 + "com/fasterxml/jackson#jackson-bom/2.17.2": { 45 + "pom": "sha256-H0crC8IATVz0IaxIhxQX+EGJ5481wElxg4f9i0T7nzI=" 46 + }, 47 + "com/fasterxml/jackson#jackson-parent/2.17": { 48 + "pom": "sha256-rubeSpcoOwQOQ/Ta1XXnt0eWzZhNiSdvfsdWc4DIop0=" 49 + }, 50 + "com/google/code/findbugs#jsr305/3.0.1": { 51 + "jar": "sha256-yIXONCSWgrwCNrSn1W78wSBI5hNaW696nN6K2M2hP80=", 52 + "pom": "sha256-QXCnYdxb/TmBqOb3qrnirNzoLTT9Wqm7EePAkNJTFM4=" 53 + }, 54 + "com/google/code/findbugs#jsr305/3.0.2": { 55 + "jar": "sha256-dmrSoHg/JoeWLIrXTO7MOKKLn3Ki0IXuQ4t4E+ko0Mc=", 56 + "pom": "sha256-GYidvfGyVLJgGl7mRbgUepdGRIgil2hMeYr+XWPXjf4=" 57 + }, 58 + "com/google/errorprone#error_prone_annotations/2.28.0": { 59 + "jar": "sha256-8/yKOgpAIHBqNzsA5/V8JRLdJtH4PSjH04do+GgrIx4=", 60 + "pom": "sha256-DOkJ8TpWgUhHbl7iAPOA+Yx1ugiXGq8V2ylet3WY7zo=" 61 + }, 62 + "com/google/errorprone#error_prone_parent/2.28.0": { 63 + "pom": "sha256-rM79u1QWzvX80t3DfbTx/LNKIZPMGlXf5ZcKExs+doM=" 64 + }, 65 + "com/google/guava#failureaccess/1.0.2": { 66 + "jar": "sha256-io+Bz5s1nj9t+mkaHndphcBh7y8iPJssgHU+G0WOgGQ=", 67 + "pom": "sha256-GevG9L207bs9B7bumU+Ea1TvKVWCqbVjRxn/qfMdA7I=" 68 + }, 69 + "com/google/guava#guava-parent/14.0.1": { 70 + "pom": "sha256-5aUl7Ttdf/8qjalkHgy5hcf9uEfjCB4qNz2vLnADm2M=" 71 + }, 72 + "com/google/guava#guava-parent/26.0-android": { 73 + "pom": "sha256-+GmKtGypls6InBr8jKTyXrisawNNyJjUWDdCNgAWzAQ=" 74 + }, 75 + "com/google/guava#guava-parent/33.3.1-jre": { 76 + "pom": "sha256-VUQdsn6Iad/v4FMFm99Hi9x+lVhWQr85HwAjNF/VYoc=" 77 + }, 78 + "com/google/guava#guava/14.0.1": { 79 + "jar": "sha256-1p3zMxhAYF7w5f5K3WDy0o6HDjggk36in3E9IDXZq5c=", 80 + "pom": "sha256-PdSpktU+tSShxlRqJLhTszKyZSB1XiayXTgQATFCS3s=" 81 + }, 82 + "com/google/guava#guava/33.3.1-jre": { 83 + "jar": "sha256-S/Dixa+ORSXJbo/eF6T3MH+X+EePEcTI41oOMpiuTpA=", 84 + "module": "sha256-QYWMhHU/2WprfFESL8zvOVWMkcwIJk4IUGvPIODmNzM=", 85 + "pom": "sha256-MTtn/BPrOwY07acVoSKZcfXem4GIvCgHYoFbg6J18ZM=" 86 + }, 87 + "com/google/guava#listenablefuture/9999.0-empty-to-avoid-conflict-with-guava": { 88 + "jar": "sha256-s3KgN9QjCqV/vv/e8w/WEj+cDC24XQrO0AyRuXTzP5k=", 89 + "pom": "sha256-GNSx2yYVPU5VB5zh92ux/gXNuGLvmVSojLzE/zi4Z5s=" 90 + }, 91 + "com/google/j2objc#j2objc-annotations/3.0.0": { 92 + "jar": "sha256-iCQVc0Z93KRP/U10qgTCu/0Rv3wX4MNCyUyd56cKfGQ=", 93 + "pom": "sha256-I7PQOeForYndEUaY5t1744P0osV3uId9gsc6ZRXnShc=" 94 + }, 95 + "com/ibm/icu#icu4j/54.1.1": { 96 + "jar": "sha256-Sxp+zPD+afshyOqksYJwi1BygtVeQP+3tJIEY15FeVo=", 97 + "pom": "sha256-3k1VZEDMK6MzHOYZ8ujr73Rq8JeLT54ZjIM2pW2fxPk=" 98 + }, 99 + "com/ibm/icu#icu4j/66.1": { 100 + "jar": "sha256-Xcypk/Z/1sNXd09JjUm34Ymx2aLPzgUMtO4d2WyADxo=", 101 + "pom": "sha256-Qv8FpFnmcPzINvtwQW0VTlvcuJo0e53stwMt7JVXt1Q=" 102 + }, 103 + "commons-collections#commons-collections/3.2.2": { 104 + "jar": "sha256-7urpF5FxRKaKdB1MDf9mqlxcX9hVk/8he87T/Iyng7g=", 105 + "pom": "sha256-1dgfzCiMDYxxHDAgB8raSqmiJu0aES1LqmTLHWMiFws=" 106 + }, 107 + "commons-io#commons-io/2.17.0": { 108 + "jar": "sha256-SqTKSPPf0wt4Igt4gdjLk+rECT7JQ2G2vvqUh5mKVQs=", 109 + "pom": "sha256-SEqTn/9TELjLXGuQKcLc8VXT+TuLjWKF8/VrsroJ/Ek=" 110 + }, 111 + "commons-io#commons-io/2.5": { 112 + "jar": "sha256-oQQYNI0jSWhgDMsdmI78u9CHFuHZaTbMwYgOfSJRNHQ=", 113 + "pom": "sha256-KOuymYvH16yyUHhSaXFkCJIADzQTWG/0LWEfEEO/7DA=" 114 + }, 115 + "commons-lang#commons-lang/2.6": { 116 + "jar": "sha256-UPEbCfh3wpTVbyRGP0fSj5Kc9QRPZIZhwPDPuumi9Jw=", 117 + "pom": "sha256-7Xa4iRwwtWYonHQ2Vvik1DWYaYJDjUDFZ8YmIzJH5xE=" 118 + }, 119 + "de/dfki/mary#emotionml-checker-java/1.2.2": { 120 + "jar": "sha256-WFdXs97l2EsSAUCq3ALN6P4GkvElMYBgXNrPEuYSXSw=", 121 + "module": "sha256-MENdIpiQRc/EtMI/0zVuUN0zOshEtFd9E1Cs94OczM8=", 122 + "pom": "sha256-G2G63569CsQUm0ILUsJRc1dZVIdYhf13BEoH79dkfrs=" 123 + }, 124 + "de/dfki/mary#marytts-common/5.2.1": { 125 + "jar": "sha256-Adcks8gqN5QI5LwpXEVjTG/K54vZfFpWxkgiOG3/wZg=", 126 + "pom": "sha256-kfPti+loZkjkbWXq+Y6W1nG/fssGeFZ73tNWvKIpQjQ=" 127 + }, 128 + "de/dfki/mary#marytts-lexicon-de/0.1.1": { 129 + "jar": "sha256-K7Fz1AE7zbWPurSELxehYe4jEi+p4gHrTnJFhYkVvbs=", 130 + "module": "sha256-GjDUJxz8dC+R/xdgKXlrIM8yGMIIdMyEvDK3YWcdB9I=", 131 + "pom": "sha256-3ekILmQnkBzw68WOGyMN3gzcolPANO+RG7hP/b48pCA=" 132 + }, 133 + "de/dfki/mary#marytts-lexicon-en_US-cmudict/0.1.1": { 134 + "jar": "sha256-mZUP9RiU7j29F5Yk46udNAcW6Q7ZAf2vjwi9ENBsWPg=", 135 + "module": "sha256-QW1R9cJj8lpS5eJ62b0OCUOZWERjv8knMlxpFQsYJeY=", 136 + "pom": "sha256-+as1Tjjn7BC385oQnbBuuB8XV6I7Ktr7kpr7weYRymI=" 137 + }, 138 + "de/dfki/mary#marytts-lexicon-fr/0.1.1": { 139 + "jar": "sha256-59QlWCDkdvb0/go8keCs97e8uZTV7Tp6gKLREPjD2KY=", 140 + "module": "sha256-hHSShbfXYcpjUCODKrwuOyMD2yG+wLeeIhAbiGyec1I=", 141 + "pom": "sha256-Z2hBfo32vl4yiGCXpVRZRClt32fInzT8J1DJCxq5E/E=" 142 + }, 143 + "de/dfki/mary#marytts-lexicon-it/0.1.1": { 144 + "jar": "sha256-Hlw0JbpX6V6LGNgXm+rzoUHFAZjUSM6djgn4ULeCvEo=", 145 + "module": "sha256-HjeupQ5BJT/7D2rzcvW4XlVED206hXK+fDi7Ckzn9Ag=", 146 + "pom": "sha256-jTGPtjPG4W6r4dvT6H0bSng+/AkPyk1crQvlPJR12Tw=" 147 + }, 148 + "de/dfki/mary#marytts-lexicon-lb/0.1.1": { 149 + "jar": "sha256-UhECnjxaA5YH2SsGHldj86fjM8/sEXDxRAz+eKjw57E=", 150 + "module": "sha256-Q5DsvV7ftRYq+7Ldnl+h0q3GfCcRbzu8rzivgXr8YHQ=", 151 + "pom": "sha256-pzb4eeRDejpQYAU9Z80Z48/lB44TFZTO0954Ga76q0k=" 152 + }, 153 + "de/dfki/mary#marytts-lexicon-ru/0.1.1": { 154 + "jar": "sha256-I+b2nGDudo2nLSiDslGozbukmOW+ZE53isxl1pQ8Fjs=", 155 + "module": "sha256-6aSmHUCftntEaUX4Le2+o9RrmnHndeVW+k4xjZzi0RE=", 156 + "pom": "sha256-8wJB3AStz0Uh0nff4PqxUGCvU+mnBByAT6bLFbi86ZU=" 157 + }, 158 + "de/dfki/mary#marytts-lexicon-tr/0.1.1": { 159 + "jar": "sha256-96FshBqq8Uj3PeeJwara7Zk0eBGvS7Ykg5nURtcpY/g=", 160 + "module": "sha256-y/edxl9qWkqcwDNWU1xbHfENiSB0AIJY0oLcBbcmmE0=", 161 + "pom": "sha256-/qnTjfEyNsQnfr4UXY1TcFLV8bd5wj2SUuRF3rnLehI=" 162 + }, 163 + "de/dfki/mary#marytts-runtime/5.2.1": { 164 + "jar": "sha256-Cp2j4x+6ZsfQne+Uxfvqs/7s4NxWz1Pp6QtGZp0r6WI=", 165 + "pom": "sha256-pi0Qi0AY/83R3rvnlNSDcbJ4Fj+PtDXTEQyxGmMkqQ0=" 166 + }, 167 + "de/dfki/mary#marytts-signalproc/5.2.1": { 168 + "jar": "sha256-HuiAF7vsFPkR4FkMRjidlY8OOn8LSXQmqPNGK+fTNsg=", 169 + "pom": "sha256-q5x0k4qUwJbVREDBuUXPFlOctzKQiF8wKlFisdvp6S4=" 170 + }, 171 + "de/dfki/mary#marytts/5.2.1": { 172 + "pom": "sha256-kyMuX+lFc1qyXn3KP+qpT8jNb8If6yPtUaYwaI3hQM4=" 173 + }, 174 + "gov/nist/math#jama/1.0.3": { 175 + "jar": "sha256-xzJe4pvhqsEofdrGkPc2cfHNkRyp7KfGGZkOhjEFVv0=", 176 + "pom": "sha256-vNwqtC4wAIf64KYiohROkMrXap65L3XQWEOh5rg1psM=" 177 + }, 178 + "jakarta/platform#jakarta.jakartaee-bom/9.1.0": { 179 + "pom": "sha256-35jgJmIZ/buCVigm15o6IHdqi6Aqp4fw8HZaU4ZUyKQ=" 180 + }, 181 + "jakarta/platform#jakartaee-api-parent/9.1.0": { 182 + "pom": "sha256-p3AsSHAmgCeEtXl7YjMKi41lkr8PRzeyXGel6sgmWcA=" 183 + }, 184 + "junit#junit/4.12": { 185 + "jar": "sha256-WXIfCAXiI9hLkGd4h9n/Vn3FNNfFAsqQPAwrF/BcEWo=", 186 + "pom": "sha256-kPFj944/+28cetl96efrpO6iWAcUG4XW0SvmfKJUScQ=" 187 + }, 188 + "net/sf/jwordnet#jwnl/1.3.3": { 189 + "jar": "sha256-PQ2EI4cXcn7WaqM5kHwkVuCNXdAeGqJD9dkoEVgcWDA=", 190 + "pom": "sha256-hUDWasSlaXGQJS/jqo5LluYeXZ1MAtyKfzCTQs12xq0=" 191 + }, 192 + "net/sf/trove4j#trove4j/2.0.2": { 193 + "jar": "sha256-i1U60gEktGRMnwAb8t5CFMDevBurGKRMDDOjHbKDwRg=", 194 + "pom": "sha256-PU5DrfR/+889XNOqlSN5KXe/XLo7okuMaOpxEY/ATfc=" 195 + }, 196 + "org/apache#apache/10": { 197 + "pom": "sha256-gC/uznKFLa/L0KQlpgNnxyxcubbqWq5ZSBEoVpGJ2vk=" 198 + }, 199 + "org/apache#apache/16": { 200 + "pom": "sha256-n4X/L9fWyzCXqkf7QZ7n8OvoaRCfmKup9Oyj9J50pA4=" 201 + }, 202 + "org/apache#apache/18": { 203 + "pom": "sha256-eDEwcoX9R1u8NrIK4454gvEcMVOx1ZMPhS1E7ajzPBc=" 204 + }, 205 + "org/apache#apache/24": { 206 + "pom": "sha256-LpO7q+NBOviaDDv7nmv3Hbyej5+xTMux14vQJ13xxSU=" 207 + }, 208 + "org/apache#apache/33": { 209 + "pom": "sha256-14vYUkxfg4ChkKZSVoZimpXf5RLfIRETg6bYwJI6RBU=" 210 + }, 211 + "org/apache#apache/7": { 212 + "pom": "sha256-E5fOHbQzrcnyI9vwdJbRM2gUSHUfSuKeWPaOePtLbCU=" 213 + }, 214 + "org/apache/commons#commons-parent/17": { 215 + "pom": "sha256-lucYuvU0h07mLOTULeJl8t2s2IORpUDgMNWdmPp8RAg=" 216 + }, 217 + "org/apache/commons#commons-parent/39": { 218 + "pom": "sha256-h80n4aAqXD622FBZzphpa7G0TCuLZQ8FZ8ht9g+mHac=" 219 + }, 220 + "org/apache/commons#commons-parent/74": { 221 + "pom": "sha256-gOthsMh/3YJqBpMTsotnLaPxiFgy2kR7Uebophl+fss=" 222 + }, 223 + "org/apache/groovy#groovy-bom/4.0.22": { 224 + "module": "sha256-Ul0/SGvArfFvN+YAL9RlqygCpb2l9MZWf778copo5mY=", 225 + "pom": "sha256-Hh9rQiKue/1jMgA+33AgGDWZDb1GEGsWzduopT4832U=" 226 + }, 227 + "org/apache/httpcomponents#httpcomponents-core/4.1": { 228 + "pom": "sha256-T3l//Zw9FW3g2+wf0eY+n9hYSpPHBDV2VT38twb2TeQ=" 229 + }, 230 + "org/apache/httpcomponents#httpcore-nio/4.1": { 231 + "jar": "sha256-drO+LO75XJlHzYo2WBitHIn9hZE1tQuyP90gWqGkf/c=", 232 + "pom": "sha256-Qg90O2snSFP3IiJDtEoUxdEscKZIMPQPdDET6DCKM1Y=" 233 + }, 234 + "org/apache/httpcomponents#httpcore/4.1": { 235 + "jar": "sha256-POON5R9OJGaMbRhAV6jQhUH56BXS0xnQ9GLwgwkrKc8=", 236 + "pom": "sha256-T8hq+jjpyfqwmcz0XCvHQ9RT5qsiJJCr/oZxl1w8cyc=" 237 + }, 238 + "org/apache/httpcomponents#project/4.1.1": { 239 + "pom": "sha256-IbtNRN/1TjOjfBGvaYWacUICrgCWmqtUU+unJ2aI+Ow=" 240 + }, 241 + "org/apache/logging#logging-parent/11.3.0": { 242 + "pom": "sha256-pcmFtW/hxYQzOTtQkabznlufeFGN2PySE0aQWZtk19A=" 243 + }, 244 + "org/apache/logging#logging-parent/5": { 245 + "pom": "sha256-3HYwz4LLMfTUdiFgVCIa/9UldG7pZUEkD0UvcyNwMCI=" 246 + }, 247 + "org/apache/logging/log4j#log4j-1.2-api/2.17.2": { 248 + "jar": "sha256-3YxkmkbF2ArRE5TWjBM7qOmpGs+Zt7mSDdW2rT9a36g=", 249 + "pom": "sha256-Znkw96Fy3+a+LaQpsCTdBaLFL+qKut/fD+1+Wi8KPyI=" 250 + }, 251 + "org/apache/logging/log4j#log4j-api/2.17.2": { 252 + "jar": "sha256-CTUbWgOCjzac3P929O055qb8IPJPBGk10LKO9RUvjOQ=", 253 + "pom": "sha256-K48/bUcd8Xlpkhp/D/2oPgYoqz3vx+W8oq7+0WZ2Ke8=" 254 + }, 255 + "org/apache/logging/log4j#log4j-api/2.24.1": { 256 + "jar": "sha256-bne7Ip/I3K8JA4vutekDCyLp4BtRtFiwGDzmaevMku8=", 257 + "pom": "sha256-IzAaISnUEAiZJfSvQa7LUlhKPcxFJoI+EyNOyst+c+M=" 258 + }, 259 + "org/apache/logging/log4j#log4j-bom/2.24.1": { 260 + "pom": "sha256-vGPPsrS5bbS9cwyWLoJPtpKMuEkCwUFuR3q1y3KwsNM=" 261 + }, 262 + "org/apache/logging/log4j#log4j-core/2.17.2": { 263 + "jar": "sha256-Wts0/0GXzRao0k9jA1hWqTPLWVYqaIjd6G6UUPz+9kY=", 264 + "pom": "sha256-o4kYQfrJvjSxshOrlb4wtTZGUW3LS8+pzGi+xXVH2lM=" 265 + }, 266 + "org/apache/logging/log4j#log4j-core/2.24.1": { 267 + "jar": "sha256-ALzziEcsqApocBQYF2O2bXdxd/Isu/F5/WDhsaybybA=", 268 + "pom": "sha256-JyQstBek3xl47t/GlYtFyJgg+WzH9NFtH0gr/CN24M0=" 269 + }, 270 + "org/apache/logging/log4j#log4j/2.17.2": { 271 + "pom": "sha256-9Kfh04fB+5s2XUyzbScO+GNLpJrSBVWMThzafUG1I/U=" 272 + }, 273 + "org/apache/logging/log4j#log4j/2.24.1": { 274 + "pom": "sha256-+NcAm1Rl2KhT0QuEG8Bve3JnXwza71OoDprNFDMkfto=" 275 + }, 276 + "org/apache/opennlp#opennlp-maxent/3.0.3": { 277 + "jar": "sha256-bpn6V7HzZFtJkqs8+qiySrygkhzy9XXWP8pDzYTdROY=", 278 + "pom": "sha256-x/ai6svRgUwwxAsUTuB42E8IoKxaCRG6EacahNZrkhU=" 279 + }, 280 + "org/apache/opennlp#opennlp-tools/1.5.3": { 281 + "jar": "sha256-Wn6uC1Rf9RfIAQRAzMQUTPz4O6rCtnohoa9mjmAi1dI=", 282 + "pom": "sha256-PKfSTYo15l4csWmvhi1ft1YGJYNeDCjZCYGyJfVg7xY=" 283 + }, 284 + "org/apache/opennlp#opennlp-tools/1.9.2": { 285 + "jar": "sha256-bsu7DbR7KJI2DVt392xIhC3pf0R7ohvPbc4/kSdzJFw=", 286 + "pom": "sha256-n3Ailz1L2qp/9vwNEye8BVk+JUSawVBoCZTwGIdR3Ng=" 287 + }, 288 + "org/apache/opennlp#opennlp/1.5.3": { 289 + "pom": "sha256-IRL2TWZGadjl1J1qcV1xBhENJSHo1QJGdcsGSjRIqUY=" 290 + }, 291 + "org/apache/opennlp#opennlp/1.9.2": { 292 + "pom": "sha256-RZkOfPHGsy0foxwbySAgb0d1cZlx5YnsYgH4nViNNaM=" 293 + }, 294 + "org/checkerframework#checker-qual/3.43.0": { 295 + "jar": "sha256-P7wumPBYVMPfFt+auqlVuRsVs+ysM2IyCO1kJGQO8PY=", 296 + "module": "sha256-+BYzJyRauGJVMpSMcqkwVIzZfzTWw/6GD6auxaNNebQ=", 297 + "pom": "sha256-kxO/U7Pv2KrKJm7qi5bjB5drZcCxZRDMbwIxn7rr7UM=" 298 + }, 299 + "org/easytesting#fest-assert/1.4": { 300 + "jar": "sha256-ivmcsM16NXtWRAHWpc3yurvkA46wCC5amqSxmiY0JE8=", 301 + "pom": "sha256-61ZTfeZ7zg7xCdEXPRx28kfs1HgYOCDm3oLSP2hlyG8=" 302 + }, 303 + "org/easytesting#fest-util/1.1.6": { 304 + "jar": "sha256-34ggqSJfFYDs6do7QFtwgLS9yI1qQtJWknayyPHs3Yk=", 305 + "pom": "sha256-A/rLiiyZC+IXonfAVvF+pUDFCSETzpbyB/MmqjdsVhw=" 306 + }, 307 + "org/easytesting#fest/1.0.8": { 308 + "pom": "sha256-xXTKpeT5wZ9C+mW+E2N2gniRk6ZV88yChWTHgIJuMYw=" 309 + }, 310 + "org/eclipse/ee4j#project/1.0.7": { 311 + "pom": "sha256-IFwDmkLLrjVW776wSkg+s6PPlVC9db+EJg3I8oIY8QU=" 312 + }, 313 + "org/hamcrest#hamcrest-core/1.3": { 314 + "jar": "sha256-Zv3vkelzk0jfeglqo4SlaF9Oh1WEzOiThqekclHE2Ok=", 315 + "pom": "sha256-/eOGp5BRc6GxA95quCBydYS1DQ4yKC4nl3h8IKZP+pM=" 316 + }, 317 + "org/hamcrest#hamcrest-parent/1.3": { 318 + "pom": "sha256-bVNflO+2Y722gsnyelAzU5RogAlkK6epZ3UEvBvkEps=" 319 + }, 320 + "org/hsqldb#hsqldb/2.0.0": { 321 + "jar": "sha256-xzyMokOE6zykNRyPJTykObZkxJeu2KrHHLFMAzyOu3A=", 322 + "pom": "sha256-eQ+COojM5vSYqjEnNw4oO9DGg/Z5626FYfAc+XtCtDI=" 323 + }, 324 + "org/hsqldb#hsqldb/2.7.3": { 325 + "pom": "sha256-MIkqaFieqpQEK9nLKuD5Ud8CotwA5MRV7gLkleODJtw=" 326 + }, 327 + "org/hsqldb#hsqldb/2.7.3/jdk8": { 328 + "jar": "sha256-EGfPoHbO0yXlSaFUfklmBxtIuzJDBVmJTH8eMpxdMVY=" 329 + }, 330 + "org/junit#junit-bom/5.10.3": { 331 + "module": "sha256-qnlAydaDEuOdiaZShaqa9F8U2PQ02FDujZPbalbRZ7s=", 332 + "pom": "sha256-EJN9RMQlmEy4c5Il00cS4aMUVkHKk6w/fvGG+iX2urw=" 333 + }, 334 + "org/junit#junit-bom/5.11.0": { 335 + "module": "sha256-9+2+Z/IgQnCMQQq8VHQI5cR29An1ViNqEXkiEnSi7S0=", 336 + "pom": "sha256-5nRZ1IgkJKxjdPQNscj0ouiJRrNAugcsgL6TKivkZE0=" 337 + }, 338 + "org/mockito#mockito-bom/4.11.0": { 339 + "pom": "sha256-2FMadGyYj39o7V8YjN6pRQBq6pk+xd+eUk4NJ9YUkdo=" 340 + }, 341 + "org/slf4j#slf4j-api/1.6.1": { 342 + "jar": "sha256-2EnRF/w3mIOMbNQttqfs9tmuBQw5l0F7jk4lHlkrHT4=", 343 + "pom": "sha256-Bpujg3vfi9tIB2SPFXn9Q7wpK412pvMbFXSGfdk7ylY=" 344 + }, 345 + "org/slf4j#slf4j-api/1.7.32": { 346 + "jar": "sha256-NiT4R0wa9G11+YvAl9eGSjI8gbOAiqQ2iabhxgHAJ74=", 347 + "pom": "sha256-ABzeWzxrqRBwQlz+ny5pXkrri8KQotTNllMRJ6skT+U=" 348 + }, 349 + "org/slf4j#slf4j-api/2.0.16": { 350 + "jar": "sha256-oSV43eG6AL2bgW04iguHmSjQC6s8g8JA9wE79BlsV5o=", 351 + "pom": "sha256-saAPWxxNvmK4BdZdI5Eab3cGOInXyx6G/oOJ1hkEc/c=" 352 + }, 353 + "org/slf4j#slf4j-bom/2.0.16": { 354 + "pom": "sha256-BWYEjsglzfKHWGIK9k2eFK44qc2HSN1vr6bfSkGUwnk=" 355 + }, 356 + "org/slf4j#slf4j-log4j12/2.0.16": { 357 + "pom": "sha256-T3GExYF1HdXIKSP0XeIPIdpkeUPOqDdjAAKpZMZav1I=" 358 + }, 359 + "org/slf4j#slf4j-parent/1.6.1": { 360 + "pom": "sha256-NNbnTB8WWHcbCuapekVKOtII5O26Oi1LoAVQ5vRf9wI=" 361 + }, 362 + "org/slf4j#slf4j-parent/1.7.32": { 363 + "pom": "sha256-WrNJ0PTHvAjtDvH02ThssZQKL01vFSFQ4W277MC4PHA=" 364 + }, 365 + "org/slf4j#slf4j-parent/2.0.16": { 366 + "pom": "sha256-CaC0zIFNcnRhbJsW1MD9mq8ezIEzNN5RMeVHJxsZguU=" 367 + }, 368 + "org/slf4j#slf4j-reload4j/2.0.16": { 369 + "jar": "sha256-gDuJTuOmDlFsTeP3R8EwY5oFolvK8KoAuqscReDovVc=", 370 + "pom": "sha256-FHbSw5i9vMg8K76uIDrS4Ru2lJPtdhwZ5vQkMrhQdjo=" 371 + }, 372 + "org/sonatype/oss#oss-parent/7": { 373 + "pom": "sha256-tR+IZ8kranIkmVV/w6H96ne9+e9XRyL+kM5DailVlFQ=" 374 + }, 375 + "org/sonatype/oss#oss-parent/9": { 376 + "pom": "sha256-+0AmX5glSCEv+C42LllzKyGH7G8NgBgohcFO8fmCgno=" 377 + }, 378 + "org/springframework#spring-framework-bom/5.3.39": { 379 + "module": "sha256-+ItA4qUDM7QLQvGB7uJyt17HXdhmbLFFvZCxW5fhg+M=", 380 + "pom": "sha256-9tSBCT51dny6Gsfh2zj49pLL4+OHRGkzcada6yHGFIs=" 381 + }, 382 + "org/swinglabs#swing-layout/1.0.3": { 383 + "jar": "sha256-e1Jqxfq+wenR7Gx2TmgYi99Me9lsI9kdNFBZL8SmuoU=", 384 + "pom": "sha256-Y0y+gvGbkZWAFokJazI/xPkFM42HpcSmUgyjrTIpU34=" 385 + }, 386 + "org/testng#testng/7.5": { 387 + "jar": "sha256-5UnbUNzEIflQHWr5M68V5PupZhdXdAnZOXJM1+GiUDM=", 388 + "module": "sha256-WCXsJh+Oc1LSYEA6E+viOvaKcooOwnIApFDplBGX518=", 389 + "pom": "sha256-p4skar8S970/pQc2obLXaGM3Ii5L/kEkzTWzWEsaWCE=" 390 + }, 391 + "org/testng#testng/7.5.1": { 392 + "jar": "sha256-payS0jYsyzpQmr5o44XKgJp8lvy6+FGz7oussqyJni8=", 393 + "module": "sha256-pOgk7jAp1HT1lymEgXw7DMaVA/MlcAwX6zHTm3+eCUk=", 394 + "pom": "sha256-OTFZjEFunSVl2nHrFM1YNK/nVD8j+AnUXSpiTDJhthU=" 395 + }, 396 + "org/webjars#jquery/3.5.1": { 397 + "jar": "sha256-gxaBEiIKyRKj26DuuukKTaW/HiSxuv1AHj1Pn1mLsss=", 398 + "pom": "sha256-T7rggddIUv8pQ80GlpanmWKK5t8igotT+kVjNBBMmHg=" 399 + }, 400 + "xmlunit#xmlunit/1.6": { 401 + "jar": "sha256-9xXOgmt9OfDj1azNfFDJHdZozh8BZIfBoW7nbPPgCnQ=", 402 + "pom": "sha256-R7eJM5BrW1LkAVL9UYgGsUXt5jyJcDfre6GOb+N4eC4=" 403 + } 404 + } 405 + }
+70
pkgs/by-name/ma/marytts/package.nix
··· 1 + { 2 + lib, 3 + stdenvNoCC, 4 + fetchFromGitHub, 5 + # Gradle 8 complains about implicit task dependencies when using `installDist`. 6 + # See https://github.com/marytts/marytts/issues/1112 7 + gradle_7, 8 + makeWrapper, 9 + jdk, 10 + nixosTests, 11 + }: 12 + stdenvNoCC.mkDerivation (finalAttrs: { 13 + pname = "marytts"; 14 + version = "5.2.1-unstable-2024-10-09"; 15 + 16 + src = fetchFromGitHub { 17 + owner = "marytts"; 18 + repo = "marytts"; 19 + rev = "1c2aaa0751b7cef8ae83216dd78b4c61232b3840"; 20 + hash = "sha256-jGpsD6IwJ67nDLnulBn8DycXCyowssSnDCkQXBIfOH8="; 21 + }; 22 + 23 + nativeBuildInputs = [ 24 + gradle_7 25 + makeWrapper 26 + ]; 27 + 28 + mitmCache = gradle_7.fetchDeps { 29 + inherit (finalAttrs) pname; 30 + data = ./deps.json; 31 + }; 32 + 33 + # Required for the MITM cache to function 34 + __darwinAllowLocalNetworking = true; 35 + 36 + gradleBuildTask = "installDist"; 37 + 38 + installPhase = '' 39 + runHook preInstall 40 + 41 + mkdir -p $out/bin 42 + mv build/install/source/{lib,user-dictionaries} $out 43 + 44 + makeWrapper ${lib.getExe jdk} $out/bin/marytts-server \ 45 + --add-flags "-cp \"$out/lib/*\"" \ 46 + --append-flags "marytts.server.Mary" 47 + 48 + # We skip the GUI installer since frankly it is a PITA to get to work with a hardened systemd service, 49 + # and the imperative installation paradigm is not ideal either way while using Nix. 50 + 51 + runHook postInstall 52 + ''; 53 + 54 + passthru.tests = lib.optionalAttrs stdenvNoCC.hostPlatform.isLinux { 55 + nixos = nixosTests.marytts; 56 + }; 57 + 58 + meta = { 59 + description = "Open-source, multilingual text-to-speech synthesis system written in pure Java"; 60 + homepage = "https://marytts.github.io/"; 61 + license = lib.licenses.lgpl3Only; 62 + inherit (jdk.meta) platforms; 63 + maintainers = with lib.maintainers; [ pluiedev ]; 64 + mainProgram = "marytts-server"; 65 + sourceProvenance = with lib.sourceTypes; [ 66 + fromSource 67 + binaryBytecode # Gradle dependencies 68 + ]; 69 + }; 70 + })