{
  config,
  lib,
  pkgs,
  ...
}: let
  inherit (lib.lists) map;
  inherit (lib.modules) mkForce mkIf mkOverride;
  inherit (lib.strings) concatMapStringsSep concatStringsSep optionalString;
  inherit (lib.attrsets) attrNames nameValuePair filterAttrs listToAttrs;

  cfg = config.services.wyoming;
in {
  config = let
    forkedPkg = import ./pkgs/wyoming-openwakeword.nix pkgs;

    whisperUnitNames = attrNames (
      filterAttrs (_: v: v.device == "cpu") cfg.faster-whisper.servers
    );
  in {
    systemd.services =
      # https://github.com/felschr/nixos-config/blob/6a0f0bf76e3ae80c1e180ba6f6c7fd3b8e91d2d3/services/home-assistant/wyoming.nix#L29
      mkIf (cfg.faster-whisper.servers != {})
      (listToAttrs (map (x:
        nameValuePair "wyoming-faster-whisper-${x}" {
          serviceConfig.ProcSubset = mkForce "all";
        })
      whisperUnitNames))
      #
      # openWakeWord
      // mkIf (cfg.openwakeword.enable) {
        wyoming-openwakeword.serviceConfig = {
          MemoryDenyWriteExecute = mkForce (cfg.openwakeword.package != forkedPkg);

          # changes according to https://github.com/rhasspy/wyoming-openwakeword/pull/27
          ExecStart = mkForce (concatStringsSep " " [
            "${cfg.openwakeword.package}/bin/wyoming-openwakeword"

            "--uri ${cfg.openwakeword.uri}"
            "--threshold ${cfg.openwakeword.threshold}"

            (concatMapStringsSep " "
              (dir: "--custom-model-dir ${toString dir}")
              cfg.openwakeword.customModelsDirectories)

            # removed option https://github.com/rhasspy/wyoming-openwakeword/pull/27#issuecomment-2211822998
            (optionalString
              (cfg.openwakeword.package != forkedPkg)
              (concatMapStringsSep " " (model: "--preload-model ${model}") cfg.openwakeword.preloadModels))

            # removed option since preloading was removed
            (optionalString
              (cfg.openwakeword.package != forkedPkg)
              "--trigger-level ${cfg.openwakeword.triggerLevel}")

            "${cfg.openwakeword.extraArgs}"
          ]);
        };
      };

    services.wyoming.openwakeword = mkIf (cfg.openwakeword.enable) {
      package = mkOverride 900 forkedPkg;
    };
  };
}