@mosaicoo/svg-engine 0.1.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.
@@ -0,0 +1,175 @@
1
+ import * as i0 from '@angular/core';
2
+ import { InjectionToken, Provider, Signal } from '@angular/core';
3
+
4
+ /**
5
+ * **D-046 voz local (Whisper WASM)** — configuração do provider de
6
+ * reconhecimento de voz **100% offline** baseado em
7
+ * `@huggingface/transformers` (transformers.js) + onnxruntime-web.
8
+ *
9
+ * Todos os caminhos apontam para assets **servidos pela própria
10
+ * origem** do app (sem CDN / sem `huggingface.co` em runtime). O modelo
11
+ * vem do submódulo `assets/ml/whisper` (repo `svgengine-ml-assets`); os
12
+ * binários `.wasm` do onnxruntime são copiados do pacote npm para os
13
+ * assets do app (ver `angular.json`).
14
+ */
15
+ interface WhisperVoiceConfig {
16
+ /**
17
+ * Base servida onde o transformers.js procura o modelo
18
+ * (`env.localModelPath`). O modelo é resolvido em
19
+ * `${modelBasePath}/${modelId}/...`. Default: `/assets/ml/whisper`.
20
+ */
21
+ readonly modelBasePath: string;
22
+ /**
23
+ * Id/pasta do modelo dentro de `modelBasePath`. Default:
24
+ * `whisper-base`.
25
+ */
26
+ readonly modelId: string;
27
+ /**
28
+ * Base servida com os binários `.wasm` do onnxruntime-web
29
+ * (`env.backends.onnx.wasm.wasmPaths`). Default: `/assets/ml/ort/`.
30
+ */
31
+ readonly wasmBasePath: string;
32
+ /**
33
+ * dtype do modelo ONNX. `'q8'` mapeia para os arquivos
34
+ * `*_quantized.onnx` (que vendoramos: encoder/decoder int8). Mantenha
35
+ * `'q8'` salvo se vendorar outra variante.
36
+ */
37
+ readonly dtype: 'q8' | 'fp32' | 'fp16' | 'int8' | 'uint8' | 'q4' | 'q4f16';
38
+ /**
39
+ * Nº de threads WASM. **1** (default) evita exigir cross-origin
40
+ * isolation (COOP/COEP) — funciona em qualquer hospedagem. Aumente
41
+ * apenas se o app já servir os headers de isolamento.
42
+ */
43
+ readonly numThreads: number;
44
+ /**
45
+ * Nível de otimização de grafo do onnxruntime (`session_options`).
46
+ * **`'disabled'`** (default) evita a passada
47
+ * `TransposeDQWeightsForMatMulNBits` do ORT 1.26, que falha ao carregar
48
+ * o decoder int8 do Whisper base (`Missing required scale` no
49
+ * `embed_tokens` merged/transposto). O modelo carrega e roda normal
50
+ * sem essa fusão — só perde uma otimização de performance irrelevante
51
+ * para comandos curtos. Suba para `'basic'`/`'all'` apenas se vendorar
52
+ * um modelo cuja quantização o ORT consiga fundir.
53
+ */
54
+ readonly graphOptimizationLevel: 'disabled' | 'basic' | 'extended' | 'all';
55
+ /**
56
+ * Idioma BCP-47 padrão quando o chamador não informa. Default
57
+ * `'pt'`. O Whisper base é multilíngue (PT-BR / ES / EN / …).
58
+ */
59
+ readonly defaultLanguage: string;
60
+ /**
61
+ * Duração máxima de captura por sessão (ms) antes de parar
62
+ * automaticamente e transcrever. Funciona como teto de segurança
63
+ * caso o VAD nunca dispare (ruído constante). Default 15000.
64
+ */
65
+ readonly maxRecordMs: number;
66
+ /**
67
+ * **VAD (detecção de silêncio)** — após a fala começar, encerra a
68
+ * captura automaticamente quando o silêncio durar este tempo (ms).
69
+ * Espelha o auto-stop da Web Speech para manter o comportamento
70
+ * consistente entre as engines. Default 1000 (1 s).
71
+ * `0` desliga o VAD (só para via `stop()` ou `maxRecordMs`).
72
+ */
73
+ readonly silenceMs: number;
74
+ /**
75
+ * Limiar de energia (RMS, 0–1 no domínio do tempo) acima do qual o
76
+ * áudio é considerado fala pelo VAD. Default 0.015. Aumente se o
77
+ * ruído de fundo disparar falso-positivo; diminua se a fala não
78
+ * estiver sendo detectada (mic baixo/distante).
79
+ */
80
+ readonly silenceThreshold: number;
81
+ /**
82
+ * **Timeout de "nenhuma fala"** — se o VAD **não** detectar fala
83
+ * dentro deste tempo (ms) após iniciar, encerra a captura mesmo
84
+ * assim. Evita o microfone ficar "preso" ligado quando o áudio fica
85
+ * abaixo do limiar. Default 6000. `0` desliga (só `maxRecordMs`).
86
+ */
87
+ readonly noSpeechTimeoutMs: number;
88
+ }
89
+ /** Defaults aplicáveis ao layout padrão de assets dos apps SVGEngine. */
90
+ declare const DEFAULT_WHISPER_VOICE_CONFIG: WhisperVoiceConfig;
91
+ /** Token DI para a configuração do provider Whisper. */
92
+ declare const WHISPER_VOICE_CONFIG: InjectionToken<WhisperVoiceConfig>;
93
+ /**
94
+ * Helper de bootstrap — registra a configuração do provider Whisper.
95
+ * Passe um patch parcial; os campos ausentes usam
96
+ * {@link DEFAULT_WHISPER_VOICE_CONFIG}.
97
+ *
98
+ * ```ts
99
+ * providers: [provideWhisperVoice({ modelBasePath: '/custom/assets/whisper' })]
100
+ * ```
101
+ */
102
+ declare function provideWhisperVoice(config?: Partial<WhisperVoiceConfig>): Provider;
103
+
104
+ declare class WhisperVoiceService {
105
+ private readonly config;
106
+ /** `false` quando o ambiente não tem mic/WebAssembly (UI esconde o botão). */
107
+ readonly isSupported: Signal<boolean>;
108
+ private readonly _listening;
109
+ /** `true` enquanto está gravando OU transcrevendo. */
110
+ readonly listening: Signal<boolean>;
111
+ private readonly _modelLoading;
112
+ /** `true` durante o (primeiro) carregamento do modelo do disco. */
113
+ readonly modelLoading: Signal<boolean>;
114
+ private readonly _lastError;
115
+ /** Último erro (`'not-allowed'`, `'audio-capture'`, `'load-failed'`, …). */
116
+ readonly lastError: Signal<string | null>;
117
+ /** Pipeline ASR carregado uma vez e reutilizado entre capturas. */
118
+ private transcriber;
119
+ /** Recorder/stream da captura ativa (para `stop()`). */
120
+ private activeRecorder;
121
+ private activeStream;
122
+ /**
123
+ * Inicia a captura e resolve com a transcrição final. Grava até
124
+ * `stop()` ser chamado OU `maxRecordMs` expirar, então transcreve.
125
+ *
126
+ * @param lang BCP-47 (default `config.defaultLanguage`)
127
+ * @param options.timeoutMs duração máxima de captura (default
128
+ * `config.maxRecordMs`)
129
+ */
130
+ listen(lang?: string, options?: {
131
+ readonly timeoutMs?: number;
132
+ }): Promise<string>;
133
+ /** Encerra a captura ativa (dispara a transcrição do que foi gravado). */
134
+ stop(): void;
135
+ /** Decodifica + downmix mono + reamostra para 16 kHz e roda o ASR. */
136
+ private transcribe;
137
+ /**
138
+ * Carrega (uma vez) o pipeline ASR a partir dos assets locais. Lazy
139
+ * `import()` do transformers.js — só puxa a lib quando a voz Whisper é
140
+ * realmente usada. Configura o env para **não** acessar a rede externa.
141
+ */
142
+ private ensurePipeline;
143
+ static ɵfac: i0.ɵɵFactoryDeclaration<WhisperVoiceService, never>;
144
+ static ɵprov: i0.ɵɵInjectableDeclaration<WhisperVoiceService>;
145
+ }
146
+
147
+ /**
148
+ * **Bootstrap da voz local (Whisper) como engine selecionável.**
149
+ *
150
+ * Registra o {@link WhisperVoiceService} no token opcional
151
+ * `VOICE_WHISPER_PROVIDER` (de `svg-engine/ai/nlu`), tornando-o
152
+ * disponível para o `VoiceEngineService` (orquestrador em `nlu-ui`).
153
+ * A partir daí o usuário pode escolher a engine `'whisper'` ou
154
+ * `'auto'` no `<svge-nlu-input>`.
155
+ *
156
+ * Aceita um patch opcional de {@link WhisperVoiceConfig} (caminhos de
157
+ * assets, dtype, idioma padrão). Sem o patch, usa os defaults
158
+ * (`/assets/ml/whisper`, `/assets/ml/ort/`, `whisper-base`, `q8`).
159
+ *
160
+ * ```ts
161
+ * // app.config.ts
162
+ * providers: [
163
+ * ...provideWhisperVoiceEngine(),
164
+ * // ou com caminhos custom:
165
+ * ...provideWhisperVoiceEngine({ modelBasePath: '/cdn/whisper' }),
166
+ * ]
167
+ * ```
168
+ *
169
+ * **Pré-requisito**: os assets do modelo + `.wasm` do onnxruntime
170
+ * precisam estar servidos pela origem do app (ver `angular.json`).
171
+ */
172
+ declare function provideWhisperVoiceEngine(config?: Partial<WhisperVoiceConfig>): Provider[];
173
+
174
+ export { DEFAULT_WHISPER_VOICE_CONFIG, WHISPER_VOICE_CONFIG, WhisperVoiceService, provideWhisperVoice, provideWhisperVoiceEngine };
175
+ export type { WhisperVoiceConfig };