演示:https://anubhavmalhotra.com/vibing/r2d2-webos/r2d2-demo.mp4
阅读项目背后的故事:适用于 webOS 的 R2D2。
一个面向 webOS 电视的本地主屏幕、私有远程浏览器和按键说话语音助手。一台 Linux 计算主机运行 Chromium 和语音模型;电视提供显示、应用和遥控器。
免责声明
警告
电视端组件以 root 身份运行,并会在某个特定固件版本上修改厂商系统服务。这不受支持,可能使保修失效,并可能导致电视在重启或恢复出厂设置之前无法使用。使用风险自负。
- keyfilter 补丁、Home/空闲路由和原生语音采集会替换或挂钩厂商服务。一次失误就可能使遥控器、Home 或语音功能失效,直到电视被恢复。
- 固件 SHA-256 固定值、代码偏移、符号名称和补丁锚点均针对一个参考版本。请针对你自己的固件重新推导它们;切勿强行使用不匹配的固定值。
- 本软件按原样提供,不附带任何担保;参见LICENSE.md。
- 这是一个独立项目。它与 LG Electronics、Lucasfilm Ltd.、The Walt Disney Company 或任何流媒体服务均无关联,也未获得其认可或赞助。产品名称和角色名称是其各自所有者的商标。
状态
在一台电视/固件上的参考部署:Home、浏览器和遥控语音命令在那里可以端到端工作。其他电视、固件、遥控器和主机的组合尚未验证。本仓库提供源代码和离线测试,而非通用的 root、固件或主机安装程序。
各部分如何协同工作
- 计算主机(
spark/位于路径中):一台 aarch64 Linux 机器。它在私有显示和音频会话中渲染沙箱化的 Chromium 会话,并通过局域网将其流式传输到电视。它还运行本地语音识别和意图模型以及一个封闭的命令注册表。 - 电视(
tv/,voice/tv/):Home 应用和浏览器查看器,后者将遥控输入发送回主机。一个 root 采集所有者接管遥控器的语音键,并通过双向 TLS 将限定范围的音频发送到主机。 - 内容保护(
protection/):固定过滤规则,加载到每个一次性浏览器配置文件中。
模型推理保留在主机上。所请求的网站、搜索、流媒体应用和可选天气仍会联系其提供商;参见SECURITY.md。
要求
- 构建机器:Python 3.10+ 和 Node.js 20+。
- 计算主机:aarch64 Linux,使用非 root 服务账户(UID 1000);启用沙箱的 Chromium snap;用于私有 X 显示的 Xvfb;用于 WebRTC 路径的 PipeWire、WirePlumber 和 GStreamer 插件;用于 MSE 和 AirPlay 路径的带硬件 HEVC 编码的 FFmpeg;用于固定本地模型的 CUDA 可用 GPU 和 Python 3.12(约 10 GB 权重)。
- 电视:一台你拥有系统(root)访问权限、并且有授权方式安装软件包的 webOS 电视。原生采集还需要与确切固件构建匹配的工具链和头文件。
- 网络:电视和主机在同一局域网。测量吞吐量和抖动;标称链路速率并不能确定播放质量。
本地构建
cp config/example.json config.local.json
#为你的设备编辑被忽略的文件。
python3 tools/build.py --config config.local.json --output dist/local --include-tests输出包含一个未签名的 Home 包、渲染后的主机服务、电视服务源码以及一个文件清单。构建不会安装软件或联系设备。输出目录必须是新的。
要启用浏览器快捷方式,请创建一个私有能力密钥并将其传递给构建:
umask 077 python3 -c 'import secrets; print(secrets.token_hex(32), end="")' > browser.local.key python3 tools/build.py --config config.local.json --browser-key-file browser.local.key --output dist/local-browser --include-tests
不随附品牌标志。除非你传入--home-logos-file,一个将应用 ID 映射到data:你有权使用的 URI 标志的私有 JSON 对象,否则 Home 显示文本磁贴。请将该文件以及使用它进行的任何构建保持私有。
保持渲染输出私有:它包含部署地址,并可能包含浏览器能力。
测试
python3 -B -m unittest discover -s tests node tests/test_protection_proof.js node tests/test_home_core.js python3 tools/privacy_check.py
UI 测试使用 Playwright 的 Chromium:
npm ci --ignore-scripts npx --no-install playwright install chromium npm run test:home npm run test:browser
完整的离线检查列在CI 工作流中。离线检查不能确定物理视频节奏、麦克风质量或与另一固件构建的兼容性。
部署主机
将完整的渲染spark/树暂存为服务账户拥有的版本化目录,然后在启用会话管理器之前运行其预检:
python3 -B "$RENDERED_SPARK/runtime/trial.py" --run --preflight-onlyRENDERED_SPARK指向暂存目录。预检会检查沙箱、显示/音频、内容保护、DNS 和清理。它不会安装软件包或验证电视播放。没有通用的主机安装程序;依赖安装和服务监督属于主机管理。
运行时将其能力密钥和可选的语音配置保存在$HOME/.local/share/baaz-browser/下。baaz-browser是为兼容性保留的旧运行时目录名。请将这些文件权限设为0600,放在私有目录中。常驻语音还需要固定版本的模型快照、TLS 凭据以及本地配对的电视控制;参见语音后端。
在电视上安装
通过你的 webOS 包工作流安装 Home 包,并先将其作为普通应用测试。更改 Home 和空闲路由是单独的步骤:离线 Home 规划器会根据你固件捕获的状态生成候选方案和回滚载荷。
语音采集遵循本地采集激活契约。公共构建器不会获得设备访问权限、修改系统文件或激活服务。请保留原始文件,并在任何会被 UI 重启终止的进程之外保留恢复路径。然后检查遥控器、现有应用、浏览器播放、连续语音按键、待机/恢复以及断电重启。
源码地图
| 路径 | 用途 |
|---|---|
tv/home/ |
Home 应用模板 |
tv/integration/ |
离线 Home 与空闲返回规划器 |
spark/ |
浏览器、媒体传输和会话管理器 |
voice/ |
电视采集、本地模型和经过验证的命令执行 |
protection/ |
内容拦截规则和可复现的扩展构建器 |
tools/ |
私有构建、打包和隐私工具 |
请将设备配置、密钥、固件镜像和运行时数据置于版本控制之外。安全边界和报告方式见SECURITY.md。
许可证
项目代码采用 MIT 许可证(LICENSE.md)。浏览器扩展、过滤工具和数据以及两个运行时适配器采用 GPL-3.0-or-later;THIRD_PARTY_NOTICES.md列出了这些组件及上游归属信息。