Bagikan melalui


API Realtime Multi-modal

Integrasi API realtime pertama untuk Semantic Kernel telah ditambahkan, saat ini hanya tersedia di Python dan dianggap eksperimental. Ini karena layanan dasar masih dalam pengembangan dan dapat mengalami perubahan, sehingga kami mungkin perlu melakukan perubahan signifikan pada API di Kernel Semantik saat kami belajar dari pelanggan tentang cara penggunaannya dan saat kami menambahkan penyedia lain untuk model dan API sejenis ini.

Abstraksi Klien Waktu Nyata

Untuk mendukung API realtime yang berbeda dari vendor yang berbeda, menggunakan protokol yang berbeda, abstraksi klien baru telah ditambahkan ke kernel. Klien ini digunakan untuk terhubung ke layanan realtime dan mengirim dan menerima pesan. Klien bertanggung jawab untuk menangani koneksi ke layanan, mengirim pesan, dan menerima pesan. Klien juga bertanggung jawab untuk menangani kesalahan apa pun yang terjadi selama proses pengiriman/penerimaan koneksi atau pesan. Mengingat cara kerja model ini, mereka dapat dianggap lebih sebagai agen dibandingkan penyelesaian percakapan biasa. Oleh karena itu, mereka juga menerima instruksi, bukan pesan sistem, mereka menjaga status internal mereka sendiri dan bisa diminta untuk melakukan pekerjaan untuk kami.

Realtime API

Setiap klien realtime mengimplementasikan metode berikut:

Metode Deskripsi
create_session Membuat sesi baru
update_session Memperbarui sesi yang sudah ada
delete_session Menghapus sesi yang ada
receive Ini adalah metode generator asinkron yang mendengarkan pesan dari layanan dan menghasilkannya saat mereka tiba.
send Mengirim pesan ke layanan

Implementasi Python

Versi python dari Semantic Kernel saat ini mendukung klien realtime berikut:

Klien Protokol Modalitas Pemanggilan fungsi diaktifkan Deskripsi
OpenAI Websocket Teks & Audio Ya OpenAI Realtime API adalah api berbasis websocket yang memungkinkan Anda mengirim dan menerima pesan secara realtime, konektor ini menggunakan paket OpenAI Python untuk menyambungkan dan menerima dan mengirim pesan.
OpenAI WebRTC Teks & Audio Ya OpenAI Realtime API adalah api berbasis WebRTC yang memungkinkan Anda mengirim dan menerima pesan secara realtime, dibutuhkan trek audio yang kompatibel dengan webRTC pada waktu pembuatan sesi.
Azure Websocket Teks & Audio Ya Azure Realtime API adalah api berbasis websocket yang memungkinkan Anda mengirim dan menerima pesan secara realtime, ini menggunakan paket yang sama dengan konektor websocket OpenAI.
Azure WebRTC Teks & Audio Ya Azure Realtime API adalah api berbasis WebRTC yang memungkinkan Anda mengirim dan menerima pesan secara realtime, ini menggunakan paket yang sama dengan konektor OpenAI WebRTC.

Memulai

Untuk mulai menggunakan Realtime API, Anda perlu menginstal semantic-kernel paket.

pip install semantic-kernel

Bergantung pada cara Anda ingin menangani audio, Anda mungkin memerlukan paket tambahan untuk berinteraksi dengan speaker dan mikrofon, seperti pyaudio atau sounddevice.

Klien WebSocket

Kemudian Anda dapat membuat kernel dan menambahkan klien realtime ke dalamnya, ini menunjukkan cara melakukannya dengan koneksi AzureRealtimeWebsocket, Anda dapat mengganti AzureRealtimeWebsocket dengan OpenAIRealtimeWebsocket tanpa perubahan lebih lanjut.

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

Ada dua hal penting yang perlu diperhatikan, yang pertama adalah bahwa realtime_client adalah manajer konteks asinkron, ini berarti Anda dapat menggunakannya dalam fungsi asinkron dan menggunakan async with untuk membuat sesi. Yang kedua adalah bahwa metode receive adalah generator asinkron, ini berarti Anda dapat menggunakannya dalam perulangan 'for' untuk menerima pesan saat pesan tiba.

Klien WebRTC

Penyiapan koneksi WebRTC sedikit lebih kompleks dan jadi kami memerlukan parameter tambahan saat membuat klien. Parameter ini, audio_track perlu menjadi objek yang mengimplementasikan protokol MediaStreamTrack paket aiortc, ini juga ditunjukkan dalam sampel yang ditautkan di bawah ini.

Untuk membuat klien yang menggunakan WebRTC, Anda akan melakukan hal berikut:

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

Kedua sampel ini menerima audio sebagai RealtimeAudioEvent dan kemudian mereka meneruskan itu ke objek audio_player yang tidak ditentukan.

Catatan: Klien Azure OpenAI WebRTC memiliki parameter tambahan: region, ini mengacu pada wilayah Azure tempat layanan OpenAI Anda dihosting. Saat ini hanya eastus2 dan swedencentral didukung.

Tanggapan balik keluaran audio

Di samping ini kita memiliki parameter yang disebut audio_output_callback pada metode receive dan pada pembuatan kelas. Callback ini akan dipanggil terlebih dahulu sebelum penanganan audio lebih lanjut dan mendapatkan array numpy dari data audio, alih-alih diuraikan menjadi AudioContent dan dikembalikan sebagai RealtimeAudioEvent yang kemudian dapat Anda tangani, seperti yang dijelaskan di atas. Telah terbukti memberikan keluaran audio yang lebih halus karena ada lebih sedikit selisih antara data audio yang masuk dan yang diberikan kepada pemutar.

Contoh ini menunjukkan cara menentukan dan menggunakan 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="")

Contoh

Ada empat sampel dalam repositori kami , mereka mencakup dasar-dasar menggunakan websocket dan WebRTC, serta pengaturan yang lebih kompleks termasuk pemanggilan fungsi. Akhirnya tersedia demo yang lebih kompleks yang menggunakan Azure Communication Services untuk memungkinkan Anda memanggil API waktu nyata Kernel Semantik Anda yang ditingkatkan.

Segera datang

Informasi lebih lanjut akan segera hadir.

Segera datang

Informasi lebih lanjut akan segera hadir.