対象となるユーザー: この記事は、Arabic、Hebrew、Urdu、Persian版のB1、B2、F8、K7、KF1、L5、P2、Q6、Q8、T2、Y6の読みペンを、現在当社が出荷している47か国に向けて調達するファームウェアエンジニア、ローカライズプログラムマネージャー、B2Bバイヤー向けに書かれています。言語パックとは何かを理解していることを前提としつつ、デバイス上の2種類のテキストエンジン——RTL(旧世代)とRTL2(Unicode準拠の双方向処理と字形結合に対応)——が、コスト、RAM使用量、OTAサイズ、テストカバレッジの点でどのように異なるかを正確に知りたいという方を対象としています。
湾岸諸国のディストリビューターが12,000台の学校向け入札を立ち上げ、「このArabic版は文字の結合、文脈依存形、双方向の数字並びを正しく処理できるのか?」と尋ねたときの答えは、「はい、Arabicに対応しています」ではありません。正直な答えは、どのビルドパイプライン、どのエンジン、どのフォントサブセット、どの署名チェーンかという点にあります。当社はファームウェアのバージョニングが1.6.xに到達して以来、2つの異なるライト・トゥ・レフトスタックを出荷しており、その差——コスト、テスト時間、フラッシュ上のサイズ、レンダリング品質——は、40,000台規模のロールアウトが初日に検査で不合格になるか、6年間フォント関連のRMAゼロで稼働するかを決定づける、まさにそのような詳細です。
本ガイドでは、読みペンファームウェア内部でのRTLおよびRTL2のアーキテクチャ、両者の分岐点、各言語パックの署名およびパッケージング方法、2,000台カスタムカラーのMOQにおけるBOMへの影響、そして発注書サインオフ前にArabic/Hebrew/Urdu/Persian版をどのように検証すべきかを詳しく解説します。本記事のブロック図、現在の出荷実績テレメトリ(47,000台以上の出荷、86回のファームウェアリリース、12の稼働中言語バージョン)に基づく実数値、そしてそのまま次のメールに貼り付けられる30秒チェックリストにご期待ください。
1. なぜ右から左への対応はフォントではなく独立したエンジンなのか
よくある誤解は、RTLは単なるグリフ方向フラグである、というものです。そうではありません。Arabic、Hebrew、Urdu、Persianはいずれも以下を必要とします。
- 双方向(bidi)アルゴリズム — Unicode UAX #9。「Chapter 3 - الفصل الثالث」のような混在文字列は、基底方向、埋め込みレベル、明示的なオーバーライド処理を必要とします。
- 文字結合/文脈依存シェイピング — Arabicの文字は最大4つの形(独立形・語頭形・語中形・語尾形)を持ち、隣接する文字に依存します。シェイピングがなければ、「كتاب」は4つの壊れたグリフとして表示されます。
- ラム・アレフの合字 — لاは単一グリフである必要があり、そうでなければ視覚的順序が崩れます。
- 数字のシェイピング — 同じ段落内でArabic-Indic数字(٠١٢)、Eastern Arabic-Indic数字(۰۱۲)、Latin数字(012)が混在します。
- ダイアクリティカルスタッキング — TashkilおよびHebrew niqqudは、基底文字に対して2〜4個の記号を積み重ねることがあります。
当社はこれをフォントの問題ではなく、エンジンの問題として扱います。フォントはエンジンが照会する単なるグリフテーブルであり、いつ、どのグリフを使用するかを決定するのはエンジンです。
2. RTL(旧世代エンジン)——その構築経緯と現存する理由
2.1 アーキテクチャ概要
RTLは当社初世代のbidiエンジンであり、2019年にMITライセンスのリファレンス実装をベースに開発されました。2バイトUTF-16コードポイントストリーム上で動作し、シェイピングを持たず、Arabic/Hebrewの高頻度256単語に対してラスタライズ済みビットマップを使用します。
| 項目 | 仕様 |
|---|---|
| コードポイントモデル | UTF-16、単一コードユニット |
| 双方向アルゴリズム | 簡略化されたUAX #9(明示的なレベルL4–L7なし) |
| 接合 | なし — 文字ごとに固定の孤立形 |
| Lam-Alef ライゲ | ルックアップテーブル、4形式(لا, لأ, لإ, لٱ) |
| 数字 | ASCII 0–9のみ、RTL段落内のLTRラン |
| フォント形式 | 224KBビットマップテーブルへの8ビットインデックス(1サイズのみ) |
| エンジンサイズ(フラッシュ) | 312 KB |
| エンジンサイズ(RAM) | 18 KB ワーキングセット |
| 署名 | MD5 + ベンダーキー(旧式) |
| 稼働中のSKU | B1(ファームウェア2.4.7)、B2(2.4.7)、P2(2.0.3) |
| 稼働中の言語パック数 | 4(ar-SAレガシー、ar-EGレガシー、he-IL、ur-PK) |
2.2 なぜB1、B2、P2に今も搭載されているのか
3つの理由がRTLを残しています。コスト:B1とB2は4MBのNORフラッシュを使用しており、RTLエンジンはコンテンツ用に1.1MBを残しています。RTL2への切り替えはさらに540KBを消費し、4番目のOIDブックスロットを廃止せざるを得ません。電源:B1は700 mAhを消費し、旧式エンジンはRTL2の1.1 mAに対し平均0.4 mAの電流を追加します。5.0時間の連続使用時間において意味があります。互換性:既存の湾岸諸国のディストリビューター14社がB1を運用しており、これらを壊すことはありません。
バイヤーへのヒント: チャネルが価格重視(陸揚げコスト8ドル未満)で、コンテンツがアリフ・バアと短い文章の基本的な絵本には、B1/B2のレガシーRTLビルドが正しい商業的選択です。使用しないRTL2に費用を支払う必要はありません。
3. RTL2(Unicode準拠エンジン) — 2024年の後継モデル
3.1 アーキテクチャ概要
RTL2は、オープンなHarfBuzzシェーピングコア(BSDライセンス)をベースに、薄いベンダーラッパーで構成された第2世代エンジンです。UAX #9のL1~L7レベル、OpenType GSUB/GPOSシェーピング、4フォントフォールバック、32 KBのシェーピングキャッシュを完全にサポートします。
| 項目 | 仕様 |
|---|---|
| コードポイントモデル | UTF-8内部処理、コードポイント0~0x10FFFF |
| 双方向アルゴリズム | L1~L7レベルを明示的にサポートするUAX #9完全対応 |
| 文字の連結 | OpenTypeシェーピング完全対応、4種の文脈依存形 |
| ラム・アレフ連字 | OpenType GSUBルックアップ、ダイアクリティカル対応の12形式を含む |
| 数字 | 段落ごとにASCII/アラビア・インディック/東アラビア・インディックを切替可能 |
| フォント形式 | WOFF2サブセット、4種のカットサイズ(24/32/40/56 px) |
| エンジンサイズ(フラッシュ) | 852 KB |
| エンジンサイズ(RAM) | ワーキングセット46 KB、シェーピングキャッシュ32 KB |
| 署名 | Ed25519 + ベンダー root + 地域別サブキー |
| 稼働中のSKU | F8(3.1.2)、K7(1.9.5)、KF1(1.9.5)、L5(4.2.0)、Q6(3.3.1)、Q8(3.3.1)、T2(2.6.4)、Y6(2.6.4) |
| 稼働中の言語パック数 | 8(ar-SAモダン、ar-AEモダン、he-ILモダン、ur-PKモダン、fa-IR、ps-AF、sd-IN、dvu-NP) |
3.2 なぜRTL2は8モデルでRTLを置き換えるのか
きっかけとなったのは、2023年のサウジアラビアSFDA検査サイクルでした。あるサウジ系ディストリビューターの9,000台導入案件で、本体11 mmサイズの文字フォントに視認できる字形欠陥が見つかり、私たちは21日以内に対応するOTAファームウェアを送り出しました。原因はレガシーエンジンにおける文脈依存字形の処理漏れと判明しました。ファームウェア3.x以降、すべてのアラビア語/ヘブライ語/ウルドゥー語/ファルシ語の言語パックはRTL2に対応しています。
4. 実コンテンツによるRTLとRTL2の比較
同一コンテンツセット上で両エンジンをベンチマークしました——アラビア語OID書籍12点(表紙、18ページ、平均240語)とヘブライ語入門書4点です。
| 指標 | RTL(レガシー) | RTL2(モダン) | 差分 |
|---|---|---|---|
| エンジンフラッシュ | 312 KB | 852 KB | +540 KB |
| エンジンRAMピーク | 18 KB | 78 KB | +60 KB |
| コールドスタートから最初の単語まで | 0.41秒 | 0.62秒 | +0.21秒 |
| 単語検索の平均 | 6.2 ms | 4.8 ms | -22% |
| シェーピング対応率 | 64%の字形 | 100%の字形 | +36ポイント |
| ビットマップフォントサイズ | 224 KB | 1.12 MB(WOFF2サブセット) | +896 KB |
| 言語別フラッシュコストの合計 | 0.54 MB | 1.97 MB | +1.43 MB |
| 1時間使用あたりのバッテリーコスト | 0.4 mA | 1.1 mA | +0.7 mA |
| OTAペイロード | 0.6 MB | 2.1 MB | +250% |
「デルタ」列こそが、まさにプログラムマネージャーが尋ねる項目です。B1では+540 KBのエンジンがコンテンツ量のトレードオフを強制します。T2(2500 mAh Li-ion 18650、連続14時間)では+0.7 mAの差は無視できます。エンジンは国ではなくSKUに合わせて選定してください。
5. 言語パックファイルフォーマットと署名チェーン
量産に出荷されるすべての言語パックは署名済みバンドルです。内部レイアウトはエンジン間で同一で、異なるのはエンジン紐付けフィールドのみです。
LP-AR-SA-RTL2-v3.2.1.spenlp
├── header.bin (256 B, version, sku_mask, engine_flag)
├── manifest.json (engine_id, fonts[], shaping_tables[])
├── font_24.woff2 (subset, ~280 KB)
├── font_32.woff2 (~310 KB)
├── font_40.woff2 (~340 KB)
├── font_56.woff2 (~410 KB)
├── shaping.bin (HarfBuzz tables, ~520 KB)
├── dictionary.dict (sorted lemma list, 12–88 MB depending on language)
├── voice_tts_en.bin (optional cross-language TTS fallback, 1.8 MB)
└── signature.sig (Ed25519, 64 B)
署名チェーンは深圳の当社HSMにルートされています。地域別サブキーはサウジアラビア(SFDA)、UAE(TDRA)、イスラエル(IMOC)、パキスタン(PTA)向けに発行されます。地域向けに署名されていない言語パックはディストリビューターがインストールできず、ブートローダーはマウントから38 ms後に署名を拒否し、デバイスは17言語英語パックにフォールバックします。
ご購入担当者へ: サンプル受け入れ前に、必ず言語パックのSHA-256と公開サブキーIDをご請求ください。納品書とともに両方をお付けしてお送りします。
6. モデル別ストレージレイアウト ― 言語パックの格納場所
flash上の dictionary.dict の配置は、読み取りレイテンシとOTA再試行コストに影響します。以下はファームウェア3.3.1(Q6/Q8)で実際に搭載しているレイアウトです。
| モデル | フラッシュタイプ | LPパーティション | 予備パーティション | 書き込み耐久回数 |
|---|---|---|---|---|
| B1 | 4 MB NOR | 0x000C0000–0x003F0000 | 0x003F0000–0x00400000(64 KB A/B) | 10K回 |
| B2 | 4 MB NOR | 0x000C0000–0x003F0000 | 0x003F0000–0x00400000(64 KB A/B) | 10K回 |
| F8 | 8 MB NAND | パーティション4(1.9 MB) | パーティション5(1.9 MB A/B) | 60K回 |
| K7 / KF1 | 8 MB NAND | パーティション4(1.9 MB) | パーティション5(1.9 MB A/B) | 60K回 |
| L5 | 16 MB NAND | パーティション6(3.6 MB) | パーティション7(3.6 MB A/B) | 100K回 |
| P2 | 4 MB NOR | 0x000C0000–0x003F0000 | 0x003F0000–0x00400000(64 KB A/B) | 10K回 |
| Q6 / Q8 | 16 MB NAND | パーティション 6 (3.6 MB) | パーティション 7 (3.6 MB A/B) | 100K サイクル |
| T2 / Y6 | 32 MB NAND | パーティション 8 (6.4 MB) | パーティション 9 (6.4 MB A/B) | 100K サイクル |
A/B とは、起動ローダーがスペア側パーティションに前回正常だった言語パックを保持し、インストール失敗時に 0.6 秒でフォールバックできる設計を指します。
7. アラビア語/ヘブライ語/ウルドゥー版をご注文前の 30 秒チェックリスト
次回ベンダー打ち合わせでそのままお使いください。OEM チームがサンプル承認前に適格性を確認するチェックリストと同じものです。
- エンジン バージョン — 設定 → について → エンジン を開いてご確認ください。F8/K7/KF1/L5/Q6/Q8/T2/Y6 では
RTL2-3.xと表示されている必要があります。B1/B2/P2 はRTL-2.x. - と表示される場合があります。 — 「كتاب」をタップしてください。文字が正しく接続されること(kaaf、beh は語末形、alef も連結)を確認します。4 文字が分離して見える場合は、RTL2 が有効になっていません。
- Lam-Alef テスト — 「لا」をタップしてください。2 文字が積重なりではなく、ベースラインを備えた 1 グリフとして表示される必要があります。
- 混在方向テスト — 「الدرس 3」をタップしてください。数字は RTL 段落内でも LTR にレンダリングされ、視覚的順序が「الدرس 3」となる必要があります。
- 数字形テスト — 設定 → 表示 で「アラビア・インド数字」へ切り替えてください。数字 ٠-٩ が正しい字形で表示される必要があります。
- 公開サブキー ID — OEM ポータルで公開しているサブキーと一致するかご確認ください。不一致は偽造 LP の証拠となります。
6 項目すべてに合格すれば、発注は安全です。いずれか 1 つでも不合格となった場合、当社の 1.0% AQL Major 条項に基づき、ロット全数の受領拒否が可能です。
8. アーキテクチャの今後の方向性(ファームウェア 4.x ロードマップ)
2026 年第 4 四半期~2027 年第 2 四半期にかけて、以下の 3 つの変更が予定されています。
- 辞書引きの右から左マーク対応 — 現状の RTL2 は辞書インデックスにラテン文字の並び替え順序を使用しています。ロケール対応の ICU コレーターへ移行し、アラビア語の辞書引きを 4.8 ms から 3.1 ms へ短縮する見込みです。
- 単語単位グリフ キャッシュ — 64 KB の永続キャッシュにより、頻出語句の再シャーピングを不要にし、アクティブ 1 分あたり約 0.3 mA の削減を見込みます。
- WOFF2 可変フォント — 単一の 540 KB 可変ファイルで 4 サイズの固定フォントを置き換え、L5/Q6/Q8/T2/Y6 で約 580 KB を節約します。
現行 RTL エンジンには、2027 年までセキュリティ保守のみ提供されます。それ以降、B1/B2/P2 のファームウェア 3.0 以降は、有償再フラッシュにより RTL2 を提供いたします。
9. RTL2 選択による価格とリードタイムへの影響
言語パックはデバイス単位ではなく、地域単位でライセンスされます。同一ハードウェアにおける RTL バンドルと RTL2 バンドルの工場原価差は、ユニット価格ではなく BOM 明細の差として現れます。
| 項目 | RTL(レガシー) | RTL2(モダン) |
|---|---|---|
| ユニットあたり言語パック ライセンス | ファームウェアに含む | ファームウェアに含む |
| 署名キー発行手数料(初回のみ) | 無償 | 地域あたり $480 |
| サンプル リードタイム(既存地域) | 7 日 | 7 日 |
| サンプル リードタイム(新規地域) | 21 日 | 21 日 |
| 量産リードタイム | 28 日 | 28 日 |
| カスタム辞書追加(10K 語) | $1,400(初回のみ) | $1,400(初回のみ) |
| 辞書更新時の再署名 | $0 (MD5) | $0 (Ed25519、フリーパイプライン) |
$480の手数料は弊社側のHSM署名セレモニーの費用です。 region単位の一回限りの費用となり、その regionに出荷される全台数で償却されます。
10. 11の稼働中SKUにおける言語パックの視覚的分布
下記の表は、各RTL/RTL2パックが11の出荷中SKUのどれに搭載されているかを示しています。 SKUのうち3点(K7、KF1、Q6/Q8)はRTL2のみを出荷します。 コスト重視のB1/B2/P2の3機種には従来エンジンが搭載されています。 F8、L5、T2、Y6は両方のエンジンを搭載しており、バイリンガル運用(例: アラビア語+ウルドゥー語)を行うバイヤー向けです。
11. 付録: 出荷済 fleetから取得したRTL2パフォーマンス詳細テレメトリ
2024年1月から2026年8月にかけて、サウジアラビア、UAE、イスラエル、パキスタン、イランの各販売チャネルから、RTL2搭載機11,420台の匿名化タイミングデータを収集しました。 下記の数値は合成データではなく、セッションがエラーなしで終了するたびにファームウェアが予備パーティションに書き込む診断ブロック perfmon.dumpセッションがエラーなく終了するたびに、ファームウェアが予備パーティションに書き込むブロックです。当社の信頼性チームが毎週月曜の朝に確認している数値と同じものです。
11.1 モデル別コールドスタート分布
| モデル | 台数 | p50 コールドスタート | p95 コールドスタート | p99 コールドスタート |
|---|---|---|---|---|
| F8 | 2,840 | 0.58 秒 | 0.79 秒 | 1.12 秒 |
| K7 / KF1 | 3,120 | 0.61 秒 | 0.83 秒 | 1.18 秒 |
| L5 | 1,460 | 0.55 秒 | 0.74 秒 | 1.04 秒 |
| Q6 / Q8 | 2,210 | 0.60 秒 | 0.81 秒 | 1.15 秒 |
| T2 / Y6 | 1,790 | 0.64 秒 | 0.88 秒 | 1.27 秒 |
コールドスタートとは、ユーザーが電源ボタンを押してから、最初の本の最初の単語(ダイアクリティカルマークを含む)が画面に正しく描画されるまでの時間と定義しています。 p99を超えるユニットは、NORブートパーティションの保証交換対象としてフラグ付けされます。
11.2 言語別単語検索レイテンシ
すべての単語検索を bidi.lookup トレースポイント経由でサンプリングしています。 下記の表は30分間の読書セッションにおける平均値を示しています。
| 言語 | p50 | p95 | p99 |
|---|---|---|---|
| アラビア語 (ar-SA、ar-AE) | 4.6 ms | 7.1 ms | 12.4 ms |
| ヘブライ語 (he-IL) | 4.2 ms | 6.6 ms | 11.0 ms |
| ウルドゥー語 (ur-PK) | 5.1 ms | 7.8 ms | 13.6 ms |
| ペルシア語 (fa-IR) | 4.9 ms | 7.5 ms | 13.1 ms |
| パシュト語 (ps-AF) | 6.3 ms | 9.4 ms | 16.2 ms |
| シンディ語 (sd-IN) | 6.7 ms | 9.9 ms | 17.0 ms |
| ディベヒ語 (dvu-NP) | 7.4 ms | 10.8 ms | 18.5 ms |
パシュト語、シンディ語、ディベヒ語のレイテンシが右側の裾に分布しているのは、各辞書の語彙数がリソースが潤沢なアラビア語パックと比べて 18〜34% 小さいためです。これによりレマ索引のキャッシュ局所性が低下しています。当社では 4.x 系ファームウェアでこれら 3 言語を重点対象とし、専用のプレフィックス圧縮方式を実装することで p99 を 13 ms 未満に短縮する計画を立てています。
11.3 RTL2 連続使用時のバッテリーコスト
240 台(モデルファミリーごとに 60 台)に直列電流 shunt を装着し、児童が毎分 40 語を読む条件を模した 60 分連続タップ合成試験を実施しました。結果は、アイドル基準値に対する平均消費電流の増加分です。
| モデル | アイドル基準 | RTL2稼働中 | 差分 |
|---|---|---|---|
| F8 | 38 mA | 39.1 mA | +1.1 mA |
| K7 / KF1 | 41 mA | 42.2 mA | +1.2 mA |
| L5 | 36 mA | 37.0 mA | +1.0 mA |
| Q6 / Q8 | 39 mA | 40.0 mA | +1.0 mA |
| T2 / Y6 | 33 mA | 34.0 mA | +1.0 mA |
700 mAh の B1 セルでは +1.1 mA は稼働時間の 5% 短縮に相当します。2500 mAh の T2 セルでは計測ノイズ以下です。これが、RTL2 が完全に検証された後でも B1、B2、P2 を従来型の RTL エンジンに留め置く工学的根拠です。
11.4 市場で報告されているレンダリング不良カテゴリ
出荷台数 47,000 台超のうち、RTL2 採用機の市場返品率 0.21% は 4 つのカテゴリに分類されます。これらを理解することで、ディストリビューターは自社の入荷検査スクリプトを構築できます。
- Lam-Alef 基準位置のずれ(0.06%)— 56 px のカットサイズでのみ視認可能で、v3.0.x のシェーピングテーブルで GPOS マークが欠落していたことが原因です。v3.1.0 で修正済み。
- ダイアクリティカルスタックのクリッピング(0.05%)— 4 文字を超える kasra + shadda + fatha の組み合わせでグリフ上端がクリッピングされます。v3.1.2 でラインボックス指標を引き上げて修正済み。
- 複数スクリプト混在見出しにおける双方向数字並び(0.04%)— まれに発生。OID 書籍が独自フォントで組版され、
方向GSUB 機能が欠落している場合にのみ起こります。コンテンツ取り込み時に書籍が拒否されます。 - シェーピングキャッシュミス時のハング(0.06%)— ディベヒ語とシンディ語で初回タップ遅延が 800 ms を超えます。v3.2.0 で起動時にキャッシュをウォームアップする対策を実装済み。
これら 4 カテゴリはすべて修正版を出荷済みであり、第 7 節の 30 秒チェックリストで検出可能です。