Platform · Capacités
STT
Implémentez la reconnaissance vocale (Speech-to-Text) — upload par lot et streaming WebSocket temps réel optionnel.
Le mode lot (transcribe) est obligatoire ; le streaming est optionnel. Le streaming est une propriété d'un modèle, pas une capacité distincte : un modèle qui déclare streaming est servi par vos hooks createStreamingSession et openStreamingSession, qui gèrent le protocole du fournisseur. La plateforme envoie du PCM16 mono 16 kHz et reçoit des transcriptions normalisées.
Définir la capacité
typescript
import { defineModels } from "@scrydon/sdk-authoring/extensions/define";
import type { STTCapabilityConfig } from "@scrydon/sdk-authoring/extensions/capabilities/stt";
import type { SttStreamingSpec } from "@scrydon/sdk-authoring/extensions/capabilities/stt-streaming";
const LIVE_STREAMING: SttStreamingSpec = {
protocol: "acme-live-v1",
audio: { sampleRateHz: 16000, encoding: "pcm16", channels: 1 },
};
const sttCapability: STTCapabilityConfig = {
models: [
{ id: "whisper-v3", name: "Whisper V3", benchmarks: [{ name: "WER", score: 4.2, source: "Artificial Analysis" }] },
{ id: "live-v1", name: "Live Transcribe", streaming: LIVE_STREAMING },
],
defaultModel: "whisper-v3",
// Batch mode — upload audio, get text back
async transcribe(request) {
const response = await fetch("https://api.example.com/v1/transcribe", {
method: "POST",
headers: { Authorization: `Bearer ${request.apiKey}` },
body: request.audioData,
});
const data = await response.json();
return { transcript: data.text, language: data.language, confidence: data.confidence };
},
// Streaming (optional). A model that declares `streaming` needs BOTH hooks:
// createStreamingSession mints the ticket, openStreamingSession runs the session.
async createStreamingSession(request) {
return {
...LIVE_STREAMING,
transport: {
mode: "proxied",
upstreamUrl: "wss://api.example.com/v1/live",
upstreamHeaders: { Authorization: `Bearer ${request.apiKey}` },
},
diarizes: false,
};
},
async openStreamingSession(request, context) {
const socket = new WebSocket(`wss://api.example.com/v1/live?model=${encodeURIComponent(request.model)}`);
await new Promise((resolve, reject) => {
socket.addEventListener("open", resolve, { once: true });
socket.addEventListener("error", reject, { once: true });
});
// Authenticate the way your vendor's protocol expects.
socket.send(JSON.stringify({ type: "auth", apiKey: request.apiKey }));
context.signal.addEventListener("abort", () => socket.close());
return {
sendAudio: (pcm) => socket.send(new Uint8Array(pcm)),
finalize: () => socket.send(JSON.stringify({ type: "finalize" })),
close: () => socket.close(),
onTranscript: (handler) =>
socket.addEventListener("message", (event) => {
const data = JSON.parse(String(event.data));
handler({ text: data.text, isFinal: data.final === true });
}),
onError: (handler) => socket.addEventListener("error", () => handler(new Error("stream error"))),
onClose: (handler) => socket.addEventListener("close", (event) => handler(event.reason || null)),
};
},
};
// One model family per runtime; list it under defineExtension()'s provides.models.
export const sttModels = defineModels({
id: "my-service-stt",
name: "My Service Speech-to-Text",
family: "stt",
runtime: sttCapability,
});Métadonnées du modèle
| Champ | Type | Requis | Description |
|---|---|---|---|
id | string | oui | Identifiant unique du modèle (ex. "whisper-v3") |
name | string | oui | Nom affiché dans l'interface |
benchmarks | BenchmarkScore[] | non | Scores WER — plus bas est meilleur |
streaming | SttStreamingSpec | non | Présent quand le modèle diffuse en continu : identifiant protocol du fournisseur et format audio, diarizes et maxSessionSeconds optionnels |
Le benchmark STT standard est le WER (taux d'erreur sur les mots) — un pourcentage où plus bas est meilleur. Incluez source pour indiquer où la mesure a été effectuée.
Indicateurs de fonctionnalités temps réel
| Indicateur | Signification |
|---|---|
interimResults | Le fournisseur diffuse des transcriptions partielles au fur et à mesure de l'arrivée de l'audio |
endpointDetection | Le fournisseur signale quand le locuteur s'arrête |
multiLanguage | Une seule session peut détecter / mélanger les langues |