Let admins hear a voice sample before picking it
The Speech section of every model settings form now has "Hear a sample", which streams a short sentence (AppData.VoicePreviewText) in the form's model and voice before they're saved, through GET api/admin/harness/preview-voice (super admins and admins, that model only via grabModelCandidate). pickVoice is shared with speakText, and explainAudioError reads why a streamed player failed for both read-aloud and the sample. Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
@@ -0,0 +1,34 @@
|
||||
type Params = {
|
||||
/**
|
||||
* The streaming audio route the player failed on.
|
||||
*/
|
||||
src: string;
|
||||
fallback?: string;
|
||||
};
|
||||
|
||||
/**
|
||||
* An `<audio>` only says it failed, so ask its route again for the
|
||||
* reason: a failure answers in JSON, and audio coming back instead is
|
||||
* dropped at once.
|
||||
*/
|
||||
export default async function explainAudioError({
|
||||
src,
|
||||
fallback = "Couldn't play it. Try again.",
|
||||
}: Params) {
|
||||
const controller = new AbortController();
|
||||
|
||||
try {
|
||||
const res = await fetch(src, { signal: controller.signal, cache: "no-store" });
|
||||
|
||||
if (!res.headers.get("content-type")?.includes("json")) {
|
||||
controller.abort();
|
||||
return fallback;
|
||||
}
|
||||
|
||||
const json = await res.json();
|
||||
|
||||
return json?.msg || fallback;
|
||||
} catch {
|
||||
return fallback;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user