from __future__ import annotations import base64 import io import json import os import re import tempfile import time import uuid import zipfile import numpy as np from ..audio_io import save_audio from .errors import APIError PCM_FORMATS = { "pcm_f32le": (np.dtype(" max_audio_seconds: raise APIError(413, "request_too_large", f"Audio duration exceeds {max_audio_seconds} seconds.") data = np.frombuffer(raw, dtype=dtype) if audio_format == "pcm_f32le": if not np.isfinite(data).all(): raise APIError(400, "invalid_audio_data", "pcm_f32le audio contains NaN or Inf.", param="input.data") float_data = data.astype(np.float32, copy=False) else: float_data = data.astype(np.float32) / 32768.0 frame_data = float_data.reshape(-1, channels) mix = frame_data[:, 0] if channels == 1 else frame_data.T return np.ascontiguousarray(mix), seconds def audio_to_interleaved_f32(audio): """Convert channel-first audio to interleaved float32 samples. Args: audio (np.ndarray): Audio samples. Returns: Any: Computed result.""" array = np.asarray(audio, dtype=np.float32) if array.ndim == 1: normalized = np.ascontiguousarray(array) return normalized, 1 if array.ndim != 2: raise ValueError(f"Expected mono or stereo audio, got shape {array.shape}") if array.shape[1] in (1, 2): normalized = np.ascontiguousarray(array) return normalized, int(array.shape[1]) if array.shape[0] in (1, 2): normalized = np.ascontiguousarray(array.T) return normalized, int(array.shape[0]) raise ValueError(f"Expected mono or stereo audio, got shape {array.shape}") def f32le_bytes(audio): """Serialize audio as little-endian float32 PCM bytes. Args: audio (np.ndarray): Audio samples. Returns: Any: Computed result.""" array, channels = audio_to_interleaved_f32(audio) return np.asarray(array, dtype="