@pie-players/pie-assessment-toolkit 0.2.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.
- package/README.md +520 -0
- package/dist/attempt/TestSession.d.ts +90 -0
- package/dist/attempt/TestSession.d.ts.map +1 -0
- package/dist/attempt/TestSession.js +174 -0
- package/dist/attempt/TestSession.js.map +1 -0
- package/dist/core/TypedEventBus.d.ts +48 -0
- package/dist/core/TypedEventBus.d.ts.map +1 -0
- package/dist/core/TypedEventBus.js +63 -0
- package/dist/core/TypedEventBus.js.map +1 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +44 -0
- package/dist/index.js.map +1 -0
- package/dist/item-loader.d.ts +45 -0
- package/dist/item-loader.d.ts.map +1 -0
- package/dist/item-loader.js +62 -0
- package/dist/item-loader.js.map +1 -0
- package/dist/player/AssessmentPlayer.d.ts +388 -0
- package/dist/player/AssessmentPlayer.d.ts.map +1 -0
- package/dist/player/AssessmentPlayer.js +965 -0
- package/dist/player/AssessmentPlayer.js.map +1 -0
- package/dist/player/index.d.ts +17 -0
- package/dist/player/index.d.ts.map +1 -0
- package/dist/player/index.js +15 -0
- package/dist/player/index.js.map +1 -0
- package/dist/player/navigation-types.d.ts +63 -0
- package/dist/player/navigation-types.d.ts.map +1 -0
- package/dist/player/navigation-types.js +7 -0
- package/dist/player/navigation-types.js.map +1 -0
- package/dist/player/qti-navigation.d.ts +29 -0
- package/dist/player/qti-navigation.d.ts.map +1 -0
- package/dist/player/qti-navigation.js +160 -0
- package/dist/player/qti-navigation.js.map +1 -0
- package/dist/reference-layout/index.d.ts +19 -0
- package/dist/reference-layout/index.d.ts.map +1 -0
- package/dist/reference-layout/index.js +20 -0
- package/dist/reference-layout/index.js.map +1 -0
- package/dist/services/AccessibilityCatalogResolver.d.ts +141 -0
- package/dist/services/AccessibilityCatalogResolver.d.ts.map +1 -0
- package/dist/services/AccessibilityCatalogResolver.js +249 -0
- package/dist/services/AccessibilityCatalogResolver.js.map +1 -0
- package/dist/services/AssessmentAuthoringService.d.ts +60 -0
- package/dist/services/AssessmentAuthoringService.d.ts.map +1 -0
- package/dist/services/AssessmentAuthoringService.js +183 -0
- package/dist/services/AssessmentAuthoringService.js.map +1 -0
- package/dist/services/ContextVariableStore.d.ts +114 -0
- package/dist/services/ContextVariableStore.d.ts.map +1 -0
- package/dist/services/ContextVariableStore.js +207 -0
- package/dist/services/ContextVariableStore.js.map +1 -0
- package/dist/services/ElementToolStateStore.d.ts +125 -0
- package/dist/services/ElementToolStateStore.d.ts.map +1 -0
- package/dist/services/ElementToolStateStore.js +200 -0
- package/dist/services/ElementToolStateStore.js.map +1 -0
- package/dist/services/HighlightCoordinator.d.ts +179 -0
- package/dist/services/HighlightCoordinator.d.ts.map +1 -0
- package/dist/services/HighlightCoordinator.js +446 -0
- package/dist/services/HighlightCoordinator.js.map +1 -0
- package/dist/services/I18nService.d.ts +121 -0
- package/dist/services/I18nService.d.ts.map +1 -0
- package/dist/services/I18nService.js +276 -0
- package/dist/services/I18nService.js.map +1 -0
- package/dist/services/PNPMapper.d.ts +71 -0
- package/dist/services/PNPMapper.d.ts.map +1 -0
- package/dist/services/PNPMapper.js +98 -0
- package/dist/services/PNPMapper.js.map +1 -0
- package/dist/services/PNPToolResolver.d.ts +127 -0
- package/dist/services/PNPToolResolver.d.ts.map +1 -0
- package/dist/services/PNPToolResolver.js +222 -0
- package/dist/services/PNPToolResolver.js.map +1 -0
- package/dist/services/SSMLExtractor.d.ts +61 -0
- package/dist/services/SSMLExtractor.d.ts.map +1 -0
- package/dist/services/SSMLExtractor.js +181 -0
- package/dist/services/SSMLExtractor.js.map +1 -0
- package/dist/services/TTSService.d.ts +162 -0
- package/dist/services/TTSService.d.ts.map +1 -0
- package/dist/services/TTSService.js +465 -0
- package/dist/services/TTSService.js.map +1 -0
- package/dist/services/ThemeProvider.d.ts +95 -0
- package/dist/services/ThemeProvider.d.ts.map +1 -0
- package/dist/services/ThemeProvider.js +299 -0
- package/dist/services/ThemeProvider.js.map +1 -0
- package/dist/services/ToolConfigResolver.d.ts +162 -0
- package/dist/services/ToolConfigResolver.d.ts.map +1 -0
- package/dist/services/ToolConfigResolver.js +230 -0
- package/dist/services/ToolConfigResolver.js.map +1 -0
- package/dist/services/ToolCoordinator.d.ts +137 -0
- package/dist/services/ToolCoordinator.d.ts.map +1 -0
- package/dist/services/ToolCoordinator.js +318 -0
- package/dist/services/ToolCoordinator.js.map +1 -0
- package/dist/services/ToolkitCoordinator.d.ts +188 -0
- package/dist/services/ToolkitCoordinator.d.ts.map +1 -0
- package/dist/services/ToolkitCoordinator.js +252 -0
- package/dist/services/ToolkitCoordinator.js.map +1 -0
- package/dist/services/interfaces.d.ts +391 -0
- package/dist/services/interfaces.d.ts.map +1 -0
- package/dist/services/interfaces.js +12 -0
- package/dist/services/interfaces.js.map +1 -0
- package/dist/services/tool-providers/DesmosToolProvider.d.ts +103 -0
- package/dist/services/tool-providers/DesmosToolProvider.d.ts.map +1 -0
- package/dist/services/tool-providers/DesmosToolProvider.js +127 -0
- package/dist/services/tool-providers/DesmosToolProvider.js.map +1 -0
- package/dist/services/tool-providers/IToolProvider.d.ts +137 -0
- package/dist/services/tool-providers/IToolProvider.d.ts.map +1 -0
- package/dist/services/tool-providers/IToolProvider.js +13 -0
- package/dist/services/tool-providers/IToolProvider.js.map +1 -0
- package/dist/services/tool-providers/TIToolProvider.d.ts +107 -0
- package/dist/services/tool-providers/TIToolProvider.d.ts.map +1 -0
- package/dist/services/tool-providers/TIToolProvider.js +123 -0
- package/dist/services/tool-providers/TIToolProvider.js.map +1 -0
- package/dist/services/tool-providers/TTSToolProvider.d.ts +143 -0
- package/dist/services/tool-providers/TTSToolProvider.d.ts.map +1 -0
- package/dist/services/tool-providers/TTSToolProvider.js +168 -0
- package/dist/services/tool-providers/TTSToolProvider.js.map +1 -0
- package/dist/services/tool-providers/ToolProviderRegistry.d.ts +165 -0
- package/dist/services/tool-providers/ToolProviderRegistry.d.ts.map +1 -0
- package/dist/services/tool-providers/ToolProviderRegistry.js +240 -0
- package/dist/services/tool-providers/ToolProviderRegistry.js.map +1 -0
- package/dist/services/tool-providers/index.d.ts +18 -0
- package/dist/services/tool-providers/index.d.ts.map +1 -0
- package/dist/services/tool-providers/index.js +15 -0
- package/dist/services/tool-providers/index.js.map +1 -0
- package/dist/services/tts/browser-provider.d.ts +24 -0
- package/dist/services/tts/browser-provider.d.ts.map +1 -0
- package/dist/services/tts/browser-provider.js +177 -0
- package/dist/services/tts/browser-provider.js.map +1 -0
- package/dist/services/tts/provider-interface.d.ts +131 -0
- package/dist/services/tts/provider-interface.d.ts.map +1 -0
- package/dist/services/tts/provider-interface.js +10 -0
- package/dist/services/tts/provider-interface.js.map +1 -0
- package/dist/tools/calculators/desmos-provider.d.ts +54 -0
- package/dist/tools/calculators/desmos-provider.d.ts.map +1 -0
- package/dist/tools/calculators/desmos-provider.js +384 -0
- package/dist/tools/calculators/desmos-provider.js.map +1 -0
- package/dist/tools/calculators/mathjs-provider.d.ts +50 -0
- package/dist/tools/calculators/mathjs-provider.d.ts.map +1 -0
- package/dist/tools/calculators/mathjs-provider.js +660 -0
- package/dist/tools/calculators/mathjs-provider.js.map +1 -0
- package/dist/tools/calculators/ti-provider.d.ts +122 -0
- package/dist/tools/calculators/ti-provider.d.ts.map +1 -0
- package/dist/tools/calculators/ti-provider.js +587 -0
- package/dist/tools/calculators/ti-provider.js.map +1 -0
- package/dist/tools/client.d.ts +17 -0
- package/dist/tools/client.d.ts.map +1 -0
- package/dist/tools/client.js +26 -0
- package/dist/tools/client.js.map +1 -0
- package/dist/tools/index.d.ts +8 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +10 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/library-loader.d.ts +63 -0
- package/dist/tools/library-loader.d.ts.map +1 -0
- package/dist/tools/library-loader.js +292 -0
- package/dist/tools/library-loader.js.map +1 -0
- package/dist/tools/response-discovery.d.ts +72 -0
- package/dist/tools/response-discovery.d.ts.map +1 -0
- package/dist/tools/response-discovery.js +183 -0
- package/dist/tools/response-discovery.js.map +1 -0
- package/dist/tools/tool-coordinator.d.ts +76 -0
- package/dist/tools/tool-coordinator.d.ts.map +1 -0
- package/dist/tools/tool-coordinator.js +197 -0
- package/dist/tools/tool-coordinator.js.map +1 -0
- package/dist/tools/types.d.ts +427 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +13 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools/variant-resolver.d.ts +48 -0
- package/dist/tools/variant-resolver.d.ts.map +1 -0
- package/dist/tools/variant-resolver.js +214 -0
- package/dist/tools/variant-resolver.js.map +1 -0
- package/dist/types/events.d.ts +157 -0
- package/dist/types/events.d.ts.map +1 -0
- package/dist/types/events.js +11 -0
- package/dist/types/events.js.map +1 -0
- package/dist/utils/logger.d.ts +7 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +11 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +71 -0
- package/src/README.md +626 -0
- package/src/components/QuestionToolBar.svelte +406 -0
- package/src/player/AssessmentLayout.svelte +68 -0
- package/src/player/README.md +154 -0
- package/src/reference-layout/README.md +135 -0
- package/src/reference-layout/ReferenceLayout.svelte +209 -0
- package/src/reference-layout/components/AssessmentContent.svelte +259 -0
- package/src/reference-layout/components/AssessmentFooter.svelte +89 -0
- package/src/reference-layout/components/AssessmentHeader.svelte +250 -0
- package/src/reference-layout/components/AssessmentNavigation.svelte +134 -0
- package/src/reference-layout/components/AssessmentToolsBar.svelte +176 -0
- package/src/reference-layout/components/ItemPanel.svelte +200 -0
- package/src/reference-layout/components/NotesPanel.svelte +179 -0
- package/src/reference-layout/components/PassagePanel.svelte +76 -0
- package/src/tools/README.md +616 -0
- package/src/tools/calculators/README.md +395 -0
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser TTS Provider
|
|
3
|
+
*
|
|
4
|
+
* Text-to-speech provider using the browser's Web Speech API.
|
|
5
|
+
* Works in all modern browsers that support SpeechSynthesis.
|
|
6
|
+
*
|
|
7
|
+
* Part of PIE Assessment Toolkit.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Browser TTS Provider
|
|
11
|
+
*
|
|
12
|
+
* Stateless factory for creating browser-based TTS implementations.
|
|
13
|
+
*/
|
|
14
|
+
export class BrowserTTSProvider {
|
|
15
|
+
providerId = "browser";
|
|
16
|
+
providerName = "Browser Speech Synthesis";
|
|
17
|
+
version = "1.0.0";
|
|
18
|
+
async initialize(config) {
|
|
19
|
+
// SSR guard
|
|
20
|
+
if (typeof window === "undefined") {
|
|
21
|
+
throw new Error("BrowserTTSProvider requires browser environment");
|
|
22
|
+
}
|
|
23
|
+
// Check browser support
|
|
24
|
+
if (!("speechSynthesis" in window)) {
|
|
25
|
+
throw new Error("Browser does not support Speech Synthesis API");
|
|
26
|
+
}
|
|
27
|
+
return new BrowserTTSProviderImpl(config);
|
|
28
|
+
}
|
|
29
|
+
supportsFeature(feature) {
|
|
30
|
+
// Browser supports all TTS features
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
getCapabilities() {
|
|
34
|
+
return {
|
|
35
|
+
supportsPause: true,
|
|
36
|
+
supportsResume: true,
|
|
37
|
+
supportsWordBoundary: true,
|
|
38
|
+
supportsVoiceSelection: true,
|
|
39
|
+
supportsRateControl: true,
|
|
40
|
+
supportsPitchControl: true,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
destroy() {
|
|
44
|
+
// No cleanup needed for browser provider
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Browser TTS Provider Implementation
|
|
49
|
+
*
|
|
50
|
+
* Handles actual speech synthesis using the Web Speech API.
|
|
51
|
+
*/
|
|
52
|
+
class BrowserTTSProviderImpl {
|
|
53
|
+
utterance = null;
|
|
54
|
+
config = null;
|
|
55
|
+
_isPlaying = false;
|
|
56
|
+
_isPaused = false;
|
|
57
|
+
constructor(config) {
|
|
58
|
+
this.config = config;
|
|
59
|
+
}
|
|
60
|
+
async speak(text) {
|
|
61
|
+
return new Promise((resolve, reject) => {
|
|
62
|
+
if (!this.config) {
|
|
63
|
+
reject(new Error("TTS not initialized"));
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
this.stop(); // Stop any ongoing speech
|
|
67
|
+
this.utterance = new SpeechSynthesisUtterance(text);
|
|
68
|
+
// Track for word boundary fallback
|
|
69
|
+
let lastBoundaryIndex = -1;
|
|
70
|
+
let boundaryCount = 0;
|
|
71
|
+
// Apply config
|
|
72
|
+
if (this.config.voice) {
|
|
73
|
+
const voices = speechSynthesis.getVoices();
|
|
74
|
+
const voice = voices.find((v) => v.name === this.config.voice);
|
|
75
|
+
if (voice)
|
|
76
|
+
this.utterance.voice = voice;
|
|
77
|
+
}
|
|
78
|
+
if (this.config.rate)
|
|
79
|
+
this.utterance.rate = this.config.rate;
|
|
80
|
+
if (this.config.pitch)
|
|
81
|
+
this.utterance.pitch = this.config.pitch;
|
|
82
|
+
// Set up event handlers
|
|
83
|
+
this.utterance.onstart = () => {
|
|
84
|
+
this._isPlaying = true;
|
|
85
|
+
this._isPaused = false;
|
|
86
|
+
};
|
|
87
|
+
this.utterance.onend = () => {
|
|
88
|
+
this._isPlaying = false;
|
|
89
|
+
this._isPaused = false;
|
|
90
|
+
resolve();
|
|
91
|
+
};
|
|
92
|
+
this.utterance.onerror = (event) => {
|
|
93
|
+
this._isPlaying = false;
|
|
94
|
+
this._isPaused = false;
|
|
95
|
+
// Ignore "interrupted" errors (expected when user stops TTS)
|
|
96
|
+
if (event.error === "interrupted" || event.error === "canceled") {
|
|
97
|
+
resolve(); // Treat interruption as successful completion
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
reject(new Error(`Speech synthesis error: ${event.error}`));
|
|
101
|
+
};
|
|
102
|
+
this.utterance.onpause = () => {
|
|
103
|
+
this._isPaused = true;
|
|
104
|
+
};
|
|
105
|
+
this.utterance.onresume = () => {
|
|
106
|
+
this._isPaused = false;
|
|
107
|
+
};
|
|
108
|
+
// Word boundary events (if supported)
|
|
109
|
+
this.utterance.onboundary = (event) => {
|
|
110
|
+
console.log("[BrowserProvider] Boundary event:", event.name, "charIndex:", event.charIndex, "charLength:", event.charLength);
|
|
111
|
+
if (event.name === "word" && this.onWordBoundary) {
|
|
112
|
+
boundaryCount++;
|
|
113
|
+
// Detect if browser word boundaries are broken (Safari bug)
|
|
114
|
+
// If we get multiple events at the same position, boundaries don't work
|
|
115
|
+
if (event.charIndex === lastBoundaryIndex && boundaryCount > 2) {
|
|
116
|
+
console.warn("[BrowserProvider] Browser word boundaries broken - disabling word highlighting");
|
|
117
|
+
if (this.utterance) {
|
|
118
|
+
this.utterance.onboundary = null; // Stop listening
|
|
119
|
+
}
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
lastBoundaryIndex = event.charIndex;
|
|
123
|
+
// Extract word from text
|
|
124
|
+
const word = text.substring(event.charIndex, event.charIndex + (event.charLength || 0));
|
|
125
|
+
console.log("[BrowserProvider] Calling onWordBoundary with word:", word, "at position:", event.charIndex);
|
|
126
|
+
this.onWordBoundary(word, event.charIndex);
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
// Start speaking
|
|
130
|
+
speechSynthesis.speak(this.utterance);
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
pause() {
|
|
134
|
+
if (this._isPlaying && !this._isPaused) {
|
|
135
|
+
speechSynthesis.pause();
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
resume() {
|
|
139
|
+
if (this._isPlaying && this._isPaused) {
|
|
140
|
+
speechSynthesis.resume();
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
stop() {
|
|
144
|
+
if (this._isPlaying) {
|
|
145
|
+
speechSynthesis.cancel();
|
|
146
|
+
this._isPlaying = false;
|
|
147
|
+
this._isPaused = false;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
isPlaying() {
|
|
151
|
+
return this._isPlaying && !this._isPaused;
|
|
152
|
+
}
|
|
153
|
+
isPaused() {
|
|
154
|
+
return this._isPaused;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Update settings dynamically (rate, pitch, voice)
|
|
158
|
+
* Changes take effect on the next speak() call
|
|
159
|
+
*/
|
|
160
|
+
updateSettings(settings) {
|
|
161
|
+
if (!this.config) {
|
|
162
|
+
this.config = {};
|
|
163
|
+
}
|
|
164
|
+
// Update config with new settings
|
|
165
|
+
if (settings.rate !== undefined) {
|
|
166
|
+
this.config.rate = settings.rate;
|
|
167
|
+
}
|
|
168
|
+
if (settings.pitch !== undefined) {
|
|
169
|
+
this.config.pitch = settings.pitch;
|
|
170
|
+
}
|
|
171
|
+
if (settings.voice !== undefined) {
|
|
172
|
+
this.config.voice = settings.voice;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
onWordBoundary;
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=browser-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-provider.js","sourceRoot":"","sources":["../../../src/services/tts/browser-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TTS Provider Interfaces
|
|
3
|
+
*
|
|
4
|
+
* Defines the contract for text-to-speech providers.
|
|
5
|
+
* Providers are stateless factories that create configured TTS implementations.
|
|
6
|
+
*
|
|
7
|
+
* Part of PIE Assessment Toolkit.
|
|
8
|
+
*/
|
|
9
|
+
import type { TTSConfig } from "../TTSService";
|
|
10
|
+
/**
|
|
11
|
+
* TTS Provider interface
|
|
12
|
+
*
|
|
13
|
+
* Providers are stateless factories that create TTS implementations.
|
|
14
|
+
* They describe capabilities and create configured instances.
|
|
15
|
+
*/
|
|
16
|
+
export interface ITTSProvider {
|
|
17
|
+
/**
|
|
18
|
+
* Unique identifier for this provider
|
|
19
|
+
*/
|
|
20
|
+
readonly providerId: string;
|
|
21
|
+
/**
|
|
22
|
+
* Human-readable provider name
|
|
23
|
+
*/
|
|
24
|
+
readonly providerName: string;
|
|
25
|
+
/**
|
|
26
|
+
* Provider version
|
|
27
|
+
*/
|
|
28
|
+
readonly version: string;
|
|
29
|
+
/**
|
|
30
|
+
* Initialize and create a configured TTS implementation
|
|
31
|
+
*/
|
|
32
|
+
initialize(config: TTSConfig): Promise<ITTSProviderImplementation>;
|
|
33
|
+
/**
|
|
34
|
+
* Check if a specific feature is supported
|
|
35
|
+
*/
|
|
36
|
+
supportsFeature(feature: TTSFeature): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Get provider capabilities
|
|
39
|
+
*/
|
|
40
|
+
getCapabilities(): TTSProviderCapabilities;
|
|
41
|
+
/**
|
|
42
|
+
* Clean up provider resources
|
|
43
|
+
*/
|
|
44
|
+
destroy(): void;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* TTS Provider Implementation interface
|
|
48
|
+
*
|
|
49
|
+
* The actual TTS implementation that handles playback.
|
|
50
|
+
* Created by ITTSProvider.initialize()
|
|
51
|
+
*/
|
|
52
|
+
export interface ITTSProviderImplementation {
|
|
53
|
+
/**
|
|
54
|
+
* Speak text
|
|
55
|
+
*/
|
|
56
|
+
speak(text: string): Promise<void>;
|
|
57
|
+
/**
|
|
58
|
+
* Pause playback
|
|
59
|
+
*/
|
|
60
|
+
pause(): void;
|
|
61
|
+
/**
|
|
62
|
+
* Resume playback
|
|
63
|
+
*/
|
|
64
|
+
resume(): void;
|
|
65
|
+
/**
|
|
66
|
+
* Stop playback
|
|
67
|
+
*/
|
|
68
|
+
stop(): void;
|
|
69
|
+
/**
|
|
70
|
+
* Check if currently playing
|
|
71
|
+
*/
|
|
72
|
+
isPlaying(): boolean;
|
|
73
|
+
/**
|
|
74
|
+
* Check if paused
|
|
75
|
+
*/
|
|
76
|
+
isPaused(): boolean;
|
|
77
|
+
/**
|
|
78
|
+
* Update settings dynamically (optional)
|
|
79
|
+
* Allows changing rate, pitch, and voice without full reinitialization.
|
|
80
|
+
* Changes take effect on the next speak() call.
|
|
81
|
+
*/
|
|
82
|
+
updateSettings?(settings: Partial<TTSConfig>): void | Promise<void>;
|
|
83
|
+
/**
|
|
84
|
+
* Word boundary callback (optional)
|
|
85
|
+
* Called during speech for word highlighting
|
|
86
|
+
* @param word - The word being spoken (may be empty for server providers)
|
|
87
|
+
* @param position - Character position in the text
|
|
88
|
+
* @param length - Optional word length (for server providers with speech marks)
|
|
89
|
+
*/
|
|
90
|
+
onWordBoundary?: (word: string, position: number, length?: number) => void;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* TTS Provider capabilities
|
|
94
|
+
*
|
|
95
|
+
* Describes which features a provider supports
|
|
96
|
+
*/
|
|
97
|
+
export interface TTSProviderCapabilities {
|
|
98
|
+
/**
|
|
99
|
+
* Supports pause/resume
|
|
100
|
+
*/
|
|
101
|
+
supportsPause: boolean;
|
|
102
|
+
/**
|
|
103
|
+
* Supports resume after pause
|
|
104
|
+
*/
|
|
105
|
+
supportsResume: boolean;
|
|
106
|
+
/**
|
|
107
|
+
* Supports word boundary events for highlighting
|
|
108
|
+
*/
|
|
109
|
+
supportsWordBoundary: boolean;
|
|
110
|
+
/**
|
|
111
|
+
* Supports voice selection
|
|
112
|
+
*/
|
|
113
|
+
supportsVoiceSelection: boolean;
|
|
114
|
+
/**
|
|
115
|
+
* Supports rate control (speed)
|
|
116
|
+
*/
|
|
117
|
+
supportsRateControl: boolean;
|
|
118
|
+
/**
|
|
119
|
+
* Supports pitch control
|
|
120
|
+
*/
|
|
121
|
+
supportsPitchControl: boolean;
|
|
122
|
+
/**
|
|
123
|
+
* Maximum text length (if limited)
|
|
124
|
+
*/
|
|
125
|
+
maxTextLength?: number;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* TTS features for capability checking
|
|
129
|
+
*/
|
|
130
|
+
export type TTSFeature = "pause" | "resume" | "wordBoundary" | "voiceSelection" | "rateControl" | "pitchControl";
|
|
131
|
+
//# sourceMappingURL=provider-interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-interface.d.ts","sourceRoot":"","sources":["../../../src/services/tts/provider-interface.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE/C;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC5B;;OAEG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAE5B;;OAEG;IACH,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAE9B;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAAC;IAEnE;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC;IAE9C;;OAEG;IACH,eAAe,IAAI,uBAAuB,CAAC;IAE3C;;OAEG;IACH,OAAO,IAAI,IAAI,CAAC;CAChB;AAED;;;;;GAKG;AACH,MAAM,WAAW,0BAA0B;IAC1C;;OAEG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnC;;OAEG;IACH,KAAK,IAAI,IAAI,CAAC;IAEd;;OAEG;IACH,MAAM,IAAI,IAAI,CAAC;IAEf;;OAEG;IACH,IAAI,IAAI,IAAI,CAAC;IAEb;;OAEG;IACH,SAAS,IAAI,OAAO,CAAC;IAErB;;OAEG;IACH,QAAQ,IAAI,OAAO,CAAC;IAEpB;;;;OAIG;IACH,cAAc,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpE;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CAC3E;AAED;;;;GAIG;AACH,MAAM,WAAW,uBAAuB;IACvC;;OAEG;IACH,aAAa,EAAE,OAAO,CAAC;IAEvB;;OAEG;IACH,cAAc,EAAE,OAAO,CAAC;IAExB;;OAEG;IACH,oBAAoB,EAAE,OAAO,CAAC;IAE9B;;OAEG;IACH,sBAAsB,EAAE,OAAO,CAAC;IAEhC;;OAEG;IACH,mBAAmB,EAAE,OAAO,CAAC;IAE7B;;OAEG;IACH,oBAAoB,EAAE,OAAO,CAAC;IAE9B;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,MAAM,UAAU,GACnB,OAAO,GACP,QAAQ,GACR,cAAc,GACd,gBAAgB,GAChB,aAAa,GACb,cAAc,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TTS Provider Interfaces
|
|
3
|
+
*
|
|
4
|
+
* Defines the contract for text-to-speech providers.
|
|
5
|
+
* Providers are stateless factories that create configured TTS implementations.
|
|
6
|
+
*
|
|
7
|
+
* Part of PIE Assessment Toolkit.
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=provider-interface.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-interface.js","sourceRoot":"","sources":["../../../src/services/tts/provider-interface.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Desmos Calculator Provider
|
|
3
|
+
* Implementation of CalculatorProvider for Desmos calculators
|
|
4
|
+
*
|
|
5
|
+
* Supports: Basic, Scientific, and Graphing calculators
|
|
6
|
+
* Based on Desmos API v1.10+
|
|
7
|
+
*/
|
|
8
|
+
import type { Calculator, CalculatorProvider, CalculatorProviderCapabilities, CalculatorProviderConfig, CalculatorType } from "@pie-players/pie-calculator";
|
|
9
|
+
/**
|
|
10
|
+
* Desmos Calculator Provider Implementation
|
|
11
|
+
*/
|
|
12
|
+
export declare class DesmosCalculatorProvider implements CalculatorProvider {
|
|
13
|
+
readonly providerId = "desmos";
|
|
14
|
+
readonly providerName = "Desmos";
|
|
15
|
+
readonly supportedTypes: CalculatorType[];
|
|
16
|
+
readonly version = "1.10";
|
|
17
|
+
private initialized;
|
|
18
|
+
private apiKey?;
|
|
19
|
+
/**
|
|
20
|
+
* Get the configured API key
|
|
21
|
+
*/
|
|
22
|
+
getApiKey(): string | undefined;
|
|
23
|
+
/**
|
|
24
|
+
* Initialize Desmos library
|
|
25
|
+
* @param config Optional configuration including API key
|
|
26
|
+
*/
|
|
27
|
+
initialize(config?: {
|
|
28
|
+
apiKey?: string;
|
|
29
|
+
}): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Create a calculator instance
|
|
32
|
+
*/
|
|
33
|
+
createCalculator(type: CalculatorType, container: HTMLElement, config?: CalculatorProviderConfig): Promise<Calculator>;
|
|
34
|
+
/**
|
|
35
|
+
* Check if type is supported
|
|
36
|
+
*/
|
|
37
|
+
supportsType(type: CalculatorType): boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Cleanup (no-op for Desmos)
|
|
40
|
+
*/
|
|
41
|
+
destroy(): void;
|
|
42
|
+
/**
|
|
43
|
+
* Get provider capabilities
|
|
44
|
+
*/
|
|
45
|
+
getCapabilities(): CalculatorProviderCapabilities;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Singleton provider instance (deprecated)
|
|
49
|
+
* @deprecated Instantiate DesmosCalculatorProvider directly instead:
|
|
50
|
+
* const provider = new DesmosCalculatorProvider();
|
|
51
|
+
* await provider.initialize();
|
|
52
|
+
*/
|
|
53
|
+
export declare const desmosProvider: DesmosCalculatorProvider;
|
|
54
|
+
//# sourceMappingURL=desmos-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"desmos-provider.d.ts","sourceRoot":"","sources":["../../../src/tools/calculators/desmos-provider.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAEX,UAAU,EACV,kBAAkB,EAClB,8BAA8B,EAC9B,wBAAwB,EAExB,cAAc,EAEd,MAAM,6BAA6B,CAAC;AAGrC;;GAEG;AACH,qBAAa,wBAAyB,YAAW,kBAAkB;IAClE,QAAQ,CAAC,UAAU,YAAY;IAC/B,QAAQ,CAAC,YAAY,YAAY;IACjC,QAAQ,CAAC,cAAc,EAAE,cAAc,EAAE,CAIvC;IACF,QAAQ,CAAC,OAAO,UAAU;IAE1B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,MAAM,CAAC,CAAS;IAExB;;OAEG;IACH,SAAS,IAAI,MAAM,GAAG,SAAS;IAI/B;;;OAGG;IACG,UAAU,CAAC,MAAM,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAsC7D;;OAEG;IACG,gBAAgB,CACrB,IAAI,EAAE,cAAc,EACpB,SAAS,EAAE,WAAW,EACtB,MAAM,CAAC,EAAE,wBAAwB,GAC/B,OAAO,CAAC,UAAU,CAAC;IAYtB;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO;IAI3C;;OAEG;IACH,OAAO,IAAI,IAAI;IAKf;;OAEG;IACH,eAAe,IAAI,8BAA8B;CAUjD;AA6UD;;;;;GAKG;AACH,eAAO,MAAM,cAAc,0BAAiC,CAAC"}
|