Skip to content

v0.2.0 — 端末で漢字かな交じり文を扱う(⚠️ 実機未検証)

Choose a tag to compare

@ayutaz ayutaz released this 31 Aug 15:17
· 111 commits to main since this release

2026-09-01

ESP32-S3漢字かな交じり文をそのまま受け取って喋る firmware を追加した。
これまでは「ひらがな + アクセント記号」に変換したものをホスト側で作る必要があった。

かな> !今日は良い天気ですね。
形態素 7 個 / ids 53 個

⚠️ モデルは v0.1.1 と bit 同一

再学習していない。 saanotts-jp-v3-stage4.pt の SHA-256 は v0.1.1 と同じ
4724bcf8a37a3c1518cc0219c1c515c6e8907410494459c91ff1c56f195890b5)。

漢字対応は入力経路(firmware + 辞書)だけの話で、モデルの入力は
以前と同じ 57 トークンの音素ID列。同じ文なら同じ ids になり、
同じ音が出る
(QEMU で bit 一致を確認済み)。

したがって v0.1.1 の重みがそのまま使える。

⚠️ 当初は「重みを再配布しない」としたが、撤回した(2026-09-01)。
releases/latest が v0.2.0 になった時点で、README が案内する
ダウンロードリンク 5 本が全部 404 相当になった
(C-052)。
bit 同一のバイト列を v0.2.0 にも置くほうが、読者に
「latest ではなく 1 つ前のタグへ行け」と説明させるより安い。

v0.1.1 から持ってきた 8 本は SHA-256 を突き合わせて bit 同一を確認してある。

何が入っているか(15 本。latest だけで完結する

資産 サイズ 中身
esp32s3-firmware-kanji-16mb.bin 16,777,216 B 漢字を読む 16 MB イメージ(app + model + dict)。焼くだけ
esp32s3-firmware-w8a8-pie.bin 2,806,624 B かな入力・W8A8 + PIE(8 MB 以上)。焼くだけ。速度の本命
esp32s3-firmware-w8a32.bin 2,806,624 B かな入力・最適化なし。PIE の比較対照
k1-dict-438750.bin 13,702,320 B 辞書 blob 単体(ソースからビルドする人向け)
saanotts-jp-v3-stage4.pt 2,744,874 B PyTorch の重み。⚠️ v0.1.1 と bit 同一
saanotts-jp-v3-samples.zip 709,476 B 合成音の WAV
saanotts-jp-v3-int8.bin 643,936 B C99 コア用の int8 blob(マイコンに載るのはこれ)
saanotts-jp-v3-fp32.bin 2,249,792 B 参照・デバッグ用の fp32 blob
golden-v3-int8.bin / golden-v3-fp32.bin 各 779,584 B make -C csrc golden 用の参照出力
NOTICE.txt / NOTICE-openjtalk.txt / NOTICE-dictionary.txt 第三者コードと辞書の帰属表示
MODEL_CARD.md / LICENSE-MODEL.md 既知の制約とモデルのライセンス
SHA256SUMS.txt 全 15 本のハッシュ⚠️ 自分自身の行は入れていない(自己参照は検証できない。v0.2.0 の初版は入れていて必ず FAILED になった)

焼きかた

⚠️ N16R8(16 MB flash)が必須。 8 MB のボードには辞書が載らない。

esptool.py --chip esp32s3 -p /dev/tty.usbmodemXXXX write_flash 0x0 \
    esp32s3-firmware-kanji-16mb.bin

! を前置した行が漢字かな交じり文として扱われる。! 無しは従来どおり
かな中間表現。

⚠️ このイメージは PIE 無効(W8A32)でビルドしてある。
PIE の効果を測るなら v0.1.1 の esp32s3-firmware-w8a8-pie.bin
esp32s3-firmware-w8a32.bin を比べること。
漢字版で知りたいのは「G2P に何 ms かかるか」の方。

かな入力のファームを焼く場合(8 MB ボード)

esptool.py --chip esp32s3 -p /dev/tty.usbmodemXXXX write_flash 0x0 \
    esp32s3-firmware-w8a8-pie.bin

w8a8-piew8a32 を両方焼いて 定常 xRT を比べるのが、
このプロジェクトで一番知りたい測定である。

測ってあること

MeCab との一致(辞書 + Viterbi + 未知語) 1,977 / 1,977 文
アクセント規則 4 段(Python 版との一致) 2,333 / 2,333 文
NJD チェーン(ホストとの一致) 635 / 635 文
ラベル → 音素ID(ホストとの一致) 298 / 298 文
1 文あたりのピーク RAM 104,589 B
app 361,392 B / 2 MB(17.2%)
dict 13,702,320 B / 13,828,096 B(99.1%)
起動直後の内部 DRAM 空き 54,232 B

枝刈りの代償(フル辞書との差):

ホストと違う音素 0.32%(n=298)
SCOREQ の差(音の品質) −0.0019 [CI が 0 を跨ぐ]

枝刈りは音を汚さない。変えるのは読みだけ。
上毛(コーゲ)が (ジョー)+ のように切り直される。
地名と固有名詞で起きやすい。

⚠️ できていないこと

  • 実機で一度も動かしていない。 QEMU で起動・辞書・錨の照合までしか
    確認していない(I2S を有効にすると QEMU では合成が走らない)
  • 速度を誰も測っていない。 QEMU はサイクル精度ではない
  • 漢字経路の音を聴いた人が 1 人もいない
  • ホスト既定の後処理 3 段が載っていない(ONNX の「何」推定 / Sudachi /
    踊り字)。中間表現で 2.00% の文が食い違い、エントリ数を上げても埋まらない

実機を持っている方への依頼は
esp32/TESTING.md

ライセンス

  • コードとドキュメント: MIT
  • モデルの重み: LICENSE-MODEL.md(v0.1.1 のものを使う)
  • Open JTalk 34 ファイル: 修正 BSD(Nagoya Institute of Technology / HTS Working Group)
  • 辞書: 修正 BSD(NAIST + The UniDic Consortium)。TTS 用に枝刈り・形式変換した派生物

⚠️ 教師コーパスのライセンス検証は未完了MODEL_CARD.md)。