Sdílet prostřednictvím


Multimodální rozhraní API v reálném čase

Byla přidána první integrace rozhraní API v reálném čase pro sémantické jádro, která je aktuálně k dispozici pouze v Pythonu a považuje se za experimentální. Důvodem je to, že základní služby se stále vyvíjejí a podléhají změnám a možná budeme muset provést zásadní změny rozhraní API v sémantickém jádru, protože se od zákazníků dozvíme, jak to používat, a jak přidáváme další poskytovatele těchto typů modelů a rozhraní API.

Abstrakce klienta v reálném čase

Pro podporu různých rozhraní API v reálném čase od různých dodavatelů pomocí různých protokolů se do jádra přidala nová abstrakce klienta. Tento klient se používá k připojení ke službě v reálném čase a odesílání a přijímání zpráv. Klient zodpovídá za zpracování připojení ke službě, odesílání zpráv a přijímání zpráv. Klient zodpovídá také za zpracování chyb, ke kterým dochází během procesu odesílání a přijímání zpráv. Vzhledem k tomu, jak tyto modely fungují, mohou být považovány za agenty více než běžné dokončování chatu, a proto také přijmou pokyny, nikoli systémovou zprávu, zachovávají svůj vlastní vnitřní stav a mohou být vyvolány, aby fungovaly v našem zastoupení.

Rozhraní API v reálném čase

Každý klient v reálném čase implementuje následující metody:

Metoda Popis
create_session Vytvoří novou relaci.
update_session Aktualizuje již existující sezení.
delete_session Odstraní existující relaci.
receive Jedná se o asynchronní metodu generátoru, která naslouchá zprávám ze služby a poskytuje je při jejich doručení.
send Odešle zprávu na službu.

Implementace Pythonu

Verze pythonu sémantického jádra v současné době podporuje následující klienty v reálném čase:

Klient Protokol Modalit Funkce volání povolena Popis
OpenAI WebSocket Text a zvuk Ano Rozhraní API OpenAI v reálném čase je rozhraní API založené na websocketu, které umožňuje odesílat a přijímat zprávy v reálném čase. Tento konektor používá balíček OpenAI Python k připojení a přijímání a odesílání zpráv.
OpenAI WebRTC Text a zvuk Ano Rozhraní API OpenAI v reálném čase je rozhraní API založené na WebRTC, které umožňuje odesílat a přijímat zprávy v reálném čase, potřebuje při vytváření relace zvukovou stopu kompatibilní s webRTC.
Azurový WebSocket Text a Zvuk Ano Rozhraní API Azure Realtime je rozhraní API založené na websocketu, které umožňuje odesílat a přijímat zprávy v reálném čase. Používá se stejný balíček jako konektor OpenAI websocket.

Začínáme

Pokud chcete začít s rozhraním API v reálném čase, musíte nainstalovat balíček semantic-kernel s realtime navíc.

pip install semantic-kernel[realtime]

V závislosti na tom, jak chcete zpracovat zvuk, možná budete potřebovat další balíčky pro rozhraní s reproduktory a mikrofony, jako jsou pyaudio nebo sounddevice.

Klienti protokolu Websocket

Pak můžete vytvořit jádro a přidat do něj klienta v reálném čase, to ukazuje, jak to udělat s připojením AzureRealtimeWebsocket, můžete nahradit AzureRealtimeWebsocket OpenAIRealtimeWebsocket bez jakýchkoli dalších změn.

from semantic_kernel.connectors.ai.open_ai import (
    AzureRealtimeWebsocket,
    AzureRealtimeExecutionSettings,
    ListenEvents,
)
from semantic_kernel.contents import RealtimeAudioEvent, RealtimeTextEvent

# this will use environment variables to get the api key, endpoint, api version and deployment name.
realtime_client = AzureRealtimeWebsocket()
settings = AzureRealtimeExecutionSettings(voice='alloy')
async with realtime_client(settings=settings, create_response=True):
    async for event in realtime_client.receive():
        match event:
            # receiving a piece of audio (and send it to a undefined audio player)
            case RealtimeAudioEvent():
                await audio_player.add_audio(event.audio)
            # receiving a piece of audio transcript
            case RealtimeTextEvent():
                # Semantic Kernel parses the transcript to a TextContent object captured in a RealtimeTextEvent
                print(event.text.text, end="")
            case _:
                # OpenAI Specific events
                if event.service_type == ListenEvents.SESSION_UPDATED:
                    print("Session updated")
                if event.service_type == ListenEvents.RESPONSE_CREATED:
                    print("\nMosscap (transcript): ", end="")

Všimněte si dvou důležitých věcí, první je, že realtime_client je asynchronní kontextový manažer, to znamená, že ho můžete použít v asynchronní funkci a použít async with k vytvoření relace. Druhou je, že receive metoda je asynchronní generátor, to znamená, že ji můžete použít ve smyčce for k příjmu zpráv při jejich doručení.

Klient WebRTC

Nastavení připojení WebRTC je trochu složitější a proto při vytváření klienta potřebujeme další parametr. Tento parametr, audio_track musí být objekt, který implementuje protokol MediaStreamTrack balíčku aiortc, je to také demonstrováno v ukázkách, které jsou propojeny níže.

Pokud chcete vytvořit klienta, který používá WebRTC, postupujte takto:

from semantic_kernel.connectors.ai.open_ai import (
    ListenEvents,
    OpenAIRealtimeExecutionSettings,
    OpenAIRealtimeWebRTC,
)
from aiortc.mediastreams import MediaStreamTrack

class AudioRecorderWebRTC(MediaStreamTrack):
    # implement the MediaStreamTrack methods.

realtime_client = OpenAIRealtimeWebRTC(audio_track=AudioRecorderWebRTC())
# Create the settings for the session
settings = OpenAIRealtimeExecutionSettings(
    instructions="""
You are a chat bot. Your name is Mosscap and
you have one goal: figure out what people need.
Your full name, should you need to know it, is
Splendid Speckled Mosscap. You communicate
effectively, but you tend to answer with long
flowery prose.
""",
    voice="shimmer",
)
audio_player = AudioPlayer
async with realtime_client(settings=settings, create_response=True):
    async for event in realtime_client.receive():
        match event.event_type:
            # receiving a piece of audio (and send it to a undefined audio player)
            case "audio":
                await audio_player.add_audio(event.audio)
            case "text":
                # the model returns both audio and transcript of the audio, which we will print
                print(event.text.text, end="")
            case "service":
                # OpenAI Specific events
                if event.service_type == ListenEvents.SESSION_UPDATED:
                    print("Session updated")
                if event.service_type == ListenEvents.RESPONSE_CREATED:
                    print("\nMosscap (transcript): ", end="")

Oba tyto příklady přijímají zvuk jako RealtimeAudioEvent a poté ho předávají neupřesněnému objektu audio_player.

Zpětné volání zvukového výstupu

Vedle toho máme parametr s názvem audio_output_callback v metodě receive a při vytváření třídy. Toto zpětné volání bude provedeno jako první před dalším zpracováním zvuku a získá pole zvukových dat typu numpy, místo aby bylo zpracováno do formátu AudioContent a vráceno jako událost typu RealtimeAudioEvent, kterou můžete následně zpracovat, což se stane výše. Ukázalo se, že poskytuje plynulejší zvukový výstup, protože je mezi příchozími zvukovými daty a jejich předání přehrávači méně systémové zátěže.

Tento příklad ukazuje, jak definovat a používat audio_output_callback:

from semantic_kernel.connectors.ai.open_ai import (
    ListenEvents,
    OpenAIRealtimeExecutionSettings,
    OpenAIRealtimeWebRTC,
)
from aiortc.mediastreams import MediaStreamTrack

class AudioRecorderWebRTC(MediaStreamTrack):
    # implement the MediaStreamTrack methods.

class AudioPlayer:
    async def play_audio(self, content: np.ndarray):
        # implement the audio player

realtime_client = OpenAIRealtimeWebRTC(audio_track=AudioRecorderWebRTC())
# Create the settings for the session
settings = OpenAIRealtimeExecutionSettings(
    instructions="""
You are a chat bot. Your name is Mosscap and
you have one goal: figure out what people need.
Your full name, should you need to know it, is
Splendid Speckled Mosscap. You communicate
effectively, but you tend to answer with long
flowery prose.
""",
    voice="shimmer",
)
audio_player = AudioPlayer
async with realtime_client(settings=settings, create_response=True):
    async for event in realtime_client.receive(audio_output_callback=audio_player.play_audio):
        match event.event_type:
            # no need to handle case: "audio"
            case "text":
                # the model returns both audio and transcript of the audio, which we will print
                print(event.text.text, end="")
            case "service":
                # OpenAI Specific events
                if event.service_type == ListenEvents.SESSION_UPDATED:
                    print("Session updated")
                if event.service_type == ListenEvents.RESPONSE_CREATED:
                    print("\nMosscap (transcript): ", end="")

Vzorky

V našem úložišti jsou čtyři ukázky,, pokrývají základy jak pomocí websocketů, tak webRTC, stejně jako složitější nastavení, včetně volání funkcí. Nakonec je k dispozici složitější ukázka, která používá Azure Communication Services k tomu, abyste mohli volat API pro reálný čas rozšířené sémantickým jádrem.