KoeAct-JP
日本語の音声から、文字起こしを挟まずに Action JSON(Function Calling)を直接出力する小型モデルです。PC の CPU と ESP32-S3(M5Stack CoreS3)で、クラウドなしに動きます(CoreS3 は音声から Action のピースと p_act までを計算し、棄却の閾値と JSON への変換は接続した PC 側の数行の処理)。
KoeAct-JP maps Japanese speech directly to Action JSON calls for a fixed 11-tool schema, without a transcript in between. It reuses the Ralomi speech encoder (2.05M parameters, upper four blocks fine-tuned) and a 0.54M grammar-constrained decoder, and computes the Action pieces on an ESP32-S3 (the rejection threshold and JSON assembly run on the connected host).
入力音声:「顔を右に45度向けて」
出力 :[{"name":"look","arguments":{"direction":"right","degrees":45}}]
入力音声:「やっぱりライトは消さないで」
出力 :[]
ブラウザで試せるデモ(Hugging Face の Static Space。音声はブラウザの外に出ません):https://huggingface.co/spaces/ayousanz/KoeAct-JP-demo
ベンチマークの要約
比較相手は、同じデータで学習したカスケード(Ralomi の文字起こし → JapaneseTinyAgentLM-kana、B1n)。精度と誤発火は 5 seeds の平均で、このリポジトリの重み(seed 14、test を見る前に val の EM で選んだもの)の値を括弧内に示す。
| 指標 |
KoeAct-JP |
カスケード(B1n) |
条件 |
| EM(Action の完全一致) |
**93.2%**(s14:93.6%) |
83.6% |
合成 test 6,850 件(3,425 文 × clean と雑音、学習にない声) |
| EM、SNR 0 dB |
**88.1%**(s14:88.7%) |
71.1% |
同上の雑音のあるコピー |
| 否定の誤作動率 |
0.05% |
0.60% |
同上 |
| 誤発火(依頼でない連続音声) |
1.57 回/時(s14:1.07) |
1.38 回/時 |
14.02 時間。KoeAct のほうが多い(下の「制限」) |
| PC の処理時間 P50 |
7.1 ms |
16.6 ms |
Apple M1 の CPU、1 スレッド、1 発話(平均 4.75 秒) |
| CoreS3 の発話終了から Action まで P50 |
0.53 秒(実測) |
1.54〜1.67 秒(実測、1 秒区切り)/1.30〜1.44 秒(見積もり、0.4 秒区切り) |
ESP32-S3。カスケードの 0.4 秒区切りは作れないので見積もり |
| パラメータ数 |
2.59M(Ralomi 2.05M+デコーダ 0.54M) |
5.20M(Ralomi 2.05M+JapaneseTinyAgentLM-kana 3.15M) |
|
- 依頼の発話はすべて合成音声で、実際の話者では検証していない。誤発火の評価だけは実録音の非依頼音(MUSAN、FSD50K)を使った(「制限」)
- 数値の根拠は
evidence/(下の「根拠のファイル」)
このリポジトリの中身
| パス |
内容 |
model.safetensors、config.json |
KoeAct-JP(seed 14)の推論に要る全部の重み(Ralomi の入力層と block 1〜4 は公開版のまま、追加学習した block 5〜8、デコーダ)と、棄却の閾値 0.97 |
code/ |
推論のコード(koeact.runtime、Apache-2.0)と requirements.txt。学習と評価のコードは含まない |
cores3/ |
M5Stack CoreS3 用:Ralomi の 0.4 秒区切りの .espdl(W16A16)、デコーダの重み a2_weights.bin(int16)、ファームウェアのソース firmware/ |
baseline/jtalm-kana-b1n/ |
比較相手のカスケードの後段(JapaneseTinyAgentLM-kana 3.15M、seed 0)の重みとトークナイザー |
evidence/ |
Model Card の数値の元になった集計(JSON) |
SHA256SUMS |
全ファイルの SHA256 |
モデル
| 項目 |
内容 |
| 構成 |
Ralomi(8 層の causal DFSMN、2.05M)の layer 4 と、追加学習した block 5〜8 の出力(layer 8)を、文法制約付きのデコーダ(0.54M、2 層の Transformer デコーダ)で Action JSON のピースにする。補助に CTC(Ralomi の分類器)を学習 |
| 学習したパラメータ |
1.57M(デコーダ 0.54M+Ralomi の block 5〜8 と CTC 分類器 1.02M) |
| 入力 |
16 kHz mono の音声 → 40 次元 log-Mel(Ralomi と同じ前処理) |
| 出力 |
スキーマ v1(JapaneseTinyAgentLM と同じ 11 tools、1 発話に 2 コールまで)の Action JSON。対象外の発話と否定は [] |
| 棄却 |
最初のピースが [] でない確率 p_act が閾値未満なら [] にする。閾値は seed ごとに合成 val で固定(対象外の誤発火率 ≤ 2%) |
| 重み |
5 seeds(11〜15)を学習し、公開するのは s14(閾値 0.97)。実機向けには s14 を W16A16 に量子化(.espdl 4.81MB、0.4 秒区切りの逐次処理)、デコーダは行列を int16 にした 1.13MB |
| ライセンス |
Apache-2.0 |
想定する使い方
- 小型ロボット(スタックチャンなど)、ゲームの NPC での、固定スキーマの音声操作(Unity/Godot への組み込みは将来の想定。現状は Python(PyTorch/ONNX)と CoreS3 のファームウェアだけ)
- オンデバイス(PC の CPU、ESP32-S3(M5Stack CoreS3))。API キーもクラウドも不要で、ダウンロードしたあとはオフラインで動く
想定しない使い方
- 自由な語彙の Function Calling(推論時にツールを足すことはできない)
- 安全に関わる機器の操作(誤発火はゼロではない。下の「制限」)
- 話者の識別や、音声の書き起こし
学習データ
| 素材 |
使い方 |
ライセンス |
| JapaneseTinyAgentLM-Action-Synth(rev 6ac72256) |
テキストと Action のラベル |
Apache-2.0 |
| Amazon MASSIVE(ja-JP) |
対象外の発話のテキスト |
CC BY 4.0 |
| プログラムのテンプレート |
数値と否定のテキスト |
(KoeAct のコード) |
| Irodori-TTS VoiceDesign |
合成音声(キャプションで設計した 120 声。実在の人の声は複製していない) |
MIT |
| ReazonSpeech |
学習用の負例(依頼でない話し声、3,000 クリップ) |
CDLA-Sharing-1.0(著作権法 30 条の 4) |
| OpenSLR SLR28 |
残響と雑音の増強、雑音の負例 |
Apache-2.0 |
- テキスト 59,935 文(train 54,500)、合成 158,783 発話(声の数を変えた 4 条件で共有)。最終モデルは 120 声の条件の発話で、品質チェックに通ったものを、そのままのコピーと増強したコピーで学習(107,964 コピー)
- 数値の一部(角度 25/37/75/105/135/165、レベルと増減量 23/47/66/85)は学習に入れず、評価だけに使う
- ReazonSpeech の音声・書き起こし・特徴量、MUSAN と DEMAND の音声、評価専用の FSD50K の音声、JESC と現行の JapaneseTinyAgentLM-Action-3M の重みに由来するものは、この公開物に含まない
- 商用 API の出力は、学習データにも正解ラベルにも使っていない
評価
合成音声(学習にない声、D01 の val 1,975 発話。evidence/e13/gate.json、evidence/b1n_e10/val_score.json)
|
EM(ゲートなし) |
EM(ゲート後、clean) |
EM(ゲート後、増強) |
対象外の誤発火率 |
| KoeAct-JP(5 seeds の平均) |
93.0% |
95.9% |
90.4% |
1.8% |
| 比較:B1n(Ralomi の文字起こし → JapaneseTinyAgentLM-kana 3M、同じデータで学習、5 seeds) |
85.6% |
93.4% |
76.9% |
1.6% |
- 負例(val 600 クリップ)での誤発火:話し声 0〜2/300、雑音と無音 0/300
- 棄却の規則は両者で違う(KoeAct は
p_act で対象外の誤発火率 ≤ 2%、B1n は JapaneseTinyAgentLM の select_gate:min_prob で val の EM の低下 0.5pt 以内)。EM(ゲートなし)は clean と増強の全コピー
- 合成音声での値なので、実際の話者・雑音・距離ではこれより下がる見込み
合成 test(学習にない声、D01 の test 3,425 文 × clean と雑音の 2 コピー。事前登録し、このモデルと比較相手では 1 回だけ評価。同じ test は M2 で別の構成の評価に一度使った)
|
EM(ゲート後、全体) |
clean |
SNR 20 |
10 |
5 |
0 dB |
否定の誤作動率 |
数値の値の正解率(test 全体) |
| KoeAct-JP(5 seeds の平均) |
93.2% |
94.8 |
94.8 |
92.4 |
91.1 |
88.1 |
0.05% |
95.7% |
| 比較:B1n(同上、5 seeds) |
83.6% |
88.1 |
85.9 |
82.9 |
77.2 |
71.1 |
0.60% |
91.8% |
- 数値:学習にない値だけを集めた subset の EM は 89.6% 対 63.5%。上の表の「数値の値の正解率」は、test 全体の数値の引数の値の一致
- 差(KoeAct − B1n):**+9.5pt**(95% 区間 +8.7〜+10.4、テキスト単位の対応 bootstrap)。差の大半は雑音のある条件と、数値・単一の Action。clean の複数動作と言い直しはほぼ同じ
- 評価の方法と基準は、評価の前に事前登録した。集計:
evidence/m3/(verdict.json、bootstrap.json、seed ごとの e13_score.json・b1n_score.json)
誤発火(FA/h:依頼でない連続音声 14.02 時間、MUSAN 1.10 時間と FSD50K の CC0/CC BY 12.93 時間。それぞれ四捨五入)
| 音の種類 |
KoeAct-JP |
B1n |
| 人の声(FSD50K Human_voice、3.83 時間。言語のラベルはなく、日本語以外の話し声や歌が多いと見込まれる) |
4.44 回/時 |
4.28 回/時 |
| 音楽(2.85 時間) |
1.05 |
0.42 |
| 家庭の音(4.14 時間) |
0.14 |
0.14 |
| その他(ペット、足音、プリンターなど、2.10 時間) |
0.6 前後 |
0.3 前後 |
| MUSAN(1.10 時間) |
0 |
0.55 |
| 全体 |
1.57 回/時(seed 別 0.50〜3.42、実機用の s14 は 1.07) |
1.38 回/時 |
- 集計:
evidence/m3/fah_e13.json、fah_b1n.json。事前登録した基準(FA/h が B1n 以下)は満たしていない。音の種類ごとの値は事後の内訳(記述)。凍結した Ralomi に同じ 0.54M のデコーダだけを付けた構成(M2 の案A′、不採用)は 0.34 回/時と少ないが、EM は低い(evidence/m2_stage2/verdict.json)
実音声(参考値:開発者 1 名、24 文)
【録音のあとで記入。話者 1 名なので一般化はできない】
PC での処理時間(Apple M1 の CPU、1 発話ずつ、合成 val 200 発話、平均 4.75 秒)
|
1 スレッド P50/P95 |
4 スレッド P50/P95 |
| KoeAct-JP |
7.1 ms/11.1 ms |
9.5 ms/17.8 ms |
| 比較:B1n(Ralomi の文字起こし → JapaneseTinyAgentLM-kana) |
16.6 ms/28.6 ms |
18.6 ms/33.3 ms |
- 発話全体を受け取ってから出力までの時間で、逐次処理ではない。Ralomi は詰めずに計算する(評価と同じ 15 秒に詰める経路では 30.5 ms 対 38.7 ms)。
evidence/pc_speed/。このリポジトリの koeact.runtime は、前処理なし(--no-clean)ならこの計測の経路と同じ計算で、合成 val の 1,975 発話で出力が全件一致する(evidence/release/verify_val_torch.json)
- 差の大半は後段:KoeAct のデコーダ(block 5〜8 を含めて 5.1 ms)と JapaneseTinyAgentLM-kana(13.7 ms)。どちらも音声の長さの 1% 以下
実機(M5Stack CoreS3、ESP32-S3)
集計:evidence/m4_redo/、evidence/m4/cascade_summary.json。事前登録した基準(遅延 P50 0.7 秒以下・P95 1.0 秒以下、内部 RAM の空き 16KB 以上、PSRAM の追加 2.0MB 以下、PC との一致 99% 以上)をすべて満たした。
| 項目 |
値 |
| Ralomi(W16A16、40 フレーム=0.4 秒ずつの逐次処理) |
.espdl 4.81MB(flash) |
| デコーダの重み(行列は int16+行ごとの縮尺) |
1.13MB(flash、メモリマップ) |
| 実機と PC の Action の一致(合成 val 600 発話) |
**99.5%**、EM の差 +0.5pt |
| 発話終了から Action までの遅延(4 秒の録音、録音中に逐次処理、P50/P95) |
0.53 秒/0.79 秒 |
| 内部 RAM の空き、PSRAM の追加 |
56KB、1.11MB |
| 比較:B1n(Ralomi → JapaneseTinyAgentLM-kana、同じ CoreS3) |
実測(1 秒区切りの公開版 Ralomi)P50 1.54 秒/P95 1.68 秒。40 フレーム区切りの Ralomi での見積もり P50 1.30〜1.44 秒 |
- カスケードの値:1 秒区切りの公開版 Ralomi での実測は P50 1.54 秒。KoeAct と同じ 0.4 秒区切りの Ralomi はカスケード用には作れないので、KoeAct の Ralomi の最後の区切りの実測に JapaneseTinyAgentLM-kana の実測を足した見積もりが P50 1.30〜1.44 秒。この見積もりと比べると、KoeAct の遅延は約 2.5〜2.7 分の 1。別の条件のカスケードの実測は 1.57〜1.67 秒(
evidence/m4/cascade_summary.json)
- 差の大半は後段(KoeAct のデコーダ 0.24 秒、JapaneseTinyAgentLM-kana 約 1.0〜1.2 秒)
- 遅延の音声は Mac のスピーカーから流した合成音声で、実際の話者ではない。最初の計測(float32 のデコーダ、1 秒区切り)は P50 2.52 秒で中止側だった。デコーダの高速化(int16、録音中の逐次 encode)を事前登録してからやり直した
制限
- 固定のスキーマ(11 tools、2 コールまで)だけ。言い回しの外れた依頼や、知らない語彙は
[] になるか、誤った Action になる
- 依頼の発話は、学習も評価も合成音声だけ(学習の負例と誤発火の評価には、実録音の非依頼音(ReazonSpeech、SLR28、MUSAN、FSD50K)を使った)。実際の話者・マイク・部屋の響きでの精度は検証していない(開発者 1 名の録音を参考値として載せる予定だが、任意で、まだ録っていない)。実環境ではこれより下がる見込み
- 人の声で誤発火しやすい:依頼でない連続音声で約 1.6 回/時、人の話し声や歌だけなら約 4.4 回/時。テレビや会話が続く場所では、ウェイクワードやボタンと組み合わせることを勧める。棄却の閾値を上げると減るが、正しい依頼も
[] になりやすくなる
- 否定(「〜しないで」)は合成 test で 99.5%、言い直しは 91.6%(全体の 93.2% よりやや低い)。どちらも実音声では未確認
使い方
PC(Python 3.13 で確認)
hf download ayousanz/KoeAct-JP --local-dir koeact-jp && cd koeact-jp
pip install -r code/requirements.txt
PYTHONPATH=code python -m koeact.runtime --model . a.wav b.wav
PYTHONPATH=code python -m koeact.runtime --model . --mic
import sys
sys.path.insert(0, "code")
from koeact.runtime import KoeAct, load_audio
model = KoeAct.from_dir(".")
r = model(load_audio("a.wav"))
print(r["output"], r["p_act"])
- v0.1.1 から、
koeact.runtime は学習と評価と同じ前処理(音量を −23 dBFS にそろえ、先頭に 0.5 秒、末尾に 0.3 秒の無音を足す)を標準でかけます。切るには --no-clean(Python では model(x, clean=False))を使います。前処理が効く理由:発話が最初のサンプルから始まると、エンコーダが最初の語を取りこぼしやすく、合成 val では前処理なしの入力が約 4.5 pt 低くなります
- 閾値は
config.json の threshold。上げると誤発火は減るが、正しい依頼も [] になりやすい(下の「制限」)
- 入力は 15 秒まで(それより長い部分は使わない)
M5Stack CoreS3(ESP32-S3)
cd cores3/firmware/e05
idf.py -DRALOMI_ESPDL=$PWD/../../ralomi_e13_stream40.espdl \
-DA2_WEIGHTS=$PWD/../../a2_weights.bin build
idf.py -p <port> flash
pip install pyserial
cd ../../.. && PYTHONPATH=code python -m koeact.runtime --model . --serial <port>
- CoreS3 が出すのは Action のピース ID と
p_act まで。閾値と JSON への変換は PC 側(koeact.runtime.from_device_line)
- ファームウェアは Ralomi の CoreS3 ファームウェア(
ayousanz/ralomi の esp32s3/firmware)にデコーダ(cores3/firmware/a2、C)を足したもの。ESP-DL、ESP-DSP、M5Unified、M5GFX は ESP-IDF のコンポーネントマネージャがビルド時に取得する(dependencies.lock で版を固定)
.espdl は完成品だけを配る。作り直すには、公開されていない Ralomi の書き出しツールが要る
比較相手(カスケードの後段)
baseline/jtalm-kana-b1n/ は、JapaneseTinyAgentLM(commit e32b6c15)の 3M 構成の重み(model.safetensors、config.json の model)と、かなの SentencePiece トークナイザー。入力は Ralomi の文字起こし(かな)。評価の比較に使ったもので、KoeAct-JP の推論には要らない
根拠のファイル(evidence/)
| ファイル |
内容 |
m3/verdict.json、m3/bootstrap.json |
合成 test の判定と、差の対応 bootstrap |
m3/e13_score.json、m3/b1n_score.json |
seed ごと・条件ごとの EM、否定、数値 |
m3/fah_e13.json、m3/fah_b1n.json |
誤発火(seed ごと、閾値ごと) |
e13/gate.json、b1n_e10/val_score.json、prereg/M3_thresholds/e13.json |
合成 val の値と、val で固定した閾値 |
m2_stage2/verdict.json |
凍結した Ralomi の構成(案A′)の誤発火 |
e10/data_summary.json |
学習データの件数 |
pc_speed/ |
PC の処理時間 |
m4_redo/、m4/cascade_summary.json |
CoreS3 の遅延・メモリ・PC との一致と、カスケードの実測と見積もり |
release/verify_val_torch.json |
このリポジトリの重みとコードで、評価のときの出力と全件一致すること |
release/fresh_env_check.json |
新しい Python 環境に code/requirements.txt だけを入れ、このリポジトリのファイルだけで同じ 1,975 発話を推論しても全件一致すること |
release/cores3_bundle_check.json |
cores3/firmware からビルドしたファームウェアが、M4 の計測のときの CoreS3 と同じ出力(60 発話)を出すこと |
release/licenses_check.txt |
学習に使った素材のライセンスの機械チェック |
変更履歴
- v0.1.1(2026-10-25):
koeact.runtime が評価と同じ前処理を標準でかけるようにした(--no-clean で v0.1.0 と同じ入力)。重みと、このカードの数値は v0.1.0 のまま
- v0.1.0(2026-10-25):最初の公開
謝辞と帰属
- Ralomi(ayousanz/ralomi、Apache-2.0)、JapaneseTinyAgentLM(Apache-2.0)。帰属の一覧は NOTICE