---
title: 「sanoTT-jp」-地元のLLM-LT
tags: 
author: [yousan](https://www.docswell.com/user/yousan)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/3EK9MM3RED.jpg?width=480
description: マイコン(スタックチャン: ESP32-S3)で動く日本語 TTSの開発とリリースについての内容  https://github.com/ayutaz/sanoTTS-jp
published: September 30, 26
canonical: https://www.docswell.com/s/yousan/KL363L-2026-09-30-200354
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/3EK9MM3RED.jpg)

0.000559B
3 – 5 M I N U T E S / LO CA L A I
を $3のマイコンで。
Japanese TTS on ESP32-S3 — sanoTTS-jp
yousan / @ayutaz
1 / 14


# Page. 2

![Page Image](https://bcdn.docswell.com/page/L73WYYGG75.jpg)

ABOUT ME
ようさん
/yousan
GitHub @ayutaz ・ Hugging Face @ayousanz
🎮 Game / Unity
🎙️ Voice &amp; Speech ML
⚡ Local / Edge AI
🎪 Event Organizer
ゲーム開発・個人ゲーム制作
オンデバイス推論
TTS・音声対話
生成AI・技術イベント運営
ゲーム・音声AI・イベントを中心に、いろいろ作ったり運営した
りしています。
Game / Unity × Speech ML × Local AI × Event
2 / 14


# Page. 3

![Page Image](https://bcdn.docswell.com/page/87DK551NJG.jpg)

LLMはローカル。
M OT I VAT I O N
でも「声」はクラウド？
Local
LLM
手元で推論
Voice should be local too.
→
Text
生成された返答
→
Cloud
TTS?
ここだけ外へ
3 / 14


# Page. 4

![Page Image](https://bcdn.docswell.com/page/VJPKGGQNE8.jpg)

ESP32-S3に、どこまで入る？
CONSTRAINTS
ESP32-S3 SoC
512 KB
M5STACK CORES3
internal SRAM
16 MB
240 MHz × 2
INTERNAL RAM / 実機
DIRAM pool
654 KB
INT8 model
211,535 B static
61.9%
8 MB
FLASH / 配置するもの
341,760 B
static DIRAM
Flash
stream arena peak
115,056 B
辞書実サイズ:
external PSRAM
13.7 MB
漢字G2P辞書
13,702,320 B
8 MB PSRAMがあっても、内蔵SRAM 512 KBの制約は消えない。 RAMとFlashの両方を詰める必要がある。
ESP32-S3 / M5Stack CoreS3 / sanoTTS-jp measured values
4 / 14


# Page. 5

![Page Image](https://bcdn.docswell.com/page/2EVV665YEQ.jpg)

作ったもの。
S A N O T T S -J P
559K
654 KB
C99
no malloc
parameters
libm only
sanoTTS-jp
INT8 model
arena based
5 / 14


# Page. 6

![Page Image](https://bcdn.docswell.com/page/57GLNN6WEL.jpg)

大きい教師から、小さい生徒へ。
D I S T I L L AT I O N
Teacher
Students
MB-iSTFT-VITS2。日本語音声の教師として利用。
ESP32-S3に載せるため、3つの小さなネットへ。
piper-plus
teacher → distillation → edge model
559K
6 / 14


# Page. 7

![Page Image](https://bcdn.docswell.com/page/4EQYQQ4QJP.jpg)

3つに分ける。
ARCHITECTURE
Duration
33K params
→
Acoustic
195K params
40-dim latent
→
iSTFT Decoder
331K params
テキスト→波形を1本で覚えさせず、明示的な中間表現を渡す。
33K + 195K + 331K ≈ 559K
7 / 14


# Page. 8

![Page Image](https://bcdn.docswell.com/page/KJ4WNNQY71.jpg)

日本語は、G2Pで詰まる。
J A PA N E S E P R O B L E M
英語圏の前提
文字から音素への変換が比較的軽い。
102 MB
TTS だけ小さくしても終わらない
日本語
漢字の読み・アクセント・無声化など、前処理側の問題が重い。
そのままの辞書はマイコンには重すぎる
8 / 14


# Page. 9

![Page Image](https://bcdn.docswell.com/page/LE1Y55PN7G.jpg)

辞書を、TTS専用にする。
ON-DEVICE G2P
877 B
かな経路の変換テーブル
13.7 MB
漢字辞書
438,750
dictionary entries
漢字かな交じり文をESP32-S3へ直接送るだけで喋れる。
Japanese G2P on device
9 / 14


# Page. 10

![Page Image](https://bcdn.docswell.com/page/GEWG55VMJ2.jpg)

小さいから、
速いと思っていた。
FIRST BENCHMARK
0.926
xRT / first device benchmark
ほぼリアルタイム。でも、狙いは ≤ 0.5。
measure first
10 / 14


# Page. 11

![Page Image](https://bcdn.docswell.com/page/47ZLNN4MJ3.jpg)

MACは、約30%しかない。
PROFILE
MAC — 約30%
量子化 / GELU / tensor lookup / weight copy …
ローカル推論は、パラメータ数 ≠ 実機の速さ。
profiling changed the plan
11 / 14


# Page. 12

![Page Image](https://bcdn.docswell.com/page/YJ6W8835JV.jpg)

モデルではなく、実装を削る。
O P T I M I Z AT I O N
Quantization
活性化周り
→
GELU
ホットパス改善
→
Tensor lookup
毎stepの探索削減
→
Weight copy
489 KB/stepを削る
18.38M → 11.66M
cycles / step
cycles / step
same waveform checksum
12 / 14


# Page. 13

![Page Image](https://bcdn.docswell.com/page/GJ5M99LGJ4.jpg)

最終的に。
R E S U LT
before
0.926
xRT
after
→
0.473
xRT
✅ リアルタイム / 波形checksum同一
ESP32-S3 device measurement
13 / 14


# Page. 14

![Page Image](https://bcdn.docswell.com/page/9E2922LD7R.jpg)

実機なしでも、
その場で試せます。
LIVE WEB DEMO
今日は地元のLLM LT会に来ています。
browser
↓
same C99 inference core → WebAssembly
↓
🔊 Japanese speech
Web Demo
ayutaz.github.io/sanoTTS-jp/
ESP32版と同じC99推論コアをWASM化。
Dキーでデモを開く
Web Demo → GitHub Pages / sanoTTS-jp
GitHub: ayutaz/sanoTTS-jp
14 / 14


