Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
A primeira integração de API em tempo real para Semantic Kernel foi adicionada, atualmente está disponível apenas em Python e é considerada experimental. Isso ocorre porque os serviços subjacentes ainda estão sendo desenvolvidos e estão sujeitos a alterações e talvez precisemos fazer alterações significativas na API no Kernel Semântico à medida que aprendemos com os clientes como usar isso e à medida que adicionamos outros provedores desses tipos de modelos e APIs.
Abstração do cliente em tempo real
Para suportar diferentes APIs em tempo real de diferentes fornecedores, usando protocolos diferentes, uma nova abstração de cliente foi adicionada ao kernel. Este cliente é usado para se conectar ao serviço em tempo real e enviar e receber mensagens. O cliente é responsável por lidar com a conexão com o serviço, enviar mensagens e receber mensagens. O cliente também é responsável por lidar com quaisquer erros que ocorram durante o processo de conexão ou envio / recebimento de mensagens. Considerando a forma como esses modelos funcionam, eles podem ser considerados mais como agentes do que conclusões regulares de chats; assim, também recebem instruções em vez de uma mensagem do sistema, mantêm seu próprio estado interno e podem ser invocados para trabalhar em nosso nome.
API em tempo real
Qualquer cliente em tempo real implementa os seguintes métodos:
| Método | Descrição |
|---|---|
create_session |
Cria uma nova sessão |
update_session |
Atualiza uma sessão existente |
delete_session |
Exclui uma sessão existente |
receive |
Este é um método gerador assíncrono que escuta as mensagens do serviço e as produz à medida que chegam. |
send |
Envia uma mensagem ao serviço |
Implementações Python
A versão python do Semantic Kernel atualmente suporta os seguintes clientes em tempo real:
| Cliente | Protocolo | Modalidades | Chamada de função ativada | Descrição |
|---|---|---|---|---|
| OpenAI | Websocket | Texto & Áudio | Sim | A API OpenAI Realtime é uma api baseada em websocket que permite enviar e receber mensagens em tempo real, este conector usa o pacote OpenAI Python para se conectar e receber e enviar mensagens. |
| OpenAI | WebRTC | Texto & Áudio | Sim | A OpenAI Realtime API é uma API baseada em WebRTC que permite enviar e receber mensagens em tempo real, ela precisa de uma faixa de áudio compatível com webRTC no momento da criação da sessão. |
| Azure | Websocket | Texto & Áudio | Sim | A API do Azure Realtime é uma api baseada em websocket que permite enviar e receber mensagens em tempo real, isso usa o mesmo pacote que o conector de websocket OpenAI. |
| Azure | WebRTC | Texto & Áudio | Sim | A API do Azure Realtime é uma API baseada em WebRTC que permite enviar e receber mensagens em tempo real, isso usa o mesmo pacote que o conector OpenAI WebRTC. |
Primeiros passos
Para começar a usar a API em tempo real, você precisa instalar o semantic-kernel pacote.
pip install semantic-kernel
Dependendo de como você deseja lidar com o áudio, talvez seja necessário pacotes adicionais para interagir com alto-falantes e microfones, como pyaudio ou sounddevice.
Clientes Websocket
Então você pode criar um kernel e adicionar o cliente em tempo real a ele, isso mostra como fazer isso com uma conexão AzureRealtimeWebsocket, você pode substituir AzureRealtimeWebsocket por OpenAIRealtimeWebsocket sem mais alterações.
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="")
Há duas coisas importantes a observar, a primeira é que o realtime_client é um gerenciador de contexto assíncrono, isso significa que você pode usá-lo em uma função assíncrona e usáasync with para criar a sessão.
O segundo é que o método receive é um gerador assíncrono, isso significa que você pode usá-lo em um loop for para receber mensagens à medida que elas chegam.
Cliente WebRTC
A configuração de uma conexão WebRTC é um pouco mais complexa e, portanto, precisamos de um parâmetro extra ao criar o cliente. Este parâmetro, audio_track precisa ser um objeto que implementa o protocolo MediaStreamTrack do pacote aiortc, isso também é demonstrado nos exemplos que estão vinculados abaixo.
Para criar um cliente que usa WebRTC, você deve fazer o seguinte:
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="")
Ambos os exemplos recebem o áudio como RealtimeAudioEvent e, em seguida, passam isso para um objeto audio_player não especificado.
Nota: O cliente WebRTC do Azure OpenAI tem um parâmetro extra:
region, refere-se à região do Azure onde o seu serviço OpenAI está alojado. Atualmente apenaseastus2eswedencentralsão suportados.
Chamada de retorno de saída de áudio
Ao lado disso, temos um parâmetro chamado audio_output_callback no método receive e na criação da classe. Primeiro, esta função de retorno será invocada antes de qualquer processamento adicional do áudio, recebendo um array numpy dos dados de áudio, em vez de serem analisados em AudioContent e retornados como um RealtimeAudioEvent que pode ser manipulado, conforme descrito acima. Isso mostrou dar uma saída de áudio mais suave porque há menos sobrecarga entre os dados de áudio que entram e são dados ao jogador.
Este exemplo mostra como definir e usar o 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="")
Amostras
Há quatro exemplos no nosso repositório , eles cobrem tanto os básicos usando websockets e WebRTC como uma configuração mais complexa, incluindo chamadas de funções. Finalmente, há uma demonstração mais complexa que usa Serviços de Comunicação do Azure para permitir que lhe chame sua API em tempo real aprimorada do Kernel Semântico.
Brevemente
Mais informações em breve.
Brevemente
Mais informações em breve.