mirror of
https://github.com/gensokyo-zone/infrastructure.git
synced 2026-02-09 04:19:19 -08:00
feat(mediabox): wyoming
This commit is contained in:
parent
a5966c0724
commit
a202d0703f
9 changed files with 283 additions and 2 deletions
72
modules/nixos/wyoming.nix
Normal file
72
modules/nixos/wyoming.nix
Normal file
|
|
@ -0,0 +1,72 @@
|
||||||
|
let
|
||||||
|
serverModule = {
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}: let
|
||||||
|
inherit (lib.options) mkOption;
|
||||||
|
inherit (lib.modules) mkIf mkOptionDefault;
|
||||||
|
inherit (lib.strings) match toInt;
|
||||||
|
inherit (lib.lists) elemAt;
|
||||||
|
in {
|
||||||
|
options = with lib.types; {
|
||||||
|
bind = mkOption {
|
||||||
|
type = str;
|
||||||
|
readOnly = true;
|
||||||
|
};
|
||||||
|
port = mkOption {
|
||||||
|
type = port;
|
||||||
|
readOnly = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
config = let
|
||||||
|
matched = match "^tcp://(.*):([0-9]+)$" config.uri;
|
||||||
|
bind = elemAt matched 0;
|
||||||
|
port = toInt (elemAt matched 1);
|
||||||
|
in {
|
||||||
|
bind = mkIf (matched != null) (mkOptionDefault bind);
|
||||||
|
port = mkIf (matched != null) (mkOptionDefault port);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
nonServerModule = service: {
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
} @ args: let
|
||||||
|
cfg = config.services.wyoming.${service};
|
||||||
|
module = serverModule (args
|
||||||
|
// {
|
||||||
|
name = service;
|
||||||
|
config = cfg;
|
||||||
|
});
|
||||||
|
in {
|
||||||
|
options.services.wyoming.${service} = module.options;
|
||||||
|
config.services.wyoming.${service} = module.config;
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}: let
|
||||||
|
inherit (lib.options) mkOption;
|
||||||
|
inherit (lib.attrsets) genAttrs;
|
||||||
|
serviceNames = ["piper" "faster-whisper"];
|
||||||
|
nonServerNames = ["openwakeword" "satellite"];
|
||||||
|
nonServerServices = map nonServerModule nonServerNames;
|
||||||
|
in {
|
||||||
|
imports = nonServerServices;
|
||||||
|
|
||||||
|
options.services.wyoming = let
|
||||||
|
mkServiceOptions = service:
|
||||||
|
with lib.types; {
|
||||||
|
servers = mkOption {
|
||||||
|
type = attrsOf (submodule [serverModule]);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
serverServices = genAttrs serviceNames mkServiceOptions;
|
||||||
|
in
|
||||||
|
serverServices
|
||||||
|
// {
|
||||||
|
};
|
||||||
|
}
|
||||||
60
modules/system/exports/wyoming.nix
Normal file
60
modules/system/exports/wyoming.nix
Normal file
|
|
@ -0,0 +1,60 @@
|
||||||
|
{
|
||||||
|
lib,
|
||||||
|
gensokyo-zone,
|
||||||
|
...
|
||||||
|
}: let
|
||||||
|
inherit (gensokyo-zone.lib) mkAlmostOptionDefault;
|
||||||
|
inherit (lib.modules) mkIf;
|
||||||
|
wyomingService = {config, ...}: {
|
||||||
|
nixos = {
|
||||||
|
serviceAttrPath = ["services" "wyoming" config.name];
|
||||||
|
assertions = [
|
||||||
|
(nixosConfig: let
|
||||||
|
service = nixosConfig.services.wyoming.${config.name};
|
||||||
|
cfg = service.servers.${config.id} or service;
|
||||||
|
in {
|
||||||
|
assertion = (! cfg ? enable) || (config.enable == cfg.enable);
|
||||||
|
message = "enable mismatch";
|
||||||
|
})
|
||||||
|
(mkIf config.enable (nixosConfig: let
|
||||||
|
service = nixosConfig.services.wyoming.${config.name};
|
||||||
|
cfg = service.servers.${config.id} or service;
|
||||||
|
in {
|
||||||
|
assertion = ! cfg.enable or false || config.ports.default.port == cfg.port or null;
|
||||||
|
message = "port mismatch";
|
||||||
|
}))
|
||||||
|
];
|
||||||
|
};
|
||||||
|
defaults.port.listen = mkAlmostOptionDefault "lan";
|
||||||
|
ports = {
|
||||||
|
default = {
|
||||||
|
transport = "tcp";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
in {
|
||||||
|
config.exports.services = {
|
||||||
|
faster-whisper = {config, ...}: {
|
||||||
|
imports = [wyomingService];
|
||||||
|
displayName = mkAlmostOptionDefault "Wyoming Whisper";
|
||||||
|
id = mkAlmostOptionDefault "whisper";
|
||||||
|
ports.default.port = mkAlmostOptionDefault 10300;
|
||||||
|
};
|
||||||
|
piper = {config, ...}: {
|
||||||
|
imports = [wyomingService];
|
||||||
|
displayName = mkAlmostOptionDefault "Wyoming Piper";
|
||||||
|
id = mkAlmostOptionDefault "piper";
|
||||||
|
ports.default.port = mkAlmostOptionDefault 10200;
|
||||||
|
};
|
||||||
|
openwakeword = {config, ...}: {
|
||||||
|
imports = [wyomingService];
|
||||||
|
displayName = mkAlmostOptionDefault "Wyoming openWakeWord";
|
||||||
|
ports.default.port = mkAlmostOptionDefault 10400;
|
||||||
|
};
|
||||||
|
satellite = {config, ...}: {
|
||||||
|
imports = [wyomingService];
|
||||||
|
displayName = mkAlmostOptionDefault "Wyoming Satellite";
|
||||||
|
ports.default.port = mkAlmostOptionDefault 10700;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
22
nixos/wyoming/openwakeword.nix
Normal file
22
nixos/wyoming/openwakeword.nix
Normal file
|
|
@ -0,0 +1,22 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}: let
|
||||||
|
inherit (lib.modules) mkIf mkDefault;
|
||||||
|
cfg = config.services.wyoming.openwakeword;
|
||||||
|
in {
|
||||||
|
imports = [./wyoming.nix];
|
||||||
|
services.wyoming.openwakeword = {
|
||||||
|
enable = mkDefault true;
|
||||||
|
uri = mkDefault "tcp://0.0.0.0:10400";
|
||||||
|
# models: https://github.com/dscripka/openWakeWord?tab=readme-ov-file#pre-trained-models
|
||||||
|
preloadModels = mkDefault [
|
||||||
|
"ok_nabu"
|
||||||
|
"hey_rhasspy"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
# allow access to LAN satellites
|
||||||
|
networking.firewall.interfaces.local.allowedTCPPorts = mkIf cfg.enable [cfg.port];
|
||||||
|
}
|
||||||
18
nixos/wyoming/piper.nix
Normal file
18
nixos/wyoming/piper.nix
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}: let
|
||||||
|
inherit (lib.modules) mkDefault;
|
||||||
|
in {
|
||||||
|
imports = [./wyoming.nix];
|
||||||
|
services.wyoming.piper = {
|
||||||
|
# voices: https://rhasspy.github.io/piper-samples/
|
||||||
|
servers.piper = {
|
||||||
|
enable = mkDefault true;
|
||||||
|
uri = mkDefault "tcp://0.0.0.0:10200";
|
||||||
|
voice = mkDefault "en_GB-semaine-medium";
|
||||||
|
speaker = mkDefault 0;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
40
nixos/wyoming/whisper.nix
Normal file
40
nixos/wyoming/whisper.nix
Normal file
|
|
@ -0,0 +1,40 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}: let
|
||||||
|
inherit (lib.modules) mkIf mkForce mkDefault;
|
||||||
|
cfg = config.services.wyoming.faster-whisper;
|
||||||
|
inherit (cfg.servers) whisper;
|
||||||
|
useRocm = false; # broken...
|
||||||
|
in {
|
||||||
|
imports = [./wyoming.nix];
|
||||||
|
services.wyoming.faster-whisper = {
|
||||||
|
# models: https://github.com/rhasspy/wyoming-faster-whisper/releases/tag/v2.0.0
|
||||||
|
servers.whisper = {
|
||||||
|
enable = mkDefault true;
|
||||||
|
language = mkDefault "en";
|
||||||
|
model = let
|
||||||
|
#distil = "distil";
|
||||||
|
#distil = "distil-whisper/distil-whisper";
|
||||||
|
distil = "Systran/faster-distil-whisper";
|
||||||
|
#size = "small.en";
|
||||||
|
size = "medium.en";
|
||||||
|
#size = "large-v3";
|
||||||
|
in
|
||||||
|
mkDefault "${distil}-${size}";
|
||||||
|
uri = mkDefault "tcp://0.0.0.0:10300";
|
||||||
|
device = mkIf useRocm "cuda";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
systemd.services.wyoming-faster-whisper-whisper = mkIf whisper.enable {
|
||||||
|
serviceConfig = mkIf (whisper.device != "cpu" && useRocm) {
|
||||||
|
DeviceAllow = [
|
||||||
|
"char-drm"
|
||||||
|
"char-kfd"
|
||||||
|
];
|
||||||
|
SupplementaryGroups = ["render"];
|
||||||
|
PrivateDevices = mkForce false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
22
nixos/wyoming/wyoming.nix
Normal file
22
nixos/wyoming/wyoming.nix
Normal file
|
|
@ -0,0 +1,22 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}: let
|
||||||
|
inherit (lib.modules) mkIf mkMerge;
|
||||||
|
inherit (lib.attrsets) mapAttrsToList;
|
||||||
|
cfgs = config.services.wyoming;
|
||||||
|
in {
|
||||||
|
config = {
|
||||||
|
networking.firewall.interfaces.lan.allowedTCPPorts = let
|
||||||
|
mkServerPort = _: server: mkIf (server.enable && server ? port) server.port;
|
||||||
|
mkServicePorts = name: cfg:
|
||||||
|
mapAttrsToList mkServerPort
|
||||||
|
cfg.servers
|
||||||
|
or {
|
||||||
|
${name} = cfg;
|
||||||
|
};
|
||||||
|
in
|
||||||
|
mkMerge (mapAttrsToList mkServicePorts cfgs);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
@ -5,7 +5,7 @@ in {
|
||||||
postPatch =
|
postPatch =
|
||||||
''
|
''
|
||||||
substituteInPlace api/types.go \
|
substituteInPlace api/types.go \
|
||||||
--replace 'UseMMap: nil,' 'UseMMap: &[]bool{true}[0],'
|
--replace-fail 'UseMMap: nil,' 'UseMMap: &[]bool{true}[0],'
|
||||||
''
|
''
|
||||||
+ old.postPatch or "";
|
+ old.postPatch or "";
|
||||||
doCheck = false;
|
doCheck = false;
|
||||||
|
|
@ -39,4 +39,16 @@ in {
|
||||||
inherit src patches;
|
inherit src patches;
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
|
wyoming-openwakeword = let
|
||||||
|
inherit (prev) wyoming-openwakeword;
|
||||||
|
drv = prev.wyoming-openwakeword.override {
|
||||||
|
python3Packages = final.python311Packages;
|
||||||
|
};
|
||||||
|
isPython312 = lib.versionAtLeast final.python3Packages.python.version "3.12";
|
||||||
|
isBroken = wyoming-openwakeword.version == "1.10.0" && isPython312;
|
||||||
|
in
|
||||||
|
if isBroken
|
||||||
|
then drv
|
||||||
|
else lib.warnIf isPython312 "wyoming-openwakeword override outdated" wyoming-openwakeword;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,9 @@ _: {
|
||||||
enable = true;
|
enable = true;
|
||||||
ports.proxied.enable = true;
|
ports.proxied.enable = true;
|
||||||
};
|
};
|
||||||
|
piper.enable = true;
|
||||||
|
faster-whisper.enable = true;
|
||||||
|
openwakeword.enable = true;
|
||||||
cloudflared.enable = true;
|
cloudflared.enable = true;
|
||||||
plex.enable = true;
|
plex.enable = true;
|
||||||
invidious.enable = true;
|
invidious.enable = true;
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
{
|
{
|
||||||
config,
|
config,
|
||||||
|
gensokyo-zone,
|
||||||
meta,
|
meta,
|
||||||
lib,
|
lib,
|
||||||
pkgs,
|
pkgs,
|
||||||
|
|
@ -16,6 +17,20 @@
|
||||||
"/mnt/Movies".hostPath = kyuuto.libraryDir + "/movies";
|
"/mnt/Movies".hostPath = kyuuto.libraryDir + "/movies";
|
||||||
"/mnt/Music".hostPath = kyuuto.libraryDir + "/music/assorted";
|
"/mnt/Music".hostPath = kyuuto.libraryDir + "/music/assorted";
|
||||||
};
|
};
|
||||||
|
useZLUDA = false;
|
||||||
|
useRocm = useZLUDA;
|
||||||
|
rocmPackages =
|
||||||
|
if useZLUDA
|
||||||
|
then pkgs.rocmPackages_5
|
||||||
|
else pkgs.rocmPackages;
|
||||||
|
zluda = let
|
||||||
|
rustChannel = gensokyo-zone.inputs.systemd2mqtt.inputs.rust.legacyPackages.x86_64-linux.releases."1.79.0";
|
||||||
|
in
|
||||||
|
pkgs.zluda.override {
|
||||||
|
inherit rocmPackages;
|
||||||
|
inherit (rustChannel) rustPlatform;
|
||||||
|
inherit (rustChannel.buildChannel) rustc;
|
||||||
|
};
|
||||||
in {
|
in {
|
||||||
imports = let
|
imports = let
|
||||||
inherit (meta) nixos;
|
inherit (meta) nixos;
|
||||||
|
|
@ -38,6 +53,11 @@ in {
|
||||||
nixos.mediatomb
|
nixos.mediatomb
|
||||||
nixos.invidious
|
nixos.invidious
|
||||||
|
|
||||||
|
# accelerated
|
||||||
|
nixos.wyoming.whisper
|
||||||
|
nixos.wyoming.piper
|
||||||
|
nixos.wyoming.openwakeword
|
||||||
|
|
||||||
# yarr harr fiddle dee dee >w<
|
# yarr harr fiddle dee dee >w<
|
||||||
nixos.radarr
|
nixos.radarr
|
||||||
nixos.sonarr
|
nixos.sonarr
|
||||||
|
|
@ -75,10 +95,22 @@ in {
|
||||||
in [libraryDir];
|
in [libraryDir];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
nixpkgs.config = mkIf useZLUDA {
|
||||||
|
cudaSupport = true;
|
||||||
|
};
|
||||||
hardware.graphics = {
|
hardware.graphics = {
|
||||||
enable = true;
|
enable = true;
|
||||||
extraPackages = with pkgs; [mesa.drivers];
|
extraPackages = with pkgs;
|
||||||
|
mkMerge [
|
||||||
|
[mesa.drivers]
|
||||||
|
(mkIf useZLUDA [zluda])
|
||||||
|
(mkIf useRocm [rocmPackages.clr.icd rocmPackages.clr])
|
||||||
|
];
|
||||||
};
|
};
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
radeontop
|
||||||
|
(mkIf useRocm rocmPackages.rocminfo)
|
||||||
|
];
|
||||||
|
|
||||||
fileSystems = let
|
fileSystems = let
|
||||||
bind = {
|
bind = {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue