20738f3623
Replace the legacy React UI with the new Svelte-based one. Introduce a Playground in the UI to quickly test out text, image, text to speech and speech to text models behind llama-swap.
Key Changes
New Svelte UI (ui-svelte/)
- Multi-tab Playground with Chat, Image Generation, Audio Transcription, and Speech interfaces
- Chat: message editing/regeneration, markdown rendering with LaTeX math support, image attachments, code syntax highlighting
- Image: size selector, download/fullscreen viewing
- Audio: transcription with peer support
- Speech: voice caching with manual refresh, download button
- Responsive mobile layout with collapsible navigation
- XSS fixes and accessibility improvements
Proxy Improvements
- Add gzip/brotli compression for UI static assets (proxy/ui_compress.go)
- Add GET /v1/audio/voices?model={model} endpoint for voice listing
- Add peer support for /v1/audio/transcriptions
31 lines
639 B
TypeScript
31 lines
639 B
TypeScript
import type { SpeechGenerationRequest } from "./types";
|
|
|
|
export async function generateSpeech(
|
|
model: string,
|
|
input: string,
|
|
voice: string,
|
|
signal?: AbortSignal
|
|
): Promise<Blob> {
|
|
const request: SpeechGenerationRequest = {
|
|
model,
|
|
input,
|
|
voice,
|
|
};
|
|
|
|
const response = await fetch("/v1/audio/speech", {
|
|
method: "POST",
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
},
|
|
body: JSON.stringify(request),
|
|
signal,
|
|
});
|
|
|
|
if (!response.ok) {
|
|
const errorText = await response.text();
|
|
throw new Error(`Speech API error: ${response.status} - ${errorText}`);
|
|
}
|
|
|
|
return response.blob();
|
|
}
|