一、🌟效果抢先看
Web浏览器中发起WebRTC直播,在后端实时的将直播流中的人脸替换成预设的图片,并在Web浏览器中展示。
1. WebRTC:实时通信的瑞士军刀
WebRTC(Web Real-Time Communication)是一个Google开源项目,允许浏览器/移动端直接进行实时音视频流传输,典型应用场景:视频会议、屏幕共享、文件传输、远程控制。
其关键特性包括:
Cursor 是一个以 AI 为核心的代码编辑器,它通过智能自动完成、多行编辑、智能重写等功能来提高软件开发效率,同时提供了与 AI 对话的能力,以帮助开发者理解和操作代码库。
1. Cursor 配置准备
为了能更好的实现代码生成oneshot的效果,我们选择Claude-3.5-sonnet作为代码生成的模型。
⚡好的prompt也是高质量代码生成的保障,cursor支持配置.cursorrules文件来为每次代码生成时提供内嵌的prompt⚡,在设置中记得include该文件。
我根据WebRTC领域编程的特点,总结一套规则,可以参考使用:
You are an expert in WebRTC, real-time communication, and the related technology stack including aiortc, coturn, and JavaScript.
Key Principles
- Write concise, technical responses with accurate code examples in JavaScript and Python.
- Use functional programming patterns; prefer composition over inheritance.
- Prioritize modularization and iteration to avoid code duplication.
- Use descriptive variable names that clearly indicate their purpose (e.g., isPeerConnected, streamingMedia).
- Follow consistent naming conventions for files and directories (e.g., webrtc/client.js, webrtc/server.py).
WebRTC Development
- Utilize aiortc for building WebRTC applications in Python; prefer async/await for asynchronous operations.
- Configure coturn for STUN/TURN services to ensure reliable media transmission across NATs.
- Use JavaScript for client-side WebRTC implementations, leveraging the RTCPeerConnection, MediaStream, and DataChannel APIs.
- Implement proper signaling mechanisms (e.g., WebSocket, HTTP REST) for establishing WebRTC connections.
Error Handling and Validation
- Prioritize error handling in WebRTC connections:
- Handle ICE candidate gathering and connection errors at the beginning of your signaling logic.
- Use early returns for error conditions to improve code clarity.
- Implement user-friendly error messages for connection issues.
Dependencies
- Python: aiortc, aiohttp (for signaling), coturn (for STUN/TURN)
- JavaScript: WebRTC API, Socket.IO (for signaling), Axios (for HTTP requests)
Performance Optimization
- Minimize latency by optimizing ICE candidate gathering and connection establishment.
- Monitor and manage bandwidth usage dynamically based on network conditions.
- Use adaptive bitrate streaming techniques to enhance media quality under varying network conditions.
Key Conventions
- Rely on established WebRTC best practices for connection management and media handling.
- Prioritize user experience with smooth connection setups and high-quality media transmission.
- Structure your application to separate signaling logic from media handling for better maintainability.
- Document all API endpoints and WebRTC setup procedures for clarity.
Testing and Debugging
- Implement unit tests for signaling and connection handling using frameworks like Jest for JavaScript and pytest for Python.
- Use browser developer tools to monitor WebRTC connections and inspect ICE candidates.
- Leverage logging for debugging connection issues, using tools like console.log in JavaScript and Python's logging module.
Security Considerations
- Ensure secure communication using HTTPS for signaling servers.
- Implement proper authentication and authorization for users connecting to the WebRTC application.
- Sanitize user inputs to prevent injection attacks and maintain overall application security.
Deployment
- Use Docker for containerizing your signaling server and TURN server for consistent deployment across environments.
- Follow best practices for scaling WebRTC applications, including load balancing and redundancy for TURN servers.
2. 构思整个demo
这一步很关键,相当于你给cursor画出了整个项目的框架,cursor会根据描述,来帮你创建必要的目录,增加相应的代码文件。
⚡为此你需要仔细思考并拆分需求。好在我们可以把需求提给大模型,让大模型来帮你结合领域知识,逐步拆分需求⚡:
项目分为三个子模块, 每个子模块单独创建目录
1. 使用coturn搭建一个webrtc的信令服务器:
1.1 包括stun/turn服务
1.2 构建docker镜像,可运行在ubuntu20.04的云主机上
1.3 支持nat穿透
1.4 包括websocket服务,用于信令转发
2. 使用aiortc搭建一个webrtc的客户端
2.1 该客户端使用python语言,使用aiortc库
2.2 该客户端使用websocket与信令服务器通信
2.3 该客户端中运行基于opencv的面部识别,对远端传过来的视频帧检测到人脸后替换成一张本地的图片,并将替换后的帧通过RTCDataChannel发送给对端
2.4 该客户端中目标检测不需要每帧都进行,仅在上一次检测处理完成后,对当前收到的帧进行检测,允许跳帧,以降低计算量
2.5 该客户端能够与javascript的webrtc客户端通信
3. 使用javascript搭建一个webrtc的客户端
3.1 该客户端参考WebRTC的官方示例,能够运行在移动端的chrome浏览器上
3.2 该客户端能够与python的webrtc客户端通信
3.3 该客户端包含摄像头流采集,包含两个窗口,分别是当前的摄像头流和目标检测后的摄像头流
3.4 该客户端能够将目标检测后的摄像头流推送给python的webrtc客户端
3.5 该客户端能够接收python的webrtc客户端发送过来的目标检测结果,并显示在目标检测后的摄像头流中
3.6 该客户端包含两个按钮,能够发起webrtc连接,并能够断开webrtc连接
将上述的要求写到init.md文件后,调用cursor的COMPOSER来依据我们的要求创建并生成文件,可以看到cursor自动的帮我们组织了目录结构,并实现了相应的代码文件。
一般来说,由于我们提供的要求描述不充分或者大模型一次输出token的限制等原因,很难做到一次生成代码就能满足我们的需求,⚡逐步的代码确认以及微调是很有必要的⚡。
▍模块一:coturn服务端
cursor给出了正确的DockerFile配置,也给出了turnserver的配置,总的来说对配置类文件,cursor向来给出的比较准确,基本不用做大的修改。
cursor也提供了一个Python版本的websocket服务器实现,其实现是将连接上来的websocket client的消息做广播。
我们想先在本地运行的话,需要先安装下coturn,这个也可以让cursor给出命令并执行。
▍模块二:Python人脸替换客户端
client.py文件中调用了aiortc库处理了ICE Candidate的交换以及视频流的收发逻辑,face_detector.py文件中处理了调用OpenCV进行人脸识别检测以及画框,websocket_handler.py是个封装过的websocket客户端,requirements.txt是Python人脸替换客户端运行以来的库文件,我们可以通过以下命令安装:
pip install -r python_client/requirements.txt
原要求中是检测到人脸后,在人脸基础上画框,现在我想将画框改为替换成一张人脸图片,因此我在cursor中 @face_detector.py文件,并提出我的新要求:
检查了diff之后,发现cursor给出的方案没有问题,Accept一下:
▍模块三:web客户端
webrtc.js是封装了RTCPeerConnection管理操作的库,在index.html和ui.js提供了UI界面,总的来说前端领域大模型都比较擅长,也不容易出错。
4. 运行一下
STUN/TURN Server启动:
sudo turnserver -c coturn/turnserver.conf
Websocket server启动:
python coturn/websocket_server.py
Python人脸替换客户端启动:
python python_client/client.py
接着打开web客户端加载网页:
能看到启动连接后,摄像头能正常的捕捉画面,但是远端的画面不能正常显示。
我们先去日志中看看错误,原来是在Python换脸客户端中遇到了错误:
InvalidStateError: Cannot handle offer in signaling state "have-remote-offer",我们丢给cursor来解决看看:
按照提示修改之后,接着再尝试一次,又报了另一个错误:Failed to add ice candidate,也丢给cursor处理,原来是从web客户端通过websocket信令通道发过来的ICE Candidate在给python换脸客户端做解析时无法匹配导致。
添加图片注释,不超过 140 字(可选)
知道原因之后,我们可以引导cursor来增加对candidate消息格式的打印:
再次运行拿着打印的结果,我们可以继续发问cursor针对这个消息格式来提供正确的解析代码:
可以看到延迟非常低,人脸检测的效果也还不错,总体来说能在这么短的时间内实现一个WebRTC的demo,cursor对效率的提示效果还是显著的。
我始终坚信,工具永远是服务于人的。集成大模型的编程工具(如Cursor)能够显著解放程序员在日常编码工作中的负担,其核心在于将复杂问题拆解为适合大语言模型处理的子问题的能力。这种技术革新使我们得以将更多精力投入到更高层次的思考中:如何进行软件架构设计、识别真正需要解决的问题、以及制定最优解决方案。我们应该将时间更多地分配在系统优化、伦理考量和用户体验提升等关键领域,而非过度拘泥于代码层面的细节。
整个项目我已上传到github: https://github.com/everettli/webrtc_face_live_demo
PS:最近国产大模型DeepSeek比较火,下次我再大家分享如何在cursor中接入DeepSeek模型以及表现效果。
【免费】cursor-auto-free是一个能够让你无限免费使用cursor的项目。该项目通过cloudflare进行托管实现,请参考教程进行配置。
视频教程:https://www.bilibili.com/video/BV1WTKge6E7u/
项目地址:https://github.com/chengazhen/cursor-auto-free?tab=readme-ov-file
【开源免费】Deep-Live-Cam是一个只需一张图片即可实现实时换脸和一键视频深度伪造的AI项目。
项目地址:https://github.com/hacksider/Deep-Live-Cam
【开源免费】XTuner 是一个高效、灵活、全能的轻量化大模型微调工具库。它帮助开发者提供一个简单易用的平台,可以对大语言模型(LLM)和多模态图文模型(VLM)进行预训练和轻量级微调。XTuner 支持多种微调算法,如 QLoRA、LoRA 和全量参数微调。
项目地址:https://github.com/InternLM/xtuner
【开源免费】LangGPT 是一个通过结构化和模板化的方法,编写高质量的AI提示词的开源项目。它可以让任何非专业的用户轻松创建高水平的提示词,进而高质量的帮助用户通过AI解决问题。
项目地址:https://github.com/langgptai/LangGPT/blob/main/README_zh.md
在线使用:https://kimi.moonshot.cn/kimiplus/conpg00t7lagbbsfqkq0
【开源免费】VideoChat是一个开源数字人实时对话,该项目支持支持语音输入和实时对话,数字人形象可自定义等功能,首次对话延迟低至3s。
项目地址:https://github.com/Henry-23/VideoChat
在线体验:https://www.modelscope.cn/studios/AI-ModelScope/video_chat
【开源免费】Streamer-Sales 销冠是一个AI直播卖货大模型。该模型具备AI生成直播文案,生成数字人形象进行直播,并通过RAG技术对现有数据进行寻找后实时回答用户问题等AI直播卖货的所有功能。
项目地址:https://github.com/PeterH0323/Streamer-Sales