r2d2-tv:适用于webOS电视的本地主屏幕、隐私浏览器和语音助手

r2d2-tv是什么

r2d2-tv是一个开源项目,它将webOS智能电视简化为显示器加遥控器,然后仅添加其拥有者选择的智能功能:本地主屏幕、隐私过滤的远程浏览器,以及即按即说的语音助手。所有浏览器渲染和语音模型推理都在同一局域网内的独立aarch64 Linux机器上运行,而不是在电视上,也不在供应商的云中。

该项目由GitHub用户anubhavmalhotra发布,地址为https://github.com/anubhavmalhotra/r2d2-tv,并作为“Show HN:让智能电视变笨再变聪明”(条目50202865)提交到Hacker News。该仓库链接了一个演示视频,位于https://anubhavmalhotra.com/vibing/r2d2-webos/r2d2-demo.mp4,以及一篇题为“R2D2 for webOS”的更长的文章。

架构:一台Linux主机、一台电视、三个代码区域

r2d2-tv基于严格的职责分离。Linux计算主机承担繁重工作;电视提供显示器、应用程序和遥控器。该仓库描述了三个协作部分。

计算主机(spark/)

主机是一台aarch64 Linux机器。它在私有显示和音频会话中渲染一个沙盒化的Chromium会话,并通过局域网将该会话流式传输到电视。同一主机运行本地语音识别和意图模型以及一个封闭的命令注册表,这意味着语音命令集在构建时是固定的,而不是开放式的。

电视端(tv/、voice/tv/)

电视运行一个主屏幕应用程序和一个浏览器查看器。查看器将遥控器输入发送回主机。电视上的根捕获所有者获取遥控器的语音按键,并通过双向TLS将受限音频发送到主机。

内容保护(protection/)

内容阻止通过固定过滤器规则实现,这些规则被加载到每个一次性浏览器配置文件中,因此每个浏览会话都从干净、过滤的配置文件开始,而不是积累状态。

哪些保持本地,哪些仍然离开网络

模型推理保持在主机上。这是该项目的核心隐私声明。

该仓库明确指出,这不是一种全面的离线模式:请求的网站、搜索、流媒体应用和可选的天气功能仍会联系各自的提供商。换句话说,r2d2-tv将电视供应商从数据路径中移除——供应商的主屏幕、推荐和常开语音管道——但不会匿名化用户选择访问的网站。安全边界和报告记录在仓库的SECURITY.md中。

要求

运行r2d2-tv需要在两侧都具备特定的硬件和软件。

  • 构建机器: 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的权重。
  • 电视: 一台webOS电视,拥有者具有系统(root)访问权限和安装软件包的授权方式。原生语音捕获还需要与确切固件构建匹配的工具链和头文件。
  • 网络: 电视和主机在同一局域网内。项目建议测量吞吐量和抖动,因为名义链路速率并不能确定播放质量。

构建、测试和部署

构建

构建不会安装软件或联系设备,输出目录必须是新的。文档描述的流程将示例配置复制到一个git忽略的文件中,为用户设备编辑该文件,然后运行构建器以生成未签名的主屏幕包、渲染的主机服务、电视服务源代码和文件清单。

启用浏览器快捷方式需要生成一个私有能力密钥(一个64字符的十六进制令牌,使用Python secrets模块在umask 077下创建),并通过browser-key-file选项将其传递给构建。品牌标识故意不随附:除非提供将应用ID映射到允许的data-URI标识的私有JSON文件,否则主屏幕会显示文本磁贴。渲染的输出应保持私有,因为它包含部署地址,并可能包含浏览器能力。

测试

离线测试运行Python单元测试以及Node测试文件,用于保护证明和主屏幕核心逻辑,然后运行隐私检查脚本。UI测试使用Playwright的Chromium来测试主屏幕和浏览器界面。完整的离线检查列表位于仓库的CI工作流文件中。项目警告说,离线检查不能确定物理视频节奏、麦克风质量或与另一个固件构建的兼容性。

部署主机

主机部署模型是手动的。一个完整渲染的spark/树作为一个版本化目录暂存,由服务账户拥有,在启用会话管理器之前,其预检以仅检查模式运行。预检验证沙盒、显示和音频、内容保护、DNS和清理。它不安装软件包或验证电视播放,也没有通用的主机安装程序——依赖安装和服务监管留给操作员作为普通主机管理。

运行时将其能力密钥和可选的语音配置保存在服务账户主目录下的.local/share/baaz-browser/中。项目指出,baaz-browser是一个为兼容性保留的遗留运行时目录名称,这些文件必须位于私有目录中,模式为0600。常驻语音额外需要固定的模型快照、TLS凭据和本地配对的电视控制。

在电视上安装

推荐的顺序是通过webOS软件包工作流安装主屏幕包,并首先将其作为普通应用程序进行测试。更改主屏幕和待机路由是单独的、后续步骤:tv/integration/中的离线主屏幕规划器根据固件的捕获状态生成候选更改和回滚负载。

语音捕获遵循文档化的本地捕获激活契约。公共构建器本身无法获得设备访问权限、修补系统文件或激活服务。项目指导用户将原始文件以及UI重启不会终止的恢复路径保存在任何进程之外,然后验证遥控器、现有应用、浏览器播放、连续语音按键、待机和恢复,以及电源循环。

风险:root、固件固定和保修

r2d2-tv不是一种安全、通用的修改,仓库在前言中明确说明了这一点。

电视组件以root身份运行,并修改一个特定固件构建上的供应商系统服务。声明的后果是:修改不受支持,可能使保修失效,并可能使电视在重新启动或恢复出厂设置之前无法使用。

三种具体机制承载着这种风险:键过滤器补丁、主屏幕和待机路由更改,以及原生语音捕获。每个都替换或挂钩供应商服务,因此一个错误可能会禁用遥控器、主屏幕按钮或语音,直到电视恢复。固件SHA-256固定、代码偏移、符号名称和补丁锚点都针对单个参考构建;项目告诉用户为自己的固件重新推导它们,并且永远不要强制使用不匹配的固定值。

当前状态是刻意狭窄的

参考部署覆盖一台电视和一个固件构建。在该配置上,主屏幕、浏览器和远程语音命令端到端工作。所有其他电视、固件、遥控器和主机的组合都被描述为未经验证的。

该仓库仅提供源代码和离线测试。它明确不是一个通用的root工具、固件安装程序或主机安装程序。它也是一个独立项目,与LG电子、卢卡斯影业、华特迪士尼公司或任何流媒体服务没有任何关联、认可或赞助。

许可

项目代码采用MIT许可。浏览器扩展、过滤器工具及其数据,以及两个运行时适配器采用GPL-3.0-or-later许可。第三方声明文件列出了这些组件及其上游归属。

社区反应:替代方案和HDMI基线

Hacker News的讨论规模较小——帖子获得了37分和7条评论——评论大多将r2d2-tv与更简单的替代方案进行对比,而不是批评其实现。

一个反复出现的立场是,理想的电视机几乎什么都不做。正如一位评论者所说:

我对电视的所有要求就是快速可靠地开机,并显示任何连接到HDMI1的内容。市场上充斥着“智能”(实际上是“监控”)电视,所以不买一台实际上不太现实。

这条评论捕捉了项目所解决的矛盾:不想要具有监控能力的电视的人仍然觉得避免购买它们不现实,因此购买后剥离软件成为务实的路径。

第二位评论者指向了一个相关项目,用于清理电视软件,位于https://github.com/Gathin23/cleanyourtv/tree/main,表明存在一个从不同角度解决同一问题的小型工具生态系统。

第三位评论者认为最简单的解决方案是完全跳过智能功能:

一台通过HDMI连接到运行Kodi的Raspberry Pi的笨电视对我来说足够智能了。

这些回复中隐含的反驳是,r2d2-tv是该领域中高风险、高集成的选择,而该领域还包括低风险的HDMI盒子方法和固件清理工具。r2d2-tv适合那些希望电视自带的遥控器、主屏幕和语音按钮继续工作,同时替换供应商软件层的人。

源映射快速参考

路径 用途
tv/home/ 主屏幕应用程序模板
tv/integration/ 离线主屏幕和待机返回规划器
spark/ 浏览器、媒体传输和会话管理器
voice/ 电视捕获、本地模型和验证命令执行
protection/ 内容阻止规则和可复现的扩展构建器
tools/ 私有构建、打包和隐私工具

仓库的指导是保持设备配置、密钥、固件映像和运行时数据不在版本控制中。

Sources