За последние пол года активно работал с голосовыми агентами и открыл для себя
pipecatчто то очень похожее на fastapi для api - очень удобный оркестратор для voice-pipelin-а
плюсом куча коннекторов и возможность кастомно докидывать любые из кубиков
общий пайплайн для voice-ассистентов обычно выглядит так:
микрофон → STT → LLM → TTS → динамик
в pipecat для этого есть удобные абстракции:
Frame - пакет данных: контент или event
FrameProcessor - блок работы с Frame
Pipeline - последовательность FrameProcessor
Transport - связь агента с браузером, мобильным клиентом/keycloak/внешними коннекторами
PipelineTask - life-cicle пайплайна
PipelineRunner - сам запуск
по коду в итоге все очень легко:
завели pipeline - основная сущность, в нем все степы:
pipeline = Pipeline(
[
transport.input(),
stt_service,
user_aggregator,
llm_service,
tts_service,
transport.output(),
assistant_aggregator,
]
)
создали из него task:
task = PipelineTask(
pipeline,
params=PipelineParams(
enable_metrics=True,
enable_usage_metrics=True,
),
)
в таск накидываем event-handlerov - on_start/on_join/on_error и тп:
@task.event_handler("on_pipeline_started")
async def on_pipeline_started(task, frame):
...
и просто запускаем все вместе:
runner = PipelineRunner(handle_sigint=handle_sigint)
await runner.run(task)
по сути главное - выбрать и реализовать(а чаще - просто подключить) step-ы Pipeline-а, продумать логику on_event и по сути все!
и это только базовое использование sdk - pipecat еще умеет в
cloud, у него есть свой VAD и еще много чего