ugly-app 0.1.287 → 0.1.289
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/dist/cli/version.d.ts +1 -1
- package/dist/cli/version.js +1 -1
- package/dist/client/audio/BlobVisualizer.d.ts +1 -0
- package/dist/client/audio/BlobVisualizer.d.ts.map +1 -1
- package/dist/client/audio/BlobVisualizer.js +5 -0
- package/dist/client/audio/BlobVisualizer.js.map +1 -1
- package/package.json +1 -1
- package/src/cli/version.ts +1 -1
- package/src/client/audio/BlobVisualizer.tsx +7 -0
- package/templates/client/pages/AudioTestPage.tsx +49 -30
package/dist/cli/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const CLI_VERSION = "0.1.
|
|
1
|
+
export declare const CLI_VERSION = "0.1.289";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/cli/version.js
CHANGED
|
@@ -11,6 +11,7 @@ export interface BlobVisualizerProps {
|
|
|
11
11
|
style?: BlobStyleType;
|
|
12
12
|
options?: Partial<BlobOptions>;
|
|
13
13
|
visible?: boolean;
|
|
14
|
+
analyzer?: AnalyserNode | null;
|
|
14
15
|
}
|
|
15
16
|
export declare function BlobVisualizer(props: BlobVisualizerProps): import("react/jsx-runtime").JSX.Element;
|
|
16
17
|
//# sourceMappingURL=BlobVisualizer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BlobVisualizer.d.ts","sourceRoot":"","sources":["../../../src/client/audio/BlobVisualizer.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,YAAY,EAMlB,MAAM,OAAO,CAAC;AAIf,OAAO,KAAK,EAAE,WAAW,EAAa,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAoC5E,qDAAqD;AACrD,MAAM,WAAW,uBAAuB;IACtC,WAAW,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,GAAG,IAAI,CAAC;IACjD,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC;IAChD,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/C;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,YAAY,CAAC,uBAAuB,CAAC,CAAC;IAChD,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"BlobVisualizer.d.ts","sourceRoot":"","sources":["../../../src/client/audio/BlobVisualizer.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,YAAY,EAMlB,MAAM,OAAO,CAAC;AAIf,OAAO,KAAK,EAAE,WAAW,EAAa,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAoC5E,qDAAqD;AACrD,MAAM,WAAW,uBAAuB;IACtC,WAAW,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,GAAG,IAAI,CAAC;IACjD,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC;IAChD,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/C;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,YAAY,CAAC,uBAAuB,CAAC,CAAC;IAChD,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;CAChC;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,2CA2JxD"}
|
|
@@ -48,6 +48,11 @@ export function BlobVisualizer(props) {
|
|
|
48
48
|
coreRef.current = null;
|
|
49
49
|
};
|
|
50
50
|
}, []);
|
|
51
|
+
useEffect(() => {
|
|
52
|
+
if (props.analyzer !== undefined) {
|
|
53
|
+
coreRef.current?.setAnalyzer(props.analyzer);
|
|
54
|
+
}
|
|
55
|
+
}, [props.analyzer]);
|
|
51
56
|
useEffect(() => {
|
|
52
57
|
const initStyle = async () => {
|
|
53
58
|
if (!coreRef.current) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BlobVisualizer.js","sourceRoot":"","sources":["../../../src/client/audio/BlobVisualizer.tsx"],"names":[],"mappings":";AAAA,OAAO,EAEL,WAAW,EACX,SAAS,EACT,mBAAmB,EACnB,MAAM,EACN,QAAQ,GACT,MAAM,OAAO,CAAC;AAEf,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAE7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,KAAK,UAAU,eAAe,CAAC,IAAmB;IAChD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,mCAAmC,CAAC,CAAC;YAC/E,OAAO,IAAI,gBAAgB,EAAE,CAAC;QAChC,CAAC;QACD,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,oCAAoC,CAAC,CAAC;YACjF,OAAO,IAAI,iBAAiB,EAAE,CAAC;QACjC,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,gCAAgC,CAAC,CAAC;YACzE,OAAO,IAAI,aAAa,EAAE,CAAC;QAC7B,CAAC;QACD,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,oCAAoC,CAAC,CAAC;YACjF,OAAO,IAAI,iBAAiB,EAAE,CAAC;QACjC,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,gCAAgC,CAAC,CAAC;YACzE,OAAO,IAAI,aAAa,EAAE,CAAC;QAC7B,CAAC;QACD,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,oCAAoC,CAAC,CAAC;YACjF,OAAO,IAAI,iBAAiB,EAAE,CAAC;QACjC,CAAC;QACD,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,mCAAmC,CAAC,CAAC;YAC/E,OAAO,IAAI,gBAAgB,EAAE,CAAC;QAChC,CAAC;IACH,CAAC;AACH,CAAC;
|
|
1
|
+
{"version":3,"file":"BlobVisualizer.js","sourceRoot":"","sources":["../../../src/client/audio/BlobVisualizer.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/cli/version.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// Auto-generated by prebuild — do not edit manually
|
|
2
|
-
export const CLI_VERSION = "0.1.
|
|
2
|
+
export const CLI_VERSION = "0.1.289";
|
|
@@ -57,6 +57,7 @@ export interface BlobVisualizerProps {
|
|
|
57
57
|
style?: BlobStyleType;
|
|
58
58
|
options?: Partial<BlobOptions>;
|
|
59
59
|
visible?: boolean;
|
|
60
|
+
analyzer?: AnalyserNode | null;
|
|
60
61
|
}
|
|
61
62
|
|
|
62
63
|
export function BlobVisualizer(props: BlobVisualizerProps) {
|
|
@@ -74,6 +75,12 @@ export function BlobVisualizer(props: BlobVisualizerProps) {
|
|
|
74
75
|
};
|
|
75
76
|
}, []);
|
|
76
77
|
|
|
78
|
+
useEffect(() => {
|
|
79
|
+
if (props.analyzer !== undefined) {
|
|
80
|
+
coreRef.current?.setAnalyzer(props.analyzer);
|
|
81
|
+
}
|
|
82
|
+
}, [props.analyzer]);
|
|
83
|
+
|
|
77
84
|
useEffect(() => {
|
|
78
85
|
const initStyle = async () => {
|
|
79
86
|
if (!coreRef.current) {
|
|
@@ -15,7 +15,6 @@ import {
|
|
|
15
15
|
import type {
|
|
16
16
|
AudioVisualizer,
|
|
17
17
|
BlobStyleType,
|
|
18
|
-
BlobVisualizerFunctions,
|
|
19
18
|
UglyBotSocket,
|
|
20
19
|
} from 'ugly-app/client';
|
|
21
20
|
|
|
@@ -97,6 +96,11 @@ function CanvasVizView({
|
|
|
97
96
|
useEffect(() => {
|
|
98
97
|
const canvas = canvasRef.current;
|
|
99
98
|
if (!canvas) return;
|
|
99
|
+
// Match canvas resolution to display size
|
|
100
|
+
const rect = canvas.getBoundingClientRect();
|
|
101
|
+
const dpr = window.devicePixelRatio || 1;
|
|
102
|
+
canvas.width = rect.width * dpr;
|
|
103
|
+
canvas.height = rect.height * dpr;
|
|
100
104
|
const viz = createCanvasViz(type);
|
|
101
105
|
vizRef.current = viz;
|
|
102
106
|
if (analyzer) viz.setAnalyzer(analyzer);
|
|
@@ -105,18 +109,11 @@ function CanvasVizView({
|
|
|
105
109
|
viz.detach();
|
|
106
110
|
vizRef.current = null;
|
|
107
111
|
};
|
|
108
|
-
|
|
109
|
-
}, [type]);
|
|
110
|
-
|
|
111
|
-
useEffect(() => {
|
|
112
|
-
vizRef.current?.setAnalyzer(analyzer);
|
|
113
|
-
}, [analyzer]);
|
|
112
|
+
}, [type, analyzer]);
|
|
114
113
|
|
|
115
114
|
return (
|
|
116
115
|
<canvas
|
|
117
116
|
ref={canvasRef}
|
|
118
|
-
width={600}
|
|
119
|
-
height={200}
|
|
120
117
|
style={{ width: '100%', height: 200, borderRadius: 8, background: '#111' }}
|
|
121
118
|
/>
|
|
122
119
|
);
|
|
@@ -131,12 +128,6 @@ function VisualizerView({
|
|
|
131
128
|
vizType: VizType;
|
|
132
129
|
analyzer: AnalyserNode | null;
|
|
133
130
|
}) {
|
|
134
|
-
const blobRef = useRef<BlobVisualizerFunctions>(null);
|
|
135
|
-
|
|
136
|
-
useEffect(() => {
|
|
137
|
-
blobRef.current?.setAnalyzer(analyzer);
|
|
138
|
-
}, [analyzer]);
|
|
139
|
-
|
|
140
131
|
if (canvasVizTypes.has(vizType)) {
|
|
141
132
|
return <CanvasVizView type={vizType as CanvasVizType} analyzer={analyzer} />;
|
|
142
133
|
}
|
|
@@ -151,8 +142,8 @@ function VisualizerView({
|
|
|
151
142
|
return (
|
|
152
143
|
<div style={{ height: 300, position: 'relative' }}>
|
|
153
144
|
<BlobVisualizer
|
|
154
|
-
blobRef={blobRef}
|
|
155
145
|
style={vizType as BlobStyleType}
|
|
146
|
+
analyzer={analyzer}
|
|
156
147
|
/>
|
|
157
148
|
</div>
|
|
158
149
|
);
|
|
@@ -209,6 +200,7 @@ function useTTSAnalyzer() {
|
|
|
209
200
|
const init = useCallback(() => {
|
|
210
201
|
if (ctxRef.current) return;
|
|
211
202
|
const ctx = new AudioContext({ sampleRate: 24000 });
|
|
203
|
+
void ctx.resume();
|
|
212
204
|
const node = ctx.createAnalyser();
|
|
213
205
|
node.fftSize = 2048;
|
|
214
206
|
const gain = ctx.createGain();
|
|
@@ -225,6 +217,7 @@ function useTTSAnalyzer() {
|
|
|
225
217
|
const ctx = ctxRef.current;
|
|
226
218
|
const gain = gainRef.current;
|
|
227
219
|
if (!ctx || !gain) return;
|
|
220
|
+
if (ctx.state === 'suspended') void ctx.resume();
|
|
228
221
|
const binary = atob(base64Audio);
|
|
229
222
|
const bytes = new Uint8Array(binary.length);
|
|
230
223
|
for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);
|
|
@@ -295,7 +288,8 @@ function STTSection({ socket }: { socket: UglyBotSocket }) {
|
|
|
295
288
|
}),
|
|
296
289
|
socket.on('stt:error', (data) => {
|
|
297
290
|
if (data.streamId && data.streamId !== streamId) return;
|
|
298
|
-
|
|
291
|
+
const errMsg = typeof data.message === 'string' ? data.message : JSON.stringify(data.message ?? data);
|
|
292
|
+
addLog(`STT error: ${errMsg}`, 'err');
|
|
299
293
|
stopListening();
|
|
300
294
|
}),
|
|
301
295
|
socket.on('stt:stopped', (data) => {
|
|
@@ -505,7 +499,8 @@ function TTSSection({ socket }: { socket: UglyBotSocket }) {
|
|
|
505
499
|
|
|
506
500
|
const ttsAudio = useTTSAnalyzer();
|
|
507
501
|
const streamIdRef = useRef<string | null>(null);
|
|
508
|
-
const
|
|
502
|
+
const playStartRef = useRef(0);
|
|
503
|
+
const wordTimersRef = useRef<ReturnType<typeof setTimeout>[]>([]);
|
|
509
504
|
const unsubsRef = useRef<Array<() => void>>([]);
|
|
510
505
|
|
|
511
506
|
function addLog(msg: string, kind: LogEntry['kind'] = 'info') {
|
|
@@ -528,29 +523,45 @@ function TTSSection({ socket }: { socket: UglyBotSocket }) {
|
|
|
528
523
|
addLog(`Got tts:chunk streamId=${data.streamId} (expected=${streamId}) audioLen=${data.audio?.length ?? 0}`);
|
|
529
524
|
if (data.streamId !== streamId) return;
|
|
530
525
|
if (data.audio) {
|
|
526
|
+
if (!playStartRef.current) playStartRef.current = Date.now();
|
|
531
527
|
ttsAudio.playChunk(data.audio);
|
|
532
528
|
addLog(`Queued audio chunk (${data.audio.length} b64 chars)`, 'ok');
|
|
533
529
|
}
|
|
534
530
|
}),
|
|
535
531
|
socket.on('tts:word', (data) => {
|
|
536
532
|
if (data.streamId !== streamId) return;
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
533
|
+
const word = data.word ?? (data as Record<string, unknown>).text as string | undefined;
|
|
534
|
+
const idx = (data as Record<string, unknown>).wordIndex as number | undefined;
|
|
535
|
+
addLog(`Word: "${word}" idx=${idx} startMs=${data.startMs}`);
|
|
536
|
+
if (word != null) {
|
|
537
|
+
// Schedule highlight at the word's startMs relative to playback start
|
|
538
|
+
const delay = typeof data.startMs === 'number' ? data.startMs - (Date.now() - playStartRef.current) : 0;
|
|
539
|
+
const apply = () => {
|
|
540
|
+
setCurrentWord(word);
|
|
541
|
+
if (typeof idx === 'number') {
|
|
542
|
+
setWordHistory((prev) => {
|
|
543
|
+
const next = prev.map((w) => ({ ...w, active: false }));
|
|
544
|
+
if (idx < next.length) {
|
|
545
|
+
next[idx] = { ...next[idx]!, active: true };
|
|
546
|
+
}
|
|
547
|
+
return next;
|
|
548
|
+
});
|
|
546
549
|
}
|
|
547
|
-
|
|
548
|
-
|
|
550
|
+
};
|
|
551
|
+
if (delay > 10) {
|
|
552
|
+
const timer = setTimeout(apply, delay);
|
|
553
|
+
wordTimersRef.current.push(timer);
|
|
554
|
+
} else {
|
|
555
|
+
apply();
|
|
556
|
+
}
|
|
549
557
|
}
|
|
550
558
|
}),
|
|
551
559
|
socket.on('tts:done', (data) => {
|
|
552
560
|
addLog(`Got tts:done streamId=${data.streamId}`);
|
|
553
561
|
if (data.streamId !== streamId) return;
|
|
562
|
+
for (const t of wordTimersRef.current) clearTimeout(t);
|
|
563
|
+
wordTimersRef.current = [];
|
|
564
|
+
playStartRef.current = 0;
|
|
554
565
|
setPlaying(false);
|
|
555
566
|
setCurrentWord('');
|
|
556
567
|
addLog('Playback complete', 'ok');
|
|
@@ -560,6 +571,9 @@ function TTSSection({ socket }: { socket: UglyBotSocket }) {
|
|
|
560
571
|
socket.on('tts:error', (data) => {
|
|
561
572
|
addLog(`Got tts:error streamId=${data.streamId} msg=${data.message}`, 'err');
|
|
562
573
|
if (data.streamId !== streamId) return;
|
|
574
|
+
for (const t of wordTimersRef.current) clearTimeout(t);
|
|
575
|
+
wordTimersRef.current = [];
|
|
576
|
+
playStartRef.current = 0;
|
|
563
577
|
setPlaying(false);
|
|
564
578
|
addLog(`TTS error: ${data.message ?? 'unknown'}`, 'err');
|
|
565
579
|
unsubAll();
|
|
@@ -572,7 +586,9 @@ function TTSSection({ socket }: { socket: UglyBotSocket }) {
|
|
|
572
586
|
if (!text.trim()) return;
|
|
573
587
|
const streamId = `tts-${++ttsCounter}`;
|
|
574
588
|
streamIdRef.current = streamId;
|
|
575
|
-
|
|
589
|
+
playStartRef.current = 0;
|
|
590
|
+
for (const t of wordTimersRef.current) clearTimeout(t);
|
|
591
|
+
wordTimersRef.current = [];
|
|
576
592
|
|
|
577
593
|
setPlaying(true);
|
|
578
594
|
setCurrentWord('');
|
|
@@ -613,6 +629,9 @@ function TTSSection({ socket }: { socket: UglyBotSocket }) {
|
|
|
613
629
|
if (streamIdRef.current) {
|
|
614
630
|
socket.send('tts:cancel', { streamId: streamIdRef.current });
|
|
615
631
|
}
|
|
632
|
+
for (const t of wordTimersRef.current) clearTimeout(t);
|
|
633
|
+
wordTimersRef.current = [];
|
|
634
|
+
playStartRef.current = 0;
|
|
616
635
|
unsubAll();
|
|
617
636
|
socket.release();
|
|
618
637
|
setPlaying(false);
|