v0.2.0 — 端末で漢字かな交じり文を扱う(⚠️ 実機未検証)
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 の重みがそのまま使える。
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 の重み。 |
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 本のハッシュ。 |
焼きかた
esptool.py --chip esp32s3 -p /dev/tty.usbmodemXXXX write_flash 0x0 \
esp32s3-firmware-kanji-16mb.bin! を前置した行が漢字かな交じり文として扱われる。! 無しは従来どおり
かな中間表現。
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.binw8a8-pie と w8a32 を両方焼いて 定常 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)。