Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Замечание
Этот документ относится к порталу Microsoft Foundry (классическая модель).
🔍 Ознакомьтесь с документацией по Microsoft Foundry (новая), чтобы узнать о новом портале.
API Azure OpenAI GPT Realtime для распознавания речи и звука входит в семейство моделей GPT-4o, которое поддерживает низкой задержки, "речь в речи" взаимодействие с беседами.
Api Realtime можно использовать через WebRTC, SIP или WebSocket для отправки входных данных звука в модель и получения звуковых ответов в режиме реального времени. Следуйте инструкциям из этой статьи, чтобы приступить к работе с API Реального времени через SIP.
SIP — это протокол, используемый для звонков по телефону через Интернет. С помощью SIP и API Реального времени можно направлять входящие телефонные звонки в API.
Поддерживаемые модели
Модели GPT в режиме реального времени доступны для глобальных развертываний в регионах "Восточная часть США 2" и "Центральная Швеция".
-
gpt-4o-mini-realtime-preview(2024-12-17) -
gpt-4o-realtime-preview(2024-12-17) -
gpt-realtime(версия 2025-08-28) -
gpt-realtime-mini(версия 2025-10-06) -
gpt-realtime-mini-2025-12-15(версия 2025-12-15)
Предпосылки
Прежде чем использовать звук gPT в режиме реального времени, вам потребуется:
- Подписка Azure — создайте бесплатную учетную запись.
- Ресурс Microsoft Foundry — создание ресурса Microsoft Foundry в одном из поддерживаемых регионов.
- Развертывание модели
gpt-4o-realtime-preview,gpt-4o-mini-realtime-preview,gpt-realtime,gpt-realtime-miniилиgpt-realtime-mini-2025-12-15в поддерживаемом регионе, как указано в разделе поддерживаемые модели этой статьи.- На портале Microsoft Foundry загрузите проект. Выберите "Сборка " в правом верхнем меню, а затем перейдите на вкладку "Модели " на левой панели и разверните базовую модель. Найдите нужную модель и выберите "Развернуть " на странице модели.
- Подписка Azure — создайте бесплатную учетную запись.
- Ресурс Azure OpenAI, созданный в поддерживаемом регионе. Дополнительные сведения см. в статье "Создание ресурса" и развертывание модели с помощью Azure OpenAI.
- Развертывание модели
gpt-4o-realtime-preview,gpt-4o-mini-realtime-preview,gpt-realtime,gpt-realtime-miniилиgpt-realtime-mini-2025-12-15в поддерживаемом регионе, как указано в разделе поддерживаемые модели этой статьи. Модель можно развернуть из каталога моделей Foundry или из проекта на портале Microsoft Foundry.
Подключение к SIP
Если вы хотите подключить номер телефона к API реального времени, используйте поставщика услуг SIP-транкинга (например, Twilio). Поставщик транкинга — это услуга по преобразованию телефонного звонка в IP-трафик. После приобретения номера телефона у поставщика магистрали SIP следуйте инструкциям, приведенным здесь.
Начните с создания веб-перехватчика для входящих вызовов с помощью службы веб-перехватчика Azure OpenAI. У нас есть REST API , который позволяет создавать, обновлять, просматривать и удалять конечные точки веб-перехватчика.
Затем направьте ваш транк SIP на конечную точку Azure OpenAI SIP, используя внутренний идентификатор вашего ресурса Azure. Пример:
- Получите внутренний идентификатор ресурса Azure Open AI. Внутренний идентификатор можно найти, щелкнув на
JSON Viewвашего ресурса. - Идентификатор проекта =
"proj_<internalId>"это может выглядеть следующим образом."proj_88c4a88817034471a0ba0fcae24ceb1b"
Приглашения SIP используют этот идентификатор проекта в качестве пользователя: например, sip:proj_88c4a88817034471a0ba0fcae24ceb1b@<region>.sip.ai.azure.com;transport=tls.
В настоящее время поддерживаемые регионы — Sweden Central и East US 2.
Обработка входящих вызовов
Когда Azure OpenAI получает SIP-трафик, связанный с проектом, конечная точка веб-перехватчика получает входящее сообщение о событии. Событие, запущенное для вызовов sip, имеет тип = realtime.call.incoming как в примере, приведенном здесь.
POST https://my_website.com/webhook_endpoint
user-agent: OpenAI/1.0 (+https://platform.openai.com/docs/webhooks)
content-type: application/json
webhook-id: wh_685342e6c53c8190a1be43f081506c52 # unique ID for idempotency
webhook-timestamp: 1750287078 # timestamp of delivery attempt
webhook-signature: v1,Signature # signature to verify authenticity from OpenAI
{
"object": "event",
"id": "evt_685343a1381c819085d44c354e1b330e",
"type": "realtime.call.incoming",
"created_at": 1750287018, // Unix timestamp
"data": {
"call_id": "some_unique_id",
"sip_headers": [
{ "name": "From", "value": "sip:[email protected]" },
{ "name": "To", "value": "sip:[email protected]" },
{ "name": "Call-ID", "value": "rtc_xyz"}
]
}
}
Из вашей конечной точки веб-перехватчика можно принять, отклонить или переадресовать этот звонок, используя значение call_id из события веб-перехватчика. При принятии вызова необходимо указать необходимую конфигурацию (инструкции, голос и т. д.) для сеанса API Реального времени. После установки вы можете настроить WebSocket и отслеживать сеанс как обычно. API для принятия, отклонения, мониторинга, перенаправления и завершения вызова описаны в следующих разделах.
Примите звонок
Используйте конечную точку вызова Accept, чтобы утвердить входящий вызов и настроить сеанс в режиме реального времени, который отвечает на него. Отправьте те же параметры, которые вы отправили бы для создания секрета клиента. Вы можете включить любые значения, которые будут использоваться в сообщении session.update, но требуются тип, модель и инструкции.
Замечание
Для авторизации можно использовать заголовок api-key или маркер носителя, как показано здесь. Помните, что имя модели — это фактически имя развертывания.
curl -X POST "https://<your azure resource name>.openai.azure.com/openai/v1/realtime/calls/$CALL_ID/accept" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"type": "realtime",
"model": "gpt-realtime",
"instructions": "You are Alex, a friendly concierge for Example Corp."
}'
Путь запроса должен содержать
- call_id из webhook-события realtime.call.incoming
- Заголовок авторизации (или API-ключ)
Конечная точка возвращает код 200 ОК после вызова на этапе SIP и установки сеанса реального времени.
Отклонение вызова
Используйте конечную точку отклонения вызова, чтобы отклонить приглашение, если вы не хотите принимать входящий вызов (например, из неподдерживаемого кода страны). Для управления ответом, отправляемым оператору, укажите необязательный код состояния SIP вместе с обязательным параметром пути call_id. В примере здесь показан запрос, отправляющий 486, который указывает, что система слишком загружена, чтобы принять вызов.
curl -X POST "https://<your azure resource name>.openai.azure.com/openai/v1/realtime/calls/$CALL_ID/reject" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"status_code": 486}'
Если код состояния не указан, сервер sip отправляет клиенту код состояния 603 в рамках сообщения "Отклонить". Успешный запрос возвращает 200 OK после того, как OpenAI отправит ответ SIP.
Перенаправление вызова
Перенаправьте активный вызов с помощью конечной точки переадресации вызова. Укажите call_id и target_uri, которые следует поместить в заголовок SIP Refer-To (например, +14155550123 или sip:[email protected]).
curl -X POST "https://<your azure resource name>.openai.azure.com/openai/v1/realtime/calls/$CALL_ID/refer" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"target_uri": "tel:+14155550123"}'
OpenAI возвращает 200 ОК после ретрансляции команды REFER к вашему поставщику SIP. Система нижнего уровня обрабатывает остальную часть потока вызова для абонента.
Мониторинг событий вызова и выдачи команд сеанса и обновлений
После принятия вызова откройте подключение WebSocket к тому же сеансу для потоковой передачи событий и выдачи команд API Realtime. Чтобы создать websocket для существующего вызова, необходимо использовать параметр call_id. Аргумент модели не используется, так как он настроен как часть json при принятии вызова. В примере ниже показан распространенный сценарий, выдающий сообщение "response.create", чтобы указать системе API Realtime ответить на телефон и сказать привет".
Ниже приведен пример запроса WebSocket для конкретного вызова SIP.
GET wss://<your azure resource name>.openai.azure.com/openai/v1/realtime?call_id={call_id}
параметры запроса.
| Параметр | Тип | Description |
|---|---|---|
| call_id | струна | Идентификатор из вебхука realtime.call.incoming. |
Headers
Авторизация: Bearer $TOKEN (или API-ключ: ваш API ключ)
WebSocket ведет себя точно так же, как и любое другое подключение API Реального времени.
Вы можете отправлять сообщения, такие как "response.create" или session.update, чтобы управлять вызовом и прослушивать события сервера, возвращаемые для отслеживания хода выполнения.
В следующем фрагменте кода показано, как выполняется подключение websocket.
import WebSocket from "ws";
const callId = "rtc_u1_9c6574da8b8a41a18da9308f4ad974ce";
const ws = new WebSocket(`wss://<your azure resource name>.openai.azure.com/openai/v1/realtime?call_id=${callId}`, {
headers: {
api-key: `${process.env.OPENAI_API_KEY}`,
},
});
ws.on("open", () => {
ws.send(
JSON.stringify({
type: "response.create",
})
);
});
Завершение вызова
Завершите сеанс с конечной точкой "Закончить вызов", когда приложение должно отключить абонента. Эту конечную точку можно использовать для завершения сеансов SIP и WebRTC в режиме реального времени.
curl -X POST "https://<your azure resource name>.openai.azure.com/openai/v1/realtime/calls/$CALL_ID/hangup" \
-H "Authorization: Bearer $TOKEN"
The API responds with 200 OK when it starts tearing down the call.
Пример конечной точки вебхука
Следующий код — это пример python для обработчика realtime.call.incoming. Он принимает вызов, а затем регистрирует все события из API Реального времени.
from flask import Flask, request, Response, jsonify, make_response
from openai import OpenAI, InvalidWebhookSignatureError
import asyncio
import json
import os
import requests
import time
import threading
import websockets
app = Flask(__name__)
client = OpenAI(
webhook_secret=os.environ["OPENAI_WEBHOOK_SECRET"]
)
AUTH_HEADER = {
"api-key": os.getenv("OPENAI_API_KEY")
}
call_accept = {
"type": "realtime",
"instructions": "You are a support agent.",
"model": "gpt-realtime",
}
response_create = {
"type": "response.create",
"response": {
"instructions": (
"Say to the user 'Thank you for calling, how can I help you'"
)
},
}
async def websocket_task(call_id):
try:
async with websockets.connect(
"wss://<your azure resource>.openai.azure.com/openai/v1/realtime?call_id=" + call_id,
additional_headers=AUTH_HEADER,
) as websocket:
await websocket.send(json.dumps(response_create))
while True:
response = await websocket.recv()
print(f"Received from WebSocket: {response}")
except Exception as e:
print(f"WebSocket error: {e}")
@app.route("/", methods=["POST"])
def webhook():
try:
event = client.webhooks.unwrap(request.data, request.headers)
if event.type == "realtime.call.incoming":
requests.post(
"https://<your azure resource name>.openai.azure.com/openai/v1/realtime/calls/"
+ event.data.call_id
+ "/accept",
headers={**AUTH_HEADER, "Content-Type": "application/json"},
json=call_accept,
)
threading.Thread(
target=lambda: asyncio.run(
websocket_task(event.data.call_id)
),
daemon=True,
).start()
return Response(status=200)
except InvalidWebhookSignatureError as e:
print("Invalid signature", e)
return Response("Invalid signature", status=400)
if __name__ == "__main__":
app.run(port=8000)
Дальнейшие шаги
Теперь вы знаете, как получить звонок, подключенный через SIP. Следующий шаг — создание приложения в режиме реального времени для обслуживания ваших клиентов.