Skip to content

v0.1.1 — 重みだけで音が出せるようになった / 焼くだけの ESP32 firmware

Choose a tag to compare

@ayutaz ayutaz released this 30 Aug 03:53
· 153 commits to main since this release

モデルは v0.1.0 と 1 バイトも変わっていません。
変わったのは「実際に動かせるかどうか」の方です。

重み・ブロブ・サンプル v0.1.0 と bit 同一(SHA-256 で確認)。再学習していません
変わったもの 端末での自由入力 / 重みだけで合成できる経路 / 焼くだけの firmware / 動かなかった手順の訂正

🔴 v0.1.0 の手順は動きませんでした(訂正)

公開した「使い方」が 2 行とも、リリースだけを落とした人には通りませんでした。

# 何が起きたか
1 uv sync が失敗するpyproject.toml の path 依存が piper-plus への絶対パスだった
2 --text(漢字)は教師 ckpt を要求する — 教師は private リポジトリにあり、外の人には原理的に実行できない

手元には piper-plus も教師も揃っているので、書いたコマンドがそのまま通ってしまっていました。
「自分の環境で動いた」は「読者の環境で動く」ではない、という当たり前を踏みました。

⚠️ MODEL_CARD.md の SHA-256 も、Release 本文だけ差し替え前の値を載せていました
(配布物と SHA256SUMS.txt は正しかったので shasum -c は通っていました)。

✅ 重みだけで音が出せるようになりました

piper-plus も教師 ckpt も要りません。 新規 clone で実測しました。

git clone https://github.com/ayutaz/sanoTTS-jp.git && cd sanoTTS-jp
uv venv && uv pip install "torch>=2.11" "numpy<2.5" "soundfile>=0.14"

uv run --no-project python scripts/synthesize_student.py \
    --ckpt saanotts-jp-v3-stage4.pt \
    --intermediate "きょ][おわよ][いて][んきです°ね" --out out/
#   → out/cli_000.wav(22.05 kHz / 1.2 秒)「今日は良い天気ですね。」

⚠️ uv sync は使わないでください(piper-plus を要求します)。
生徒の推論に要るのは torch / numpy / soundfile の 3 つだけです。

できるようにした中身:

  • --intermediate — かな中間表現を直接受ける。教師 ckpt を 1 バイトも読まず、
    教師経路(--text)と WAV がバイト単位で一致します
  • csrc/g2p_table.json — かな→音素のテーブルを凍結。OpenJTalk が要らない
    読むたびに SHA-256 を検証し、piper-plus がある環境では live 表と全 195 件を突き合わせます

⚠️ 漢字→かなの変換scripts/to_intermediate.py)には引き続き piper-plus が要ります。
かなを直接書くなら不要です。

🔊 ESP32-S3 でかなを自由入力できるようになりました

それまでのファームはビルド時に焼き込んだ 1 文しか喋れませんでした

かな> こんにちわ
かな> きょ][おわよ][いて][んきです°ね
  • 行編集は 369 B(csrc/line.c)。UTF-8 対応の BS / CRLF / ESC の吸い込み / 溢れ検出
    ⚠️ 矢印キーの ESC [ A[ は中間表現では上昇アクセントです。
    吸わないとカーソルを動かしただけでエラーも出さずに抑揚が変わります
  • コンソールは UART0 でも USB Serial/JTAG でも動きます
  • 漢字・カタカナ・句読点は位置と文字を出して拒否します(黙って無音にしません)

QEMU の UART に実際に打ち込み、基準の 1 行から起動時と同じ checksum
0x04de91103a0e49f9)が出ることを確認しました。

📦 新しい成果物: 焼くだけの firmware

ESP-IDF を入れなくても実機で試せます。esptool だけで焼けます。

ファイル 中身
esp32s3-firmware-w8a8-pie.bin W8A8 + PIE(ESP32-S3 の整数 SIMD)。★ こちらが本命
esp32s3-firmware-w8a32.bin 最適化なし(移植可能 C)。比較用
pip install esptool
esptool.py --chip esp32s3 -p <ポート> write_flash 0x0 esp32s3-firmware-w8a8-pie.bin
# 115200 baud のシリアル端末で開く(screen / minicom / PuTTY など)

bootloader + パーティション表 + アプリ + 重み blob が全部入っています
(offset 0x0 から 2.8 MB)。8 MB 以上の flash が要ります。

⚠️ I2S の GPIO は BCLK=5 / WS=6 / DOUT=7 の仮置きです。DAC を鳴らすなら
自分の配線に合わせてソースから作り直してください。
速度の測定だけなら DAC は不要です。

⚠️ 実機では一度も動かしていません。 QEMU で「起動 → 重み 183 tensors →
G2P が錨と一致 → プロンプト」までは確認しましたが、QEMU はサイクル精度ではないので
速度は測れません。

🙏 ESP32-S3 をお持ちの方へ — 残っている未検証項目は速度だけです。
15〜30 分で決着します。手順は
esp32/TESTING.md
⚠️ v0.1.0 時点の手順書には欠陥が 2 件あり(1 行目の set-target が落ちる /
USB ポート切り替えが黙って無視される)、新規 clone でなぞって直しました。

📊 品質(v0.1.0 から変更なし)

指標 生徒 教師 教師比
SCOREQ synthetic/nr 1.2716 1.9732 0.6444 [0.6044, 0.6843]
DNSMOS OVRL 2.1730 2.7270 0.7969 [0.7756, 0.8173]
かな CER 0.1671 0.1351 +0.0320(p=0.31、有意差なし
アクセント符号一致 37/37 = 1.000

⚠️ 絶対値を英語のモデルと比べないでください。 日本語では実人間の音声ですら
SCOREQ 2.4983 / UTMOS 2.3047
しか出ません。
⚠️ 人による評価は 1 名の少数試行のみです。

📜 ライセンス(変更なし)

対象 ライセンス
リポジトリのコードとドキュメント MIT
重み・ブロブ・サンプル・firmware イメージ LICENSE-MODEL.md

⚠️ firmware イメージには重みが入っています。 再配布するなら NOTICE.txt
帰属表示を同梱し、出力の用途制限(個人攻撃 / 政治・宗教の主張 / アダルト /
素材としての再配布は不可)が下流にも伝播します。


一次データ: docs/measurements.md の M-63〜M-66
決定と訂正履歴: docs/decisions.md の D-040 / D-041 / C-039〜C-041

SHA-256

3ba8fdd7600fac8f450255435c7a837910506b319938d3821b5852251a786ea7  esp32s3-firmware-w8a32.bin
f18b0523345ead8787fe2fe89104de776aac8a2c9dd916285ab9a84ed6e67ef9  esp32s3-firmware-w8a8-pie.bin
b833f7025cf4dff8318847e9c5a620316bbbda3cb4f539baa112aa85eaf3ca81  golden-v3-fp32.bin
02641b6ea7ca2d44b99a5c205603a642a382162bc1ff3c74834ba4b07f5134bf  golden-v3-int8.bin
82a16adad61837d5d2d8cfb1e0305bf5d2d61ce5431a5c0cb0f7938f69995028  LICENSE-MODEL.md
6d0f48a414680c7904fc430e47f79c2d8aec21f24fea6547b823d6926a9f77c6  MODEL_CARD.md
0b8681feeda97fc16ae99c57c3e7f2f818309c33aa03310242185bb7f1a6bda1  NOTICE.txt
dae6303c1105845aeedabc5141aa811f9d5de02f63d7af4188fb82e6cbe5298e  saanotts-jp-v3-fp32.bin
c3b89216133fa7bee3f61ed9d8e6c7183a5dfd41b70dab194f42c20fce5b4170  saanotts-jp-v3-int8.bin
4991c8b532e29be182c7c190db393dd38bb0612053281adaf859569e7321f10c  saanotts-jp-v3-samples.zip
4724bcf8a37a3c1518cc0219c1c515c6e8907410494459c91ff1c56f195890b5  saanotts-jp-v3-stage4.pt