Dela via


GPT Realtime API för tal och ljud

Azure OpenAI GPT Realtime API för tal och ljud är en del av GPT-4o-modellfamiljen som stöder konversationsinteraktioner med låg svarstid, "tal in, tal ut".

Du kan använda Realtids-API:et via WebRTC eller WebSocket för att skicka ljudindata till modellen och ta emot ljudsvar i realtid.

Följ anvisningarna i den här artikeln för att komma igång med Realtids-API:et via WebSockets. Använd Realtids-API:et via WebSockets i server-till-server-scenarier där låg svarstid inte är ett krav.

Tips/Råd

I de flesta fall rekommenderar vi att du använder Realtids-API:et via WebRTC för ljudströmning i realtid i program på klientsidan, till exempel en webbapp eller mobilapp. WebRTC är utformat för låg latens, realtidsljudströmning och är det bästa valet för de flesta användningsfall.

Modeller som stöds

GPT-realtidsmodellerna är tillgängliga för globala distributioner.

  • gpt-4o-realtime-preview (version 2024-12-17)
  • gpt-4o-mini-realtime-preview (version 2024-12-17)
  • gpt-realtime (version 2025-08-28)
  • gpt-realtime-mini (version 2025-10-06)

Mer information finns i dokumentationen om modeller och versioner.

API-stöd

Stöd för REALTIDS-API:et lades först till i API-versionen 2024-10-01-preview (har dragits tillbaka). Använd version 2025-08-28 för att få åtkomst till de senaste funktionerna i Realtids-API:et. Vi rekommenderar att du väljer den allmänt tillgängliga API-versionen (utan suffixet "-preview") när det är möjligt.

Distribuera en modell för realtidsljud

Så här distribuerar gpt-realtime du modellen i Azure AI Foundry-portalen:

  1. Gå till Azure AI Foundry-portalen och skapa eller välj ditt projekt.
  2. Välj Modeller + slutpunkter under Mina tillgångar i den vänstra rutan.
  3. Välj + Distribuera modell>Distribuera basmodell för att öppna distributionsfönstret.
  4. Sök efter och välj gpt-realtime modellen och välj sedan Bekräfta.
  5. Granska distributionsinformationen och välj Distribuera.
  6. Följ guiden för att slutföra distributionen av modellen.

Nu när du har en distribution av modellen kan du interagera med den gpt-realtime i Azure AI Foundry portalens Audio-lekplats eller i realtids-API:t.

Använda GPT-realtidsljudet

Om du vill chatta med din distribuerade gpt-realtime modell i Azure AI Foundrysrealtidsljudlekplats följer du dessa steg:

  1. Gå till Azure AI Foundry-portalen och välj ditt projekt som har din distribuerade gpt-realtime modell.

  2. Välj Lekplatser i den vänstra rutan.

  3. Välj Ljudlekplats>Prova ljudlekplatsen.

    Anmärkning

    Chattlekplatsen stödjer inte gpt-realtime modellen. Använd ljudlekplatsen enligt beskrivningen i det här avsnittet.

  4. Välj din distribuerade gpt-realtime modell i listrutan Distribution .

  5. Du kan också redigera innehållet i textrutan Ge modellinstruktioner och kontext . Ge modellinstruktionerna om hur den ska bete sig och vilken kontext den ska referera till när du genererar ett svar. Du kan beskriva assistentens personlighet, berätta vad den ska och inte ska svara på och tala om för den hur svar ska formateras.

  6. Du kan också ändra inställningar som tröskelvärde, prefixutfyllnad och varaktighet för tystnad.

  7. Välj Börja lyssna för att starta sessionen. Du kan tala i mikrofonen för att starta en chatt.

  8. Du kan avbryta chatten när som helst genom att tala. Du kan avsluta chatten genom att välja knappen Sluta lyssna .

Förutsättningar

Krav för Microsoft Entra-ID

För den rekommenderade nyckellösa autentiseringen med Microsoft Entra-ID måste du:

  • Installera Azure CLI som används för nyckellös autentisering med Microsoft Entra-ID.
  • Cognitive Services User Tilldela rollen till ditt användarkonto. Du kan tilldela roller i Azure-portalen under Åtkomstkontroll (IAM)>Lägg till rolltilldelning.

Distribuera en modell för realtidsljud

Så här distribuerar gpt-realtime du modellen i Azure AI Foundry-portalen:

  1. Gå till Azure AI Foundry-portalen och skapa eller välj ditt projekt.
  2. Välj Modeller + slutpunkter under Mina tillgångar i den vänstra rutan.
  3. Välj + Distribuera modell>Distribuera basmodell för att öppna distributionsfönstret.
  4. Sök efter och välj gpt-realtime modellen och välj sedan Bekräfta.
  5. Granska distributionsinformationen och välj Distribuera.
  6. Följ guiden för att slutföra distributionen av modellen.

Nu när du har en distribution av modellen kan du interagera med den gpt-realtime i Azure AI Foundry portalens Audio-lekplats eller i realtids-API:t.

Ställ in

  1. Skapa en ny mapp realtime-audio-quickstart-js och gå till snabbstartsmappen med följande kommando:

    mkdir realtime-audio-quickstart-js && cd realtime-audio-quickstart-js
    
  2. Skapa package.json med följande kommando:

    npm init -y
    
  3. type Uppdatera till module i package.json med följande kommando:

    npm pkg set type=module
    
  4. Installera OpenAI-klientbiblioteket för JavaScript med:

    npm install openai
    
  5. Installera de beroende paket som används av OpenAI-klientbiblioteket för JavaScript med:

    npm install ws
    
  6. För den rekommenderade nyckellösa autentiseringen med Microsoft Entra-ID installerar du @azure/identity paketet med:

    npm install @azure/identity
    

Hämta resursinformation

Du måste hämta följande information för att autentisera ditt program med din Azure OpenAI-resurs:

Variabelnamn Värde
AZURE_OPENAI_ENDPOINT Det här värdet finns i avsnittet Nycklar och slutpunkter när du undersöker din resurs från Azure-portalen.
AZURE_OPENAI_DEPLOYMENT_NAME Det här värdet motsvarar det anpassade namn som du valde för distributionen när du distribuerade en modell. Det här värdet finns underResurshanteringsmodelldistributioner> i Azure-portalen.

Läs mer om nyckellös autentisering och inställning av miljövariabler.

Försiktighet

Om du vill använda den rekommenderade nyckellösa autentiseringen med SDK:t kontrollerar du att AZURE_OPENAI_API_KEY miljövariabeln inte har angetts.

Text i ljudutgång

  1. index.js Skapa filen med följande kod:

    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 Azure AI 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 Azure AI 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
    };
    
  2. Logga in på Azure med följande kommando:

    az login
    
  3. Kör JavaScript-filen.

    node index.js
    

Vänta en stund för att få svaret.

Utgång

Skriptet hämtar ett svar från modellen och skriver ut avskriften och mottagna ljuddata.

Utdata ser ut ungefär så här:

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.

Förutsättningar

Krav för Microsoft Entra-ID

För den rekommenderade nyckellösa autentiseringen med Microsoft Entra-ID måste du:

  • Installera Azure CLI som används för nyckellös autentisering med Microsoft Entra-ID.
  • Cognitive Services User Tilldela rollen till ditt användarkonto. Du kan tilldela roller i Azure-portalen under Åtkomstkontroll (IAM)>Lägg till rolltilldelning.

Distribuera en modell för realtidsljud

Så här distribuerar gpt-realtime du modellen i Azure AI Foundry-portalen:

  1. Gå till Azure AI Foundry-portalen och skapa eller välj ditt projekt.
  2. Välj Modeller + slutpunkter under Mina tillgångar i den vänstra rutan.
  3. Välj + Distribuera modell>Distribuera basmodell för att öppna distributionsfönstret.
  4. Sök efter och välj gpt-realtime modellen och välj sedan Bekräfta.
  5. Granska distributionsinformationen och välj Distribuera.
  6. Följ guiden för att slutföra distributionen av modellen.

Nu när du har en distribution av modellen kan du interagera med den gpt-realtime i Azure AI Foundry portalens Audio-lekplats eller i realtids-API:t.

Ställ in

  1. Skapa en ny mapp realtime-audio-quickstart-py och gå till snabbstartsmappen med följande kommando:

    mkdir realtime-audio-quickstart-py && cd realtime-audio-quickstart-py
    
  2. Skapa en virtuell miljö. Om du redan har Python 3.10 eller senare installerat kan du skapa en virtuell miljö med hjälp av följande kommandon:

    py -3 -m venv .venv
    .venv\scripts\activate
    

    När du aktiverar Python-miljön innebär det att när du kör python eller pip från kommandoraden använder du sedan Python-tolken .venv som finns i mappen för ditt program. Du kan använda deactivate kommandot för att avsluta den virtuella python-miljön och senare återaktivera den när det behövs.

    Tips/Råd

    Vi rekommenderar att du skapar och aktiverar en ny Python-miljö som ska användas för att installera de paket som du behöver för den här självstudien. Installera inte paket i din globala Python-installation. Du bör alltid använda en virtuell miljö eller conda-miljö när du installerar Python-paket, annars kan du avbryta den globala installationen av Python.

  3. Installera OpenAI Python-klientbiblioteket med:

    pip install openai[realtime]
    

    Anmärkning

    Det här biblioteket underhålls av OpenAI. Se versionshistoriken för att spåra de senaste uppdateringarna i biblioteket.

  4. För den rekommenderade nyckellösa autentiseringen med Microsoft Entra-ID installerar du azure-identity paketet med:

    pip install azure-identity
    

Hämta resursinformation

Du måste hämta följande information för att autentisera ditt program med din Azure OpenAI-resurs:

Variabelnamn Värde
AZURE_OPENAI_ENDPOINT Det här värdet finns i avsnittet Nycklar och slutpunkter när du undersöker din resurs från Azure-portalen.
AZURE_OPENAI_DEPLOYMENT_NAME Det här värdet motsvarar det anpassade namn som du valde för distributionen när du distribuerade en modell. Det här värdet finns underResurshanteringsmodelldistributioner> i Azure-portalen.

Läs mer om nyckellös autentisering och inställning av miljövariabler.

Försiktighet

Om du vill använda den rekommenderade nyckellösa autentiseringen med SDK:t kontrollerar du att AZURE_OPENAI_API_KEY miljövariabeln inte har angetts.

Text i ljudutgång

  1. text-in-audio-out.py Skapa filen med följande kod:

    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 Azure AI 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 Azure AI 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={
                "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_responese": 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 == "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 == "response.done":
                        break
    
        print("Conversation ended.")
        credential.close()
    
    asyncio.run(main())
    
  2. Logga in på Azure med följande kommando:

    az login
    
  3. Kör Python-filen.

    python text-in-audio-out.py
    
  4. När du uppmanas att mata in något, skriv ett meddelande och tryck på Retur för att skicka det till modellen. Ange "q" för att avsluta konversationen.

Vänta en stund för att få svaret.

Utgång

Skriptet hämtar ett svar från modellen och skriver ut avskriften och mottagna ljuddata.

Utdata ser ut ungefär så här:

Enter a message: How are you today?
Received text delta: I
Received text delta: ’m
Received text delta:  feeling
Received text delta:  fantastic
Received text delta: ,
Received 4800 bytes of audio data.
Received 7200 bytes of audio data.
Received 12000 bytes of audio data.
Received text delta:  thanks
Received 12000 bytes of audio data.
Received 12000 bytes of audio data.
Received text delta:  for
Received text delta:  asking
Received text delta: !
Received 12000 bytes of audio data.
Received 12000 bytes of audio data.
Received 12000 bytes of audio data.
Received text delta:  It
Received text delta: ’s
Received text delta:  a
Received text delta:  great
Received text delta:  day
Received text delta:  to
Received text delta:  chat
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 text delta:  and
Received text delta:  I
Received text delta: ’m
Received text delta:  energized
Received text delta:  and
Received text delta:  ready
Received text delta:  to
Received text delta:  help
Received text delta:  you
Received text delta:  out
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 text delta:  How
Received text delta:  about
Received text delta:  you
Received text delta: ?
Received text delta:  How
Received text delta: ’s
Received text delta:  your
Received text delta:  day
Received text delta:  going
Received text delta:  so
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 text delta:  far
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 24000 bytes of audio data.
Enter a message: q
Stopping the conversation.
Conversation ended.

Förutsättningar

Krav för Microsoft Entra-ID

För den rekommenderade nyckellösa autentiseringen med Microsoft Entra-ID måste du:

  • Installera Azure CLI som används för nyckellös autentisering med Microsoft Entra-ID.
  • Cognitive Services User Tilldela rollen till ditt användarkonto. Du kan tilldela roller i Azure-portalen under Åtkomstkontroll (IAM)>Lägg till rolltilldelning.

Distribuera en modell för realtidsljud

Så här distribuerar gpt-realtime du modellen i Azure AI Foundry-portalen:

  1. Gå till Azure AI Foundry-portalen och skapa eller välj ditt projekt.
  2. Välj Modeller + slutpunkter under Mina tillgångar i den vänstra rutan.
  3. Välj + Distribuera modell>Distribuera basmodell för att öppna distributionsfönstret.
  4. Sök efter och välj gpt-realtime modellen och välj sedan Bekräfta.
  5. Granska distributionsinformationen och välj Distribuera.
  6. Följ guiden för att slutföra distributionen av modellen.

Nu när du har en distribution av modellen kan du interagera med den gpt-realtime i Azure AI Foundry portalens Audio-lekplats eller i realtids-API:t.

Ställ in

  1. Skapa en ny mapp realtime-audio-quickstart-ts och gå till snabbstartsmappen med följande kommando:

    mkdir realtime-audio-quickstart-ts && cd realtime-audio-quickstart-ts
    
  2. Skapa package.json med följande kommando:

    npm init -y
    
  3. package.json Uppdatera till ECMAScript med följande kommando:

    npm pkg set type=module
    
  4. Installera OpenAI-klientbiblioteket för JavaScript med:

    npm install openai
    
  5. Installera de beroende paket som används av OpenAI-klientbiblioteket för JavaScript med:

    npm install ws
    
  6. För den rekommenderade nyckellösa autentiseringen med Microsoft Entra-ID installerar du @azure/identity paketet med:

    npm install @azure/identity
    

Hämta resursinformation

Du måste hämta följande information för att autentisera ditt program med din Azure OpenAI-resurs:

Variabelnamn Värde
AZURE_OPENAI_ENDPOINT Det här värdet finns i avsnittet Nycklar och slutpunkter när du undersöker din resurs från Azure-portalen.
AZURE_OPENAI_DEPLOYMENT_NAME Det här värdet motsvarar det anpassade namn som du valde för distributionen när du distribuerade en modell. Det här värdet finns underResurshanteringsmodelldistributioner> i Azure-portalen.

Läs mer om nyckellös autentisering och inställning av miljövariabler.

Försiktighet

Om du vill använda den rekommenderade nyckellösa autentiseringen med SDK:t kontrollerar du att AZURE_OPENAI_API_KEY miljövariabeln inte har angetts.

Text i ljudutgång

  1. index.ts Skapa filen med följande kod:

    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 Azure AI 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 Azure AI 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 };    
    
  2. tsconfig.json Skapa filen för att transpilera TypeScript-koden och kopiera följande kod för 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"]
    }
    
  3. Installera typdefinitioner för Node

    npm i --save-dev @types/node
    
  4. Transpilera från TypeScript till JavaScript.

    tsc
    
  5. Logga in på Azure med följande kommando:

    az login
    
  6. Kör koden med följande kommando:

    node index.js
    

Vänta en stund för att få svaret.

Utgång

Skriptet hämtar ett svar från modellen och skriver ut avskriften och mottagna ljuddata.

Utdata ser ut ungefär så här:

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.