Gerçek Zamanlı Çok Modlu API'ler

Anlam Çekirdeği için ilk gerçek zamanlı API tümleştirmesi eklendi, şu anda yalnızca Python'da kullanılabilir ve deneysel olarak kabul edilir. Bu, temel hizmetlerin hala geliştirilmekte ve değişikliklere tabi olmasından kaynaklanmaktadır. Müşterilerden bunun nasıl kullanılacağına dair geri bildirim aldıkça ve bu tür model ve API'lerin diğer sağlayıcılarını ekledikçe, Anlam Çekirdeği'ndeki API'de büyük değişiklikler yapmamız gerekebilir.

Gerçek Zamanlı İstemci Soyutlaması

Farklı satıcılardan farklı gerçek zamanlı API'leri desteklemek için, farklı protokoller kullanılarak çekirdekte yeni bir istemci soyutlaması eklenmiştir. Bu istemci, gerçek zamanlı hizmete bağlanmak ve ileti gönderip almak için kullanılır. İstemci, hizmet bağlantısını işlemek, ileti göndermek ve iletileri almaktan sorumludur. İstemci ayrıca bağlantı veya ileti gönderme/alma işlemi sırasında oluşan hataların işlenmesinden de sorumludur. Bu modellerin çalışma şekli göz önünde bulundurularak, normal sohbet tamamlanmalarından ziyade daha çok aracılar olarak kabul edilebilirler, bu nedenle sistem mesajı yerine yönergeler alırlar, kendi iç durumlarını korurlar ve bizim adımıza çalışmak üzere çağrılabilirler.

Gerçek zamanlı API

Herhangi bir gerçek zamanlı istemci aşağıdaki yöntemleri uygular:

Yöntem Açıklama
create_session Yeni oturum oluşturur
update_session Mevcut oturumu güncelleştirir
delete_session Mevcut oturumu siler
receive Bu, hizmetten gelen iletileri dinleyen ve geldikçe bunları üreten eşzamanlı olmayan bir oluşturucu yöntemidir.
send Hizmete ileti gönderir

Python uygulamaları

Anlam Çekirdeği'nin python sürümü şu anda aşağıdaki gerçek zamanlı istemcileri destekler:

Müşteri Protokol Yöntemler İşlev çağrısı etkin Açıklama
OpenAI Web soketi Metin & Ses Evet OpenAI Gerçek Zamanlı API, iletileri gerçek zamanlı olarak gönderip almanıza olanak tanıyan websocket tabanlı bir API'dir. Bu bağlayıcı, bağlanmak ve ileti almak ve göndermek için OpenAI Python paketini kullanır.
OpenAI WebRTC Metin & Ses Evet OpenAI Gerçek Zamanlı API, gerçek zamanlı olarak ileti gönderip almanıza olanak tanıyan WebRTC tabanlı bir API'dir ve oturum oluşturma zamanında webRTC uyumlu bir ses parçasına ihtiyaç duyar.
Gök mavisi Web soketi Metin & Ses Evet Azure Realtime API'si, iletileri gerçek zamanlı olarak gönderip almanızı sağlayan websocket tabanlı bir API'dir. Bu, OpenAI websocket bağlayıcısı ile aynı paketi kullanır.
Gök mavisi WebRTC Metin & Ses Evet Azure Gerçek Zamanlı API, gerçek zamanlı olarak ileti gönderip almanıza olanak tanıyan WebRTC tabanlı bir API'dir. Bu, OpenAI WebRTC bağlayıcısı ile aynı paketi kullanır.

Başlangıç

Realtime API'sini kullanmaya başlamak için paketi yüklemeniz semantic-kernel gerekir.

pip install semantic-kernel

Sesi nasıl işlemek istediğinize bağlı olarak, pyaudio veya sounddevicegibi hoparlörler ve mikrofonlarla arabirim oluşturması için ek paketlere ihtiyacınız olabilir.

Websocket istemcileri

Daha sonra bir çekirdek oluşturabilir ve buna gerçek zamanlı istemcisini ekleyebilirsiniz. Bu, AzureRealtimeWebsocket bağlantısıyla bunun nasıl yapılacağını gösterir. AzureRealtimeWebsocket'i OpenAIRealtimeWebsocket ile daha fazla değişiklik yapmadan değiştirebilirsiniz.

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="")

Dikkat edilmesi gereken iki önemli nokta vardır, birincisi realtime_client zaman uyumsuz bir bağlam yöneticisi olmasıdır; bu, bunu zaman uyumsuz bir işlevde kullanabileceğiniz ve oturumu oluşturmak için async with kullanabileceğiniz anlamına gelir. İkincisi, receive yönteminin asenkron bir jeneratör olmasıdır; bu, gelen iletileri almak için bir for döngüsünde kullanabileceğiniz anlamına gelir.

WebRTC istemcisi

WebRTC bağlantısının kurulumu biraz daha karmaşıktır ve bu nedenle istemciyi oluştururken ek bir parametreye ihtiyacımız vardır. bu parametre, audio_trackMediaStreamTrack paketinin aiortc protokolünün uygulandığı bir nesne olması gerekir; bu, aşağıdaki bağlantılı örneklerde de gösterilmiştir.

WebRTC kullanan bir istemci oluşturmak için aşağıdakileri yaparsınız:

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="")

Bu örneklerin her ikisi de sesi RealtimeAudioEvent olarak alır ve bunu belirtilmemiş bir audio_player nesnesine geçirir.

Not: Azure OpenAI WebRTC istemcisinin ek bir parametresi vardır: region, bu, OpenAI hizmetinizin barındırıldığı Azure bölgesini ifade eder. Şu anda yalnızca eastus2 ve swedencentral desteklenmektedir.

Ses çıkışı geri çağrı

Bunun yanında audio_output_callback yönteminde ve sınıf oluşturmada receive adlı bir parametremiz vardır. Bu geri çağırma, sesin daha fazla işlenmesinden önce çağrılır ve ses verilerini numpy dizisi olarak alır. Yukarıdaki işlemin aksine, burada veriler doğrudan AudioContent'e ayrıştırılmaz ve sizin işlem yapabileceğiniz bir RealtimeAudioEvent olarak geri döndürülmez. Bu, gelen ses verileriyle yürütücüye verilen ses verileri arasında daha az ek yük olduğundan daha sorunsuz bir ses çıkışı sağladığını göstermiştir.

Bu örnekte, audio_output_callbacktanımlama ve kullanma gösterilmektedir:

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="")

Örnekler

depomuzda dört örnek vardır. Bunlar hem websockets hem de WebRTC kullanarak temel bilgileri ve işlev çağrısı dahil daha karmaşık bir kurulumu kapsar. Son olarak, Semantik Çekirdek gelişmiş gerçek zamanlı API'nizi çağırmanıza olanak sağlamak için Azure İletişim Hizmetleri kullanan daha karmaşık bir tanıtım vardır.

Çok yakında

Daha fazla bilgi yakında sunulacaktır.

Çok yakında

Daha fazla bilgi yakında sunulacaktır.