const assetRoot = '/static/piper-wasm-v1/onnx/'; export function createOnnxWasmPaths(origin) { const absoluteAssetRoot = new URL(assetRoot, origin).href; return absoluteAssetRoot; } export function configureOnnxRuntime(onnxRuntime) { if (!onnxRuntime?.env?.wasm) throw new TypeError('ONNX Runtime WebAssembly settings are unavailable.'); // Piper 1.0.3 overwrites this value in TtsSession.init() with // navigator.hardwareConcurrency. Override that source as well, otherwise an // iPad may start a large WASM worker pool despite this setting. const navigatorObject = globalThis.navigator; if (navigatorObject && navigatorObject.hardwareConcurrency !== 1) { try { Object.defineProperty(navigatorObject, 'hardwareConcurrency', { configurable: true, value: 1, }); } catch (_) { // The check below converts an unsupported override into a clear error. } } if (navigatorObject && navigatorObject.hardwareConcurrency !== 1) { throw new Error('Piper could not be restricted to one processor thread.'); } // Piper already runs in a worker. Avoid a second worker pool on mobile Safari. onnxRuntime.env.wasm.numThreads = 1; onnxRuntime.env.wasm.initTimeout = 60000; }