Transcription en temps réel
Envoyez continuellement de l’audio via Realtime WebSocket et recevez des transcriptions incrémentielles et finales.
La transcription en temps réel reçoit un flux audio continu sur une connexion WebSocket persistante et renvoie du texte incrémentiel ainsi qu’une transcription finale pour chaque élément audio. Elle convient aux sous-titres en direct, à la prise de notes de réunion, aux transcriptions d’appels et à la saisie vocale. Pour téléverser un enregistrement complet en une fois, utilisez l’interface de transcription audio.
gpt-live-transcribe convient à la transcription incrémentielle à faible latence ; gpt-transcribe convient à une transcription très précise après validation d’un segment vocal complet et peut renvoyer la langue détectée dans l’événement final. Le modèle de connexion doit correspondre à celui de la session.
wss://api.agtcloud.cn/v1/realtime?model=MODEL_IDAuthentification et connexion
Les applications serveur doivent utiliser une clé API Bearer pendant le handshake WebSocket :
| Élément | Valeur |
|---|---|
| Adresse de connexion | wss://api.agtcloud.cn/v1/realtime?model=MODEL_ID |
| Authorization | Bearer your-api-key |
| OpenAI-Safety-Identifier | Identifiant facultatif anonymisé de l’utilisateur final |
L’API WebSocket d’un navigateur ordinaire ne permet pas de personnaliser le Header Authorization. N’intégrez donc pas de clé API de longue durée dans le HTML, le JavaScript ou un paquet client. Pour un produit de navigateur, un backend de confiance doit établir la connexion ou fournir un mécanisme contrôlé d’identifiants de courte durée.
Exigences audio d’entrée
Cette documentation utilise de l’audio PCM16 little-endian, 24 kHz, mono, sans en-tête WAV ni autre conteneur. Le champ audio de input_audio_buffer.append est une chaîne Base64 des octets PCM bruts.
Pour l’envoi en temps réel, privilégiez des fragments audio petits et réguliers ; un événement ne doit pas dépasser 15 MiB. Un format, un échantillonnage ou un traitement de conteneur incorrect entraîne un échec de transcription.
Configuration de session
session.type dans session.update est toujours transcription. La configuration de transcription se trouve dans session.audio.input.transcription :
| Champ | Description |
|---|---|
model | Modèle de transcription identique à celui de l’URL de connexion |
prompt | Indications sur le cas métier, l’environnement de parole et le contexte |
keywords | Indications sur les noms propres, abréviations et produits, sans garantie de sortie imposée |
languages | Liste des langues attendues, par exemple zh-cn, en |
delay | Réglage de latence du modèle en temps réel, par exemple low |
noise_reduction.type=near_field convient à un casque-micro et far_field aux salles de réunion ou microphones d’ordinateur portable ; null désactive la réduction du bruit.
Validation manuelle et VAD côté serveur
turn_detection: null: le client appelleinput_audio_buffer.commitaprès l’envoi audio ; ce mode convient à une segmentation explicitement contrôlée par l’application.- VAD côté serveur : configurez le seuil, le préfixe audio et la durée de silence ; le serveur détecte automatiquement le début et la fin de la parole.
En mode manuel, ne validez pas un tampon vide. Avec la VAD, vous pouvez mettre à jour l’interface d’enregistrement selon speech_started et speech_stopped, mais la transcription finale reste celle de l’événement completed.
Exemples de connexion
Les exemples suivants supposent que audio.pcm a été converti en audio brut PCM16, 24 kHz, mono. Une application temps réel doit envoyer continuellement de petits blocs audio plutôt que lire l’enregistrement complet en une fois.
import fs from 'node:fs';
import WebSocket from 'ws';
const ws = new WebSocket('wss://api.agtcloud.cn/v1/realtime?model=MODEL_ID', {
headers: {
Authorization: 'Bearer your-api-key',
},
});
ws.on('open', async () => {
ws.send(JSON.stringify({
"type": "session.update",
"session": {
"type": "transcription",
"audio": {
"input": {
"format": { "type": "audio/pcm", "rate": 24000 },
"noise_reduction": { "type": "near_field" },
"transcription": {
"model": "MODEL_ID",
"prompt": "Appel de service client en chinois",
"keywords": ["AGTCloud", "Passerelle API"],
"languages": ["zh-cn", "en"]
},
"turn_detection": null
}
}
}
}));
const audio = fs.createReadStream('audio.pcm', { highWaterMark: 4800 });
for await (const chunk of audio) {
ws.send(JSON.stringify({
type: 'input_audio_buffer.append',
audio: chunk.toString('base64'),
}));
await new Promise((resolve) => setTimeout(resolve, 100));
}
ws.send(JSON.stringify({ type: 'input_audio_buffer.commit' }));
});
ws.on('message', (message) => {
const event = JSON.parse(message.toString());
if (event.type.endsWith('.delta')) process.stdout.write(event.delta);
if (event.type.endsWith('.completed')) console.log('\n', event.transcript);
});Référence des événements
Le client contrôle l’entrée avec les événements de session et de tampon audio ; le serveur associe texte incrémentiel, texte final et erreurs avec l’Item ID. Les éléments audio peuvent se terminer dans un ordre différent ; agrégez donc le texte selon item_id.
session.update
Configure la session de transcription en temps réel, l’audio d’entrée et la segmentation.
| Champ | Type | Obligatoire | Description | Exemple |
|---|---|---|---|---|
event_id | string | Non | ID d’événement généré par le client. | evt_session_001 |
type | string | Oui | Valeur fixe : session.update. | session.update |
session.type | string | Oui | Valeur fixe : transcription. | transcription |
session.audio.input.format.type | string | Oui | Cette page utilise PCM16 little-endian. | audio/pcm |
session.audio.input.format.rate | integer | Oui | Fréquence d’échantillonnage de l’entrée PCM. | 24000 |
session.audio.input.noise_reduction.type | string | Non | Réduction du bruit en champ proche ou lointain. | near_field |
session.audio.input.transcription.model | string | Oui | Modèle de transcription identique à celui de l’URL de connexion. | MODEL_ID |
session.audio.input.transcription.prompt | string | Non | Prompt décrivant le contexte et le cas de transcription. | Appel de service client en chinois |
session.audio.input.transcription.keywords | string[] | Non | Indications sur les noms propres, abréviations ou produits. | ["AGTCloud", "Passerelle API"] |
session.audio.input.transcription.languages | string[] | Non | Liste des langues attendues. | ["zh-cn", "en"] |
session.audio.input.transcription.delay | string | Non | Réglage de latence du modèle en temps réel. | low |
session.audio.input.turn_detection | object or null | Oui | null utilise la validation manuelle ; un objet active la VAD côté serveur. | null |
{
"event_id": "evt_session_001",
"type": "session.update",
"session": {
"type": "transcription",
"audio": {
"input": {
"format": {
"type": "audio/pcm",
"rate": 24000
},
"noise_reduction": {
"type": "near_field"
},
"transcription": {
"model": "MODEL_ID",
"prompt": "Appel de service client en chinois",
"keywords": [
"AGTCloud",
"Passerelle API"
],
"languages": [
"zh-cn",
"en"
],
"delay": "low"
},
"turn_detection": null
}
}
}
}Gestion des erreurs et reprise
| Type | Causes courantes | Traitement |
|---|---|---|
| Échec du handshake | Adresse WSS, clé API ou Headers de requête incorrects | Corrigez les paramètres puis reconnectez-vous |
| Erreur de paramètres | Hiérarchie de session, valeurs de champs ou modèles incohérents | Lisez error.event_id et corrigez l’événement client correspondant |
| Erreur audio | Format, fréquence, Base64 ou en-tête non conformes | Reconvertissez l’audio et effacez le tampon |
| Échec de transcription | Audio inintelligible ou échec du traitement de l’élément actuel | Conservez l’Item ID en échec et ne retentez que le segment vocal concerné |
| Connexion interrompue | Coupure réseau ou session devenue non valide | Arrêtez l’envoi audio, limitez les reconnexions et recréez la session |
Le texte incrémentiel peut être révisé par les résultats suivants ; ne l’enregistrez pas de façon immuable à la réception de delta. Seul transcript dans completed doit être considéré comme le texte final de l’élément audio actuel.