FastTurn JA
日本語の 4 状態ターン検出モデル。論文 FastTurn (arXiv:2604.01897) を日本語で再現した実装の学習済み重みです。公式実装・公式 checkpoint は公開されていないため、論文の記述から独自に再実装しています。
前世代の easy-turn-ja が VAD の後段に置く再判定器だったのに対し、こちらは VAD 非依存のストリーミング判定を行います。
| 状態 | 意味 | システムの取るべき動作 |
|---|---|---|
| Complete | 話し終わった | 応答を開始する |
| Incomplete | まだ続く | 黙って聞き続ける |
| Backchannel | 相槌(「うん」「へー」) | 自分の発話を止めない |
| Wait | 「ちょっと待ってください」 | 長めに待つ |
位置づけ
音声 (16kHz)
→ Nemotron-3.5-asr-streaming-0.6b (24層 FastConformer, 320ms chunk) ※同梱していません
├─ CTC の途中の文字列 → Qwen3-0.6B (本リポジトリの qwen3/)
└─ 中間 hidden (T, 1024)
├─ LLM Adapter (4層 Transformer, 34M) → adapter.pt
└─ Acoustic Adapter (4層 Transformer)
└→ LLM hidden と融合 → 3層 MLP Turn Detector → unified.pt
エンコーダ(Nemotron)は同梱していません。利用者側で nvidia/nemotron-3.5-asr-streaming-0.6b を取得してください。
ファイルの対応
学習時に使われた組み合わせは meta_unified.json に記録されています(qwen3_ckpt=joint_out_mix/qwen3 / adapter_ckpt=adapter_aug)。
| ファイル | 中身 | 学習時の出所 |
|---|---|---|
unified.pt |
Acoustic Adapter + 3層 MLP Turn Detector | Phase 4.2 Fusion の成果物 |
adapter.pt |
LLM Adapter(4層 Transformer, 34M) | Phase 4.1b の Modality Alignment(adapter_aug) |
qwen3/ |
SFT 済み Qwen3-0.6B | Phase 4.2 mix の Joint(joint_out_mix/qwen3) |
adapter.pt は Modality Alignment 段の重みです。Joint 段でも LLM Adapter は更新されますが、Unified の Fusion 段では Modality Alignment 側を凍結して使う構成で学習・評価しています(llm_adapter_trainable=0)。
性能
評価セット full200(実会話 150 件 + 合成 wait 50 件、clean 条件、n=200)。実会話部分は TalkBank CallHome Japanese の音声で、easy-turn-ja と同一のものを使っています。
| 指標 | 値 |
|---|---|
| Macro-F1 | 0.718 |
| Accuracy | 0.715 |
| C/I Youden J | 0.440 |
| complete F1 | 0.589 |
| incomplete F1 | 0.706 |
| backchannel F1 | 0.727 |
| wait F1 | 0.851 |
| wait recall | 0.740 |
参考: 同一評価セットでの他系統
| 系統 | Macro-F1 | C/I Youden J |
|---|---|---|
| VAD-only (silero, τ=550ms) | 0.150 | 0.10 |
| Cascaded (ASR 文字列のみ) | 0.538 | 0.02 |
| Semantic (音声表現を LLM 入力に) | 0.639 | 0.36 |
| Unified (本モデル) | 0.718 | 0.440 |
| easy-turn-ja (exp11a, 前世代) | 0.810 | 0.46 |
論文が示す積み上がり(VAD-only < Cascaded < Semantic < Unified)は再現していますが、前世代の easy-turn-ja には精度で届いていません。
⚠️ この 0.810 は
full200(200 件)での値です。easy-turn-ja の model card は別の評価セット(824 件)の数値を載せているため、両者を直接引き比べることはできません。
VAD-only との比較
運用時の挙動を、同じ 200 件で比較したものです。
| 話し終わりの取り逃し | 誤って割り込む | 相槌に割り込む | |
|---|---|---|---|
| VAD-only (τ=550ms) | 0.90 | 0.13 | 0.62 |
| Unified (本モデル) | 0.44 | 0.13 | 0.08 |
話し終わりの取り逃しと相槌への割り込みは大きく改善します。一方、誤って割り込む率は VAD-only と同じ 0.13 で、統計的な差は出ていません(McNemar 検定 p=1.0)。
推論性能
| 指標 | 値 |
|---|---|
| end-to-end 遅延 P95 | 110.2ms(エンコーダ 59.6 + 判定器 50.6) |
| 参考: easy-turn-ja | 291ms |
| チャンク処理(エンコーダのみ, median) | 11.8〜16.0ms |
| エンコーダ VRAM(fp32, ピーク) | 5.15GB |
計測は RTX 3090 / RTX 4090 上での実測です。Unified 全体(エンコーダ + LLM + Adapter + Detector)の推論ピーク VRAM は未実測です。
使い方
推論コードは yousan/fast-turn-jp(Apache-2.0)にあります。
git clone https://github.com/yousan/fast-turn-jp
cd fast-turn-jp
uv sync
from scripts.vast.eval_unified import load_unified_detector
detector = load_unified_detector(
unified_ckpt="path/to/fast-turn-ja", # unified.pt があるディレクトリ
adapter_ckpt="path/to/fast-turn-ja", # adapter.pt があるディレクトリ
qwen3_ckpt="path/to/fast-turn-ja/qwen3", # SFT 済み Qwen3-0.6B
device="cuda", dtype="bfloat16",
)
エンコーダの中間 hidden は NeMo の cache-aware streaming から forward hook で取得します(fastturn_ja/encoder/ を参照)。
unified.pt は fusion の構成キーを内部に保持しており、復元時に fusion_config_from_ckpt() を通す必要があります。load_state_dict は strict のままなので、構成を取り違えるとキーの過不足で必ず失敗します(黙って別のモデルになることはありません)。
学習データ
| 出所 | 件数 | ライセンス | 用途 |
|---|---|---|---|
| turn2k v3(LLM 生成の架空台本を Irodori-TTS-500M-v3 で合成) | 1,825 | MIT (TTS) | 学習 |
| J-CHAT(実会話) | 1,841 | CC BY-NC 4.0 | 学習 |
| 合計 | 3,666(学習 3,300 / 検証 366) | ||
| TalkBank CallHome Japanese | 200 | CC BY-NC-SA | 評価のみ。学習には使用していません |
学習時のクラス分布は complete 1,555 / incomplete 1,580 / backchannel 281 / wait 250 です。
学習は論文の 4 段階のうち、ASR 事前学習を除く 3 段階(Modality Alignment / Joint Training / Modality Fusion)を実施しています。
制限事項
利用前に必ずお読みください。
- PoC ラインには到達していません。 受け入れ基準 10 件のうち達成は 5 件です。研究成果として公開しており、製品への組み込みは想定していません
- 前世代の easy-turn-ja に精度で劣ります(同一評価セットで 0.718 対 0.810)。優位なのは遅延のみです(110.2ms 対 291ms)
- この重みは 12 seed の分布のうち上振れした個体です。 同一構成で学習の乱数だけを変えて 12 回学習すると Macro-F1 は平均 0.6664(標準偏差 0.0510)で、本重みの 0.7183 は +1.02σ に位置します。再学習しても同じ数値は再現しません
- 論文の中心的主張(音響融合で最良になる)は検証できていません。 Unified と Semantic の差は 12 seed ずつの比較で +0.019(z=+1.25、判定境界は z≥2)です。否定されたわけではなく、未検証です
- 評価セットが小さく(n=200)、95% 信頼区間は [0.655, 0.775] です。精度に関する指標はほとんど統計的に決着していません
- 評価セットに既知の欠陥があります。 wait とドメインが完全に交絡しており(5〜8kHz の帯域だけで分離 AUC 0.999)、相槌 50 件の異なり表層形は 7 種(86% が「うん」)しかありません
- 前段の ASR が日本語の相槌を中国語・英語として転写することがあります。 評価セットでは出力の 38% が壊れており、相槌 50 件では仮名が 1 文字も出ませんでした(「うん」→「嗯」「Mm.」など)
- 学習・評価に使った実会話は電話品質(8kHz 由来)が中心です。広帯域の音声での挙動は測っていません
- Unified 全体の推論 VRAM は未実測です
ライセンス
CC BY-NC-SA 4.0(研究用・非商用)
学習データに J-CHAT(CC BY-NC 4.0、日本の著作権法第 30 条の 4 の目的に限定して利用)を含むため、商用利用はできません。
- 土台の Qwen3-0.6B は Apache-2.0 です
- エンコーダの Nemotron-3.5-asr-streaming-0.6b(OpenMDW-1.1)は同梱していません
- 推論コード(yousan/fast-turn-jp)は Apache-2.0 です
引用
学習データの提供元には引用義務があります。
@inproceedings{nakata2024jchat,
title={J-CHAT: Japanese Large-scale Spoken Dialogue Corpus for Spoken Dialogue Language Modeling},
author={Nakata, Wataru and others},
year={2024}
}
評価に使用した TalkBank CallHome Japanese: doi:10.21415/T5H59V
再現元の論文:
@article{fastturn2026,
title={FastTurn: Unifying Acoustic and Streaming Semantic Cues for Low-Latency and Robust Turn Detection},
journal={arXiv preprint arXiv:2604.01897},
year={2026}
}
関連
- 論文: arXiv:2604.01897
- 公式リポジトリ: ASLP-lab/FastTurn(テストセットのみ公開。重み・コードは非公開)
- 実装: yousan/fast-turn-jp(Apache-2.0)
- 前世代: ayousanz/easy-turn-ja / ayousanz/easy-turn-ja-ckpt
- エンコーダ: nvidia/nemotron-3.5-asr-streaming-0.6b
- LLM: Qwen/Qwen3-0.6B