>100 Views
September 30, 26
スライド概要
2026年9月29日に開催した「DeNA × AI Talks #9 LLMとどこまで付き合ったか」の登壇スライドです。
イベント概要:https://dena.connpass.com/event/404885/
DeNA が社会の技術向上に貢献するため、業務で得た知見を積極的に外部に発信する、DeNA 公式のアカウントです。DeNA エンジニアの登壇資料をお届けします。
GPU不要!SLM・BERTによる音声 対話向け高速ターン検出モデル 佐藤悠翔 IT本部AI・データ戦略統括部AI技術開発部AIイノベーションG 株式会社ディー・エヌ・エー © DeNA Co., Ltd. 1
自己紹介 佐藤 悠翔 DeNA IT本部AI・データ戦略統括部AI技術開発部 AIイノベーションG 横浜生まれ横浜育ち 学生時代 ●電車線設備の自動点検の研究 ●スタートアップでAI Eng/PjM 2年くらい DeNA ●26卒で新卒入社 ●新規事業立ち上げの部署 © DeNA Co., Ltd. 2
目次 1 ターン検出とは? 2 SLM / BERTによる判定手法 3 CPU向け最適化と処理速度の評価 4 精度評価と量子化の影響 5 まとめ © DeNA Co., Ltd. 3
ターン検出とは? © DeNA Co., Ltd. 4
ターン検出器とは? 1 音声認識 → 応答生成 → 音声合成を別々のモデルでつなぐカスケード型の音声対話 において、応答を生成するタイミングを決めるためのモデル 入力音声 ASR 音声認識 ターン検出 終了確率 LLM 応答生成 TTS 音声合成 無音時に判定を呼ぶ VAD:発声/無音 直近の会話履歴 終了 → 応答を開始 継続 → 追加発話を待つ 応答タイミングを見誤ると、喋っている最中の割り込みや応答の遅れに繋がる © DeNA Co., Ltd. 5
1 VADだけでは発話が終わったかは分からない 例:「明日の予定は、」 …… 「午後から空いています」 発話の流れ 明日の予定は、 無音 午後から空いています VADの判断 音声あり 音声なし 音声あり 終了検出の判断 「予定は、」は続きを待つ → 意味・文脈を使って補完 無音で判定すると、言い淀み等のタイミングで応答してしまう © DeNA Co., Ltd. 6
既存のターン検出モデルの課題 1 日本語で低コストに運用するには課題がある 高精度なオープンモデル 軽量モデル GPU運用でコストが重い 品質をコントロールしづらい UltraVAD等はそこそこ精度がいいが、 Llama-8BベースでGPU必須。 Smart Turnのような軽量モデルもあるが、特定用途に 特化させたり、機能追加といった対応が難しい。 高性能なクローズドモデル オープンな日本語音声対話データ コスト・外部依存が懸念 学習に使えるデータが少ない 従量課金・データの外部送信が懸念。 料金変更・障害時に提供元へ依存。 音声対話の日本語データが不足。 収録・ラベル付けからの整備は負担が大きい。 音声データを使わず、日本語の判定器を低コストにセルフホストしたい 参考:UltraVAD公式モデルカード / Smart Turn公式README / LiveKit言語別レポート © DeNA Co., Ltd. 7
1 ターン判定の手法を比較し、テキストベースの判定器を選択 手法の比較: 方式 入力 特徴 開発・運用上の要件 VADのみ 音声 発声/無音を軽く判定 意味や会話文脈は見ない 音声モデル 例:Smart Turn 音声 韻律を使える CPU向けの軽量版もある 学習には音声データが必要 音声+文脈 例:UltraVAD 音声+会話履歴 韻律と会話文脈を使える モデル規模・推論資源と 音声データの整備が課題 テキスト(今回) SLM / BERT ASR結果+会話履歴 音声を収録せずに 学習データを作れる 韻律は直接使わない →軽量なSLM・BERTを用いたテキストベースを採用し、音声収録なしでモデルを作成 参考:UltraVAD公式モデルカード / Smart Turn公式README © DeNA Co., Ltd. 8
1 テキストベースの判定の限界もある 「そうですね」の話し方例: 言い切る場合 続きを考えている場合 声の高さ 声の高さ 高 高 低 低 そう です ね そう です 時間 → 終了として応答しやすい ね 時間 → 続きを待つ判断につながる 文字だけでは抑揚・息づかい・間などが伝わらず、どちらも同じ判断になってしまう © DeNA Co., Ltd. 9
2. SLM / BERTによる判定手法 © DeNA Co., Ltd. 10
2 ASRテキストと会話履歴から会話ターンの終了確率を出力 現在のASRテキスト + 直近の会話履歴 ターン判定器 終了確率 p 0.0 〜 1.0 p ≥ 閾値:終了 p < 閾値:継続 音声は使わず、リアルタイムの文字起こしテキスト + 会話履歴を入力する © DeNA Co., Ltd. 11
2 音声収録なしで途中発話の学習データを作る 学習データの例: 1 えっとサイズは 待つ(false) 2 えっとサイズはひとつ大きめ 待つ(false) 3 えっとサイズはひとつ大きめで大丈 待つ(false) 4 えっとサイズはひとつ大きめで大丈夫。 終了(true) ASRの途中認識をシミュレーションした学習データを作成 © DeNA Co., Ltd. 12
2 Qwen / BERTでターン終了確率を出力するモデルを作る Qwen3-0.6B|SLM(小型言語モデル) 履歴+ 現在発話 Qwen 本体 約596M・28層 既存の語彙予測ヘッド 全語彙 softmax 終端トークンの 確率を選ぶ ModernBERT-ja-130M|文の表現をつくるモデル 履歴+ 現在発話 BERT 本体 約132M・19層 追加した二値分類ヘッド 先頭表現 → Linear sigmoid で 終了確率を出す どちらも学習データ・出力形式は同じで、ターン終了確率を0〜1で出力。 参考:Qwen3-0.6Bモデルカード / ModernBERT-ja-130Mモデルカード © DeNA Co., Ltd. 13
Qwen:全語彙の予測から終端トークン確率を選ぶ 2 Qwen Decoder 出力行列 H 最終表現 既存 LM head 全語彙 softmax 28層・hidden 1,024 L × 1,024 1,024次元 W[151,936 × 1,024] 151,936次元 Decoder layer × 28 トークン埋め込み 履歴+現在発話 最後の有効行を選択 p1 h1 z1 h2 z2 h3 zEOT p(終了) ⋮ ⋮ ⋮ h1024 zV pV 151,936次元 終端だけを採用 全語彙で 正規化 p2 会話ターン終了用の特殊トークンの予測確率を最終出力として使用 参考:Qwen3-0.6Bモデルカード © DeNA Co., Ltd. 14
BERT:先頭の512次元表現を全結合 2 ModernBERT 出力行列 H 先頭表現 全結合:512 → 1 終了確率 19層・hidden 512 L × 512 512次元 W[1 × 512] 1個の値 h1 Encoder layer × 19 h3 トークン埋め込み 履歴+現在発話 sigmoid h2 ⋮ 先頭 <s> の行を選択 z p 1次元の logit 0〜1 h512 z = w1h1 + w2h2 + … + b 512個の特徴量を全結合し、sigmoidで最終的な終了確率を出力する 参考:ModernBERT-ja-130Mモデルカード © DeNA Co., Ltd. 15
2 同じ日本語データでQwenとBERTを学習 学習データの構成: train 26,834件 48.6% 終了 validation 3,464件 48.1% 終了 test 3,413件 48.9% 終了 終了 継続 終了・継続はほぼ半々の同じデータでQwen・BERTを学習する © DeNA Co., Ltd. 16
3. 処理速度の評価・CPU向け最適化 © DeNA Co., Ltd. 17
PyTorchではGPU推論は速いがCPU推論は遅い 3 入力長128 tokens時の平均モデル計算時間(ms) Qwen BERT CPU 864.3 L4 GPU 40.3 CPU 158.1 L4 GPU 17.6 0 450 900 ms GPUなら数十msで処理できるが、CPUの処理速度は不十分・・・ ⇨高速化を検討! © DeNA Co., Ltd. 18
3 変換前 CPU向けに学習済みモデルをONNXへ変換する 保存するモデル 計算を実行するソフト 得られる結果 PyTorch用モデル 構造+学習済みの重み PyTorch 終了確率 p ONNX Runtime ほぼ同じ 終了確率 p 計算と重みをONNXへ書き出す 変換後 ONNXファイル 計算のつながり+同じ重み ONNX形式で保存し、ONNX Runtimeで読み込んで計算する。 © DeNA Co., Ltd. 19
3 さらにINT8量子化で軽量化を狙う ONNXへの変換後に数値の表し方を軽くする量子化を行う 量子化する重み1個あたりのbit数 FP32 32 bit INT8 8 bit イメージ 0.1234 ≈ 整数 12 × 0.01 = 0.12 0.01は整数を元の値に対応させる倍率(scale) 近似で計算結果が変わりうるため、量子化後は精度と閾値を確認。 © DeNA Co., Ltd. 20
3 CPU推論が高速化! 最大2〜3倍高速に 128 tokens・平均モデル計算時間(ms) Qwen BERT 864.3 PyTorch CPU 158.1 758.8 ONNX FP32 CPU 140.6 275.0 ONNX INT8 CPU 78.4 0 450 900 ms PyTorch CPU比でQwen 約3.1倍、BERT 約2.0倍に高速化! © DeNA Co., Ltd. 21
3 ただし、CPUでは入力が長いほど時間がかかる ONNX INT8・CPU|平均処理時間 Qwen BERT 549 275 157 156 44 64 tokens 78 128 tokens 256 tokens 入力長に比例して処理にかかる時間も増加するが、BERTの場合は許容範囲内に収まる © DeNA Co., Ltd. 22
4. 精度と量子化の影響 © DeNA Co., Ltd. 23
4 LiveKitのeot-benchで精度を評価 eot-benchは、多言語の人と音声エージェントの実会話の音声・文字起こし・会話履歴を 含む評価用データセット 発話 無音 継続 hold 発話 無音 継続 hold 発話 最後の無音 終了 eot 日本語 356発話、1,320無音区間のデータを使用(hold 964区間 / eot 356区間)し、 無音区間ごとにターン判定 → 複数指標で評価を行う。 参考:LiveKit eot-bench-data / LiveKit eot-bench © DeNA Co., Ltd. 24
4 精度は誤終了率と平均待ち時間を見る 「途中で割り込んでしまう割合」と「話し終えてからの待ち時間」を分けて評価 評価指標 誤終了率 低いほどよい 平均待ち時間 短いほどよい 意味 話の途中の無音で、 続きの発話を待たずに 「終了」と判断してしまう割合。 本当に話し終えてから、 「終了」と判定するまでに 待つ時間の平均。 計算方法 再開前に終了した区間数 ÷ 話の途中の無音区間数 × 100 各終了区間の待ち時間を足し、 本当の終了区間数で割る。 10%:途中の無音100区間のうち、 800ms:本当の終了100区間で、 10区間で続きの発話を待てずに終了。 90区間は500ms、10区間は3,500ms 計算例 ※待ち時間にモデル計算・通信・応答生成の時間は含まない © DeNA Co., Ltd. 25
ベースラインのVADよりも圧倒的に誤終了割合を減らせる 4 FP32で効果を確認(平均待ち時間 ≤ 600 msでの最小誤終了率) 47.3% VADのみ Qwen FP32 12.7% BERT FP32 12.9% 0 25% 50% 低いほど良い VADと比較して誤終了率を約34ポイント低減し、両モデルの精度はほぼ同等。 © DeNA Co., Ltd. 26
INT8量子化後も大きな精度の低下は見られない 4 同じ誤終了率 ≤ 5%で比較(条件を満たす最小の平均待ち時間) VADのみ Qwen FP32 Qwen INT8 BERT FP32 BERT INT8 (ONNX) 1,700 ms VADのみ Qwen FP32 838 ms Qwen INT8 868 ms BERT FP32 867 ms BERT INT8 904 ms 0 900 1,800 ms Qwen / BERTともにFP32 → INT8で大きな悪化は見られない © DeNA Co., Ltd. 27
4 INT8量子化後もスコアの識別性能を維持 ROC-AUC(高いほど良い) Qwen FP32 Qwen BERT Qwen INT8 BERT FP32 BERT INT8 FP32 0.881 INT8 0.882 FP32 0.847 INT8 0.854 0 0.5 (ONNX) 1.0 Qwen、BERTともにFP32 → INT8でAUCの低下も見られなかった © DeNA Co., Ltd. 28
4 量子化による影響は小さく、CPU計算は大幅に短縮 ONNX FP32 → ONNX INT8 で判定品質と計算時間の比較 比較する指標 Qwen BERT ROC-AUC 0.881 → 0.882 0.847 → 0.854 誤終了 ≤ 5% の平均待ち 838 → 868 ms 867 → 904 ms CPU計算時間(128 tokens) 758.8 → 275.0 ms 140.6 → 78.4 ms 量子化で約1.8〜2.8倍高速化し、精度の低下は4%程度に抑えられた! QwenとBERTの精度の差も小さく、今回の用途では高速なBERTが最適 © DeNA Co., Ltd. 29
5. まとめ © DeNA Co., Ltd. 30
5 まとめ 成果 CPUで平均78.4 msの低遅延な判定器を作成。 Qwen/BERTともにVADと比較して大幅な精度改善。 限界 文字だけでは抑揚やためらいといった差異を捉えきれない。 今日の要点 テキストの判定に、GPU・大規模LLMは必須ではない! 小型モデル+用途に合う学習データで実装できる。 タスクに応じて必要な精度・遅延・コストを満たすモデルを選択すべき © DeNA Co., Ltd. 31
Appendix © DeNA Co., Ltd. 32
A 補足:QwenとBERTで異なる入力書式 会話履歴+現在発話をモデルごとの形式に整形する Qwen:公式ChatTemplate BERT:今回定義した書式 <|im_start|>user <s>会話履歴: 初めまして!<|im_end|> ユーザー: 初めまして! <|im_start|>assistant アシスタント: 初めましてー! 初めましてー!<|im_end|> 現在のユーザー発話: <|im_start|>user 本日は暑かったですね!</s> 本日は暑かったですね! 現在のuserは <|im_end|> で閉じず、 次の <|im_end|>トークン確率を使う。 © DeNA Co., Ltd. 日本語の見出しで履歴と現在発話を区切る。 <s>・</s> は tokenizer が付加。 33
A 補足:速度ベンチの全条件と実測値 平均計算時間(ms) 64 tokens 128 tokens 256 tokens Qwen / PT CPU 750.7 864.3 1460.2 BERT / PT CPU 131.1 158.1 274.0 Qwen / ONNX FP32 410.5 758.8 1501.7 BERT / ONNX FP32 73.6 140.6 275.5 Qwen / ONNX INT8 155.7 275.0 548.8 BERT / ONNX INT8 44.0 78.4 156.6 Qwen / PT L4 41.0 40.3 43.0 BERT / PT L4 17.3 17.6 17.0 100入力 × 3反復 / warmup 10 / batch 1 / intra-op 4・inter-op 1 PyTorch 2.10.0 FP32 / ORT 1.26.0 / L4 / 4vCPU © DeNA Co., Ltd. 34
補足:判定時点までに届く文字だけを入力する A ASRの到着が遅れるのをシミュレーションし、文字起こしに500 msの遅延を入れる 500 msの到着遅延 この部分の文字は入力に使える 0秒 未到着 1.7秒 無音 2.0秒 発話停止 2.2秒 スコア取得 参考:LiveKit eot-bench © DeNA Co., Ltd. 35
A 補足:確率だけでなく、終了までの待ち方を比較する 調整するのは「閾値」「終了を許す最短の無音時間」「タイムアウト」 閾値 = 0.5 最短待機 = 600 ms 0 p=0.8:閾値より高い 200 ms タイムアウト = 2,500 ms 600 ms 2,500 ms 600 msで終了 p=0.2:閾値以下 2,500 msで終了 終了より先に発話が再開すれば、その無音区間では割り込まない。 参考:LiveKit eot-bench © DeNA Co., Ltd. 36
A 補足:速さか誤終了率の片方を固定して評価する 同じ評価データで設定を変え、条件を満たす中の最良値を選ぶ 指標 説明 平均待ち時間 ≤ 300 ms その速さで達成できる最小の誤終了率 平均待ち時間 ≤ 600 ms 待つ余裕を増やしたときの最小の誤終了率 誤終了率 ≤ 5% 途中で切る割合を抑えた最短の平均待ち 誤終了率 ≤ 10% 誤終了をより許したときの最短の平均待ち 4つの条件で最良の設定は異なる。 参考:LiveKit eot-bench © DeNA Co., Ltd. 37
補足:ROC-AUCは終了と継続を分ける力を見る A 終了を拾う割合(TPR) ROC曲線 1.0 曲線が左上に寄るほどよい 上位3件を選択した点 FPR=1/5、TPR=2/3 縦:本当の終了のうち、拾えた割合 横:継続のうち、誤って拾った割合 無作為順位 AUCの目安 0.5 0 AUC = ROC曲線の下の面積 1.0なら、終了と継続を完全に分離 1.0 継続を誤って拾う割合(FPR) © DeNA Co., Ltd. 38
補足:APはPrecisionとRecallの変化から計算する A Precision(適合率) 閾値を下げたときの変化 終了と判定した中で正しかった割合 APの階段 閾値90% 1 70% 40% 0.5 0 0 0.5 Recall(再現率) 1 APの面積 閾値 Precision Recall 90% 100%(1/1) 33%(1/3) 70% 67%(2/3) 67%(2/3) 40% 50%(3/6) 100%(3/3) 横幅(Recallの増分)× 高さ(Precision) を足し合わせる。 AP = 塗った階段の面積 = 0.722 本当の終了のうち検出できた割合 © DeNA Co., Ltd. 39
A © DeNA Co., Ltd. 補足:PR曲線とROC曲線 40
© DeNA Co., Ltd. 41