refactor: centralize audio payload codec and harden worker dispatch compatibility

This commit is contained in:
Robert Wojciechowski
2026-02-28 04:53:20 +00:00
parent 0dae73ec7d
commit 487f5b9c85
6 changed files with 169 additions and 71 deletions
+2 -45
View File
@@ -9,7 +9,6 @@ import time
from aiohttp import web
import server
import torch
import numpy as np
from PIL import Image
from ..utils.logging import debug_log
@@ -135,51 +134,9 @@ def _decode_canonical_png_tensor(image_payload):
def _decode_audio_payload(audio_payload):
"""Decode canonical audio payload into an AUDIO dict."""
if audio_payload is None:
return None
if not isinstance(audio_payload, dict):
raise ValueError("Field 'audio' must be an object when provided.")
from ..utils.audio_payload import decode_audio_payload
encoded = audio_payload.get("data")
shape = audio_payload.get("shape")
sample_rate = audio_payload.get("sample_rate", 44100)
if not isinstance(encoded, str) or not encoded.strip():
raise ValueError("Field 'audio.data' must be a non-empty base64 string.")
if not isinstance(shape, list) or len(shape) != 3:
raise ValueError("Field 'audio.shape' must be a 3-item list [batch, channels, samples].")
try:
shape_tuple = tuple(int(dim) for dim in shape)
except (TypeError, ValueError) as exc:
raise ValueError("Field 'audio.shape' must contain integers.") from exc
if any(dim < 0 for dim in shape_tuple):
raise ValueError("Field 'audio.shape' dimensions must be non-negative.")
try:
sample_rate = int(sample_rate)
except (TypeError, ValueError) as exc:
raise ValueError("Field 'audio.sample_rate' must be an integer.") from exc
if sample_rate <= 0:
raise ValueError("Field 'audio.sample_rate' must be positive.")
try:
raw = base64.b64decode(encoded, validate=True)
except (binascii.Error, ValueError) as exc:
raise ValueError("Field 'audio.data' is not valid base64.") from exc
expected_bytes = int(np.prod(shape_tuple, dtype=np.int64)) * 4
if len(raw) != expected_bytes:
raise ValueError(
f"Field 'audio.data' byte size mismatch: expected {expected_bytes}, got {len(raw)}."
)
array = np.frombuffer(raw, dtype=np.float32).reshape(shape_tuple)
waveform = torch.from_numpy(array.copy())
return {
"waveform": ensure_contiguous(waveform),
"sample_rate": sample_rate,
}
return decode_audio_payload(audio_payload)
@server.PromptServer.instance.routes.post("/distributed/prepare_job")
+10 -1
View File
@@ -22,7 +22,16 @@ from ..workers.detection import (
is_docker_environment,
is_runpod_environment,
)
from ..utils.async_helpers import PromptValidationError, queue_prompt_payload
try:
from ..utils.async_helpers import PromptValidationError, queue_prompt_payload
except ImportError:
from ..utils.async_helpers import queue_prompt_payload
class PromptValidationError(RuntimeError):
def __init__(self, message, validation_error=None, node_errors=None):
super().__init__(str(message))
self.validation_error = validation_error if isinstance(validation_error, dict) else {}
self.node_errors = node_errors if isinstance(node_errors, dict) else {}
@server.PromptServer.instance.routes.get("/distributed/worker_ws")