r2d2-tv: webOS TV向けのローカルホーム画面、プライベートブラウザ、音声アシスタント
r2d2-tvとは
r2d2-tvはオープンソースプロジェクトで、webOSスマートTVをディスプレイとリモコンのみに縮退させ、その後、所有者が選択したスマート機能だけを追加で戻します。ローカルホーム画面、プライバシーフィルタ付きリモートブラウザ、プッシュトーク音声アシスタントです。ブラウザのレンダリングと音声モデルの推論はすべて、TV上でもベンダークラウド上でもなく、同じLAN上の別のaarch64 Linuxマシンで実行されます。
このプロジェクトはGitHubユーザーanubhavmalhotraによってhttps://github.com/anubhavmalhotra/r2d2-tvで公開され、Hacker Newsに「Show HN: Making a smart TV dumb and then smart」(item 50202865)として投稿されました。リポジトリにはデモ動画(https://anubhavmalhotra.com/vibing/r2d2-webos/r2d2-demo.mp4)と、「R2D2 for webOS」という長文の解説へのリンクがあります。
アーキテクチャ: 1台のLinuxホスト、1台のTV、3つのコード領域
r2d2-tvは、厳密な責任分担に基づいて構築されています。Linuxコンピュートホストが重い処理を行い、TVはディスプレイ、アプリケーション、リモコンを提供します。リポジトリは3つの協調する部分について説明しています。
コンピュートホスト (spark/)
ホストはaarch64 Linuxマシンです。プライベートなディスプレイおよびオーディオセッション内でサンドボックス化されたChromiumセッションをレンダリングし、そのセッションをLAN経由でTVにストリーミングします。同じホストがローカル音声認識およびインテントモデルと、クローズドなコマンドレジストリを実行します。つまり、音声コマンドのセットはビルド時に固定され、オープンエンドではありません。
TV側 (tv/, voice/tv/)
TVはホームアプリケーションとブラウザビューアを実行します。ビューアはリモコン入力をホストに送り返します。TV上のルートキャプチャオーナーがリモコンの音声キーを受け取り、相互TLSを介して制限付きオーディオをホストに送信します。
コンテンツ保護 (protection/)
コンテンツブロッキングは、各使い捨てブラウザプロファイルに読み込まれるピン留めされたフィルタルールとして実装されており、各ブラウジングセッションは状態を蓄積するのではなく、クリーンでフィルタリングされたプロファイルから始まります。
ローカルに留まるものと、ネットワークから出ていくもの
モデル推論はホスト上に留まります。これがこのプロジェクトの核となるプライバシー主張です。
リポジトリは、これが完全なオフラインモードではないことを明示しています。要求されたウェブサイト、検索、ストリーミングアプリ、オプションの天気機能は、それぞれのプロバイダーに連絡します。言い換えれば、r2d2-tvはTVベンダーをデータパスから排除します(ベンダーのホーム画面、レコメンデーション、常時オンの音声パイプラインを排除)が、ユーザーが訪問するサイトを匿名化するわけではありません。セキュリティ境界とレポートはリポジトリのSECURITY.mdに文書化されています。
要件
r2d2-tvを実行するには、両側に特定のハードウェアとソフトウェアが必要です。
- ビルドマシン: Python 3.10以降とNode.js 20以降。
- コンピュートホスト: aarch64 Linuxで、非rootサービスアカウント(UID 1000)を持つもの。サンドボックスが有効なChromiumスナップ。プライベートXディスプレイ用のXvfb。WebRTCパス用のPipeWire、WirePlumber、GStreamerプラグイン。MSEおよびAirPlayパス用のハードウェアHEVCエンコーディングを備えたFFmpeg。CUDA対応GPUとPython 3.12(ピン留めされたローカルモデル用。約10GBの重みを持つ)。
- TV: 所有者がシステム(root)アクセスとパッケージをインストールする許可を得ているwebOS TV。ネイティブ音声キャプチャには、正確なファームウェアビルドに一致するツールチェーンとヘッダーがさらに必要です。
- ネットワーク: TVとホストが同じLAN上にあること。プロジェクトはスループットとジッターの測定を推奨しています。名目上のリンクレートは再生品質を保証しないからです。
ビルド、テスト、デプロイ
ビルド
ビルドはソフトウェアをインストールしたりデバイスに接続したりせず、出力ディレクトリは新規である必要があります。文書化されたフローは、サンプル設定をgit無視ファイルにコピーし、ユーザーのデバイス用に編集してから、ビルダーを実行して未署名のHomeパッケージ、レンダリングされたホストサービス、TVサービスソース、ファイルマニフェストを生成します。
ブラウザショートカットを有効にするには、プライベートケイパビリティキー(umask 077の下でPython secretsモジュールで作成された64文字の16進トークン)を生成し、browser-key-fileオプションでビルドに渡す必要があります。ブランドロゴは意図的に同梱されていません。アプリIDを許可されたdata-URIロゴにマッピングするプライベートJSONファイルが提供されない限り、ホーム画面にはテキストタイルが表示されます。レンダリングされた出力にはデプロイアドレスが含まれ、ブラウザケイパビリティが含まれる可能性があるため、プライベートに保つことを意図しています。
テスト
オフラインテストでは、Pythonユニットテストに加え、保護証明とホーム画面コアロジック用のNodeテストファイル、そしてプライバシーチェックスクリプトを実行します。UIテストは、ホームとブラウザのサーフェスにPlaywrightのChromiumを使用します。オフラインチェックの完全なリストはリポジトリのCIワークフローファイルにあります。プロジェクトは、オフラインチェックが物理的なビデオキャデンス、マイク品質、または別のファームウェアビルドとの互換性を確立するものではないと警告しています。
ホストのデプロイ
ホストのデプロイメントモデルは手動です。レンダリングされた完全なspark/ツリーは、サービスアカウントが所有するバージョン管理されたディレクトリとしてステージングされ、セッションマネージャーが有効になる前にプリフライトがチェックのみモードで実行されます。プリフライトは、サンドボックス、ディスプレイとオーディオ、コンテンツ保護、DNS、クリーンアップを検証します。パッケージのインストールやTV再生の検証は行わず、一般的なホストインストーラーもありません。依存関係のインストールとサービス監視は、通常のホスト管理としてオペレーターに委ねられます。
ランタイムは、ケイパビリティキーとオプションの音声設定をサービスアカウントのホームディレクトリの.local/share/baaz-browser/に保持します。プロジェクトは、baaz-browserは互換性のために維持されているレガシーなランタイムディレクトリ名であり、これらのファイルはプライベートディレクトリ内でモード0600でなければならないと述べています。常駐音声にはさらに、ピン留めされたモデルスナップショット、TLS認証情報、ローカルでペアリングされたTVコントロールが必要です。
TVへのインストール
推奨される順序は、webOSパッケージワークフローを通じてHomeパッケージをインストールし、まず通常のアプリケーションとしてテストすることです。ホームとアイドルルーティングの変更は、別の後のステップです。tv/integration/内のオフラインHomeプランナーは、ファームウェアのキャプチャ状態から候補変更とロールバックペイロードを生成します。
音声キャプチャは、文書化されたローカルキャプチャアクティベーション契約に従います。パブリックビルダーは、デバイスアクセスを取得したり、システムファイルにパッチを適用したり、サービスを単独でアクティブ化したりすることはできません。プロジェクトはユーザーに、元のファイルとリカバリパスを、UI再起動で終了しないプロセスの外に保持し、その後、リモコン、既存アプリ、ブラウザ再生、連続音声押下、スタンバイとレジューム、電源サイクルを検証するよう指示しています。
リスク: root、ファームウェアピン留め、保証
r2d2-tvは安全な汎用改造ではなく、リポジトリは最初にそれを明言しています。
TVコンポーネントはrootとして実行され、特定のファームウェアビルド上のベンダーシステムサービスを変更します。述べられている結果は、この変更はサポートされておらず、保証が無効になる可能性があり、再起動またはファクトリーリセットまでTVが使用できなくなる可能性があるということです。
そのリスクをもたらす3つの具体的なメカニズムがあります。キーフィルターパッチ、ホームとアイドルルーティングの変更、ネイティブ音声キャプチャです。それぞれがベンダーサービスを置き換えるかフックするため、ミスがリモコン、ホームボタン、または音声をTVが復元されるまで無効にする可能性があります。ファームウェアSHA-256ピン、コードオフセット、シンボル名、パッチアンカーはすべて単一のリファレンスビルドを対象としています。プロジェクトはユーザーに、自分のファームウェア用にそれらを再導出し、不一致のピンを強制しないように指示しています。
現在のステータスは意図的に狭い
リファレンスデプロイメントは、1台のTVと1つのファームウェアビルドを対象としています。その構成では、ホーム、ブラウザ、リモート音声コマンドがエンドツーエンドで機能します。TV、ファームウェア、リモコン、ホストの他のすべての組み合わせは未検証と説明されています。
リポジトリはソースとオフラインテストのみを提供します。これは明示的に、汎用rootツール、ファームウェアインストーラー、またはホストインストーラーではありません。また、LGエレクトロニクス、ルーカスフィルム、ウォルト・ディズニー・カンパニー、またはストリーミングサービスとは提携、承認、またはスポンサーされていない独立したプロジェクトです。
ライセンス
プロジェクトコードはMITライセンスです。ブラウザ拡張機能、フィルターツールとそのデータ、および2つのランタイムアダプターはGPL-3.0-or-laterです。サードパーティ通知ファイルには、これらのコンポーネントとその上流の帰属がリストされています。
コミュニティの反応: 代替案とHDMIベースライン
Hacker Newsの議論は小規模で、投稿は37ポイント、7コメントで、コメントは主にr2d2-tvをより単純な代替案と比較しており、実装を批判するものではありませんでした。
繰り返し出てくる立場の1つは、理想的なテレビはほとんど何もしないというものです。あるコメンターが言ったように:
私がテレビに本当に望むのは、素早く確実に電源が入り、HDMI1に接続されたものを表示することだけです。市場は「スマート」(実際は「監視」)TVで溢れているので、買わないというのは現実的ではありません。
このコメントは、プロジェクトが取り組む緊張関係を捉えています。監視能力のあるTVを望まない人々は、それを避けて買うのが非現実的だと感じているため、購入後にソフトウェアを削ぎ落とすことが現実的な道になります。
2人目のコメンターは、TVソフトウェアをクリーンアップするための関連プロジェクト(https://github.com/Gathin23/cleanyourtv/tree/main)を指摘し、同じ問題に別の角度から取り組む小さなツールエコシステムを示しました。
3人目のコメンターは、スマート機能を完全にスキップするのが最も簡単な解決策だと主張しました:
Kodiを実行しているRaspberry PiにHDMIで接続されたダムTVは、私には十分スマートです。
これらの返信に暗に含まれる反論は、r2d2-tvは、低リスクのHDMIボックスアプローチや他のファームウェアクリーニングツールも存在する領域における、高リスクで高統合のオプションであるということです。r2d2-tvは、ベンダーのソフトウェアレイヤーが置き換えられている間も、TV独自のリモコン、ホーム画面、音声ボタンが機能し続けることを望む人のための選択肢です。
ソースマップクイックリファレンス
| パス | 目的 |
|---|---|
tv/home/ |
ホームアプリケーションテンプレート |
tv/integration/ |
オフラインHomeおよびアイドル復帰プランナー |
spark/ |
ブラウザ、メディアトランスポート、セッションマネージャー |
voice/ |
TVキャプチャ、ローカルモデル、検証済みコマンド実行 |
protection/ |
コンテンツブロッキングルールと再現可能な拡張機能ビルダー |
tools/ |
プライベートビルド、パッケージ、プライバシーツール |
リポジトリのガイダンスは、デバイス設定、キー、ファームウェアイメージ、ランタイムデータをバージョン管理の外に保つことです。