实时多模态 AI 的开源堆栈
想要跟上人工智能领域发生的一切似乎是不可能完成的任务。每周似乎都有新的突破。尽管我们不会在2024年拥有AGI(通用人工智能),但思考当我们拥有它时世界会是什么样子是很有趣的。
特别是,LiveKit团队一直在探索我们将如何与AGI
我们使用眼睛、耳朵和嘴巴;AGI将使用摄像头、麦克风和扬声器。
人类互动是多模态和实时的。人类与AGI的互动也将如此。
虽然像Samantha或J.A.R.V.I.S.这样的LMM(大型多模态模型)还有一段距离,但构建实时多模态AI“代理”的核心组件已经就位。大多数LLM(大型语言模型)以文本作为输入并生成文本作为输出,但有些AI模型是专门用于将其他模态转换为文本,或实时从文本合成音频/视频的。
例如,现在可以在几百毫秒内完成语音转录和合成
难以置信 🤯
— Linus (●ᴗ●) (@LinusEkenstam) 2023年12月8日
这是Deepgram,我原以为实时AI对话至少需要6-12个月才能实现。我错了。
这个演示中的TTS(文本转语音)是100%真实的。AI代理即将变得非常真实。 pic.twitter.com/zWfEE7xSEJ
📸 一个由AI驱动的照相亭
— jordan singer (@jsngr) 2023年12月16日
通过实时潜在一致性模型,这是一种新型的相机应用:pic.twitter.com/KyYRANaRVl
与LLM类似,这些处理或合成语音和视频的模型在数据中心的GPU上运行。但用户的摄像头、麦克风、屏幕和扬声器都在他们的设备上,位于世界某个地方。为了创建与AI进行类似人类的对话,我们需要尽快在服务器和客户端之间传输数据。
一个想法是尝试使用WebSocket。WebSocket使用TCP,非常适合低数据速率传输,但将其用于通过公共互联网流式传输音频或视频存在问题。这是因为大多数数据包丢失发生在客户端和ISP之间,当发生数据包丢失时,HOL阻塞会增加延迟或导致音频/视频播放卡顿和延迟。

另一方面,WebRTC专为超低延迟媒体传输而设计,是(间接)访问Web浏览器中UDP套接字的唯一广泛支持的方法。然而,原始WebRTC很复杂,其p2p架构具有固有的扩展限制,并且需要您实现自己的跨平台信令协议。
LiveKit的开源服务器和SDK为您解决了所有这些问题,但还有一个问题:WebRTC在服务器上不能原生工作,而AI代理需要与客户端进行实时通信。
介绍 LiveKit Agents
今天,我们很高兴地推出LiveKit开源堆栈的新成员:Agents。
Agents是一系列API、服务和工具的集合,可轻松构建实时、多模态AI应用程序。该框架由几个不同的部分组成
后端SDK
用于构建可编程LiveKit参与者的核心后端库,包括Python、Rust和Node(开发中)。每个SDK都建立在一个共同的Rust核心之上,并提供了方便的钩子来处理传入的媒体流,并自动管理诸如缓冲传出音频或视频之类的棘手部分。
from livekit import rtc
import asyncio
async def main():
room = rtc.Room()
async def receive_frames(stream: rtc.VideoStream):
async for frame in stream:
# received a video frame!
pass
@room.on("track_subscribed")
def on_track_subscribed(
track: rtc.Track,
publication: rtc.RemoteTrackPublication,
participant: rtc.RemoteParticipant,
):
if track.kind == rtc.TrackKind.KIND_VIDEO:
video_stream = rtc.VideoStream(track)
asyncio.create_task(receive_frames(video_stream))
await room.connect(URL, TOKEN)连接到LiveKit会话并处理已发布的视频轨道中的帧
插件
为了构建KITT,我们最初将VAD(语音活动检测)、Google的语音转文本(STT)和文本转语音(TTS)以及用于推理的GPT-3.5 Turbo粘合在一起。我们花费了大量时间来串联API并优化端到端管道,以实现低延迟。
在框架中,我们包含了一组预构建的插件,使构建像KITT这样的代理变得更加简单。Agents附带了第三方集成,例如DeepGram、Whisper、ElevenLabs、Fal和Open AI。随着时间的推移,我们计划扩大插件的数量和种类,并欢迎社区贡献。我们还包含了一些有用的工具,例如VAD插件,用于检测用户何时说话(或不说话),以及一个句子分割器,用于将大段文本分词以通过TTS流式传输。
import asyncio
from livekit import rtc
from livekit.plugins import deepgram
async def recognize_task(stream: deepgram.SpeechStream):
async for event in stream:
if event.is_final:
final_speech = event.alternatives[0].text
async def process_track(track: rtc.AudioTrack):
stt = deepgram.STT(model="nova-2-general")
audio_stream = rtc.AudioStream(track)
stt_stream = stt.stream()
asyncio.create_task(recognize_task(stt_stream))
async for audio_frame in audio_stream:
stt_stream.push_frame(audio_frame)使用DeepGram处理流式语音并将其转换为文本
游乐场
为了快速原型设计和测试您的多模态代理,我们构建了Agents Playground。这是一个客户端应用程序,预先连接用于将语音、视频或文本流式传输到您的代理并接收流回。它还包括切换输入设备和通过电话拨入会话的功能。我们为游乐场规划了许多令人兴奋的功能,敬请期待!
编排
一旦您构建并测试了您的代理以及与之交互的客户端界面,下一步就是投入生产。然而,部署和扩展代理与典型的网站不同。代理执行有状态的工作,并且必须在整个对话期间保留该状态。这些对话的长度可能相差很大;有些可能持续几秒钟,而有些则持续数小时。如果您使用传统的HTTP负载均衡器,会话长度的变化会导致Web服务器之间的负载不均。在部署新版本时重新启动实时代理也很棘手,因为您不希望中断代理和用户之间的活动对话。
代理类似于后台工作程序,它们从共享队列中处理作业(即对话)。然而,不同之处在于代理是
事实证明,我们已经在LiveKit构建了一个用于长时间运行的前台作业的编排系统:用于云出口的系统。该系统现在管理着数千个并发的录制和多流工作负载。我们了解到,在扩展这些类型的作业时,重要的是不要过度利用底层机器实例。处理中的任何延迟都可能导致录制中的音频或视频断断续续,或者在代理的情况下,直接流式传输给用户。
借鉴我们云出口编排器的想法,我们构建了一个新的(开源)通用系统,使您的多模态代理投入生产成为一个交钥匙过程。

当您的程序向LiveKit服务器实例注册时,我们会通知它何时有新的“作业”到来(即创建了一个新房间)。如果您的程序接受此作业,将创建您的代理实例并加入房间。Agents框架会自动监控代理连接性并在您的代理池中进行负载均衡。
from livekit import agents
async def my_agent(job: agents.JobContext):
# my agent logic
pass
if __name__ == "__main__":
async def job_handler(job_request: agents.JobRequest):
await job_request.accept(my_agent)
worker = agents.Worker(job_handler)
agents.run_app(worker)向LiveKit的工作程序服务注册代理以进行代理编排
您在本地使用本地LiveKit服务器开发的相同代理,无需更改一行代码即可使用LiveKit Cloud部署并扩展到数千台服务器。我们的目标是使有状态代理的扩展像Web服务器一样容易。
像我们的其他产品和服务一样,Agents框架基于真实的用例以及我们与已经在构建多模态AI应用程序的开发人员所做的工作。
一个团队在美国各地的911调度中心部署了一个代理。它通过从语音中提取上下文来协助人类调度员,并检测流式视频中的枪支和车牌。另一个团队正在构建一个AI体育分析师,它可以观看现场比赛,跟踪并显示球员得分和统计数据,并可以即时生成剪辑或重播。
一位在世界各地拥有呼叫中心的开发人员正在从头开始重建他们的软件堆栈以使用AI。最终用户可以使用LiveKit SIP呼入,支持请求被路由到下一个可用的AI代理。如果通话升级到人类主管,代理将把他们带入会话中,并耐心听取并从随后的对话中学习。
我刚和一位正在为孩子们构建AI驱动玩具的创始人交谈。另一位正在为角色扮演游戏中的LLM驱动NPC构建平台。甚至WebRTC的创建者Justin Uberti也使用LiveKit Agents构建了一个微型网站,用于与圣诞老人和他的朋友们进行有趣的、节日主题的对话。
连接其中几个应用程序的一个共同点是使用语音或视频作为
然而,我们相信未来AI将成为
我们很高兴您尝试LiveKit Agents,并支持您构建软件2.0。您提供的任何反馈都将对我们在此开发者预览阶段进行改进至关重要。您可以通过hello@livekit.io或LiveKit社区Slack联系我们。祝您编码愉快!
🤖