HN 日本語サマリー

← 一覧へ戻る
プログラミング

Sing-song: 長い数字やキーのための発音可能なエンコーディング

Sing-song: a speakable encoding for long numbers and keys (blog.vrypan.net)

9 pointsby zdw1 コメント

要約

Sing-songは、長い数字やキーを電話越しでも正確に伝えられるように設計された、発音可能なCV(子音-母音)音節ベースのエンコーディング方式です。各音節が6ビットをエンコードし、元のバイト長を維持しながら、ヘキサデシマルなどの機械的なエンコーディングに比べて人間にとって扱いやすいことを目指しています。この方式は、決定論的で可逆的、かつプレフィックス安定性を持ち、オプションでバリアント(XORマスクによる変換)もサポートします。

全文翻訳

これは、Nostrのnpubキー(最後のセクション参照)の決定論的な「ユーザー名」を生成する方法として始まった、楽しい実験です。英語は単純な音節でさえ扱うのが非常に難しいため、結果は私が望むほど良くはありません(電話で他の人に読み上げてもらい、正確に聞き取ってもらえるような文字列)、しかし、それほど悪くもないです――もし誰もがイタリア語を話せたら、Sing-songはもっと価値があるでしょう :-) Sing-song: 長い数字やキーのための発音可能なエンコーディング 状態: ドラフト、v0.1.2 --- コメント歓迎。要約 Sing-songは、任意のバイト文字列を、発音可能なCV音節として可逆的にエンコードする方式です。64音節のアルファベットは、各6ビット値を直接1つの音節にマッピングします。完全なエンコーディングはバイト長と先頭のゼロバイトを保持し、外部の長さメタデータは不要で、標準的です。このエンコーディングはプレフィックス安定性があります:共通の入力プレフィックスは共通の音節プレフィックスを生成します。オプションのバリアント接尾辞は、同じバイト文字列の代替の可逆表現を提供します。動機 ヘックスやBase58のような機械指向のエンコーディングはコンパクトですが、話しにくく、書き取りにくく、覚えにくいです。Sing-songは、書き取り密度を多少犠牲にして、小さく規則的な発音文法を実現しつつ、決定論的、可逆的、計算上シンプルであることを保ちます。設計目標 エンコーディングは、決定論的、可逆的、プレフィックス安定性があり、訓練なしで発音・書き取り可能で、完全なバイト文字列に対して自己サイズ調整され、負荷を担う句読点なしで自己区切り可能であるべきです。エンコーディング アルファベット 位置 記号 数 子音(奇数) b d f g j k l m n p r s t v w z 16 母音(偶数) a i o u 4 子音と母音は厳密に交互になり、クラスターやコーダのない64の開CV音節を生成します。位置の偶奇が記号テーブルを決定します。h、y、eは、それらの発音が比較的不安定なため省略されています。音節とグループ化 各音節は正確に6ビットをエンコードします。表示グループは、化粧的なハイフンで区切られた2つの音節(zila、sibo)を含みます。パーサーはハイフンを無視しなければなりません:zilasibotivajuzuとzila-sibo-tiva-juzuは同一です。グループは自然な発音のチェックポイントを提供します。発音 Sing-songは、すべての文字に固定の発音を使用します。スペルは音素的です:各文字は1つの音を表し、同じ文字は常に同じように発音されます。以下のIPA値が規範的です:文字 a i o u b d f g j k IPA /a/ /i/ /o/ /u/ /b/ /d/ /f/ /ɡ/ /dz/ /k/ 文字 l m n p r s t v z IPA /l/ /m/ /n/ /p/ /r/ /s/ /t/ /v/ /z/ 母音は純粋な母音であり、英語のスペル規則に従って解釈されてはなりません。特に、iは/i/、oは/o/、uは/u/であり、/aɪ/、/oʊ/、または/juː/とは発音されません。各文字は独立して発音されます。無音の文字、二重字、または文脈依存の発音はありません。単語は各子音-母音ペアで音節に分割され、アクセントは最初の音節に置かれます。例:単語 IPA sibo /ˈsi.bo/ katu /ˈka.tu/ pova /ˈpo.va/ 発音における軽微なアクセント依存の違いは、エンコードされた文字が識別可能である限り許容されます。アルゴリズム 入力をビットストリームとして扱い、最上位ビットを最初に6ビットチャンクに分割します。各チャンクは直接1つの音節にマッピングされます:ビット 5..2 → 子音インデックス 0..15 ビット 1..0 → 母音インデックス 0..3 Lバイトの入力に対して、n = ceil(8·L / 6) 音節を出力します。最後のチャンクが6ビット未満の入力ビットを持つ場合、その下位ビットをゼロで埋めます。これらのゼロは標準的なパディングであり、情報を含みません。完全なエンコーディングは自己サイズ調整可能です:L = floor(6·n / 8)。デコーダーは6ビットチャンクを再構築し、Lを推測し、最初の8·Lビットを返します。非標準的な音節数またはゼロ以外のパディングは拒否しなければなりません。先頭のゼロバイトは保持されます。これは完全なエンコーディングに適用されます。切り捨てられたプレフィックスは、それ以上の音節が続くかどうかを示しません。k音節のプレフィックスは、エンコードされた値の最初の6kビットをコミットし、デコーディングではなく再計算によって検証されます。バリアント バリアントは、同じバイト文字列の代替の可逆表現です。バリアント識別子は表現内にエンコードされるため、デコーディングに外部メタデータは不要です。入力Xとバリアントv = 0…15に対して: M(0, n) = 0^n M(v, n) = SHAKE-256("sing-song/variant" ‖ byte(v), n) v > 0 の場合 Y = X XOR M(v, len(X)) 通常のSing-songコーデックでYをエンコードします。XORは自己逆なので: X = Y XOR M(v, len(Y)) マスクは公開されており、機密性を提供しません。SHAKE-256は決定論的なストリームを生成し、前述のプレフィックス安定性プロパティを維持します。バリアント0は直接エンコーディングです。バリアント識別子は、後続の2文字の接尾辞としてレンダリングされます:1つの母音の後にl, m, n, rのいずれか: v = 4·i + j ここで母音 = "aiou"[i]、子音 = "lmnr"[j] 0=al 1=am 2=an 3=ar 4=il 5=im 6=in 7=ir 8=ol 9=om 10=on 11=or 12=ul 13=um 14=un 15=ur バリアント0は接尾辞なしでレンダリングされるべきです;パーサーは明示的なalを同等として受け入れなければなりません。偶奇性により接尾辞が曖昧さを解消します:コンテンツの子音は奇数位置を占めるため、奇数位置の母音はバリアント接尾辞を開始することしかできません。パーサーは正確に2つの後続文字(母音の後にl/m/n/r)を要求し、他の偶奇性の違反を拒否しなければなりません。プレフィックス安定性 各完全な音節は、正確に6つの連続する入力ビットを表します。したがって、2つのバイト文字列が最初の6kビットを共有する場合、それらの直接Sing-songエンコーディングは最初のk音節を共有します。バイトアラインされたプレフィックスの場合、境界は24ビットごと(3バイト = 24ビット = 4音節)にバイト境界と音節境界の両方になります。それらの境界では、エンコーディングの切り捨ては、切り捨てられたバイト文字列のエンコーディングと正確に同等です:SingSong(X)[0:4k音節] = SingSong(X[0:3kバイト]) 同じプロパティがバリアントにも当てはまります。SHAKE-256マスクは出力ストリームとして生成されるため、短いマスクは長いマスクのプレフィックスです:M(v, 3k) = M(v, len(X))[0:3k] したがって: body(SingSong(X, v))[0:4k音節] + suffix(v) = SingSong(X[0:3kバイト], v) プレフィックスが存在する任意のkに対して。バイト境界と音節境界の両方で終了しないプレフィックスの場合、共有された先頭の音節は依然として同じ先頭ビットを表しますが、切り捨てられたテキスト自体はバイト文字列の完全な標準エンコーディングではありません。書き取りとエラー処理 CV文法は基本的な構文チェックを提供します。奇数位置には子音、偶数位置には母音が含まれていなければなりません。対応するアルファベット外の文字は拒否されなければなりません。パーサーは、位置が意図されたシンボルを決定する場合、曖昧でない書き取り置換を正規化してもよいです: 0 → 母音位置のo 1 → 子音位置のl e → 母音位置のi これらの置換は表現エラーのみを修正します。Sing-songには誤り訂正コードやチェックサムは含まれていません:有効な音節が別の有効な音節に置換された場合、エンコーディング自体からは検出できません。検討された代替案 ベース文法は、記録する価値のある3つの代替案を生き残りました。キュレーションされた音節辞書 手作業で選ばれたコードブックは、b/p、d/t、g/k、f/v、s/z、m/n、l/rのような紛らわしい最小ペアを排除し、それらを同等クラスにマージすることができます。約10の開始クラス × 4つの母音 × 3つのコーダクラスで約120の堅牢な音節、または各音節あたり約6.9ビットが得られます:Sing-songより約17%少ない音節で、より良いエラー許容性があります。コストは大きなルックアップテーブル、長い書き取り形式、そして重い閉音節です。例:ban-fok-rim-tus-gal-nom-pik-sur 利点は、単純な生成文法と軽快で開いた響きを失う価値はありませんでした。交互をクラスターなし制約に緩和 CV、VC、CVCを許可し、隣接する子音のみを禁止することで、理論的な容量を2.95ビット/文字から3.32ビット/文字に引き上げます。二重母音を禁止すると、母音の連続が制限され、明確な二重母音(ai、au、oi、ou、ui)のみが許可されると、書き取り長で約3%、話し言葉の密度では実質ゼロの実際の増加が得られます。例:zilai-sibo-tauva-juzu 小さな増加は、偶奇性ルールをオートマトンに置き換える、エラー回復を弱める、そして complic