v0.1.0 — 559 K パラメータ日本語 TTS の初回リリース
⚠️ これは古いリリースです。v0.1.1 を見てください。
モデルは v0.1.1 と bit 同一ですが、下の「使い方」は v0.1.1 で訂正されており、
v0.1.1 には焼くだけの ESP32 firmware が付いています。
559,008 パラメータの日本語 TTS。 arXiv:2608.21378
"sanoTTS" の蒸留レシピを日本語に適用した独立再実装の最初のリリースです。
教師は piper-plus (MB-iSTFT-VITS2)。
⚠️ 先に読んでください
| ライセンスはコードとモデルで違う | コードは MIT、モデルの重みは MIT ではありません → LICENSE-MODEL.md |
| 実機で動かしたことがありません | ESP32-S3 のボードが手元に無く、速度を一度も測っていない。C99 コアはホストと QEMU でしか走っていません |
| これは検証 (PoC) です | 製品品質ではありません。既知の制約は MODEL_CARD.md |
| 漢字は入力できません | 端末は「ひらがな + アクセント記号」を受け取ります。漢字→かなはホスト側でオフラインに行います |
📜 ライセンス — 重みは MIT ではありません
| 対象 | ライセンス |
|---|---|
| リポジトリのコードとドキュメント | MIT |
| このリリースで配布する重み・ブロブ・サンプル音声 | LICENSE-MODEL.md(LicenseRef-sanoTTS-jp-Model-1.0) |
なぜ分けたか。 MIT は「無制限に (without restriction)」の利用を認めます。
しかしこの重みはつくよみちゃんコーパスを素材に含む教師からの蒸留物で、
そのコーパスの条件は 帰属表示を必須とし、出力の用途に禁止事項を課し、
その義務が再配布を受けた側にも伝播すると定めています。
MIT を名乗ることは、こちらが持っていない権利を持っているかのように宣言することに
なるため、重みだけを別条件にしました。
できること
✅ 使用(商用を含む)/ ✅ 改変・派生物の作成 / ✅ 再配布・サブライセンス — 無償
必ず守ること(2 つ。下流にも伝播します)
1. 帰属表示を配布物に同梱する — NOTICE.txt をそのまま入れてください。
本ソフトウェアの音声合成には、フリー素材キャラクター「つくよみちゃん」
(© 夢前黎)が無料公開している音声データを使用しています。
https://tyc.rei-yumesaki.net/material/corpus/
(全文は NOTICE.txt。MOE-Speech / Common Voice / ROHAN4600 / ITA / JSUT /
piper-plus の表示も含まれます。1 行でも欠けると違反になります)
2. 生成音声を次の用途に使わない
❌ 個人・団体への攻撃、批判 / ❌ 政治・宗教上の主張 / ❌ アダルト用途 /
❌ 素材としての再配布(生成音声を「音声素材集」として配ること)
一次ソース: https://tyc.rei-yumesaki.net/material/corpus/
⚠️ 隠さずに書く既知のリスク
蒸留に使ったテキストのうち JSUT ver1.1 の 6,472 行は CC-BY-SA-4.0(継承付き)です。
「学習済みモデルは学習テキストの二次的著作物」という立場を取られた場合、
継承が重みに及ぶ可能性があります。日本の著作権法 30 条の 4 により学習自体が許され、
コーパス本文も再配布していないため実務上この立場が通る公算は低いと判断しましたが、
リスクはゼロではありません。
📦 成果物
| ファイル | サイズ | 中身 |
|---|---|---|
saanotts-jp-v3-stage4.pt |
2.7 MB | PyTorch checkpoint(fp32)。Python から推論・追加学習 |
saanotts-jp-v3-int8.bin |
643,936 B | C99 コア用 int8 ブロブ。マイコンに載せるのはこれ |
saanotts-jp-v3-fp32.bin |
2,249,792 B | 同 fp32 版(参照・デバッグ用) |
golden-v3-int8.bin / golden-v3-fp32.bin |
各 779,584 B | 移植を検証するゴールデン中間出力 |
saanotts-jp-v3-samples.zip |
709 KB | 合成音声サンプル 8 本(22.05 kHz / 21.5 秒) |
NOTICE.txt |
— | 必須の帰属表示(配布物に同梱すること) |
LICENSE-MODEL.md / MODEL_CARD.md |
— | ライセンス全文 / モデルカード |
SHA256SUMS.txt |
— | 上記すべての SHA-256 |
すべて runs/v3/stage4.pt(Stage 3 = 80,000 step)から生成しました。
csrc/export_i8.json / csrc/export.json に生成元 ckpt と SHA-256 が記録してあります。
📊 品質(held-out 24 文・すべて予測器スコア)
| 指標 | 生徒 | 教師 | 教師比 |
|---|---|---|---|
| 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 [−0.031, +0.087] p=0.31(有意差なし) |
| アクセント符号一致 | 37/37 = 1.000 | — | CI95 [1.000, 1.000] |
参考: 論文が報告する英語 embedded tier の SCOREQ 教師比は 0.5427。
int8 化のコスト(fp32 経路に対する SNR、n=24): 平均 28.11 dB / 最小 25.72 dB。
⚠️ この数字の読み方
- 絶対値を英語のモデルと比べないでください。 SCOREQ も UTMOS も DNSMOS も
日本語で較正されていません。日本語では実人間の音声ですら SCOREQ 2.4983 /
UTMOS 2.3047 しか出ません。論文自身も言語をまたいだ絶対値比較はできないと明言しています - 「教師比 0.64」は「教師の音を 100 としたとき 64」ではありません。
較正されていない予測器のスコアの比です ⚠️ 人による評価は 1 名の少数試行しかしていません。
v2 → v3 の指標上の改善は、盲検 A/B 7 試行で 1 度も聴き分けられませんでした。
「指標が向上した」と「人が良いと感じた」は別です
🧠 メモリと速度
| 実行時 RAM(ストリーミング版) | 197 KB(ESP32-S3 の SRAM 512 KB の 38%) |
| 重み(int8、flash) | 643,936 B |
| 速度 |
fp32 のまま移植すると 2.47× 実時間(間に合わない)という外挿値があります。
int8 + PIE(ESP32-S3 の SIMD)カーネルは実装済みで、QEMU 上でスカラ実装と
bit 完全一致することを確認しました(MAC の 99.40% を被覆)。
残っているのは実機でのサイクル実測だけです。
🔧 使い方
# ✗ 2 か所で失敗する
git clone https://github.com/ayutaz/sanoTTS-jp.git && cd sanoTTS-jp && uv sync
uv run python scripts/synthesize_student.py \
--ckpt saanotts-jp-v3-stage4.pt --text "今日は良い天気ですね。" --out out/uv syncが通らない —pyproject.tomlの[tool.uv.sources]が piper-plus への
絶対パスを指しているので、向け直すまでerror: Distribution not found at: file://...--text(漢字)は教師 ckpt を要求する — 音素 ID を教師のphoneme_id_map経由で
組むため。教師は private リポジトリにあるので、リリースだけでは使えない
正しい手順(piper-plus も教師も要らない。新規 clone で実測 = M-65):
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/uv sync は使わない。 生徒の推論に要るのは torch / numpy / soundfile だけで、
uv sync は piper-plus への path 依存を解決しようとして落ちる。
[ 上昇 / ] 下降核 / # 句境界 / ° 無声化。
漢字混じり文からの変換(scripts/to_intermediate.py)には OpenJTalk が要るので、
piper-plus のクローンが必要(教師 ckpt は不要)。
--intermediate と --text は同じ入力に対して WAV がバイト単位で一致する
(教師がある環境で確認済み。M-64)。
C99 コアの移植を検証する場合は golden-v3-*.bin を突き合わせてください
(make -C csrc all-test が実装例)。
🐛 このリリースで訂正した数値
生徒側だけ前後 0.3 秒のパディング無しの音声を、パディング済みの教師と
突き合わせていました。SCOREQ / DNSMOS はどちらも前後の無音に反応するため、
生徒だけが下駄を履いていました。
| 指標 | 誤(記録) | 正(前処理を揃えて測り直し) |
|---|---|---|
| SCOREQ 教師比 | 0.6613 | 0.6444 |
| DNSMOS OVRL 教師比 | 0.8385 | 0.7969 |
| かな CER(教師との差) | +0.0034 | +0.0320 |
アクセント(37/37)と int8 SNR(28.11 / 25.72 dB)は別経路なので影響を受けていません。
配布するモデルを選ぶ判断は変わりません — v3 は SCOREQ (+0.0653 [+0.022, +0.108]) と
DNSMOS (+0.0660 [+0.006, +0.124]) で v2 より有意に良く、アクセントと int8 SNR でも
上回り、CER で悪化していません。論文の英語比 0.5427 を上回る点も維持されます。
実際の差は +0.0320 で、v2 (+0.0425) からの改善は
−0.0105 [−0.037, +0.018] = 検出できません。
再現とゲート:
uv run --extra eval python scripts/release_metrics.py --out reports/release_v0.1.0(G1 が「比較する全セットが同じ長さの先頭無音を持つ」ことを検査し、
無パディングの陽性対照が落ちることまで確認します)
一次データ: docs/measurements.md(全項目に再現コマンド付き)
決定と訂正履歴: docs/decisions.md
SHA-256
MODEL_CARD.md の行だけ古い値 (6d9be727…) を載せていました
(差し替え前のファイルのハッシュ。2026-08-30 に訂正)。
配布物そのものと SHA256SUMS.txt は最初から下の値で正しいので、
shasum -a 256 -c SHA256SUMS.txt は通ります。
4724bcf8a37a3c1518cc0219c1c515c6e8907410494459c91ff1c56f195890b5 saanotts-jp-v3-stage4.pt
c3b89216133fa7bee3f61ed9d8e6c7183a5dfd41b70dab194f42c20fce5b4170 saanotts-jp-v3-int8.bin
dae6303c1105845aeedabc5141aa811f9d5de02f63d7af4188fb82e6cbe5298e saanotts-jp-v3-fp32.bin
02641b6ea7ca2d44b99a5c205603a642a382162bc1ff3c74834ba4b07f5134bf golden-v3-int8.bin
b833f7025cf4dff8318847e9c5a620316bbbda3cb4f539baa112aa85eaf3ca81 golden-v3-fp32.bin
4991c8b532e29be182c7c190db393dd38bb0612053281adaf859569e7321f10c saanotts-jp-v3-samples.zip
0b8681feeda97fc16ae99c57c3e7f2f818309c33aa03310242185bb7f1a6bda1 NOTICE.txt
51d0fec9f4e5a63a21ef5f493bcc900d73ed9efa927dc57d07893a8e7f207e07 LICENSE-MODEL.md
b80ea4a36c38b3d83e400d9570176041f70c1f681bd553e8cd71b7e3c47e66cc MODEL_CARD.md