Utilisation
useTranscription() ne reçoit des données que si TranscriptionProvider entoure le sous-arbre et que TranscriptionButton est monté (ou utilisez onStateChange).
TranscriptionProvider
Enveloppez la partie de l’app qui doit partager l’état de transcription (affichage du texte, boutons « effacer », etc.) :
import { TranscriptionProvider, TranscriptionButton } from '@ephia/transcribe-sdk';
import '@ephia/transcribe-sdk/dist/styles.css';
function App() {
const token = 'YOUR_API_KEY';
return (
<TranscriptionProvider>
<TranscriptionButton token={token} endUserId="user-123" />
<Transcript />
</TranscriptionProvider>
);
}Clé API : Créer votre clé API.
TranscriptionButton et token
La prop token est obligatoire. Sans token, le bouton reste désactivé.
La prop endUserId est fortement recommandée (sera obligatoire prochainement) : elle identifie l’utilisateur final pour le suivi d’usage, la facturation et l’analytics. Transmis au serveur lors de la connexion WebSocket.
Props de connexion et de flux (détail dans Connexion et flux) :
streamingUrl(optionnel) : URL WebSocket complète (avec query). Usage avancé si vous construisez vous-même tous les paramètres.streamingUrlBase(optionnel) : origine seule ; le SDK ajoute le chemin/api/v2/streaming/liveet les paramètres issus des props du bouton.audioProcessorUrl(optionnel) : URL du worklet (défaut :/audio-processor.js).
Autres props utiles :
projectId(optionnel) : rattache la session à un projet.onStateChange(optionnel) : callback appelé à chaque changement d’état significatif.
Presets : voir Presets.
useTranscription() : quand l’état est disponible
- Avec
TranscriptionProvideret unTranscriptionButton(ou tout composant qui publie dans le contexte) : le hook retourne l’état à jour. - Sans provider, ou tant que personne n’a encore publié d’état : le hook retourne un état vide —
chunksvide, flags à faux,startRecording/stopRecordingen no-op. Pour consommer l’état sans provider, utilisez la proponStateChangesurTranscriptionButton.
Propriétés exposées (TranscriptionState)
Le hook et onStateChange fournissent le même objet logique :
| Champ | Description |
|---|---|
chunks | Segments triés par seq (interim / final, texte, session_num, etc.). |
phase | Phase de la machine d’état (idle, preparing_audio, connecting_ws, arming, ready, recording, stopping, finalizing, error) — voir Référence SDK. |
isArming | true pendant la préparation (audio + WebSocket + armement). |
isRecording | Enregistrement effectif côté UI. |
isProcessing | Traitement / attente serveur (ex. après début de parole, jusqu’à synchronisation finale). |
isConnected | WebSocket ouvert. |
volume | Niveau audio estimé (RMS), utile pour des jauges. |
speechProb | Probabilité de parole détectée par le VAD (0–1). |
isSpeech | true si le VAD détecte actuellement de la parole. |
lastSpeechStartTimestamp | Horodatage du dernier début de parole utile. |
sessionId | Identifiant de session renvoyé par le serveur. |
debugMessages | Trace récente des messages (limite côté SDK), utile au debug. |
error / errorCode | Message et code structuré si erreur. |
permissionState | prompt | granted | denied si l’API permissions du navigateur est disponible. |
transcriptionErrors | Sous-ensemble de chunks dont le texte est [ERREUR] (convention de flux). |
streamingWarning | Dernier avertissement non bloquant (presets, relecture, fermeture pendant finalisation, etc.) — voir Connexion et flux. |
startRecording / stopRecording / clear | Contrôles (mêmes références stables côté implémentation pour limiter les re-renders inutiles). |
connect | Ouvre le WebSocket (usage avancé). |
prepareAudio / prepareTransport | Préchauffage micro + worklet, ou WebSocket, sans lancer une session complète. |
stats | Compteurs bas niveau (frames, batchs…) — surtout pour le diagnostic ; basés sur un ref interne, pas pour de l’UI temps réel frame par frame. |
Exemple : afficher la transcription
import { useTranscription } from '@ephia/transcribe-sdk';
function Transcript() {
const { chunks, isRecording, clear, streamingWarning } = useTranscription();
return (
<div>
<button type="button" onClick={clear}>Effacer</button>
{streamingWarning && (
<p role="status">{streamingWarning.message}</p>
)}
{chunks.map((c) => (
<p key={c.id}>{c.text}</p>
))}
</div>
);
}Contrôle programmatique (sans cliquer sur le bouton)
Les fonctions startRecording et stopRecording exposées par useTranscription() sont alimentées par TranscriptionButton tant que ce dernier est monté sous le même TranscriptionProvider (sinon le contexte reste vide ou figé). Vous pouvez déclencher l’enregistrement depuis un autre composant enfant du provider, et masquer le bouton en CSS si vous ne voulez que vos propres contrôles :
function CustomControls() {
const { startRecording, stopRecording, isRecording, isArming } = useTranscription();
return (
<div>
<button type="button" onClick={() => void startRecording()} disabled={isArming || isRecording}>
Démarrer
</button>
<button type="button" onClick={() => void stopRecording()} disabled={!isRecording}>
Arrêter
</button>
</div>
);
}Pour une UI sans TranscriptionButton, il faut utiliser useStreamingV2 et gérer vous-même l’état (voir Référence SDK) — le package n’exporte pas TranscriptionContext pour publier un état personnalisé dans useTranscription.
Rendu des segments
- Les
chunksportentstatus: 'interim' | 'final': vous pouvez n’afficher en dur que lesfinal, ou griser les intermédiaires selon votre expérience. - Le champ
isMedicalCorrectionsur un chunk final est renseigné par le serveur (booléen) ; utilisez-le si vous devez distinguer une relecture / correction côté flux.
onStateChange
Alternative au contexte pour recevoir chaque mise à jour significative de l’état (le SDK évite de rappeler le callback quand seuls des détails non pertinents changent, pour limiter le bruit sur le volume) :
<TranscriptionButton
token={token}
endUserId="user-123"
onStateChange={(state) => {
// state : même forme que useTranscription()
}}
/>Codes d’erreur (TranscriptionErrorCode)
| Code | Signification |
|---|---|
insecure_context | Pas HTTPS (sauf localhost). |
microphone_denied | Permission micro refusée. |
microphone_not_found | Aucun micro. |
microphone_error | Autre erreur d’accès micro. |
audio_worklet_error | Échec de chargement du worklet (audio-processor.js). |
token_missing | Connexion sans token (usage hook avancé). |
websocket_error | Erreur WebSocket (fermeture anormale ou onerror). |
websocket_auth_error | Auth refusée (code 1008 ou message contenant « auth »). |
unknown | Erreur non classée. |
Le serveur peut aussi émettre des warnings non bloquants (fallback de preset, endUserId manquant, etc.) via le champ streamingWarning. Voir Connexion et flux et Dépannage.
Dépannage : Dépannage.