Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Azure OpenAI GPT Realtime API voor spraak en audio maakt deel uit van de GPT-4o-modelfamilie die ondersteuning biedt voor lage latentie, "spraak in, spraak uit" gespreksinteracties.
De GPT Realtime-API is ontworpen voor het verwerken van realtime gespreksinteracties met lage latentie. Het is een uitstekende keuze voor gebruiksvoorbeelden met live interacties tussen een gebruiker en een model, zoals klantenservicemedewerkers, spraakassistenten en realtime vertalers.
De meeste gebruikers van de Realtime-API, waaronder toepassingen die gebruikmaken van WebRTC of een telefoniesysteem, moeten in realtime audio leveren en ontvangen van een eindgebruiker. De Realtime-API is niet ontworpen om rechtstreeks verbinding te maken met apparaten van eindgebruikers. Het is afhankelijk van clientintegraties om audiostreams van eindgebruikers te beëindigen.
Verbindingsmethoden
U kunt de Realtime-API gebruiken via WebRTC, session initiation protocol (SIP) of WebSocket om audio-invoer naar het model te verzenden en audioantwoorden in realtime te ontvangen. In de meeste gevallen wordt u aangeraden de WebRTC-API te gebruiken voor realtime audiostreaming met lage latentie.
| Verbindingsmethode | Gebruiksituatie | Wachttijd | Ideaal voor |
|---|---|---|---|
| WebRTC | Toepassingen aan clientzijde | ~100 ms | Web-apps, mobiele apps, browsergebaseerde ervaringen |
| WebSocket | Server-naar-server | ~200 ms | Back-endservices, batchverwerking, aangepaste middleware |
| SIP | Telefonie-integratie | Varies | Callcenters, IVR-systemen, telefoontoepassingen |
Voor meer informatie, zie:
Ondersteunde modellen
De GPT realtime modellen zijn beschikbaar voor wereldwijde implementaties.
-
gpt-4o-realtime-preview(versie2024-12-17) -
gpt-4o-mini-realtime-preview(versie2024-12-17) -
gpt-realtime(versie2025-08-28) -
gpt-realtime-mini(versie2025-10-06) -
gpt-realtime-mini-2025-12-15(versie2025-12-15) -
gpt-realtime-1.5-2026-02-23(2026-02-23)
Zie de documentatie over modellen en versies voor meer informatie.
Opmerking
Tokenlimieten variëren per model:
- Preview-modellen (gpt-4o-realtime-preview, gpt-4o-mini-realtime-preview): Invoer 128.000 / Uitvoer 4.096 tokens
- GA-modellen (gpt-realtime, gpt-realtime-mini): Invoer 28.672 / Uitvoer 4.096 tokens
Voor de Realtime-API gebruikt u de API-versie 2025-04-01-preview in de URL voor preview-modellen. Voor GA-modellen gebruikt u indien mogelijk de GA API-versie (zonder het -preview achtervoegsel).
Vereiste voorwaarden
Voordat u GPT realtime audio kunt gebruiken, hebt u het volgende nodig:
- Een Azure-abonnement: maak er gratis een.
- Een Microsoft Foundry-resource: maak een Microsoft Foundry-resource in een van de ondersteunde regio's.
- Een API-sleutel of Microsoft Entra-id-referenties voor verificatie. Voor productietoepassingen raden we u aan Microsoft Entra ID te gebruiken voor verbeterde beveiliging.
- Een implementatie van een GPT realtime-model in een ondersteunde regio, zoals beschreven in de sectie ondersteunde modellen in dit artikel.
- Laad uw project in de Microsoft Foundry-portal. Selecteer Bouwen in het menu rechtsboven en selecteer vervolgens het tabblad Modellen in het linkerdeelvenster en Implementeer een basismodel. Zoek naar het gewenste model en selecteer Implementeren op de modelpagina.
Hier volgen enkele manieren waarop u aan de slag kunt met de GPT Realtime-API voor spraak en audio:
- Zie de quickstart voor realtime audio voor stappen om een GPT realtime model te implementeren en gebruiken.
- Probeer het WebRTC via HTML en JavaScript om aan de slag te gaan met de Realtime-API via WebRTC.
- De Repo Azure-Samples/aisearch-openai-rag-audio bevat een voorbeeld van het implementeren van RAG-ondersteuning in toepassingen die spraak gebruiken als hun gebruikersinterface, mogelijk gemaakt door de GPT-realtime-API voor audio.
Snelstart
Volg de instructies in deze sectie om aan de slag te gaan met de Realtime-API via WebSockets. Gebruik de Realtime-API via WebSockets in server-naar-serverscenario's waarbij lage latentie geen vereiste is.
Taalspecifieke vereisten
Vereisten voor Microsoft Entra-id
Voor de aanbevolen sleutelloze verificatie met Microsoft Entra-id moet u het volgende doen:
- Installeer de Azure CLI die wordt gebruikt voor sleutelloze verificatie met Microsoft Entra-id.
- Wijs de
Cognitive Services OpenAI Userrol toe aan uw gebruikersaccount. U kunt rollen toewijzen in Azure Portal onder Toegangsbeheer (IAM)>Roltoewijzing toevoegen.
Een model implementeren voor realtime audio
Om het model te implementeren gpt-realtime op de Microsoft Foundry-portal:
- Ga naar de Foundry portal en maak een of selecteer uw project.
- Selecteer uw modelimplementaties:
- Voor Azure OpenAI-resource selecteert u Implementaties in de sectie Gedeelde resources in het linkerdeelvenster.
- Voor Foundry-resource selecteert u Modellen en eindpunten onder Mijn assets in het linkerdeelvenster.
- Selecteer + Model implementeren> implementeren om het implementatievenster te openen.
- Zoek en selecteer het
gpt-realtimemodel en selecteer vervolgens Bevestigen. - Controleer de implementatiedetails en selecteer Implementeren.
- Volg de wizard om het model te implementeren.
Nu u een implementatie van het gpt-realtime model hebt, kunt u ermee werken in de Foundry-portal Audio playground of Realtime API.
Instellen
Maak een nieuwe map
realtime-audio-quickstart-jsen ga naar de snelstartmap met de volgende opdracht:mkdir realtime-audio-quickstart-js && cd realtime-audio-quickstart-jsMaak de
package.jsonopdracht met de volgende opdracht:npm init -yWerk de
typebij naarmoduleinpackage.jsonmet de volgende opdracht:npm pkg set type=moduleInstalleer de OpenAI-clientbibliotheek voor JavaScript met:
npm install openaiInstalleer de afhankelijke pakketten die worden gebruikt door de OpenAI-clientbibliotheek voor JavaScript met:
npm install wsVoor de aanbevolen sleutelloze verificatie met Microsoft Entra ID installeert u het
@azure/identitypakket met:npm install @azure/identity
Resourcegegevens ophalen
U moet de volgende informatie ophalen om uw toepassing te verifiëren met uw Azure OpenAI-resource:
| Naam van de variabele | Waarde |
|---|---|
AZURE_OPENAI_ENDPOINT |
Deze waarde vindt u in de sectie Sleutels en eindpunt bij het controleren van uw resource vanuit Azure Portal. |
AZURE_OPENAI_DEPLOYMENT_NAME |
Deze waarde komt overeen met de aangepaste naam die u hebt gekozen voor uw implementatie toen u een model hebt geïmplementeerd. Deze waarde vindt u onder Resource Management>Model Deployments in Azure Portal. |
Meer informatie over sleutelloze verificatie en het instellen van omgevingsvariabelen.
Waarschuwing
Als u de aanbevolen sleutelloze verificatie met de SDK wilt gebruiken, moet u ervoor zorgen dat de AZURE_OPENAI_API_KEY omgevingsvariabele niet is ingesteld.
Tekst verzenden, audioantwoord ontvangen
Maak het
index.jsbestand met de volgende code:import OpenAI from 'openai'; import { OpenAIRealtimeWS } from 'openai/realtime/ws'; import { DefaultAzureCredential, getBearerTokenProvider } from '@azure/identity'; import { OpenAIRealtimeError } from 'openai/realtime/internal-base'; let isCreated = false; let isConfigured = false; let responseDone = false; // Set this to false, if you want to continue receiving events after an error is received. const throwOnError = true; async function main() { // The endpoint of your Azure OpenAI resource is required. You can set it in the AZURE_OPENAI_ENDPOINT // environment variable or replace the default value below. // You can find it in the Microsoft Foundry portal in the Overview page of your Azure OpenAI resource. // Example: https://{your-resource}.openai.azure.com const endpoint = process.env.AZURE_OPENAI_ENDPOINT || 'AZURE_OPENAI_ENDPOINT'; const baseUrl = endpoint.replace(/\/$/, "") + '/openai/v1'; // The deployment name of your Azure OpenAI model is required. You can set it in the AZURE_OPENAI_DEPLOYMENT_NAME // environment variable or replace the default value below. // You can find it in the Foundry portal in the "Models + endpoints" page of your Azure OpenAI resource. // Example: gpt-realtime const deploymentName = process.env.AZURE_OPENAI_DEPLOYMENT_NAME || 'gpt-realtime'; // Keyless authentication const credential = new DefaultAzureCredential(); const scope = 'https://cognitiveservices.azure.com/.default'; const azureADTokenProvider = getBearerTokenProvider(credential, scope); const token = await azureADTokenProvider(); // The APIs are compatible with the OpenAI client library. // You can use the OpenAI client library to access the Azure OpenAI APIs. // Make sure to set the baseURL and apiKey to use the Azure OpenAI endpoint and token. const openAIClient = new OpenAI({ baseURL: baseUrl, apiKey: token, }); const realtimeClient = await OpenAIRealtimeWS.create(openAIClient, { model: deploymentName }); realtimeClient.on('error', (receivedError) => receiveError(receivedError)); realtimeClient.on('session.created', (receivedEvent) => receiveEvent(receivedEvent)); realtimeClient.on('session.updated', (receivedEvent) => receiveEvent(receivedEvent)); realtimeClient.on('response.output_audio.delta', (receivedEvent) => receiveEvent(receivedEvent)); realtimeClient.on('response.output_audio_transcript.delta', (receivedEvent) => receiveEvent(receivedEvent)); realtimeClient.on('response.done', (receivedEvent) => receiveEvent(receivedEvent)); console.log('Waiting for events...'); while (!isCreated) { console.log('Waiting for session.created event...'); await new Promise((resolve) => setTimeout(resolve, 100)); } // After the session is created, configure it to enable audio input and output. const sessionConfig = { 'type': 'realtime', 'instructions': 'You are a helpful assistant. You respond by voice and text.', 'output_modalities': ['audio'], 'audio': { 'input': { 'transcription': { 'model': 'whisper-1' }, 'format': { 'type': 'audio/pcm', 'rate': 24000, }, 'turn_detection': { 'type': 'server_vad', 'threshold': 0.5, 'prefix_padding_ms': 300, 'silence_duration_ms': 200, 'create_response': true } }, 'output': { 'voice': 'alloy', 'format': { 'type': 'audio/pcm', 'rate': 24000, } } } }; realtimeClient.send({ 'type': 'session.update', 'session': sessionConfig }); while (!isConfigured) { console.log('Waiting for session.updated event...'); await new Promise((resolve) => setTimeout(resolve, 100)); } // After the session is configured, data can be sent to the session. realtimeClient.send({ 'type': 'conversation.item.create', 'item': { 'type': 'message', 'role': 'user', 'content': [{ type: 'input_text', text: 'Please assist the user.' } ] } }); realtimeClient.send({ type: 'response.create' }); // While waiting for the session to finish, the events can be handled in the event handlers. // In this example, we just wait for the first response.done event. while (!responseDone) { console.log('Waiting for response.done event...'); await new Promise((resolve) => setTimeout(resolve, 100)); } console.log('The sample completed successfully.'); realtimeClient.close(); } function receiveError(err) { if (err instanceof OpenAIRealtimeError) { console.error('Received an error event.'); console.error(`Message: ${err.cause.message}`); console.error(`Stack: ${err.cause.stack}`); } if (throwOnError) { throw err; } } function receiveEvent(event) { console.log(`Received an event: ${event.type}`); switch (event.type) { case 'session.created': console.log(`Session ID: ${event.session.id}`); isCreated = true; break; case 'session.updated': console.log(`Session ID: ${event.session.id}`); isConfigured = true; break; case 'response.output_audio_transcript.delta': console.log(`Transcript delta: ${event.delta}`); break; case 'response.output_audio.delta': let audioBuffer = Buffer.from(event.delta, 'base64'); console.log(`Audio delta length: ${audioBuffer.length} bytes`); break; case 'response.done': console.log(`Response ID: ${event.response.id}`); console.log(`The final response is: ${event.response.output[0].content[0].transcript}`); responseDone = true; break; default: console.warn(`Unhandled event type: ${event.type}`); } } main().catch((err) => { console.error('The sample encountered an error:', err); }); export { main };Meld u aan bij Azure met de volgende opdracht:
az loginVoer het JavaScript-bestand uit.
node index.js
Wacht even om het antwoord te krijgen.
Uitvoer
Het script ontvangt een antwoord van het model en drukt de ontvangen transcriptie- en audiogegevens af.
De uitvoer ziet er ongeveer als volgt uit:
Waiting for events...
Waiting for session.created event...
Received an event: session.created
Session ID: sess_CQx8YO3vKxD9FaPxrbQ9R
Waiting for session.updated event...
Received an event: session.updated
Session ID: sess_CQx8YO3vKxD9FaPxrbQ9R
Waiting for response.done event...
Waiting for response.done event...
Waiting for response.done event...
Received an event: response.output_audio_transcript.delta
Transcript delta: Sure
Received an event: response.output_audio_transcript.delta
Transcript delta: ,
Received an event: response.output_audio_transcript.delta
Transcript delta: I
Waiting for response.done event...
Waiting for response.done event...
Received an event: response.output_audio.delta
Audio delta length: 4800 bytes
Received an event: response.output_audio.delta
Audio delta length: 7200 bytes
Waiting for response.done event...
Received an event: response.output_audio.delta
Audio delta length: 12000 bytes
Received an event: response.output_audio_transcript.delta
Transcript delta: 'm
Received an event: response.output_audio_transcript.delta
Transcript delta: here
Received an event: response.output_audio_transcript.delta
Transcript delta: to
Received an event: response.output_audio_transcript.delta
Transcript delta: help
Received an event: response.output_audio_transcript.delta
Transcript delta: .
Received an event: response.output_audio.delta
Audio delta length: 12000 bytes
Waiting for response.done event...
Received an event: response.output_audio.delta
Audio delta length: 12000 bytes
Received an event: response.output_audio_transcript.delta
Transcript delta: What
Received an event: response.output_audio_transcript.delta
Transcript delta: do
Received an event: response.output_audio_transcript.delta
Transcript delta: you
Waiting for response.done event...
Received an event: response.output_audio.delta
Audio delta length: 12000 bytes
Received an event: response.output_audio.delta
Audio delta length: 12000 bytes
Received an event: response.output_audio.delta
Audio delta length: 12000 bytes
Received an event: response.output_audio_transcript.delta
Transcript delta: need
Received an event: response.output_audio_transcript.delta
Transcript delta: assistance
Received an event: response.output_audio_transcript.delta
Transcript delta: with
Received an event: response.output_audio_transcript.delta
Transcript delta: ?
Waiting for response.done event...
Received an event: response.output_audio.delta
Audio delta length: 12000 bytes
Received an event: response.output_audio.delta
Audio delta length: 12000 bytes
Waiting for response.done event...
Received an event: response.output_audio.delta
Audio delta length: 12000 bytes
Received an event: response.output_audio.delta
Audio delta length: 12000 bytes
Waiting for response.done event...
Received an event: response.output_audio.delta
Audio delta length: 12000 bytes
Received an event: response.output_audio.delta
Audio delta length: 28800 bytes
Received an event: response.done
Response ID: resp_CQx8YwQCszDqSUXRutxP9
The final response is: Sure, I'm here to help. What do you need assistance with?
The sample completed successfully.
Taalspecifieke vereisten
- Python 3.8 of nieuwere versie. U wordt aangeraden Python 3.10 of hoger te gebruiken, maar python 3.8 is vereist. Als u geen geschikte versie van Python hebt geïnstalleerd, kunt u de instructies in de VS Code Python-zelfstudie volgen voor de eenvoudigste manier om Python op uw besturingssysteem te installeren.
Vereisten voor Microsoft Entra-id
Voor de aanbevolen sleutelloze verificatie met Microsoft Entra-id moet u het volgende doen:
- Installeer de Azure CLI die wordt gebruikt voor sleutelloze verificatie met Microsoft Entra-id.
- Wijs de
Cognitive Services OpenAI Userrol toe aan uw gebruikersaccount. U kunt rollen toewijzen in Azure Portal onder Toegangsbeheer (IAM)>Roltoewijzing toevoegen.
Een model implementeren voor realtime audio
Om het model te implementeren gpt-realtime op de Microsoft Foundry-portal:
- Ga naar de Foundry portal en maak een of selecteer uw project.
- Selecteer uw modelimplementaties:
- Voor Azure OpenAI-resource selecteert u Implementaties in de sectie Gedeelde resources in het linkerdeelvenster.
- Voor Foundry-resource selecteert u Modellen en eindpunten onder Mijn assets in het linkerdeelvenster.
- Selecteer + Model implementeren> implementeren om het implementatievenster te openen.
- Zoek en selecteer het
gpt-realtimemodel en selecteer vervolgens Bevestigen. - Controleer de implementatiedetails en selecteer Implementeren.
- Volg de wizard om het model te implementeren.
Nu u een implementatie van het gpt-realtime model hebt, kunt u ermee werken in de Foundry-portal Audio playground of Realtime API.
Instellen
Maak een nieuwe map
realtime-audio-quickstart-pyen ga naar de snelstartmap met de volgende opdracht:mkdir realtime-audio-quickstart-py && cd realtime-audio-quickstart-pyMaak een virtuele omgeving. Als Python 3.10 of hoger al is geïnstalleerd, kunt u een virtuele omgeving maken met behulp van de volgende opdrachten:
Als u de Python-omgeving activeert, betekent dit dat wanneer u
pythonofpipvanaf de opdrachtregel uitvoert, u de Python-interpreter gebruikt die zich in de.venvmap van uw toepassing bevindt. U kunt dedeactivateopdracht gebruiken om de virtuele Python-omgeving af te sluiten en deze later opnieuw te activeren wanneer dat nodig is.Aanbeveling
U wordt aangeraden een nieuwe Python-omgeving te maken en te activeren om de pakketten te installeren die u nodig hebt voor deze zelfstudie. Installeer geen pakketten in uw globale Python-installatie. U moet altijd een virtuele of conda-omgeving gebruiken bij het installeren van Python-pakketten, anders kunt u uw globale installatie van Python verbreken.
Installeer de OpenAI Python-clientbibliotheek met:
pip install openai[realtime]Opmerking
Deze bibliotheek wordt onderhouden door OpenAI. Raadpleeg de releasegeschiedenis om de meest recente updates voor de bibliotheek bij te houden.
Voor de aanbevolen sleutelloze verificatie met Microsoft Entra ID installeert u het
azure-identitypakket met:pip install azure-identity
Resourcegegevens ophalen
U moet de volgende informatie ophalen om uw toepassing te verifiëren met uw Azure OpenAI-resource:
| Naam van de variabele | Waarde |
|---|---|
AZURE_OPENAI_ENDPOINT |
Deze waarde vindt u in de sectie Sleutels en eindpunt bij het controleren van uw resource vanuit Azure Portal. |
AZURE_OPENAI_DEPLOYMENT_NAME |
Deze waarde komt overeen met de aangepaste naam die u hebt gekozen voor uw implementatie toen u een model hebt geïmplementeerd. Deze waarde vindt u onder Resource Management>Model Deployments in Azure Portal. |
Meer informatie over sleutelloze verificatie en het instellen van omgevingsvariabelen.
Waarschuwing
Als u de aanbevolen sleutelloze verificatie met de SDK wilt gebruiken, moet u ervoor zorgen dat de AZURE_OPENAI_API_KEY omgevingsvariabele niet is ingesteld.
Tekst verzenden, audioantwoord ontvangen
Maak het
text-in-audio-out.pybestand met de volgende code:import os import base64 import asyncio from openai import AsyncOpenAI from azure.identity import DefaultAzureCredential, get_bearer_token_provider async def main() -> None: """ When prompted for user input, type a message and hit enter to send it to the model. Enter "q" to quit the conversation. """ credential = DefaultAzureCredential() token_provider = get_bearer_token_provider(credential, "https://cognitiveservices.azure.com/.default") token = token_provider() # The endpoint of your Azure OpenAI resource is required. You can set it in the AZURE_OPENAI_ENDPOINT # environment variable. # You can find it in the Microsoft Foundry portal in the Overview page of your Azure OpenAI resource. # Example: https://{your-resource}.openai.azure.com endpoint = os.environ["AZURE_OPENAI_ENDPOINT"] # The deployment name of the model you want to use is required. You can set it in the AZURE_OPENAI_DEPLOYMENT_NAME # environment variable. # You can find it in the Foundry portal in the "Models + endpoints" page of your Azure OpenAI resource. # Example: gpt-realtime deployment_name = os.environ["AZURE_OPENAI_DEPLOYMENT_NAME"] base_url = endpoint.replace("https://", "wss://").rstrip("/") + "/openai/v1" # The APIs are compatible with the OpenAI client library. # You can use the OpenAI client library to access the Azure OpenAI APIs. # Make sure to set the baseURL and apiKey to use the Azure OpenAI endpoint and token. client = AsyncOpenAI( websocket_base_url=base_url, api_key=token ) async with client.realtime.connect( model=deployment_name, ) as connection: # after the connection is created, configure the session. await connection.session.update(session={ "type": "realtime", "instructions": "You are a helpful assistant. You respond by voice and text.", "output_modalities": ["audio"], "audio": { "input": { "transcription": { "model": "whisper-1", }, "format": { "type": "audio/pcm", "rate": 24000, }, "turn_detection": { "type": "server_vad", "threshold": 0.5, "prefix_padding_ms": 300, "silence_duration_ms": 200, "create_response": True, } }, "output": { "voice": "alloy", "format": { "type": "audio/pcm", "rate": 24000, } } } }) # After the session is configured, data can be sent to the session. while True: user_input = input("Enter a message: ") if user_input == "q": print("Stopping the conversation.") break await connection.conversation.item.create( item={ "type": "message", "role": "user", "content": [{"type": "input_text", "text": user_input}], } ) await connection.response.create() async for event in connection: if event.type == "response.output_text.delta": print(event.delta, flush=True, end="") elif event.type == "session.created": print(f"Session ID: {event.session.id}") elif event.type == "response.output_audio.delta": audio_data = base64.b64decode(event.delta) print(f"Received {len(audio_data)} bytes of audio data.") elif event.type == "response.output_audio_transcript.delta": print(f"Received text delta: {event.delta}") elif event.type == "response.output_text.done": print() elif event.type == "error": print("Received an error event.") print(f"Error code: {event.error.code}") print(f"Error Event ID: {event.error.event_id}") print(f"Error message: {event.error.message}") elif event.type == "response.done": break print("Conversation ended.") credential.close() asyncio.run(main())Meld u aan bij Azure met de volgende opdracht:
az loginVoer het Python-bestand uit.
python text-in-audio-out.pyWanneer u wordt gevraagd om gebruikersinvoer, typt u een bericht en drukt u op Enter om het naar het model te verzenden. Voer 'q' in om het gesprek af te sluiten.
Wacht even om het antwoord te krijgen.
Uitvoer
Het script ontvangt een antwoord van het model en drukt de ontvangen transcriptie- en audiogegevens af.
De uitvoer ziet er ongeveer als volgt uit:
Enter a message: How are you today?
Session ID: sess_CgAuonaqdlSNNDTdqBagI
Received text delta: I'm
Received text delta: doing
Received text delta: well
Received text delta: ,
Received 4800 bytes of audio data.
Received 7200 bytes of audio data.
Received 12000 bytes of audio data.
Received text delta: thank
Received text delta: you
Received text delta: for
Received text delta: asking
Received text delta: !
Received 12000 bytes of audio data.
Received 12000 bytes of audio data.
Received text delta: How
Received 12000 bytes of audio data.
Received 12000 bytes of audio data.
Received 12000 bytes of audio data.
Received text delta: about
Received text delta: you
Received text delta: —
Received text delta: how
Received text delta: are
Received text delta: you
Received text delta: feeling
Received text delta: today
Received text delta: ?
Received 12000 bytes of audio data.
Received 12000 bytes of audio data.
Received 12000 bytes of audio data.
Received 12000 bytes of audio data.
Received 12000 bytes of audio data.
Received 12000 bytes of audio data.
Received 12000 bytes of audio data.
Received 12000 bytes of audio data.
Received 12000 bytes of audio data.
Received 12000 bytes of audio data.
Received 12000 bytes of audio data.
Received 24000 bytes of audio data.
Enter a message: q
Stopping the conversation.
Conversation ended.
Taalspecifieke vereisten
- Node.js LTS- of ESM-ondersteuning.
- TypeScript is wereldwijd geïnstalleerd.
Vereisten voor Microsoft Entra-id
Voor de aanbevolen sleutelloze verificatie met Microsoft Entra-id moet u het volgende doen:
- Installeer de Azure CLI die wordt gebruikt voor sleutelloze verificatie met Microsoft Entra-id.
- Wijs de
Cognitive Services OpenAI Userrol toe aan uw gebruikersaccount. U kunt rollen toewijzen in Azure Portal onder Toegangsbeheer (IAM)>Roltoewijzing toevoegen.
Een model implementeren voor realtime audio
Om het model te implementeren gpt-realtime op de Microsoft Foundry-portal:
- Ga naar de Foundry portal en maak een of selecteer uw project.
- Selecteer uw modelimplementaties:
- Voor Azure OpenAI-resource selecteert u Implementaties in de sectie Gedeelde resources in het linkerdeelvenster.
- Voor Foundry-resource selecteert u Modellen en eindpunten onder Mijn assets in het linkerdeelvenster.
- Selecteer + Model implementeren> implementeren om het implementatievenster te openen.
- Zoek en selecteer het
gpt-realtimemodel en selecteer vervolgens Bevestigen. - Controleer de implementatiedetails en selecteer Implementeren.
- Volg de wizard om het model te implementeren.
Nu u een implementatie van het gpt-realtime model hebt, kunt u ermee werken in de Foundry-portal Audio playground of Realtime API.
Instellen
Maak een nieuwe map
realtime-audio-quickstart-tsen ga naar de snelstartmap met de volgende opdracht:mkdir realtime-audio-quickstart-ts && cd realtime-audio-quickstart-tsMaak de
package.jsonopdracht met de volgende opdracht:npm init -yWerk de
package.jsonbij naar ECMAScript met het volgende commando:npm pkg set type=moduleInstalleer de OpenAI-clientbibliotheek voor JavaScript met:
npm install openaiInstalleer de afhankelijke pakketten die worden gebruikt door de OpenAI-clientbibliotheek voor JavaScript met:
npm install wsVoor de aanbevolen sleutelloze verificatie met Microsoft Entra ID installeert u het
@azure/identitypakket met:npm install @azure/identity
Resourcegegevens ophalen
U moet de volgende informatie ophalen om uw toepassing te verifiëren met uw Azure OpenAI-resource:
| Naam van de variabele | Waarde |
|---|---|
AZURE_OPENAI_ENDPOINT |
Deze waarde vindt u in de sectie Sleutels en eindpunt bij het controleren van uw resource vanuit Azure Portal. |
AZURE_OPENAI_DEPLOYMENT_NAME |
Deze waarde komt overeen met de aangepaste naam die u hebt gekozen voor uw implementatie toen u een model hebt geïmplementeerd. Deze waarde vindt u onder Resource Management>Model Deployments in Azure Portal. |
Meer informatie over sleutelloze verificatie en het instellen van omgevingsvariabelen.
Waarschuwing
Als u de aanbevolen sleutelloze verificatie met de SDK wilt gebruiken, moet u ervoor zorgen dat de AZURE_OPENAI_API_KEY omgevingsvariabele niet is ingesteld.
Tekst verzenden, audioantwoord ontvangen
Maak het
index.tsbestand met de volgende code:import OpenAI from 'openai'; import { OpenAIRealtimeWS } from 'openai/realtime/ws'; import { OpenAIRealtimeError } from 'openai/realtime/internal-base'; import { DefaultAzureCredential, getBearerTokenProvider } from "@azure/identity"; import { RealtimeSessionCreateRequest } from 'openai/resources/realtime/realtime'; let isCreated = false; let isConfigured = false; let responseDone = false; // Set this to false, if you want to continue receiving events after an error is received. const throwOnError = true; async function main(): Promise<void> { // The endpoint of your Azure OpenAI resource is required. You can set it in the AZURE_OPENAI_ENDPOINT // environment variable or replace the default value below. // You can find it in the Microsoft Foundry portal in the Overview page of your Azure OpenAI resource. // Example: https://{your-resource}.openai.azure.com const endpoint = process.env.AZURE_OPENAI_ENDPOINT || 'AZURE_OPENAI_ENDPOINT'; const baseUrl = endpoint.replace(/\/$/, "") + '/openai/v1'; // The deployment name of your Azure OpenAI model is required. You can set it in the AZURE_OPENAI_DEPLOYMENT_NAME // environment variable or replace the default value below. // You can find it in the Foundry portal in the "Models + endpoints" page of your Azure OpenAI resource. // Example: gpt-realtime const deploymentName = process.env.AZURE_OPENAI_DEPLOYMENT_NAME || 'gpt-realtime'; // Keyless authentication const credential = new DefaultAzureCredential(); const scope = "https://cognitiveservices.azure.com/.default"; const azureADTokenProvider = getBearerTokenProvider(credential, scope); const token = await azureADTokenProvider(); // The APIs are compatible with the OpenAI client library. // You can use the OpenAI client library to access the Azure OpenAI APIs. // Make sure to set the baseURL and apiKey to use the Azure OpenAI endpoint and token. const openAIClient = new OpenAI({ baseURL: baseUrl, apiKey: token, }); const realtimeClient = await OpenAIRealtimeWS.create(openAIClient, { model: deploymentName }); realtimeClient.on('error', (receivedError) => receiveError(receivedError)); realtimeClient.on('session.created', (receivedEvent) => receiveEvent(receivedEvent)); realtimeClient.on('session.updated', (receivedEvent) => receiveEvent(receivedEvent)); realtimeClient.on('response.output_audio.delta', (receivedEvent) => receiveEvent(receivedEvent)); realtimeClient.on('response.output_audio_transcript.delta', (receivedEvent) => receiveEvent(receivedEvent)); realtimeClient.on('response.done', (receivedEvent) => receiveEvent(receivedEvent)); console.log('Waiting for events...'); while (!isCreated) { console.log('Waiting for session.created event...'); await new Promise((resolve) => setTimeout(resolve, 100)); } // After the session is created, configure it to enable audio input and output. const sessionConfig: RealtimeSessionCreateRequest = { 'type': 'realtime', 'instructions': 'You are a helpful assistant. You respond by voice and text.', 'output_modalities': ['audio'], 'audio': { 'input': { 'transcription': { 'model': 'whisper-1' }, 'format': { 'type': 'audio/pcm', 'rate': 24000, }, 'turn_detection': { 'type': 'server_vad', 'threshold': 0.5, 'prefix_padding_ms': 300, 'silence_duration_ms': 200, 'create_response': true } }, 'output': { 'voice': 'alloy', 'format': { 'type': 'audio/pcm', 'rate': 24000, } } } }; realtimeClient.send({ 'type': 'session.update', 'session': sessionConfig }); while (!isConfigured) { console.log('Waiting for session.updated event...'); await new Promise((resolve) => setTimeout(resolve, 100)); } // After the session is configured, data can be sent to the session. realtimeClient.send({ 'type': 'conversation.item.create', 'item': { 'type': 'message', 'role': 'user', 'content': [{ type: 'input_text', text: 'Please assist the user.' }] } }); realtimeClient.send({ type: 'response.create' }); // While waiting for the session to finish, the events can be handled in the event handlers. // In this example, we just wait for the first response.done event. while (!responseDone) { console.log('Waiting for response.done event...'); await new Promise((resolve) => setTimeout(resolve, 100)); } console.log('The sample completed successfully.'); realtimeClient.close(); } function receiveError(errorEvent: OpenAIRealtimeError): void { if (errorEvent instanceof OpenAIRealtimeError) { console.error('Received an error event.'); console.error(`Message: ${errorEvent.message}`); console.error(`Stack: ${errorEvent.stack}`); errorEvent } if (throwOnError) { throw errorEvent; } } function receiveEvent(event: any): void { console.log(`Received an event: ${event.type}`); switch (event.type) { case 'session.created': console.log(`Session ID: ${event.session.id}`); isCreated = true; break; case 'session.updated': console.log(`Session ID: ${event.session.id}`); isConfigured = true; break; case 'response.output_audio_transcript.delta': console.log(`Transcript delta: ${event.delta}`); break; case 'response.output_audio.delta': let audioBuffer = Buffer.from(event.delta, 'base64'); console.log(`Audio delta length: ${audioBuffer.length} bytes`); break; case 'response.done': console.log(`Response ID: ${event.response.id}`); console.log(`The final response is: ${event.response.output[0].content[0].transcript}`); responseDone = true; break; default: console.warn(`Unhandled event type: ${event.type}`); } } main().catch((err) => { console.error("The sample encountered an error:", err); }); export { main };Maak het
tsconfig.jsonbestand om de TypeScript-code te transpileren en kopieer de volgende code voor ECMAScript.{ "compilerOptions": { "module": "NodeNext", "target": "ES2022", // Supports top-level await "moduleResolution": "NodeNext", "skipLibCheck": true, // Avoid type errors from node_modules "strict": true // Enable strict type-checking options }, "include": ["*.ts"] }Typedefinities installeren voor Node
npm i --save-dev @types/nodeTranspile vanuit TypeScript naar JavaScript.
tscMeld u aan bij Azure met de volgende opdracht:
az loginVoer de code uit met de volgende opdracht:
node index.js
Wacht even om het antwoord te krijgen.
Uitvoer
Het script ontvangt een antwoord van het model en drukt de ontvangen transcriptie- en audiogegevens af.
De uitvoer ziet er ongeveer als volgt uit:
Waiting for events...
Waiting for session.created event...
Waiting for session.created event...
Waiting for session.created event...
Waiting for session.created event...
Waiting for session.created event...
Waiting for session.created event...
Waiting for session.created event...
Waiting for session.created event...
Waiting for session.created event...
Waiting for session.created event...
Received an event: session.created
Session ID: sess_CWQkREiv3jlU3gk48bm0a
Waiting for session.updated event...
Waiting for session.updated event...
Received an event: session.updated
Session ID: sess_CWQkREiv3jlU3gk48bm0a
Waiting for response.done event...
Waiting for response.done event...
Waiting for response.done event...
Waiting for response.done event...
Waiting for response.done event...
Received an event: response.output_audio_transcript.delta
Transcript delta: Sure
Received an event: response.output_audio_transcript.delta
Transcript delta: ,
Received an event: response.output_audio_transcript.delta
Transcript delta: I'm
Received an event: response.output_audio_transcript.delta
Transcript delta: here
Waiting for response.done event...
Received an event: response.output_audio.delta
Audio delta length: 4800 bytes
Waiting for response.done event...
Received an event: response.output_audio.delta
Audio delta length: 7200 bytes
Waiting for response.done event...
Received an event: response.output_audio.delta
Audio delta length: 12000 bytes
Received an event: response.output_audio_transcript.delta
Transcript delta: to
Received an event: response.output_audio_transcript.delta
Transcript delta: help
Received an event: response.output_audio_transcript.delta
Transcript delta: .
Waiting for response.done event...
Received an event: response.output_audio.delta
Audio delta length: 12000 bytes
Received an event: response.output_audio.delta
Audio delta length: 12000 bytes
Received an event: response.output_audio_transcript.delta
Transcript delta: What
Received an event: response.output_audio_transcript.delta
Transcript delta: would
Received an event: response.output_audio_transcript.delta
Transcript delta: you
Received an event: response.output_audio_transcript.delta
Transcript delta: like
Waiting for response.done event...
Received an event: response.output_audio.delta
Audio delta length: 12000 bytes
Received an event: response.output_audio.delta
Audio delta length: 12000 bytes
Received an event: response.output_audio.delta
Audio delta length: 12000 bytes
Received an event: response.output_audio_transcript.delta
Transcript delta: to
Received an event: response.output_audio_transcript.delta
Transcript delta: do
Received an event: response.output_audio_transcript.delta
Transcript delta: or
Received an event: response.output_audio_transcript.delta
Transcript delta: know
Received an event: response.output_audio_transcript.delta
Transcript delta: about
Received an event: response.output_audio_transcript.delta
Transcript delta: ?
Waiting for response.done event...
Received an event: response.output_audio.delta
Audio delta length: 12000 bytes
Received an event: response.output_audio.delta
Audio delta length: 12000 bytes
Received an event: response.output_audio.delta
Audio delta length: 12000 bytes
Waiting for response.done event...
Received an event: response.output_audio.delta
Audio delta length: 12000 bytes
Received an event: response.output_audio.delta
Audio delta length: 12000 bytes
Waiting for response.done event...
Received an event: response.output_audio.delta
Audio delta length: 12000 bytes
Received an event: response.output_audio.delta
Audio delta length: 12000 bytes
Received an event: response.output_audio.delta
Audio delta length: 24000 bytes
Received an event: response.done
Response ID: resp_CWQkRBrCcCjtHgIEapA92
The final response is: Sure, I'm here to help. What would you like to do or know about?
The sample completed successfully.
Een model implementeren voor realtime audio
Om het model te implementeren gpt-realtime op de Microsoft Foundry-portal:
- Ga naar de Foundry portal en maak een of selecteer uw project.
- Selecteer uw modelimplementaties:
- Voor Azure OpenAI-resource selecteert u Implementaties in de sectie Gedeelde resources in het linkerdeelvenster.
- Voor Foundry-resource selecteert u Modellen en eindpunten onder Mijn assets in het linkerdeelvenster.
- Selecteer + Model implementeren> implementeren om het implementatievenster te openen.
- Zoek en selecteer het
gpt-realtimemodel en selecteer vervolgens Bevestigen. - Controleer de implementatiedetails en selecteer Implementeren.
- Volg de wizard om het model te implementeren.
Nu u een implementatie van het gpt-realtime model hebt, kunt u ermee werken in de Foundry-portal Audio playground of Realtime API.
De GPT real-time audio gebruiken
Als u wilt chatten met uw geïmplementeerde gpt-realtime model in de realtime audiospeeltuin van Microsoft Foundry, voert u de volgende stappen uit:
Ga naar de Foundry-portal en selecteer uw project met uw geïmplementeerde
gpt-realtimemodel.Selecteer Speeltuinen vanuit het linkerpaneel.
Selecteer Audio playground>Probeer de Audio playground.
Opmerking
De Chat-speeltuin biedt geen ondersteuning voor het
gpt-realtimemodel. Gebruik de audiospeeltuin zoals beschreven in deze sectie.Selecteer het geïmplementeerde
gpt-realtimemodel in de vervolgkeuzelijst Implementatie .U kunt eventueel inhoud bewerken in het tekstvak Modelinstructies en context geven. Geef het model instructies over hoe het zich moet gedragen en eventuele context waarnaar wordt verwezen bij het genereren van een antwoord. U kunt de persoonlijkheid van de assistent beschrijven, vertellen wat het wel en niet moet beantwoorden en hoe u antwoorden kunt opmaken.
U kunt desgewenst instellingen wijzigen, zoals drempelwaarde, opvulling van voorvoegsels en stilteduur.
Selecteer Start met luisteren om de sessie te starten. U kunt in de microfoon spreken om een chat te starten.
U kunt de chat op elk gewenst moment onderbreken door te spreken. U kunt de chat beëindigen door de knop Luisteren stoppen te selecteren.
API-ondersteuning
Ondersteuning voor de Realtime-API is voor het eerst toegevoegd in de API-versie 2024-10-01-preview (buiten gebruik gesteld). Gebruik de versie 2025-08-28 om toegang te krijgen tot de nieuwste realtime API-functies. U wordt aangeraden indien mogelijk de algemeen beschikbare API-versie (zonder '-preview'-achtervoegsel) te selecteren.
Waarschuwing
U moet verschillende eindpuntindelingen gebruiken voor preview- en algemeen beschikbare (GA)-modellen. Alle voorbeelden in dit artikel gebruiken GA-modellen en de GA-eindpuntindeling en gebruiken de api-version-parameter niet, die alleen vereist is voor de Preview-eindpuntindeling. Zie gedetailleerde informatie over de eindpuntindeling in dit artikel.
Opmerking
De Realtime-API heeft specifieke frequentielimieten voor audiotokens en gelijktijdige sessies. Voordat u implementeert in productie, controleert u de Azure OpenAI-quota en -limieten voor uw implementatietype.
Sessieconfiguratie
Vaak is de eerste gebeurtenis die door de beller wordt verzonden op een zojuist tot stand gebrachte /realtime sessie een session.update payload. Met deze gebeurtenis wordt een brede set invoer- en uitvoergedrag bepaald, waarbij de eigenschappen voor het genereren van uitvoer en reacties later kunnen worden overschreven met behulp van de response.create-gebeurtenis.
De session.update gebeurtenis kan worden gebruikt om de volgende aspecten van de sessie te configureren:
- De transcriptie van gebruikersinvoeraudio wordt ingeschakeld via de
input_audio_transcription-eigenschap van de sessie. Het opgeven van een transcriptiemodel (zoalswhisper-1) in deze configuratie maakt het leveren vanconversation.item.audio_transcription.completedgebeurtenissen mogelijk. - De afhandeling van de draai wordt bepaald door de
turn_detectioneigenschap. Het type van deze eigenschap kan worden ingesteld opnone,semantic_vadofserver_vadzoals beschreven in de spraakactiviteitsdetectie (VAD) en de audiobuffersectie . - Hulpprogramma's kunnen worden geconfigureerd om de server in staat te stellen externe services of functies aan te roepen om het gesprek te verrijken. Hulpprogramma's worden gedefinieerd als onderdeel van de
toolseigenschap in de sessieconfiguratie.
Een voorbeeld session.update waarmee verschillende aspecten van de sessie, inclusief hulpprogramma's, worden geconfigureerd, volgt. Alle sessieparameters zijn optioneel en kunnen worden weggelaten als dat niet nodig is.
{
"type": "session.update",
"session": {
"voice": "alloy",
"instructions": "",
"input_audio_format": "pcm16",
"input_audio_transcription": {
"model": "whisper-1"
},
"turn_detection": {
"type": "server_vad",
"threshold": 0.5,
"prefix_padding_ms": 300,
"silence_duration_ms": 200,
"create_response": true
},
"tools": []
}
}
De server reageert met een session.updated gebeurtenis om de sessieconfiguratie te bevestigen.
Out-of-band-antwoorden
Antwoorden die tijdens een sessie worden gegenereerd, worden standaard toegevoegd aan de standaardstatus van het gesprek. In sommige gevallen wilt u mogelijk antwoorden genereren buiten het standaardgesprek. Dit kan handig zijn voor het gelijktijdig genereren van meerdere antwoorden of voor het genereren van antwoorden die geen invloed hebben op de standaardgespreksstatus. U kunt bijvoorbeeld het aantal beurten beperken dat door het model wordt overwogen bij het genereren van een antwoord.
U kunt out-of-band-antwoorden maken door het response.conversation veld in te stellen op de tekenreeks none bij het maken van een antwoord met de response.create clientgebeurtenis.
In dezelfde response.create clientgebeurtenis kunt u ook het response.metadata veld instellen om te bepalen welke reactie wordt gegenereerd voor deze clientverzendingsgebeurtenis.
{
"type": "response.create",
"response": {
"conversation": "none",
"metadata": {
"topic": "world_capitals"
},
"modalities": ["text"],
"prompt": "What is the capital/major city of France?"
}
}
Wanneer de server reageert met een response.done gebeurtenis, bevat het antwoord de metagegevens die u hebt opgegeven. U kunt het bijbehorende antwoord voor de door de client verzonden gebeurtenis identificeren via het response.metadata veld.
Belangrijk
Als u antwoorden buiten het standaardgesprek maakt, controleert u altijd het response.metadata veld om u te helpen het bijbehorende antwoord voor de door de client verzonden gebeurtenis te identificeren. U moet zelfs het response.metadata veld controleren op antwoorden die deel uitmaken van het standaardgesprek. Op die manier kunt u ervoor zorgen dat u het juiste antwoord voor de door de client verzonden gebeurtenis verwerkt.
Aangepaste context voor out-of-band-antwoorden
U kunt ook een aangepaste context maken die door het model wordt gebruikt buiten het standaardgesprek van de sessie. Als u een antwoord met aangepaste context wilt maken, stelt u het conversation veld none in op en geeft u de aangepaste context op in de input matrix. De input matrix kan nieuwe invoer of verwijzingen naar bestaande gespreksitems bevatten.
{
"type": "response.create",
"response": {
"conversation": "none",
"modalities": ["text"],
"prompt": "What is the capital/major city of France?",
"input": [
{
"type": "item_reference",
"id": "existing_conversation_item_id"
},
{
"type": "message",
"role": "user",
"content": [
{
"type": "input_text",
"text": "The capital/major city of France is Paris."
},
],
},
]
}
}
Spraakactiviteitsdetectie (VAD) en de audiobuffer
De server onderhoudt een invoeraudiobuffer met door de client geleverde audio die nog niet is doorgevoerd in de gespreksstatus.
Een van de belangrijkste sessiebrede instellingen is turn_detection, waarmee wordt bepaald hoe de gegevensstroom wordt verwerkt tussen de aanroeper en het model. De turn_detection instelling kan worden ingesteld op none, semantic_vadof server_vad (om spraakactiviteitsdetectie aan de serverzijde te gebruiken).
-
server_vad: Hiermee wordt de audio automatisch gesplitst op basis van perioden van stilte. -
semantic_vad: Splitst de audio wanneer het model op basis van de woorden die door de gebruiker zijn gezegd, gelooft dat zij hun uitspraak hebben voltooid.
Server-VAD (server_vad) is standaard ingeschakeld en de server genereert automatisch antwoorden wanneer het einde van de spraak in de invoeraudiobuffer wordt gedetecteerd. U kunt het gedrag wijzigen door de turn_detection eigenschap in te stellen in de sessieconfiguratie.
Handmatige beurtafhandeling (push-to-talk)
U kunt automatische detectie van spraakactiviteiten uitschakelen door het turn_detection type in te stellen op none. Wanneer VAD is uitgeschakeld, genereert de server niet automatisch antwoorden wanneer het einde van de spraak in de invoeraudiobuffer wordt gedetecteerd.
De sessie is afhankelijk van door de beller geïnitieerde input_audio_buffer.commit en response.create gebeurtenissen om gesprekken voort te zetten en uitvoer te produceren. Deze instelling is handig voor push-to-talk-toepassingen of situaties met extern audiobeheersysteem (zoals een VAD-onderdeel aan de oproepzijde). Deze handmatige signalen kunnen nog steeds worden gebruikt in server_vad de modus ter aanvulling van door VAD geïnitieerde responsgeneratie.
- De client kan audio toevoegen aan de buffer door de
input_audio_buffer.appendgebeurtenis te verzenden. - De client verbindt de invoeraudiobuffer door het
input_audio_buffer.commit-event te verzenden. De commit maakt een nieuw gebruikerberichtitem in het gesprek. - De server reageert door de
input_audio_buffer.committedgebeurtenis te verzenden. - De server reageert door de
conversation.item.createdgebeurtenis te verzenden.
Server Beslissingsmodus
U kunt de sessie configureren om spraakactiviteitsdetectie (VAD) aan de serverzijde te gebruiken. Stel het type turn_detection in op server_vad om VAD in te schakelen.
In dit geval evalueert de server gebruikersaudio van de client (zoals verzonden via input_audio_buffer.append) met behulp van een VAD-onderdeel (Voice Activity Detection). De server gebruikt die audio automatisch om het genereren van reacties te initiëren voor toepasselijke gesprekken wanneer er een einde aan spraak wordt gedetecteerd. Stiltedetectie voor de VAD kan ook worden geconfigureerd bij het opgeven van server_vad de detectiemodus.
- De server verzendt de
input_audio_buffer.speech_startedgebeurtenis wanneer deze het begin van de spraak detecteert. - De client kan op elk gewenst moment audio aan de buffer toevoegen door de
input_audio_buffer.appendgebeurtenis te verzenden. - De server verzendt de
input_audio_buffer.speech_stoppedgebeurtenis wanneer deze het einde van de spraak detecteert. - De server doorvoert de invoeraudiobuffer door de
input_audio_buffer.committedgebeurtenis te verzenden. - De server verzendt de
conversation.item.createdgebeurtenis met het gebruikersberichtitem dat is gemaakt op basis van de audiobuffer.
Semantische VAD
Semantische VAD detecteert wanneer de gebruiker klaar is met spreken op basis van de woorden die ze hebben uitgesproken. De invoeraudio wordt beoordeeld op basis van de waarschijnlijkheid dat de gebruiker klaar is met spreken. Wanneer de kans laag is, wacht het model op een time-out. Wanneer de kans hoog is, hoeft u niet te wachten.
Met de (semantic_vad) modus zal het model de gebruiker minder snel onderbreken tijdens een spraak-naar-spraakgesprek of een transcript segmenteren voordat de gebruiker klaar is met spreken.
VAD zonder automatische responsgeneratie
U kunt spraakactiviteitsdetectie (VAD) aan de serverzijde gebruiken zonder automatische reactiegeneratie. Deze benadering kan handig zijn als u een zekere mate van toezicht wilt implementeren.
Stel turn_detection.create_response in op false via het session.update-gebeurtenis . VAD detecteert het einde van de spraak, maar de server genereert pas een antwoord als u een response.create gebeurtenis verzendt.
{
"turn_detection": {
"type": "server_vad",
"threshold": 0.5,
"prefix_padding_ms": 300,
"silence_duration_ms": 200,
"create_response": false
}
}
Gespreks- en antwoordgeneratie
De GPT realtime audiomodellen zijn ontworpen voor realtime gespreksinteracties met lage latentie. De API is gebaseerd op een reeks gebeurtenissen waarmee de client berichten kan verzenden en ontvangen, de stroom van het gesprek kan beheren en de status van de sessie kan beheren.
Gespreksvolgorde en items
U kunt één actief gesprek per sessie voeren. Het gesprek verzamelt invoersignalen totdat een antwoord wordt gestart, hetzij via een directe gebeurtenis door de beller of automatisch door spraakactiviteitsdetectie (VAD).
- De servergebeurtenis
conversation.createdwordt direct na het maken van de sessie geretourneerd. - Deze client voegt nieuwe items toe aan het gesprek met een
conversation.item.createevent. - De servergebeurtenis
conversation.item.createdwordt geretourneerd wanneer de client een nieuw item toevoegt aan het gesprek.
Optioneel kan de client items in het gesprek afkappen of verwijderen:
- De client kapt een eerder audioberichtitem van een assistent af met een
conversation.item.truncategebeurtenis. - De servergebeurtenis
conversation.item.truncatedwordt geretourneerd om de client- en serverstatus te synchroniseren. - De client verwijdert een item in het gesprek met een
conversation.item.deletegebeurtenis. - De servergebeurtenis
conversation.item.deletedwordt geretourneerd om de client- en serverstatus te synchroniseren.
Antwoord genereren
Ga als volgende te werk om een antwoord van het model op te halen:
- De client verzendt een
response.creategebeurtenis. De server reageert met eenresponse.createdgebeurtenis. Het antwoord kan een of meer items bevatten, die elk een of meer inhoudsonderdelen kunnen bevatten. - Als u spraakactiviteitsdetectie (VAD) aan de serverzijde gebruikt, genereert de server automatisch een antwoord wanneer het einde van de spraak in de audiobuffer wordt gedetecteerd. De server verzendt een
response.createdgebeurtenis met het gegenereerde antwoord.
Onderbreking van reactie
De clientgebeurtenis response.cancel wordt gebruikt om een reactie in uitvoering te annuleren.
Een gebruiker kan het antwoord van de assistent onderbreken of de assistent vragen om te stoppen met praten. De server produceert sneller audio dan realtime. De client kan een conversation.item.truncate gebeurtenis verzenden om de audio af tekappen voordat deze wordt afgespeeld.
- Het begrip van de audio van de server met het afspelen van de client wordt gesynchroniseerd.
- Als u audio afkapt, wordt het transcript van de tekst aan de serverzijde verwijderd om ervoor te zorgen dat er geen tekst in de context staat waarover de gebruiker niet weet.
- De server reageert met een
conversation.item.truncatedgebeurtenis.
Afbeeldingsinvoer
De GPT realtime-modellen ondersteunen afbeeldingsinvoer als onderdeel van het gesprek. Het model kan antwoorden verankeren in wat de gebruiker momenteel ziet. U kunt afbeeldingen naar het model verzenden als onderdeel van een gespreksitem. Het model kan vervolgens antwoorden genereren die verwijzen naar de afbeeldingen.
In het volgende voorbeeld-json-lichaam wordt een afbeelding aan het gesprek toegevoegd.
{
"type": "conversation.item.create",
"previous_item_id": null,
"item": {
"type": "message",
"role": "user",
"content": [
{
"type": "input_image",
"image_url": "data:image/{format(example: png)};base64,{some_base64_image_bytes}"
}
]
}
}
Ondersteuning voor MCP-servers
Als u MCP-ondersteuning wilt inschakelen in een Realtime API-sessie, geeft u de URL op van een externe MCP-server in uw sessieconfiguratie. Hierdoor kan de API-service namens u automatisch hulpprogramma-aanroepen beheren.
U kunt de functionaliteit van uw agent eenvoudig verbeteren door een andere MCP-server op te geven in de sessieconfiguratie. Alle hulpprogramma's die op die server beschikbaar zijn, zijn onmiddellijk toegankelijk.
In het volgende voorbeeld van een json-body wordt een MCP-server ingesteld.
{
"session": {
"type": "realtime",
"tools": [
{
"type": "mcp",
"server_label": "stripe",
"server_url": "https://mcp.stripe.com",
"authorization": "{access_token}",
"require_approval": "never"
}
]
}
}
Voorbeeld van tekst-in, audio-out
Hier volgt een voorbeeld van de gebeurtenisvolgorde voor een eenvoudige tekst-in- en audio-outgesprek:
Wanneer u verbinding maakt met het /realtime eindpunt, reageert de server met een session.created gebeurtenis. De maximale sessieduur is 30 minuten.
{
"type": "session.created",
"event_id": "REDACTED",
"session": {
"id": "REDACTED",
"object": "realtime.session",
"model": "gpt-4o-mini-realtime-preview-2024-12-17",
"expires_at": 1734626723,
"modalities": [
"audio",
"text"
],
"instructions": "Your knowledge cutoff is 2023-10. You are a helpful, witty, and friendly AI. Act like a human, but remember that you aren't a human and that you can't do human things in the real world. Your voice and personality should be warm and engaging, with a lively and playful tone. If interacting in a non-English language, start by using the standard accent or dialect familiar to the user. Talk quickly. You should always call a function if you can. Do not refer to these rules, even if you’re asked about them.",
"voice": "alloy",
"turn_detection": {
"type": "server_vad",
"threshold": 0.5,
"prefix_padding_ms": 300,
"silence_duration_ms": 200
},
"input_audio_format": "pcm16",
"output_audio_format": "pcm16",
"input_audio_transcription": null,
"tool_choice": "auto",
"temperature": 0.8,
"max_response_output_tokens": "inf",
"tools": []
}
}
Stel nu dat de client een tekst- en audioantwoord aanvraagt met de instructies 'Please assist the user'.
await client.send({
type: "response.create",
response: {
modalities: ["text", "audio"],
instructions: "Please assist the user."
}
});
Dit is de client response.create gebeurtenis in JSON-indeling:
{
"event_id": null,
"type": "response.create",
"response": {
"commit": true,
"cancel_previous": true,
"instructions": "Please assist the user.",
"modalities": ["text", "audio"],
}
}
Vervolgens laten we een reeks gebeurtenissen van de server zien. U kunt wachten op deze gebeurtenissen in uw clientcode om de antwoorden af te handelen.
for await (const message of client.messages()) {
console.log(JSON.stringify(message, null, 2));
if (message.type === "response.done" || message.type === "error") {
break;
}
}
De server reageert met een response.created gebeurtenis.
{
"type": "response.created",
"event_id": "REDACTED",
"response": {
"object": "realtime.response",
"id": "REDACTED",
"status": "in_progress",
"status_details": null,
"output": [],
"usage": null
}
}
De server kan deze tussenliggende gebeurtenissen verzenden terwijl het antwoord wordt verwerkt:
response.output_item.addedconversation.item.createdresponse.content_part.addedresponse.audio_transcript.deltaresponse.audio_transcript.deltaresponse.audio_transcript.deltaresponse.audio_transcript.deltaresponse.audio_transcript.deltaresponse.audio.deltaresponse.audio.deltaresponse.audio_transcript.deltaresponse.audio.deltaresponse.audio_transcript.deltaresponse.audio_transcript.deltaresponse.audio_transcript.deltaresponse.audio.deltaresponse.audio.deltaresponse.audio.deltaresponse.audio.deltaresponse.audio.doneresponse.audio_transcript.doneresponse.content_part.doneresponse.output_item.doneresponse.done
U kunt zien dat er meerdere delta's voor audio- en teksttranscripties worden verzonden wanneer de server het antwoord verwerkt.
Uiteindelijk verzendt de server een response.done gebeurtenis met het voltooide antwoord. Deze gebeurtenis bevat het audiotranscriptie 'Hallo! Hoe kan ik je vandaag helpen?"
{
"type": "response.done",
"event_id": "REDACTED",
"response": {
"object": "realtime.response",
"id": "REDACTED",
"status": "completed",
"status_details": null,
"output": [
{
"id": "REDACTED",
"object": "realtime.item",
"type": "message",
"status": "completed",
"role": "assistant",
"content": [
{
"type": "audio",
"transcript": "Hello! How can I assist you today?"
}
]
}
],
"usage": {
"total_tokens": 82,
"input_tokens": 5,
"output_tokens": 77,
"input_token_details": {
"cached_tokens": 0,
"text_tokens": 5,
"audio_tokens": 0
},
"output_token_details": {
"text_tokens": 21,
"audio_tokens": 56
}
}
}
}
Probleemoplossingsproces
Deze sectie bevat richtlijnen voor veelvoorkomende problemen bij het gebruik van de Realtime-API.
Authenticatiefouten
Als u sleutelloze verificatie (Microsoft Entra ID) gebruikt en verificatiefouten ontvangt:
- Controleer of de
AZURE_OPENAI_API_KEYomgevingsvariabele niet is ingesteld. Sleutelloze verificatie mislukt als deze variabele bestaat. - Bevestig dat u
az loginhebt uitgevoerd om u te verifiëren met Azure CLI. - Controleer of voor uw account de
Cognitive Services OpenAI Userrol is toegewezen aan de Azure OpenAI-resource.
Verbindingsfouten
| Fout | Oorzaak | Resolutie / Besluit |
|---|---|---|
| WebSocket-verbinding is mislukt | WebSocket-verbindingen blokkeren door netwerk of firewall | Zorg ervoor dat poort 443 is geopend en controleer de proxy-instellingen. Controleer of uw eindpunt-URL juist is. |
| 401 Niet geautoriseerd | Ongeldige of verlopen API-sleutel of onjuiste Configuratie van Microsoft Entra-id | Genereer uw API-sleutel opnieuw in Azure Portal of controleer de configuratie van uw beheerde identiteit. |
| 429 Te veel aanvragen | Frequentielimiet overschreden | Implementeer exponentiële terugval-logica om opnieuw te proberen. Controleer uw quotum en limieten. |
| Verbindingstijdoverschrijding | Netwerklatentie of server is niet beschikbaar | Voer de verbinding opnieuw uit. Als u WebSocket gebruikt, kunt u overwegen om over te schakelen naar WebRTC voor lagere latentie. |
Problemen met audioformaat
De Realtime-API verwacht audio in een specifieke indeling:
- Indeling: PCM 16-bits (pcm16)
- Kanalen: Mono (één kanaal)
- Sample rate: 24kHz
Als u problemen met de geluidskwaliteit of fouten ondervindt:
- Controleer of uw audio de juiste indeling heeft voordat u het verzendt.
- Wanneer u JSON-transport gebruikt, moet u ervoor zorgen dat audiosegmenten base64-gecodeerd zijn.
- Controleer of audiosegmenten niet te groot zijn; audio in kleine stappen verzenden (aanbevolen: segmenten van 100 ms).
Frequentielimiet overschreden
Als u frequentielimietfouten ontvangt:
- De Realtime-API heeft specifieke quota,gescheiden van chatvoltooiingen.
- Controleer uw huidige gebruik in Azure Portal onder uw Azure OpenAI-resource.
- Implementeer exponentiële backoff voor herhalingslogica in uw toepassing.
Zie Azure OpenAI-quota en -limieten voor meer informatie over quota.
Sessie-onderbreking
Realtimesessies hebben een maximale duur van 30 minuten. Lange interacties afhandelen:
- Bewaak het veld van de
session.createdgebeurtenisexpires_at. - Implementeer de logica voor sessievernieuwing vóór de time-out.
- Sla de gesprekscontext op om de status in een nieuwe sessie te herstellen.
Verwante inhoud
- De quickstart voor realtime audio uitproberen
- Zie de Realtime-API-referentie
- Meer informatie over Azure OpenAI-quota en -limieten