omni-viewer-core 0.16.0 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/README.md +128 -1
  2. package/dist/i18n/catalog.de.js +7 -2
  3. package/dist/i18n/catalog.en.js +184 -2
  4. package/dist/i18n/catalog.fr.js +7 -2
  5. package/dist/i18n/catalog.it.js +7 -2
  6. package/dist/i18n/catalog.ja.js +164 -2
  7. package/dist/i18n/catalog.ko.js +164 -2
  8. package/dist/i18n/catalog.th.js +7 -2
  9. package/dist/i18n/catalog.zh-cn.js +158 -2
  10. package/dist/parsers/coreml/index.d.ts +232 -0
  11. package/dist/parsers/coreml/index.js +2498 -0
  12. package/dist/parsers/openvino/index.d.ts +141 -0
  13. package/dist/parsers/openvino/index.js +950 -0
  14. package/dist/parsers/pt2/index.d.ts +266 -0
  15. package/dist/parsers/pt2/index.js +1625 -0
  16. package/dist/parsers/safetensors/index.d.ts +6 -0
  17. package/dist/parsers/safetensors/index.js +175 -28
  18. package/dist/registry/index.d.ts +4 -1
  19. package/dist/registry/index.js +21 -1
  20. package/dist/registry/probe.js +16 -0
  21. package/dist/registry/sniff.d.ts +2 -1
  22. package/dist/registry/sniff.js +6 -0
  23. package/dist/styles/audio.css +82 -18
  24. package/dist/styles/coreml.css +4 -0
  25. package/dist/styles/openvino.css +4 -0
  26. package/dist/styles/pt2.css +3 -0
  27. package/dist/viewers/audio/audio-window.d.ts +70 -0
  28. package/dist/viewers/audio/audio-window.js +246 -0
  29. package/dist/viewers/audio/controller.d.ts +10 -1
  30. package/dist/viewers/audio/controller.js +11 -2
  31. package/dist/viewers/audio/index.d.ts +37 -2
  32. package/dist/viewers/audio/index.js +508 -118
  33. package/dist/viewers/audio/mp3-analyzer.d.ts +9 -0
  34. package/dist/viewers/audio/mp3-analyzer.js +50 -0
  35. package/dist/viewers/audio/spectrogram-view.d.ts +121 -0
  36. package/dist/viewers/audio/spectrogram-view.js +303 -0
  37. package/dist/viewers/audio/spectrogram.d.ts +57 -0
  38. package/dist/viewers/audio/spectrogram.js +256 -0
  39. package/dist/viewers/audio/styles.js +82 -18
  40. package/dist/viewers/coreml/index.d.ts +18 -0
  41. package/dist/viewers/coreml/index.js +767 -0
  42. package/dist/viewers/coreml/styles.d.ts +1 -0
  43. package/dist/viewers/coreml/styles.js +8 -0
  44. package/dist/viewers/openvino/index.d.ts +33 -0
  45. package/dist/viewers/openvino/index.js +522 -0
  46. package/dist/viewers/openvino/styles.d.ts +1 -0
  47. package/dist/viewers/openvino/styles.js +5 -0
  48. package/dist/viewers/pt2/index.d.ts +21 -0
  49. package/dist/viewers/pt2/index.js +759 -0
  50. package/dist/viewers/pt2/styles.d.ts +1 -0
  51. package/dist/viewers/pt2/styles.js +4 -0
  52. package/dist/viewers/safetensors/index.d.ts +7 -0
  53. package/dist/viewers/safetensors/index.js +23 -1
  54. package/package.json +31 -1
package/README.md CHANGED
@@ -16,7 +16,8 @@ models, viewers mount into a DOM element, and everything host-specific
16
16
  legacy PPT), Markdown, LaTeX (structure and math preview, not typesetting)
17
17
  - **Data & spreadsheets** — Excel, CSV/TSV, JSON, JSONL/NDJSON, YAML, TOML,
18
18
  Parquet, Avro, HDF5, MATLAB MAT, NumPy (NPY/NPZ), Safetensors, GGUF, ONNX, TFLite/LiteRT,
19
- Keras (.keras and legacy .h5), Protocol Buffers, ReqIF, SQLite
19
+ Keras (.keras and legacy .h5), Core ML (.mlmodel and .mlpackage),
20
+ OpenVINO IR (.xml + .bin), PyTorch Export (.pt2), Protocol Buffers, ReqIF, SQLite
20
21
  - **Media & graphics** — audio (waveform/spectrogram), video, images,
21
22
  Photoshop PSD
22
23
  - **Engineering & automotive** — CAN DBC, AUTOSAR ARXML, ASAM A2L, Vector
@@ -172,6 +173,132 @@ contents distinguish a Keras model from any other HDF5 file; hosts that read the
172
173
  whole file can refine that with `looksLikeKerasHdf5` from
173
174
  `omni-viewer-core/parsers/keras` and mount the Keras viewer instead.
174
175
 
176
+ ### Core ML models
177
+
178
+ A `.mlmodel` is a serialized `CoreML.Specification.Model` protobuf, and an
179
+ `.mlpackage` is a bundle whose `Manifest.json` points at one such spec plus the
180
+ weight blobs its ML Program references. One entry point reads both — bytes that
181
+ open with a ZIP header are treated as a packaged bundle:
182
+
183
+ ```ts
184
+ import { mountCoremlViewer } from 'omni-viewer-core/viewers/coreml';
185
+
186
+ await mountCoremlViewer({ fileName: file.name, data: bytes }, container, ctx);
187
+ ```
188
+
189
+ Weight payloads are never decoded: blob references resolve to a file, an offset,
190
+ and a byte count, and inline weight tensors to their size and quantization, so a
191
+ multi-gigabyte model costs nothing to open. Package members are read in place,
192
+ and JSZip is only consulted for a bundle that was re-zipped with compression.
193
+
194
+ Two model families carry a graph, and the viewer reads them to different depths:
195
+
196
+ - An **ML Program** (Core ML 5 and newer) is self-describing — every operation
197
+ names its own inputs, so attributes are shown exactly as the producer wrote
198
+ them, with no schema knowledge involved.
199
+ - A **neural network** (the older encoding) stores each layer's parameters in a
200
+ distinct message per layer type. Layer types resolve for all of them, and
201
+ attributes are decoded for the common types; weights need no such table, since
202
+ `WeightParams` has one shape everywhere it appears and is found structurally.
203
+
204
+ The viewer provides a per-graph computation graph with operation, value, and
205
+ weight inspection, navigation into the blocks a control-flow operation
206
+ references, and searchable operation, input/output, weight, package, and
207
+ model-information panels. Custom layers, pipeline stages, unmapped layer types,
208
+ and weight files that are not present are surfaced as warnings.
209
+
210
+ Both extensions route by extension, and an extensionless zipped bundle is
211
+ resolved by `probeContainer` from its `Manifest.json` + `Data/com.apple.CoreML`
212
+ layout. A `.mlmodel` carries no leading magic, so hosts that can read a whole
213
+ extensionless file can refine routing with `looksLikeCoremlSpec` from
214
+ `omni-viewer-core/parsers/coreml`.
215
+
216
+ ### OpenVINO IR models
217
+
218
+ An OpenVINO IR is two files that share a base name. The `.xml` is ordinary XML
219
+ whose root is `<net name version>` holding `<layers>` and `<edges>`; the `.bin`
220
+ has no header, magic, or index of its own — it is a raw concatenation of
221
+ constant payloads that `Const` layers address by `offset` and `size`. The core
222
+ receives the `.xml` as its input and the `.bin` as a sidecar the adapter reads
223
+ from the same directory:
224
+
225
+ ```ts
226
+ import { mountOpenVinoViewer } from 'omni-viewer-core/viewers/openvino';
227
+
228
+ await mountOpenVinoViewer({ fileName: file.name, data: xmlBytes }, container, ctx, {
229
+ sidecars: { bin: binBytes } // optional
230
+ });
231
+ ```
232
+
233
+ The topology renders in full without the `.bin`. When it is supplied, every
234
+ constant's byte range is checked against it and its leading values are decoded
235
+ for a preview (all fixed-width IR element types, including f16, bf16, and the
236
+ f8 variants); the rest of the weights are never read, so a multi-gigabyte model
237
+ costs nothing beyond its XML. A `.bin` that is too short for the constants, or
238
+ that has bytes no constant references, is surfaced as a warning — the usual
239
+ signs of a mismatched pair (the unreferenced-bytes signal is only trusted when
240
+ every constant was read).
241
+
242
+ The viewer provides a computation graph with layer inspection (ports with
243
+ their producers and consumers, `<data>` attributes, `rt_info`, weight ranges,
244
+ and the sub-graphs a `Loop`, `TensorIterator`, or `If` layer carries in its
245
+ body), plus searchable layer, constant, input/output, and model-information
246
+ panels. IR v10 and v11 are the target; the legacy v7-and-earlier layout
247
+ (`<layer precision>` with `<blobs>`) is read on a best-effort basis and
248
+ flagged.
249
+
250
+ Routing is by content only: `.xml` is shared with every other XML dialect, so
251
+ the descriptor claims no extension and `detectViewer` reaches the viewer
252
+ through its text sample (`looksLikeOpenVinoIr`, also exported from
253
+ `omni-viewer-core/parsers/openvino`). A `.bin` opened on its own has nothing to
254
+ identify it; an adapter that wants to open one should look for the same-named
255
+ `.xml` beside it.
256
+
257
+ ### PyTorch Export packages (.pt2)
258
+
259
+ A `.pt2` is what `torch.export.save` writes: a ZIP whose members sit under a
260
+ folder named after the file, with the serialized Export IR program in
261
+ `models/<name>.json`, parameters and buffers as raw storage bytes under
262
+ `data/weights/` (indexed by `<name>_weights_config.json`), tensor constants and
263
+ script objects under `data/constants/`, pickled sample inputs, optional
264
+ AOTInductor artifacts under `data/aotinductor/`, and user files under `extra/`.
265
+
266
+ ```ts
267
+ import { mountPt2Viewer } from 'omni-viewer-core/viewers/pt2';
268
+
269
+ await mountPt2Viewer({ fileName: file.name, data: bytes }, container, ctx);
270
+ ```
271
+
272
+ `parsePt2` reads the archive's central directory and only the JSON members it
273
+ needs; stored weight payloads are viewed in place and sampled for a short value
274
+ preview (every fixed-width torch dtype, including bf16 and the float8
275
+ variants), so a multi-gigabyte package costs nothing beyond its program JSON.
276
+ The viewer shows the ATen graph — placeholders coloured by signature kind
277
+ (user input, parameter, buffer, constant), operator nodes, higher-order
278
+ control-flow nodes with their `cond` / `while_loop` sub-graphs, and outputs —
279
+ with a node inspector (arguments, producers and consumers, module stack,
280
+ metadata, stack trace), plus searchable tables of nodes (sub-graph nodes
281
+ included), weights and constants with their archive status, the graph
282
+ signature (inputs and outputs by kind, buffer mutations, constant inputs), the
283
+ nn.Module hierarchy with preserved call signatures, model information (schema
284
+ and torch versions, opsets, range constraints, guards, operator counts), and
285
+ the archive listing. Symbolic shapes are printed as expressions (`2*s0`)
286
+ rather than the sympy `srepr` the file stores.
287
+
288
+ A package holding several programs (`package_pt2`) gets a model selector; an
289
+ AOTInductor-only package (`aoti_compile_and_package`) opens on the archive
290
+ tab with its compile metadata. The pre-PT2 `torch.export.save` layout
291
+ (`serialized_exported_program.json` beside torch.save pickles) is read on a
292
+ best-effort basis: the graph is complete, but weights are listed from the
293
+ signature without a preview. Schema 8.x is the target; enums
294
+ written as member names by older versions are accepted.
295
+
296
+ Routing is by the `.pt2` extension; an extensionless package reaches the viewer
297
+ through `probeContainer`, which recognizes the `archive_format` marker
298
+ (`looksLikePt2Archive` is also exported from `omni-viewer-core/parsers/pt2`).
299
+ A plain `torch.save` checkpoint (`.pt` / `.pth`) is not an Export package and
300
+ is not claimed.
301
+
175
302
  ### Archive host integration
176
303
 
177
304
  Archive decompression remains adapter-owned: pass an `ArchiveDecoder` to
@@ -3,14 +3,18 @@
3
3
  export const CATALOG_DE = {
4
4
  'audio.title': 'Audio', 'video.title': 'Video', 'dbc.title': 'CAN-Datenbank',
5
5
  'audio.play': 'Wiedergabe', 'audio.pause': 'Pause', 'audio.stop': 'Stopp',
6
- 'audio.loop': 'Schleife', 'audio.clearRegions': 'Bereiche löschen', 'audio.volume': 'Lautstärke',
6
+ 'audio.volume': 'Lautstärke',
7
+ 'audio.loop.region': 'Bereich wiederholen', 'audio.loop.track': 'Titel wiederholen',
7
8
  'audio.region.start': 'Bereichsstart (s)', 'audio.region.end': 'Bereichsende (s)', 'audio.region.duration': 'Bereichslänge (s)',
8
9
  'audio.zoom': 'Zoom', 'audio.zoomIn': 'Vergrößern', 'audio.zoomOut': 'Verkleinern', 'audio.zoomFit': 'Anpassen',
9
10
  'audio.visualization': 'Ansicht', 'audio.vis.waveform': 'Wellenform', 'audio.vis.spectrogram': 'Spektrogramm',
10
11
  'audio.vis.both': 'Beide', 'audio.download': 'Herunterladen',
11
- 'audio.spectrogramScale': 'Skala',
12
+ 'audio.spectrogramScale': 'Spektrogramm-Skala',
12
13
  'audio.scale.linear': 'Linear', 'audio.scale.mel': 'Mel', 'audio.scale.bark': 'Bark', 'audio.scale.erb': 'ERB',
14
+ 'audio.scale.logarithmic': 'Logarithmisch',
15
+ 'audio.frequencyRange': 'Frequenzbereich', 'audio.frequency.full': 'Gesamt', 'audio.frequency.limit': 'Bis {hz}',
13
16
  'audio.error.save': 'Die Audiodatei konnte nicht gespeichert werden.',
17
+ 'audio.error.spectrogram': 'Das Spektrogramm für diesen Bereich konnte nicht gezeichnet werden.',
14
18
  'audio.info.duration': 'Dauer', 'audio.info.sampleRate': 'Abtastrate', 'audio.info.channels': 'Kanäle',
15
19
  'audio.info.channelLevels': 'L Spitze {leftPeak}, RMS {leftRms} | R Spitze {rightPeak}, RMS {rightRms}',
16
20
  'audio.info.bitDepth': 'Bittiefe', 'audio.info.format': 'Format', 'audio.info.fileSize': 'Dateigröße',
@@ -21,6 +25,7 @@ export const CATALOG_DE = {
21
25
  'audio.error.decode': 'Der Browser konnte diesen Audio-Codec nicht dekodieren. Verwenden Sie einen Host mit dem erforderlichen Codec oder transkodieren Sie die Datei.',
22
26
  'audio.warning.analysisFailed': 'Die Wellenform-Voranalyse ist fehlgeschlagen — es wird auf die vollständige Browser-Dekodierung zurückgegriffen, die bei einer Datei dieser Größe langsam sein kann.',
23
27
  'audio.warning.analysisSkipped': 'Die Wellenform-Voranalyse ist für dieses Format nicht verfügbar — es wird auf die vollständige Browser-Dekodierung zurückgegriffen, die bei einer Datei dieser Größe langsam sein kann.',
28
+ 'audio.warning.reducedFidelity': 'Zur Speicherersparnis mit reduzierter Qualität dekodiert; dem Spektrogramm fehlen die höchsten Frequenzen.',
24
29
  'audio.vis.unavailableLarge': 'Das Spektrogramm ist für große Dateien, die aus vorberechneten Spitzenwerten gerendert werden, nicht verfügbar.',
25
30
  'video.play': 'Wiedergabe', 'video.pause': 'Pause', 'video.stop': 'Stopp',
26
31
  'video.skipBack': '⏪ -{seconds} s', 'video.skipForward': '⏩ +{seconds} s',
@@ -6,14 +6,18 @@
6
6
  export const CATALOG_EN = {
7
7
  'audio.title': 'Audio', 'video.title': 'Video', 'dbc.title': 'CAN database',
8
8
  'audio.play': 'Play', 'audio.pause': 'Pause', 'audio.stop': 'Stop',
9
- 'audio.loop': 'Loop', 'audio.clearRegions': 'Clear regions', 'audio.volume': 'Volume',
9
+ 'audio.volume': 'Volume',
10
+ 'audio.loop.region': 'Loop region', 'audio.loop.track': 'Loop track',
10
11
  'audio.region.start': 'Region start (s)', 'audio.region.end': 'Region end (s)', 'audio.region.duration': 'Region length (s)',
11
12
  'audio.zoom': 'Zoom', 'audio.zoomIn': 'Zoom in', 'audio.zoomOut': 'Zoom out', 'audio.zoomFit': 'Fit',
12
13
  'audio.visualization': 'View', 'audio.vis.waveform': 'Waveform', 'audio.vis.spectrogram': 'Spectrogram',
13
14
  'audio.vis.both': 'Both', 'audio.download': 'Download',
14
- 'audio.spectrogramScale': 'Scale',
15
+ 'audio.spectrogramScale': 'Spectrogram scale',
15
16
  'audio.scale.linear': 'Linear', 'audio.scale.mel': 'Mel', 'audio.scale.bark': 'Bark', 'audio.scale.erb': 'ERB',
17
+ 'audio.scale.logarithmic': 'Logarithmic',
18
+ 'audio.frequencyRange': 'Frequency range', 'audio.frequency.full': 'Full', 'audio.frequency.limit': 'Up to {hz}',
16
19
  'audio.error.save': 'Saving the audio file failed.',
20
+ 'audio.error.spectrogram': 'The spectrogram could not be rendered for this range.',
17
21
  'audio.info.duration': 'Duration', 'audio.info.sampleRate': 'Sample rate', 'audio.info.channels': 'Channels',
18
22
  'audio.info.channelLevels': 'L peak {leftPeak}, RMS {leftRms} | R peak {rightPeak}, RMS {rightRms}',
19
23
  'audio.info.bitDepth': 'Bit depth', 'audio.info.format': 'Format', 'audio.info.fileSize': 'File size',
@@ -24,6 +28,7 @@ export const CATALOG_EN = {
24
28
  'audio.error.decode': 'The browser could not decode this audio codec. Try a host with the required codec or transcode the file.',
25
29
  'audio.warning.analysisFailed': 'Waveform pre-analysis failed — falling back to a full browser decode, which may be slow for a file this large.',
26
30
  'audio.warning.analysisSkipped': 'Waveform pre-analysis is unavailable for this format — falling back to a full browser decode, which may be slow for a file this large.',
31
+ 'audio.warning.reducedFidelity': 'Decoded at reduced quality to fit this file in memory; the spectrogram loses its highest frequencies.',
27
32
  'audio.vis.unavailableLarge': 'Spectrogram is unavailable for large files rendered from precomputed peaks.',
28
33
  'video.play': 'Play', 'video.pause': 'Pause', 'video.stop': 'Stop',
29
34
  'video.skipBack': '⏪ -{seconds}s', 'video.skipForward': '⏩ +{seconds}s',
@@ -210,6 +215,182 @@ export const CATALOG_EN = {
210
215
  'tflite.inspector.inputs': 'Inputs', 'tflite.inspector.outputs': 'Outputs',
211
216
  'tflite.inspector.intermediates': 'Intermediates', 'tflite.inspector.options': 'Options',
212
217
  'tflite.inspector.customOptions': 'Custom options', 'tflite.inspector.subgraphs': 'Referenced subgraphs',
218
+ 'coreml.title': 'Core ML model', 'coreml.search': 'Search operations, operands, and weights…',
219
+ 'coreml.copyJson': 'Copy JSON', 'coreml.graph': 'Graph', 'coreml.unnamed': 'unnamed',
220
+ 'coreml.operations': 'Operations', 'coreml.io': 'Inputs & Outputs', 'coreml.weights': 'Weights',
221
+ 'coreml.packageContents': 'Package', 'coreml.modelInfo': 'Model Info',
222
+ 'coreml.package': 'Package', 'coreml.updatable': 'Updatable',
223
+ 'coreml.specVersion': 'specification v{version}',
224
+ 'coreml.rows': '{shown} / {total} rows shown', 'coreml.noMatches': 'No rows match the current search.',
225
+ 'coreml.selectNode': 'Select an operation or value to inspect it.',
226
+ 'coreml.graphLimited': 'Graph preview shows {shown} of {total} items.',
227
+ 'coreml.graphEdgesLimited': 'Only the first {count} connections are shown.',
228
+ 'coreml.moreItems': '{count} more…', 'coreml.optional': 'Optional', 'coreml.default': 'default',
229
+ 'coreml.unknown': 'unknown', 'coreml.external': 'from enclosing scope',
230
+ 'coreml.yes': 'Yes', 'coreml.no': 'No', 'coreml.rootItem': 'root model',
231
+ 'coreml.blobPresent': '{count} tensor(s), {referenced} referenced of {size} in the package',
232
+ 'coreml.blobAbsent': '{count} tensor(s), {referenced} referenced — the file is not available here',
233
+ 'coreml.weightFiles': 'Weight files',
234
+ 'coreml.summary.operations': 'Operations', 'coreml.summary.graphs': 'Graphs',
235
+ 'coreml.summary.inputs': 'Inputs', 'coreml.summary.outputs': 'Outputs',
236
+ 'coreml.summary.functions': 'Functions', 'coreml.summary.specVersion': 'Spec version',
237
+ 'coreml.kind.operation': 'Operation', 'coreml.kind.layer': 'Layer', 'coreml.kind.stage': 'Pipeline stage',
238
+ 'coreml.kind.input': 'Input', 'coreml.kind.output': 'Output', 'coreml.kind.state': 'State',
239
+ 'coreml.kind.trainingInput': 'Training input', 'coreml.kind.manifestItem': 'Manifest item',
240
+ 'coreml.kind.archiveMember': 'Archive member',
241
+ 'coreml.storage.blob': 'Weight file', 'coreml.storage.inline': 'Inline',
242
+ 'coreml.column.index': '#', 'coreml.column.name': 'Name', 'coreml.column.type': 'Type',
243
+ 'coreml.column.kind': 'Kind', 'coreml.column.inputs': 'Inputs', 'coreml.column.outputs': 'Outputs',
244
+ 'coreml.column.attributes': 'Attributes', 'coreml.column.weights': 'Weights',
245
+ 'coreml.column.function': 'Function', 'coreml.column.typeShape': 'Type / Shape',
246
+ 'coreml.column.flexibility': 'Flexibility', 'coreml.column.optional': 'Optional',
247
+ 'coreml.column.description': 'Description', 'coreml.column.graph': 'Graph', 'coreml.column.node': 'Operation',
248
+ 'coreml.column.parameter': 'Parameter', 'coreml.column.shape': 'Shape', 'coreml.column.elements': 'Elements',
249
+ 'coreml.column.dataSize': 'Data size', 'coreml.column.storage': 'Storage',
250
+ 'coreml.column.location': 'Location', 'coreml.column.path': 'Path',
251
+ 'coreml.info.modelType': 'Model type', 'coreml.info.specVersion': 'Specification version',
252
+ 'coreml.info.availability': 'OS availability', 'coreml.info.description': 'Description',
253
+ 'coreml.info.author': 'Author', 'coreml.info.license': 'License', 'coreml.info.version': 'Version',
254
+ 'coreml.info.updatable': 'On-device update', 'coreml.info.fileSize': 'File size',
255
+ 'coreml.info.functions': 'Functions', 'coreml.info.defaultFunction': 'Default function',
256
+ 'coreml.info.graphs': 'Graphs', 'coreml.info.classLabels': 'Class labels',
257
+ 'coreml.info.packageVersion': 'Package format', 'coreml.info.modelPath': 'Model path',
258
+ 'coreml.inspector.inputs': 'Inputs', 'coreml.inspector.outputs': 'Outputs',
259
+ 'coreml.inspector.attributes': 'Attributes', 'coreml.inspector.weights': 'Weights',
260
+ 'coreml.inspector.graphs': 'Referenced graphs',
261
+ 'coreml.warning.specVersion': 'The model declares specification version {version}, which this viewer does not have an OS mapping for.',
262
+ 'coreml.warning.noModelType': 'The model declares no model type.',
263
+ 'coreml.warning.emptyGraph': 'The model contains no operations.',
264
+ 'coreml.warning.emptyProgram': 'The ML Program declares no functions.',
265
+ 'coreml.warning.programVersion': 'The ML Program declares version {version}; this viewer targets version 1.',
266
+ 'coreml.warning.emptyPipeline': 'The pipeline contains no stages.',
267
+ 'coreml.warning.pipelineDepth': 'Pipeline nesting deeper than {limit} levels was not read.',
268
+ 'coreml.warning.unknownLayer': 'Layer {name} declares no recognized layer type.',
269
+ 'coreml.warning.customLayers': '{count} custom layer(s) require a matching runtime registration: {names}',
270
+ 'coreml.warning.blobMissing': '{count} weight file(s) the model references are not in this package: {names}',
271
+ 'coreml.warning.blobUnavailable': '{count} weight file(s) live beside this specification and were not read: {names}',
272
+ 'coreml.warning.manifestMissing': 'The package has no Manifest.json; the model was located by its conventional path.',
273
+ 'coreml.warning.manifestInvalid': 'The package Manifest.json could not be read.',
274
+ 'coreml.warning.manifestUnreadable': 'The package Manifest.json could not be extracted, so the package contents are not described.',
275
+ 'coreml.warning.textTruncated': 'Some text fields were longer than this viewer displays and were cut short.',
276
+ 'coreml.warning.archiveEntryLimit': 'Only the first {limit} archive entries were read.',
277
+ 'coreml.warning.serializedModel': 'This is a private serialized model; Apple documents no schema for its contents.',
278
+ 'coreml.warning.linkedModel': 'This model links to a separate model file that this viewer does not read.',
279
+ 'openvino.title': 'OpenVINO IR model', 'openvino.search': 'Search layers, ports, constants, and attributes…',
280
+ 'openvino.copyJson': 'Copy JSON', 'openvino.unnamed': 'unnamed', 'openvino.unknown': 'unknown', 'openvino.scalar': 'scalar',
281
+ 'openvino.irVersion': 'IR v{version}', 'openvino.noBin': 'no .bin supplied', 'openvino.binSize': '.bin {size}',
282
+ 'openvino.graph': 'Graph', 'openvino.layers': 'Layers', 'openvino.constants': 'Constants',
283
+ 'openvino.io': 'Inputs & Outputs', 'openvino.modelInfo': 'Model Info',
284
+ 'openvino.rows': '{shown} / {total} rows shown', 'openvino.noMatches': 'No rows match the current search.',
285
+ 'openvino.selectLayer': 'Select a layer to inspect it.',
286
+ 'openvino.graphLimited': 'Graph preview shows {shown} of {total} layers.',
287
+ 'openvino.graphEdgesLimited': 'Only the first {count} connections are shown.',
288
+ 'openvino.moreItems': '{count} more…',
289
+ 'openvino.kind.input': 'Input', 'openvino.kind.output': 'Output',
290
+ 'openvino.summary.layers': 'Layers', 'openvino.summary.edges': 'Edges', 'openvino.summary.operators': 'Operator types',
291
+ 'openvino.summary.constants': 'Constants', 'openvino.summary.weights': 'Weights', 'openvino.summary.io': 'Inputs / outputs',
292
+ 'openvino.column.id': 'ID', 'openvino.column.name': 'Name', 'openvino.column.type': 'Type', 'openvino.column.version': 'Opset',
293
+ 'openvino.column.inputs': 'Inputs', 'openvino.column.outputs': 'Outputs', 'openvino.column.attributes': 'Attributes',
294
+ 'openvino.column.rtInfo': 'Runtime info', 'openvino.column.kind': 'Kind', 'openvino.column.shape': 'Shape',
295
+ 'openvino.column.elements': 'Elements', 'openvino.column.offset': 'Offset', 'openvino.column.dataSize': 'Data size',
296
+ 'openvino.column.status': 'Status', 'openvino.column.preview': 'Preview', 'openvino.column.tensorNames': 'Tensor names',
297
+ 'openvino.column.typeShape': 'Type / Shape',
298
+ 'openvino.status.unchecked': 'Not checked', 'openvino.status.available': 'In .bin',
299
+ 'openvino.status.out-of-range': 'Beyond .bin', 'openvino.status.invalid': 'Invalid range',
300
+ 'openvino.info.name': 'Network name', 'openvino.info.irVersion': 'IR version', 'openvino.info.opsets': 'Opsets',
301
+ 'openvino.info.xmlSize': 'XML size', 'openvino.info.binSize': '.bin size', 'openvino.info.referencedBytes': 'Referenced weight bytes',
302
+ 'openvino.info.layers': 'Layers', 'openvino.info.edges': 'Edges', 'openvino.info.operator': 'Operator',
303
+ 'openvino.inspector.inputs': 'Inputs', 'openvino.inspector.outputs': 'Outputs', 'openvino.inspector.attributes': 'Attributes',
304
+ 'openvino.inspector.weights': 'Weights', 'openvino.inspector.range': 'offset {offset} · {size}',
305
+ 'openvino.inspector.preview': 'First {count} values', 'openvino.inspector.inputPort': 'input port', 'openvino.inspector.outputPort': 'output port',
306
+ 'openvino.inspector.bodies': 'Sub-graphs', 'openvino.inspector.body': '{kind} · {layers} layers · {edges} edges',
307
+ 'openvino.warning.noVersion': 'The <net> root declares no IR version.',
308
+ 'openvino.warning.legacyVersion': 'IR version {version} predates the opset-based v10 layout; the legacy blobs were read on a best-effort basis.',
309
+ 'openvino.warning.noLayers': 'The network contains no layers.',
310
+ 'openvino.warning.layersLimited': 'Only the first {shown} of {total} layers were read.',
311
+ 'openvino.warning.edgesLimited': 'Only the first {shown} of {total} edges were read.',
312
+ 'openvino.warning.metadataLimited': '{count} metadata entries were not read.',
313
+ 'openvino.warning.bodyLayersLimited': '{count} layer(s) inside control-flow sub-graphs were not read because the layer limit was reached.',
314
+ 'openvino.warning.bodyEdgesLimited': '{count} edge(s) inside control-flow sub-graphs were not read because the edge limit was reached.',
315
+ 'openvino.warning.bodiesLimited': '{count} control-flow sub-graph(s) beyond the per-layer limit were not kept.',
316
+ 'openvino.warning.truncated': 'The XML ends before its root element closes; the topology may be incomplete.',
317
+ 'openvino.warning.danglingEdges': '{count} edge(s) reference a layer that does not exist.',
318
+ 'openvino.warning.invalidConstants': '{count} constant(s) declare an unreadable offset or size.',
319
+ 'openvino.warning.noWeights': 'No .bin was supplied, so constants are shown by range only.',
320
+ 'openvino.warning.weightsOutOfRange': '{count} constant(s) reach beyond the {size} .bin; it may belong to a different model.',
321
+ 'openvino.warning.weightsUnreferenced': '{bytes} of the .bin are not referenced by any constant.',
322
+ 'pt2.title': 'PyTorch Export program (.pt2)', 'pt2.eyebrowLegacy': 'PyTorch Export · legacy archive',
323
+ 'pt2.search': 'Search nodes, values, weights, and modules…', 'pt2.selectModel': 'Model', 'pt2.copyJson': 'Copy JSON',
324
+ 'pt2.schema': 'schema {version}', 'pt2.scalar': 'scalar', 'pt2.rootModule': '(root)', 'pt2.preserved': 'preserved',
325
+ 'pt2.persistent': 'persistent', 'pt2.nonPersistent': 'non-persistent',
326
+ 'pt2.graph': 'Graph', 'pt2.nodes': 'Nodes', 'pt2.weights': 'Weights & Constants', 'pt2.io': 'Inputs & Outputs',
327
+ 'pt2.modules': 'Modules', 'pt2.modelInfo': 'Model Info', 'pt2.archive': 'Archive', 'pt2.extraFiles': 'Extra files', 'pt2.files': 'Files',
328
+ 'pt2.rows': '{shown} / {total} rows shown', 'pt2.noMatches': 'No rows match the current search.',
329
+ 'pt2.selectNode': 'Select a node or value to inspect it.', 'pt2.emptyGraph': 'The graph has no nodes.',
330
+ 'pt2.graphLimited': 'Graph preview shows {shown} of {total} elements.',
331
+ 'pt2.graphEdgesLimited': 'Only the first {count} connections are shown.', 'pt2.moreItems': '{count} more…',
332
+ 'pt2.side.input': 'Input', 'pt2.side.output': 'Output',
333
+ 'pt2.kind.user_input': 'User input', 'pt2.kind.parameter': 'Parameter', 'pt2.kind.buffer': 'Buffer',
334
+ 'pt2.kind.tensor_constant': 'Tensor constant', 'pt2.kind.custom_obj': 'Custom object', 'pt2.kind.opaque_obj': 'Opaque object',
335
+ 'pt2.kind.token': 'Token', 'pt2.kind.constant_input': 'Constant input', 'pt2.kind.user_output': 'User output',
336
+ 'pt2.kind.loss_output': 'Loss output', 'pt2.kind.buffer_mutation': 'Buffer mutation', 'pt2.kind.parameter_mutation': 'Parameter mutation',
337
+ 'pt2.kind.gradient_to_parameter': 'Gradient to parameter', 'pt2.kind.gradient_to_user_input': 'Gradient to user input',
338
+ 'pt2.kind.user_input_mutation': 'User input mutation',
339
+ 'pt2.status.raw': 'Raw bytes', 'pt2.status.pickled': 'Pickled (torch.save)', 'pt2.status.missing': 'Missing from archive',
340
+ 'pt2.status.truncated': 'Shorter than tensor', 'pt2.status.unlisted': 'No payload listed',
341
+ 'pt2.layout.pt2': 'PT2 archive', 'pt2.layout.legacy': 'Legacy torch.export.save layout',
342
+ 'pt2.category.model': 'Program', 'pt2.category.weights': 'Weights', 'pt2.category.constants': 'Constants',
343
+ 'pt2.category.sampleInputs': 'Sample inputs', 'pt2.category.aotinductor': 'AOTInductor', 'pt2.category.extra': 'Extra',
344
+ 'pt2.category.archive': 'Archive marker', 'pt2.category.other': 'Other',
345
+ 'pt2.column.index': '#', 'pt2.column.name': 'Name', 'pt2.column.op': 'Operator', 'pt2.column.module': 'Module',
346
+ 'pt2.column.inputs': 'Inputs', 'pt2.column.outputs': 'Outputs', 'pt2.column.graph': 'Sub-graph', 'pt2.column.kind': 'Kind',
347
+ 'pt2.column.placeholder': 'Placeholder', 'pt2.column.dtype': 'Dtype', 'pt2.column.shape': 'Shape', 'pt2.column.elements': 'Elements',
348
+ 'pt2.column.bytes': 'Tensor bytes', 'pt2.column.path': 'Path', 'pt2.column.fileSize': 'File size', 'pt2.column.status': 'Status',
349
+ 'pt2.column.preview': 'Preview', 'pt2.column.side': 'Side', 'pt2.column.value': 'Value', 'pt2.column.target': 'Target',
350
+ 'pt2.column.typeShape': 'Type / Shape', 'pt2.column.detail': 'Detail', 'pt2.column.class': 'Class', 'pt2.column.nodes': 'Nodes',
351
+ 'pt2.column.totalNodes': 'Nodes incl. children', 'pt2.column.signature': 'Call signature', 'pt2.column.forwardArgs': 'Forward args',
352
+ 'pt2.column.category': 'Category', 'pt2.column.compressedSize': 'Compressed', 'pt2.column.method': 'Method',
353
+ 'pt2.info.model': 'Model', 'pt2.info.torchVersion': 'PyTorch version', 'pt2.info.schemaVersion': 'Schema version',
354
+ 'pt2.info.opsets': 'Opsets', 'pt2.info.verifiers': 'Verifiers', 'pt2.info.nodes': 'Nodes', 'pt2.info.values': 'Values',
355
+ 'pt2.info.parameters': 'Parameters', 'pt2.info.weightBytes': 'Weight bytes', 'pt2.info.sampleInputs': 'Sample inputs',
356
+ 'pt2.info.rangeConstraint': 'Range constraint', 'pt2.info.guard': 'Guard', 'pt2.info.operator': 'Operator',
357
+ 'pt2.info.layout': 'Layout', 'pt2.info.fileSize': 'File size', 'pt2.info.prefix': 'Package folder', 'pt2.info.models': 'Programs',
358
+ 'pt2.info.aotInductor': 'AOTInductor model',
359
+ 'pt2.inspector.inputs': 'Inputs', 'pt2.inspector.outputs': 'Outputs', 'pt2.inspector.subgraphs': 'Sub-graphs',
360
+ 'pt2.inspector.subgraph': '{name} · {nodes} nodes · {inputs} inputs · {outputs} outputs',
361
+ 'pt2.inspector.moduleStack': 'Module stack', 'pt2.inspector.metadata': 'Metadata', 'pt2.inspector.stackTrace': 'Stack trace',
362
+ 'pt2.inspector.value': 'Value', 'pt2.inspector.producer': 'Producer', 'pt2.inspector.consumers': 'Consumers', 'pt2.inspector.payload': 'Payload',
363
+ 'pt2.inspector.fileSize': 'file {size}', 'pt2.inspector.tensorBytes': 'tensor {size}', 'pt2.inspector.preview': 'First {count} values',
364
+ 'pt2.inspector.strides': 'Strides', 'pt2.inspector.storageOffset': 'Storage offset', 'pt2.inspector.device': 'Device',
365
+ 'pt2.inspector.layout': 'Layout', 'pt2.inspector.requiresGrad': 'Requires grad',
366
+ 'pt2.summary.models': 'Programs', 'pt2.summary.nodes': 'Nodes', 'pt2.summary.operators': 'Operator types',
367
+ 'pt2.summary.parameters': 'Parameters', 'pt2.summary.weights': 'Weights', 'pt2.summary.constants': 'Constants',
368
+ 'pt2.summary.io': 'Inputs / outputs', 'pt2.summary.aotInductor': 'AOTInductor models',
369
+ 'pt2.summary.files': 'Archive members', 'pt2.summary.fileSize': 'File size',
370
+ 'pt2.warning.notZip': 'The file is not a ZIP archive, so it cannot be a PT2 package.',
371
+ 'pt2.warning.archiveUnreadable': 'The ZIP central directory could not be read.',
372
+ 'pt2.warning.entryLimit': 'Only the first {limit} archive members were read.',
373
+ 'pt2.warning.legacyLayout': 'This is the pre-PT2 torch.export.save layout: weights are torch.save pickles and are listed from the graph signature only.',
374
+ 'pt2.warning.noArchiveFormat': 'No archive_format marker was found; the package layout was inferred.',
375
+ 'pt2.warning.modelsLimited': 'Only the first {shown} of {total} programs were read.',
376
+ 'pt2.warning.unknownArchiveFormat': 'archive_format is "{value}" rather than "pt2".',
377
+ 'pt2.warning.memberTooLarge': '{name} exceeds the {limit} limit and was not read.',
378
+ 'pt2.warning.memberMethod': '{name} uses ZIP compression method {method}, which is not supported.',
379
+ 'pt2.warning.memberUnreadable': '{name} could not be read from the archive.',
380
+ 'pt2.warning.inflateUnavailable': '{name} is deflated and no inflater (jszip) is available.',
381
+ 'pt2.warning.jsonUnreadable': '{name} is not valid JSON.',
382
+ 'pt2.warning.modelUnreadable': 'The program "{name}" could not be read.',
383
+ 'pt2.warning.schemaVersion': 'Program "{name}" was serialized with schema {version}, newer than the {supported}.x this reader targets; some fields may be missing.',
384
+ 'pt2.warning.nodesLimited': '{count} node(s) were not read because the node limit was reached.',
385
+ 'pt2.warning.valuesLimited': '{count} value(s) were not read because the value limit was reached.',
386
+ 'pt2.warning.payloadsLimited': '{count} weight or constant entries were not read because the limit was reached.',
387
+ 'pt2.warning.danglingRefs': '{count} argument(s) reference a value that no node or input produces.',
388
+ 'pt2.warning.subgraphDepth': '{count} sub-graph(s) nested deeper than {limit} levels were not read.',
389
+ 'pt2.warning.pickledPayloads': 'Program "{name}": {count} tensor(s) are stored as torch.save pickles and are listed without a value preview.',
390
+ 'pt2.warning.payloadMissing': 'Program "{name}": {count} weight file(s) referenced by the payload config are not in the archive.',
391
+ 'pt2.warning.payloadTruncated': 'Program "{name}": {count} weight file(s) are shorter than the tensor they hold.',
392
+ 'pt2.warning.aotiOnly': 'The package holds only AOTInductor compiled artifacts; there is no Export IR graph to show.',
393
+ 'pt2.warning.noModels': 'The package holds no exported program (models/*.json).',
213
394
  'keras.title': 'Keras model', 'keras.document.v3': 'Keras v3 archive', 'keras.document.hdf5': 'Keras HDF5 model',
214
395
  'keras.version': 'Keras {version}', 'keras.search': 'Search layers, weights, and configuration…',
215
396
  'keras.copyJson': 'Copy JSON', 'keras.invalid': 'invalid',
@@ -449,6 +630,7 @@ export const CATALOG_EN = {
449
630
  'common.copied': 'Copied to clipboard',
450
631
  'common.noClipboard': 'Copy is unavailable on this platform',
451
632
  'common.copyTooLarge': 'Too large to copy to the clipboard ({size} bytes). Use file export instead.',
633
+ 'common.copyTooLargeNoExport': 'Too large to copy to the clipboard ({size} bytes).',
452
634
  'common.noFileSave': 'Saving files is unavailable on this platform',
453
635
  'common.saved': 'Saved {name}',
454
636
  'common.savedToOriginal': 'Saved',
@@ -3,14 +3,18 @@
3
3
  export const CATALOG_FR = {
4
4
  'audio.title': 'Audio', 'video.title': 'Vidéo', 'dbc.title': 'Base de données CAN',
5
5
  'audio.play': 'Lecture', 'audio.pause': 'Pause', 'audio.stop': 'Arrêt',
6
- 'audio.loop': 'Boucle', 'audio.clearRegions': 'Effacer les régions', 'audio.volume': 'Volume',
6
+ 'audio.volume': 'Volume',
7
+ 'audio.loop.region': 'Boucler la région', 'audio.loop.track': 'Boucler la piste',
7
8
  'audio.region.start': 'Début de la région (s)', 'audio.region.end': 'Fin de la région (s)', 'audio.region.duration': 'Durée de la région (s)',
8
9
  'audio.zoom': 'Zoom', 'audio.zoomIn': 'Zoom avant', 'audio.zoomOut': 'Zoom arrière', 'audio.zoomFit': 'Ajuster',
9
10
  'audio.visualization': 'Affichage', 'audio.vis.waveform': 'Forme d’onde', 'audio.vis.spectrogram': 'Spectrogramme',
10
11
  'audio.vis.both': 'Les deux', 'audio.download': 'Télécharger',
11
- 'audio.spectrogramScale': 'Échelle',
12
+ 'audio.spectrogramScale': 'Échelle du spectrogramme',
12
13
  'audio.scale.linear': 'Linéaire', 'audio.scale.mel': 'Mel', 'audio.scale.bark': 'Bark', 'audio.scale.erb': 'ERB',
14
+ 'audio.scale.logarithmic': 'Logarithmique',
15
+ 'audio.frequencyRange': 'Plage de fréquences', 'audio.frequency.full': 'Totale', 'audio.frequency.limit': "Jusqu'à {hz}",
13
16
  'audio.error.save': 'L’enregistrement du fichier audio a échoué.',
17
+ 'audio.error.spectrogram': 'Le spectrogramme de cette plage n’a pas pu être rendu.',
14
18
  'audio.info.duration': 'Durée', 'audio.info.sampleRate': 'Fréquence d’échantillonnage', 'audio.info.channels': 'Canaux',
15
19
  'audio.info.channelLevels': 'L crête {leftPeak}, RMS {leftRms} | R crête {rightPeak}, RMS {rightRms}',
16
20
  'audio.info.bitDepth': 'Profondeur de bits', 'audio.info.format': 'Format', 'audio.info.fileSize': 'Taille du fichier',
@@ -21,6 +25,7 @@ export const CATALOG_FR = {
21
25
  'audio.error.decode': 'Le navigateur n’a pas pu décoder ce codec audio. Essayez un hôte disposant du codec requis ou transcodez le fichier.',
22
26
  'audio.warning.analysisFailed': 'L’analyse préalable de la forme d’onde a échoué — retour au décodage complet par le navigateur, qui peut être lent pour un fichier de cette taille.',
23
27
  'audio.warning.analysisSkipped': 'L’analyse préalable de la forme d’onde n’est pas disponible pour ce format — retour au décodage complet par le navigateur, qui peut être lent pour un fichier de cette taille.',
28
+ 'audio.warning.reducedFidelity': 'Décodé en qualité réduite pour tenir en mémoire ; le spectrogramme perd ses fréquences les plus hautes.',
24
29
  'audio.vis.unavailableLarge': 'Le spectrogramme n’est pas disponible pour les fichiers volumineux rendus à partir de pics précalculés.',
25
30
  'video.play': 'Lecture', 'video.pause': 'Pause', 'video.stop': 'Arrêt',
26
31
  'video.skipBack': '⏪ -{seconds} s', 'video.skipForward': '⏩ +{seconds} s',
@@ -3,14 +3,18 @@
3
3
  export const CATALOG_IT = {
4
4
  'audio.title': 'Audio', 'video.title': 'Video', 'dbc.title': 'Database CAN',
5
5
  'audio.play': 'Riproduci', 'audio.pause': 'Pausa', 'audio.stop': 'Arresta',
6
- 'audio.loop': 'Ripeti', 'audio.clearRegions': 'Cancella regioni', 'audio.volume': 'Volume',
6
+ 'audio.volume': 'Volume',
7
+ 'audio.loop.region': 'Ripeti regione', 'audio.loop.track': 'Ripeti traccia',
7
8
  'audio.region.start': 'Inizio regione (s)', 'audio.region.end': 'Fine regione (s)', 'audio.region.duration': 'Durata regione (s)',
8
9
  'audio.zoom': 'Zoom', 'audio.zoomIn': 'Ingrandisci', 'audio.zoomOut': 'Riduci', 'audio.zoomFit': 'Adatta',
9
10
  'audio.visualization': 'Vista', 'audio.vis.waveform': 'Forma d’onda', 'audio.vis.spectrogram': 'Spettrogramma',
10
11
  'audio.vis.both': 'Entrambi', 'audio.download': 'Scarica',
11
- 'audio.spectrogramScale': 'Scala',
12
+ 'audio.spectrogramScale': 'Scala dello spettrogramma',
12
13
  'audio.scale.linear': 'Lineare', 'audio.scale.mel': 'Mel', 'audio.scale.bark': 'Bark', 'audio.scale.erb': 'ERB',
14
+ 'audio.scale.logarithmic': 'Logaritmica',
15
+ 'audio.frequencyRange': 'Intervallo di frequenza', 'audio.frequency.full': 'Completo', 'audio.frequency.limit': 'Fino a {hz}',
13
16
  'audio.error.save': 'Salvataggio del file audio non riuscito.',
17
+ 'audio.error.spectrogram': 'Non è stato possibile disegnare lo spettrogramma per questo intervallo.',
14
18
  'audio.info.duration': 'Durata', 'audio.info.sampleRate': 'Frequenza di campionamento', 'audio.info.channels': 'Canali',
15
19
  'audio.info.channelLevels': 'L picco {leftPeak}, RMS {leftRms} | R picco {rightPeak}, RMS {rightRms}',
16
20
  'audio.info.bitDepth': 'Profondità di bit', 'audio.info.format': 'Formato', 'audio.info.fileSize': 'Dimensione file',
@@ -21,6 +25,7 @@ export const CATALOG_IT = {
21
25
  'audio.error.decode': 'Il browser non è riuscito a decodificare questo codec audio. Prova un host con il codec richiesto o transcodifica il file.',
22
26
  'audio.warning.analysisFailed': 'L’analisi preliminare della forma d’onda non è riuscita — si torna alla decodifica completa del browser, che può essere lenta per un file di queste dimensioni.',
23
27
  'audio.warning.analysisSkipped': 'L’analisi preliminare della forma d’onda non è disponibile per questo formato — si torna alla decodifica completa del browser, che può essere lenta per un file di queste dimensioni.',
28
+ 'audio.warning.reducedFidelity': 'Decodificato a qualità ridotta per rientrare in memoria; lo spettrogramma perde le frequenze più alte.',
24
29
  'audio.vis.unavailableLarge': 'Lo spettrogramma non è disponibile per i file di grandi dimensioni renderizzati da picchi precalcolati.',
25
30
  'video.play': 'Riproduci', 'video.pause': 'Pausa', 'video.stop': 'Arresta',
26
31
  'video.skipBack': '⏪ -{seconds} s', 'video.skipForward': '⏩ +{seconds} s',