From 84f61c8b71256c88da33268d55c1627f23f624c1 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Tue, 27 Aug 2024 18:39:25 +0800 Subject: [PATCH] bugfix --- rtcllm/rtc.py | 108 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 107 insertions(+), 1 deletion(-) diff --git a/rtcllm/rtc.py b/rtcllm/rtc.py index ab8b9ac..572c75f 100644 --- a/rtcllm/rtc.py +++ b/rtcllm/rtc.py @@ -1,2 +1,108 @@ -from aiortc import MediaStreamTrack, RTCPeerConnection, RTCSessionDescription +import asyncio + +from appPublic.dictObject import DictObject +from aiortc import MediaStreamTrack, RTCPeerConnection, RTCSessionDescription, RTCIceCandidate from aiortc.contrib.media import MediaBlackhole, MediaPlayer, MediaRecorder, MediaRelay + +# from websockets.asyncio.client import connect +from websockets.asyncio.client import connect +import websockets + +class RTCLLM: + def __init__(self, ws_url, iceServers): + self.ws_url = ws_url + self.iceServers = iceServers + self.peers = DictObject() + + def get_pc(self, data): + return self.peers[data['from'].id].pc + + async def run(self): + async with connect(self.ws_url) as self.ws: + self.login() + while True: + msg = await self.ws.recv() + data = DictObject(**json.loads(msg)) + f = self.handler.get(data.type) + await f(data) + self.ws.close() + + async def login(self): + await self.ws.send(json.dumps({ + 'type':'login', + 'info':{ + 'id':'rtcllm_agent', + 'name':'rtcllm_agent' + } + })) + + async def save_onlineList(self, data): + self.onlineList = data.onlineList + + async def auto_accept_call(self, data): + pc = await self.createPeerConnection(data['from']) + self.peers[data['from'].id] = DictObject(**{ + 'info':data['from'], + 'pc':pc + }) + await self.ws.send(json.dumps({'type':'callAccepted', 'to':data['from']})) + + async def response_offer(self, data): + pc = self.get_pc(data) + offer = RTCSessionDescription(data.offer) + await pc.setRemoteDescription(offer) + answer = await pc.createAnswer() + await pc.setLocalDescription(answer) + self.ws.send(json.dumps({ + 'type':'answer', + 'answer':pc.localDescription, + 'to':data['from'] + })) + @pc.on("datachannel") + def datachannel_handle(channel): + @channel.on("message") + def recvdata(channel): + pass + """ + @pc.on("connectionstatechange") + @pc.on("track") + """ + + async def accept_answer(self, data): + pc = self.get_pc(data) + answer = RTCSessionDescription(data.answer); + pc.setRemoteDescription(answer) + + async def accept_iceCandidate(self, data): + pc = self.get_pc(data) + candidate = RTCIceCandidate(data.candidate) + # pc.addIceCandidate(RTCIceCandidate.from_string(candidate)) + await pc.addIceCandidate(candidate) + + async def createPeerConnection(self, peerinfo): + opts = { + iceServers:self.iceServers + } + pc = RTCPeerConnection(opts) + + handlers = { + 'onlineList':save_onlineList, + 'callRequest':auto_accept_call, + 'offer':response_offer, + 'answer':accept_answer, + 'iceCandidate':accept_iceCandidate, + } + +async def main(): + agent = RTCLLM(ws_url='https://sage.opencomputing.cn/wss/ws/rtc_signaling.ws', + iceServers=[{ + 'urls':'stun:stun.opencomputing.cn'},{ + 'urls':'turn:stun.opencomputing.cn', + 'username':'turn', + 'credential':'server' + }]) + await agent.run() + +if __name__ == '__main__': + asyncio.run(main()) +