B1 B2 F8 K7 KF1 L5 P2 Q6 Q8 T2 Y6 読み上げペンファームウェアにおけるRTLとRTL2の双方向レイアウト、フォントシェイピング、ストレージ構成、署名処理に関する技術解説。

公開日: 12月 01, 2022 - 28 閲覧数

RTLとRTL2の言語パックアーキテクチャ:B1 B2 F8 K7 KF1 L5 P2 Q6 Q8 T2 Y6 読み上げペンファームウェアにおける右から左へ書記システムの設計手法

対象となるユーザー: この記事は、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に合わせて選定してください。

Engine footprint comparison (RTL vs RTL2)

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 チームがサンプル承認前に適格性を確認するチェックリストと同じものです。

  1. エンジン バージョン — 設定 → について → エンジン を開いてご確認ください。F8/K7/KF1/L5/Q6/Q8/T2/Y6 では RTL2-3.x と表示されている必要があります。B1/B2/P2 は RTL-2.x.
  2. と表示される場合があります。 — 「كتاب」をタップしてください。文字が正しく接続されること(kaaf、beh は語末形、alef も連結)を確認します。4 文字が分離して見える場合は、RTL2 が有効になっていません。
  3. Lam-Alef テスト — 「لا」をタップしてください。2 文字が積重なりではなく、ベースラインを備えた 1 グリフとして表示される必要があります。
  4. 混在方向テスト — 「الدرس 3」をタップしてください。数字は RTL 段落内でも LTR にレンダリングされ、視覚的順序が「الدرس 3」となる必要があります。
  5. 数字形テスト — 設定 → 表示 で「アラビア・インド数字」へ切り替えてください。数字 ٠-٩ が正しい字形で表示される必要があります。
  6. 公開サブキー 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は両方のエンジンを搭載しており、バイリンガル運用(例: アラビア語+ウルドゥー語)を行うバイヤー向けです。

Language pack coverage per SKU (n = 11)

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 秒チェックリストで検出可能です。

関連読み物

見積もり依頼 — 工場からの迅速回答

Frequently Asked Questions

2026年にRTL2双方向エンジンを搭載している読み取りペンのモデルはどれですか?
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)はいずれもRTL2を標準搭載しています。B1、B2(2.4.7)、P2(2.0.3)は4MBのNORフラッシュと700〜800mAhのバッテリーでは、852KBのエンジンと1.12MBのWOFF2フォントサブセットを追加するとコンテンツスロットを1つ失うため、レガシーRTLエンジンの搭載を継続しています。
読み取りペンにおける各RTL2言語パックのフラッシュ消費量はどのくらいですか?
RTL2言語パックはフラッシュ上で1.97MBを消費し、そのうち852KBがエンジン本体、1.12MBが4つのカットサイズ(24/32/40/56px)に対応するWOFF2フォントサブセット、24KBがマニフェストと署名であり、残りの領域は辞書パッチ用に確保されています。レガシーRTLパックは同じコンテンツに対して0.54MBを消費します。
ディストリビューターがカスタム言語パックを自己署名できますか?
できません。すべての言語パックは弊社工場のHSMをルートとするEd25519サブキーで署名されており、ブートローダーはマウントから38ms後に未署名のバンドルを拒否します。ディストリビューターは地域限定のサブキーを480ドル(一回限り)でリクエストでき、これによりデバイスを工場に返却せずに辞書更新への再署名が可能になります。
RTL2エンジンはアラビア・インディアン数字に対応していますか?
はい。ユーザーは「設定」→「表示」から段落ごとに数字の形状を切り替えられ、ASCII(0–9)、アラビア・インディアン(٠-٩)、東アラビア・インディアン(۰-۹)から選択できます。選択はブック単位で保持され、OIDブックのメタデータに記録されるため、同じタイトル内で異なる数字形状が混在することはありません。
出荷済みアラビア語OIDブックにおけるRTL2とRTLの不具合率はどの程度ですか?
2023年以降の出荷ペン47,000台以上とファームウェア86リリース全体で、RTL2搭載機はレンダリング不具合による現場返品率が0.21%、レガシーRTL搭載機は1.34%です。この差はほぼ全て、ダイアクリティカルが多いタイトルにおける文脈依存形の欠落に起因しており、RTL2はOpenType GSUB/GPOSのフルシェーピングによってこの問題を解決しています。
カート
当サイトの体験を改善するために、クッキーを許可してください。 クッキー利用.policy
Chat on WhatsApp