<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Conformer on M1KE BL0G</title><link>https://www.m1ke.org/tags/conformer/</link><description>Recent content in Conformer on M1KE BL0G</description><generator>Hugo -- gohugo.io</generator><language>ja-jp</language><copyright>mike</copyright><lastBuildDate>Wed, 10 Jun 2026 22:01:26 +0900</lastBuildDate><atom:link href="https://www.m1ke.org/tags/conformer/index.xml" rel="self" type="application/rss+xml"/><item><title>GoogleのSODAの日本語オンデバイスASRモデルの仕組み</title><link>https://www.m1ke.org/p/google%E3%81%AEsoda%E3%81%AE%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%82%AA%E3%83%B3%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9asr%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF/</link><pubDate>Wed, 10 Jun 2026 22:01:26 +0900</pubDate><guid>https://www.m1ke.org/p/google%E3%81%AEsoda%E3%81%AE%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%82%AA%E3%83%B3%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9asr%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF/</guid><description>&lt;img src="https://www.m1ke.org/p/google%E3%81%AEsoda%E3%81%AE%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%82%AA%E3%83%B3%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9asr%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF/google.jpg" alt="Featured image of post GoogleのSODAの日本語オンデバイスASRモデルの仕組み" /&gt;&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;ChromeOSの日本語SODAモデルをリバースエンジニアリングした&lt;/li&gt;
&lt;li&gt;SODA は Google のオンデバイス音声認識まわりで使われている仕組み。ライブ字幕、音声入力、音声コマンドの裏側にいるやつ&lt;/li&gt;
&lt;li&gt;前に書いた音声系の技術メモでは、ASR、VAD、TTS、フルデュプレックス会話、リングバッファ、句読点、Endpointing などの用語を整理した。今回はその続きとして、実際のオンデバイス ASR モデルがどういう部品でできているかを見た&lt;/li&gt;
&lt;li&gt;見たかったのはこのあたり:
&lt;ul&gt;
&lt;li&gt;オンデバイス ASR がどのくらいのサイズで動いているか&lt;/li&gt;
&lt;li&gt;VAD と ASR 本体がどう分かれているか&lt;/li&gt;
&lt;li&gt;prefetch が何をしているか&lt;/li&gt;
&lt;li&gt;語頭を落とさないために何をしているか&lt;/li&gt;
&lt;li&gt;EOT、つまりターン終了をどう判断しているか&lt;/li&gt;
&lt;li&gt;RNN-T、LAS、FST がどう組み合わされているか&lt;/li&gt;
&lt;li&gt;日本語向けにどんな辞書やコンテキスト注入が入っているか&lt;/li&gt;
&lt;li&gt;OSS で似たものを作るなら何が必要か&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="先に結論"&gt;先に結論&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;見えた構成はかなり堅い&lt;/li&gt;
&lt;li&gt;軽い VAD を常時動かし、重い Conformer Encoder は発話区間だけに使う&lt;/li&gt;
&lt;li&gt;RNN-Tで逐次認識し、FSTで言語スコアを持ち、LAS Rescorerで候補を再評価する&lt;/li&gt;
&lt;li&gt;最後に句読点、normalizer、context injection が効く&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;特に重要なのはこの3つ。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;prefetch.decision&lt;/code&gt; は別モデルではなく、同じ VAD posterior を別閾値で解釈したもの&lt;/li&gt;
&lt;li&gt;SHORT モードは prefetch 閾値が 0.17 と低く、語頭を拾うためにかなり攻めている&lt;/li&gt;
&lt;li&gt;EOT は VAD だけでなく、音響スコア、FST/LAS の言語スコア、hotword、DecoderEndpointerStream の統合パラメータで決まる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;「話したら文字になる」だけに見えるが、実際にはかなり細かい交通整理がある。&lt;/p&gt;
&lt;h2 id="基本情報"&gt;基本情報&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;項目&lt;/th&gt;
&lt;th&gt;値&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;言語&lt;/td&gt;
&lt;td&gt;ja-JP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;バージョン識別子&lt;/td&gt;
&lt;td&gt;&lt;code&gt;cnch24d3&lt;/code&gt; (Conch 2024, revision 3)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;内部バージョン&lt;/td&gt;
&lt;td&gt;v5072&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;アーキテクチャ&lt;/td&gt;
&lt;td&gt;Causal Conformer Encoder + RNN-T Decoder&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;合計サイズ&lt;/td&gt;
&lt;td&gt;約 138MB（全ファイル合計）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ランタイム&lt;/td&gt;
&lt;td&gt;TFLite (&lt;code&gt;TFL3&lt;/code&gt; FlatBuffer, MLIR変換済み)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;設定フォーマット&lt;/td&gt;
&lt;td&gt;Protocol Buffers (バイナリ)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ビルド日時&lt;/td&gt;
&lt;td&gt;2024年7月2日 15:00:00（訓練完了）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;リリース日時&lt;/td&gt;
&lt;td&gt;2025年1月7日（ChromeOS R133 DLC）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;経過時間&lt;/td&gt;
&lt;td&gt;2026年6月時点で約 &lt;strong&gt;17ヶ月前&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="世代バージョン体系"&gt;世代・バージョン体系&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;世代&lt;/th&gt;
&lt;th&gt;識別子&lt;/th&gt;
&lt;th&gt;時期&lt;/th&gt;
&lt;th&gt;備考&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Legacy&lt;/td&gt;
&lt;td&gt;&lt;code&gt;df24d2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;〜2024年以前&lt;/td&gt;
&lt;td&gt;旧世代&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Conch&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;cnch24d3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2025年1月&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;← これ&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;code&gt;cnch24d3&lt;/code&gt; = &lt;strong&gt;C&lt;/strong&gt;o&lt;strong&gt;n&lt;/strong&gt;c&lt;strong&gt;h&lt;/strong&gt; &lt;strong&gt;24&lt;/strong&gt; (2024年設計) &lt;strong&gt;d3&lt;/strong&gt; (第3リビジョン)。Conch世代でアーキテクチャ刷新。&lt;/p&gt;
&lt;p&gt;サーバーモデルをオンデバイス向けに変換したもの：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/placer/prod/home/speech-placer/.../20240702150000_OD_CONVERTED_DEFAULT_SERVER_V101_WITH_CONFIDENCE/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;OD_CONVERTED&lt;/code&gt; = On-Device 変換済み、&lt;code&gt;V101_WITH_CONFIDENCE&lt;/code&gt; = confidence スコア付き v101&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="全体パイプライン"&gt;全体パイプライン&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;span class="lnt"&gt;54
&lt;/span&gt;&lt;span class="lnt"&gt;55
&lt;/span&gt;&lt;span class="lnt"&gt;56
&lt;/span&gt;&lt;span class="lnt"&gt;57
&lt;/span&gt;&lt;span class="lnt"&gt;58
&lt;/span&gt;&lt;span class="lnt"&gt;59
&lt;/span&gt;&lt;span class="lnt"&gt;60
&lt;/span&gt;&lt;span class="lnt"&gt;61
&lt;/span&gt;&lt;span class="lnt"&gt;62
&lt;/span&gt;&lt;span class="lnt"&gt;63
&lt;/span&gt;&lt;span class="lnt"&gt;64
&lt;/span&gt;&lt;span class="lnt"&gt;65
&lt;/span&gt;&lt;span class="lnt"&gt;66
&lt;/span&gt;&lt;span class="lnt"&gt;67
&lt;/span&gt;&lt;span class="lnt"&gt;68
&lt;/span&gt;&lt;span class="lnt"&gt;69
&lt;/span&gt;&lt;span class="lnt"&gt;70
&lt;/span&gt;&lt;span class="lnt"&gt;71
&lt;/span&gt;&lt;span class="lnt"&gt;72
&lt;/span&gt;&lt;span class="lnt"&gt;73
&lt;/span&gt;&lt;span class="lnt"&gt;74
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PCM音声 (s16le, 16kHz, mono)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[AudioDecoderStream] → waveform
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[Framer] frame=25ms(400samples), shift=10ms(160samples)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[Window (Hann窓)] → windowed frames
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[FFT]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[FilterBank] 80次元 log-mel フィルタバンク
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[FrameStacker × N] → [SubsampleStream]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├──────────────────────────────────────────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼ 【VAD パス（軽量・並列）】 │ 【エンコーダパス（重・ゲート制御）】
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[AppendClusterIdStream] │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(VOICE_SEARCH/CAPTION/FARFIELD/TELEPHONY) │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[VAD LSTM: 436KB] │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; → prefetch.decision │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; → vad.audio_level_events │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; → vad.decision ─────────────────────────────────┐ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; → vad.decision_for_segmenter │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼ │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [EndpointerEventStream] │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [SegmenterStream] ◄───────────────────────────┘ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ (発話フレームのみ通過) │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├──────────────────────────────────────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[FrameNormalizeStream] (mean_stddev: 240次元)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[AppendClusterIdStream (TELEPHONY)]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[FrameStacker] → [SubsampleStream] (エンコーダ用積み重ね)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[CausalEncoderStream]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Conformer × 12層 (107MB)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ← streaming states: 85テンソル
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[DecoderEndpointerStream]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; RNN-T Decoder + EndpointerStream
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ← vad.decision (音響的発話判断)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ← prefetch.decision (先読み音響判断)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ← FST言語モデル (言語的文完成度判断)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── 2nd Pass: LAS Rescorer (3.9MB)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[CombinedResultStream]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[後処理パイプライン]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 1. remove_decorators (FST)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 2. pron_cleanup (FST)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 3. CapitalizationNormalizer (FST)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 4. PunctuationNormalizer (BiLSTM 2.5MB)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 5. porn_normalizer (FST)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[RecognitionEventStream] → テキスト出力
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="ファイル一覧サイズ詳細"&gt;ファイル一覧・サイズ詳細&lt;/h2&gt;
&lt;h3 id="endtoendmodel-メイン-asr"&gt;endtoendmodel/ (メイン ASR)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ファイル&lt;/th&gt;
&lt;th&gt;サイズ&lt;/th&gt;
&lt;th&gt;役割&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;large-encoder.tflite&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;107MB&lt;/strong&gt; (108,803KB)&lt;/td&gt;
&lt;td&gt;Causal Conformer Encoder&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;large-decoder.tflite&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;8.6MB (9,025KB)&lt;/td&gt;
&lt;td&gt;RNN-T LSTM Decoder&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;large-joint_posterior.tflite&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;4.6MB (4,865KB)&lt;/td&gt;
&lt;td&gt;Joint Network: AM+LM posterior&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;large-joint_prior.tflite&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;4.3MB (4,429KB)&lt;/td&gt;
&lt;td&gt;Joint Network: LM prior のみ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;large-rank_candidates_acoustic.tflite&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;3.8MB (4,030KB)&lt;/td&gt;
&lt;td&gt;LAS N-best Rescorer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;large.wpm.portable&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;188KB&lt;/td&gt;
&lt;td&gt;WordPiece モデル (サブワード分割)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;large.syms.compact&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;31KB&lt;/td&gt;
&lt;td&gt;語彙シンボルテーブル (OpenFST CompactSymbolTable)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ONDEVICE_LARGE_CONTINUOUS.mean_stddev&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1.9KB&lt;/td&gt;
&lt;td&gt;フィルタバンク正規化パラメータ (240次元)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ONDEVICE_LARGE_SHORT.mean_stddev&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1.9KB&lt;/td&gt;
&lt;td&gt;同上 (SHORT モード用・同一値)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;エンコーダが全体の 94% を占める。&lt;/strong&gt; これがボトルネック。&lt;/p&gt;
&lt;h3 id="acousticmodel-vad--エンドポインタ"&gt;acousticmodel/ (VAD / エンドポインタ)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ファイル&lt;/th&gt;
&lt;th&gt;サイズ&lt;/th&gt;
&lt;th&gt;用途&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DEFAULT_BF_VAD_EP_MD_UF_DARWINN_CONTINUOUS.endpointer_portable_lstm_model&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;436KB&lt;/td&gt;
&lt;td&gt;連続発話 VAD LSTM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DEFAULT_BF_EOQ_EP_MD_UF_DARWINN_SHORT.endpointer_portable_lstm_model&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;436KB&lt;/td&gt;
&lt;td&gt;短文用 VAD LSTM (EOQ)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SODA_DICTATION_EP_UNIFIED_FRONTEND_LANGID.endpointer_portable_lstm_model&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;471KB&lt;/td&gt;
&lt;td&gt;言語ID統合 VAD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;*.endpointer_portable_lstm_mean_stddev&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2.0KB&lt;/td&gt;
&lt;td&gt;VAD 特徴量正規化 (256次元)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SODA_DICTATION_EP_UNIFIED_FRONTEND_LANGID.endpointer_portable_lstm_mean_stddev&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;4.1KB&lt;/td&gt;
&lt;td&gt;LangID 統合 VAD 正規化 (528次元)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="denorm-後処理"&gt;denorm/ (後処理)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ファイル&lt;/th&gt;
&lt;th&gt;サイズ&lt;/th&gt;
&lt;th&gt;役割&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;lm.pruned.sorted.fst&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;12MB&lt;/td&gt;
&lt;td&gt;FST 言語モデル (プルーニング済みソート済み)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;lm.pruned.sorted.syms&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1.4MB&lt;/td&gt;
&lt;td&gt;FST 言語モデル語彙&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;transducer.pruned.fst&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;3.6MB&lt;/td&gt;
&lt;td&gt;トランスデューサ FST&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PUNCTUATION_LSTM.model.int8.tflite&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2.4MB&lt;/td&gt;
&lt;td&gt;句読点挿入 BiLSTM (int8量子化)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PUNCTUATION_LSTM.syms&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;20KB&lt;/td&gt;
&lt;td&gt;句読点 LSTM 語彙 2,332トークン&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;porn_normalizer_ondevice.mfar&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;616KB&lt;/td&gt;
&lt;td&gt;不適切語フィルタ (MFAR=Mapped FST Archive)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pron_cleanup_denormalizer.mfar&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;28KB&lt;/td&gt;
&lt;td&gt;発音整形&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;remove_decorators_ondevice.mfar&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;336KB&lt;/td&gt;
&lt;td&gt;装飾除去&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;punctuation_converter_config.pb&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;76KB&lt;/td&gt;
&lt;td&gt;句読点変換マッピング (protobuf)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="langid-言語識別"&gt;langid/ (言語識別)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ファイル&lt;/th&gt;
&lt;th&gt;サイズ&lt;/th&gt;
&lt;th&gt;役割&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ONDEVICE_langid.tflite&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2.4MB&lt;/td&gt;
&lt;td&gt;43言語識別 Conformer モデル&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;application_params_langid_stream_multiclass_ONDEVICE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;528B&lt;/td&gt;
&lt;td&gt;対応言語リスト・設定&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="context_prebuilt-コンテキスト注入"&gt;context_prebuilt/ (コンテキスト注入)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ファイル&lt;/th&gt;
&lt;th&gt;サイズ&lt;/th&gt;
&lt;th&gt;役割&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;mozc.dic&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;9.4MB&lt;/td&gt;
&lt;td&gt;Mozc 辞書 (日本語形態素解析)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;japanese_family_name.txt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;125KB&lt;/td&gt;
&lt;td&gt;日本語姓名辞書&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;portable_ja_verbalizer.far&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1.2MB&lt;/td&gt;
&lt;td&gt;数字・記号→日本語読み FST&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ja-JP_nga_popular-media_STD_FST.fst&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;228KB&lt;/td&gt;
&lt;td&gt;メディアタイトル FST&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ja-JP_nga_hotword-popular-media_STD_FST.fst&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;228KB&lt;/td&gt;
&lt;td&gt;ホットワード+メディア FST&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ja-JP_nga_device-actions_STD_FST.fst&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;99KB&lt;/td&gt;
&lt;td&gt;デバイス操作コマンド FST&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ja-JP_assistant_hotword_STD_FST.fst&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2KB&lt;/td&gt;
&lt;td&gt;アシスタントホットワード FST&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;songs.txt&lt;/code&gt; / &lt;code&gt;apps.txt&lt;/code&gt; / &lt;code&gt;contacts.txt&lt;/code&gt; 等&lt;/td&gt;
&lt;td&gt;各数KB〜128KB&lt;/td&gt;
&lt;td&gt;動的コンテキスト用テキスト&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="音声フロントエンド詳細"&gt;音声フロントエンド詳細&lt;/h2&gt;
&lt;h3 id="特徴量パラメータconfig-から確定"&gt;特徴量パラメータ（config から確定）&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ステップ&lt;/th&gt;
&lt;th&gt;パラメータ&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;サンプリングレート&lt;/td&gt;
&lt;td&gt;16,000 Hz&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;フレーム長&lt;/td&gt;
&lt;td&gt;400 samples = 25ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;フレームシフト&lt;/td&gt;
&lt;td&gt;160 samples = 10ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;窓関数&lt;/td&gt;
&lt;td&gt;Hann窓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FilterBank 次元数&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;80次元&lt;/strong&gt; log-mel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VAD 入力&lt;/td&gt;
&lt;td&gt;80-mel フレーム × 3 = 240次元 + クラスタ ID 16次元 = &lt;strong&gt;256次元&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Encoder 正規化入力&lt;/td&gt;
&lt;td&gt;80-mel × 3フレーム積み重ね = &lt;strong&gt;240次元&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="正規化パラメータmean_stddev-から実測"&gt;正規化パラメータ（mean_stddev から実測）&lt;/h3&gt;
&lt;p&gt;エンコーダの 240次元入力に対する統計量 (CONTINUOUS = SHORT, 同一値)：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;統計量&lt;/th&gt;
&lt;th&gt;最小値&lt;/th&gt;
&lt;th&gt;最大値&lt;/th&gt;
&lt;th&gt;特徴&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;平均 (mean)&lt;/td&gt;
&lt;td&gt;7.398&lt;/td&gt;
&lt;td&gt;9.262&lt;/td&gt;
&lt;td&gt;log-mel エネルギースケール&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;標準偏差 (stddev)&lt;/td&gt;
&lt;td&gt;1.643&lt;/td&gt;
&lt;td&gt;4.026&lt;/td&gt;
&lt;td&gt;高周波帯ほど分散大&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;平均が 7〜9 ≈ log(1000〜8000)スケール → log-mel フィルタバンクの典型値 ✓&lt;/li&gt;
&lt;li&gt;標準偏差が後半(高周波)ほど大きい → 環境ノイズの影響を受けやすい高周波の分散が大 ✓&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;VAD の 256次元：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Field 1 (mean): 範囲 [0.000, 8.379]（クラスタID次元は 0 付近）&lt;/li&gt;
&lt;li&gt;Field 2 (stddev): 範囲 [1.000, 3.703]&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="conformer-encoder-詳細"&gt;Conformer Encoder 詳細&lt;/h2&gt;
&lt;h3 id="モデル規模"&gt;モデル規模&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;項目&lt;/th&gt;
&lt;th&gt;値&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ファイルサイズ&lt;/td&gt;
&lt;td&gt;107MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Conformer ブロック数&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;12層&lt;/strong&gt; (conf_0 〜 conf_11)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;入力次元&lt;/td&gt;
&lt;td&gt;240次元 (80-mel × 3フレーム積み重ね)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ストリーミング状態テンソル&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;85個&lt;/strong&gt; (previous_state.00 〜 .84)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ストリーミング状態/層&lt;/td&gt;
&lt;td&gt;≈ 7 state tensors × 12層 + 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;モデル変換&lt;/td&gt;
&lt;td&gt;MLIR Converted (TensorFlow → TFLite)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TFLite バージョン&lt;/td&gt;
&lt;td&gt;TFL3 (min runtime: 2.19.0)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="各-conformer-ブロックの構造全12層共通"&gt;各 Conformer ブロックの構造（全12層共通）&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;入力 x
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[fflayer_start] — Feed-Forward 1 (×0.5 Macaron scale)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[trans_atten] — Multi-Head Self-Attention (因果的・動的長さ)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─ multihead_atten/StreamStep/dynamic_length
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ← streaming で left-context のみ参照（Causal）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[lconv] — Local Convolution Module
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─ depthwise_conv/strided_slice (深さ方向畳み込み)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[fflayer_end] — Feed-Forward 2 (×0.5 Macaron scale)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[output_ln] — Layer Normalization
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;出力
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;これは &lt;strong&gt;Macaron-style Conformer&lt;/strong&gt; (Chan et al., 2022)：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;FFN を MHSA の前後に配置（0.5 スケール）&lt;/li&gt;
&lt;li&gt;Local Convolution が音響的局所パターンを学習&lt;/li&gt;
&lt;li&gt;Causal MHSA がグローバルな依存関係を学習&lt;/li&gt;
&lt;li&gt;streaming 推論のため &lt;code&gt;dynamic_length&lt;/code&gt; で左コンテキストのみ参照&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="ストリーミング実装の構造"&gt;ストリーミング実装の構造&lt;/h3&gt;
&lt;p&gt;TFLite の状態テンソル名からわかる 3段構成：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;conformer_encoder_1: previous_state.00〜.84 (入力状態テンソル, 85個)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;conformer_encoder_2: 実際の計算グラフ (extractor/graph_layer/conf_0〜conf_11)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;conformer_encoder_3: next_state.00〜.84 (出力状態テンソル, 85個)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;各フレームを逐次処理し、状態テンソルで文脈を保持する streaming 設計。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="rnn-t-decoder-詳細"&gt;RNN-T Decoder 詳細&lt;/h2&gt;
&lt;h3 id="アーキテクチャ"&gt;アーキテクチャ&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;項目&lt;/th&gt;
&lt;th&gt;値&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ファイルサイズ&lt;/td&gt;
&lt;td&gt;8.6MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;型&lt;/td&gt;
&lt;td&gt;シンプル LSTM Decoder&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;状態テンソル&lt;/td&gt;
&lt;td&gt;&lt;code&gt;previous_decoder_state_0&lt;/code&gt; / &lt;code&gt;next_decoder_state_0&lt;/code&gt; (1ペア)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;入出力&lt;/td&gt;
&lt;td&gt;&lt;code&gt;inputs&lt;/code&gt; → &lt;code&gt;outputs&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;単一 LSTM セル（状態テンソルが 1つだけ）のシンプルな Prediction Network。&lt;/p&gt;
&lt;h3 id="joint-network-の分離設計"&gt;Joint Network の分離設計&lt;/h3&gt;
&lt;p&gt;Joint Network が &lt;strong&gt;posterior&lt;/strong&gt; と &lt;strong&gt;prior&lt;/strong&gt; に分離されている：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Encoder出力 (am) + Decoder出力 (lm)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ┌────┴────────────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼ ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[joint_posterior.tflite] [joint_prior.tflite]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;am_proj + lm_proj_1 lm_proj_2 のみ
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ Tanh → LogSoftmax │ Tanh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼ ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;P(y|x, y_{&amp;lt;t}) P(y|y_{&amp;lt;t})
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; (音響+言語) (言語のみ)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;なぜ分離するか：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;posterior / prior&lt;/code&gt; により、暗黙的な &lt;strong&gt;LM shallow fusion&lt;/strong&gt; が可能&lt;/li&gt;
&lt;li&gt;テスト時に LM の重みを調整できる&lt;/li&gt;
&lt;li&gt;&lt;code&gt;joint_prior&lt;/code&gt; は LM のみなので、LM 置き換え (LM subtraction) にも使える&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lm_proj_1/MatMul&lt;/code&gt; = 音響+言語の合算投影&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lm_proj_2/MatMul&lt;/code&gt; = 言語単独投影（prior）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="joint-network-の演算グラフposterior"&gt;Joint Network の演算グラフ（posterior）&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;concat(am_proj, lm_proj) → Tanh → add_1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;am_proj_1/MatMul → lm_proj_1/MatMul → MatMul;add_2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Softplus → Softplus1 → Softplus2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;strided_slice_1 → Neg_1 → sub_12 → add_3;Neg_1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;LogSoftmax → outputs
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="2nd-pass-rescorer-las"&gt;2nd Pass Rescorer (LAS)&lt;/h2&gt;
&lt;h3 id="アーキテクチャ概要"&gt;アーキテクチャ概要&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;項目&lt;/th&gt;
&lt;th&gt;値&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ファイルサイズ&lt;/td&gt;
&lt;td&gt;3.8MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;アーキテクチャ&lt;/td&gt;
&lt;td&gt;Listen, Attend, Spell (LAS)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;用途&lt;/td&gt;
&lt;td&gt;N-best 仮説の再スコアリング + confidence&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="演算グラフchild_decoders_0"&gt;演算グラフ（child_decoders_0）&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;入力: encoded (エンコーダ出力), candidate_labels (N-best仮説), encoded_padding
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[embedding_lookup] + [位置エンコーディング (Sin/Cos)]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[self_atten] — Self-Attention (仮説内部の依存関係)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─ MultiHeadedAttention/ComputeContextVectorWithSource
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; PackSource (K,V キャッシュ)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[aux_atten] — Cross-Attention (エンコーダ出力への注意)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─ MultiHeadedAttention/ComputeContextVectorWithSource
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[fflayer] — Feed-Forward (tr_fflayer, layer norm付き)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─ fflayer_0 (Relu) → fflayer_1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[confidence_source_proj/MatMul]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[confidence_mlp_0] — Confidence スコア出力
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─ Sigmoid (信頼度 0〜1)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;outputs: スコア (仮説ランキング用)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;INFLUENCE_MODEL_TWIDDLER&lt;/code&gt; = 再スコアリング重みを実行時に調整する仕組み（A/Bテスト・実験対応）。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="vad--eoq-lstm-詳細"&gt;VAD / EOQ LSTM 詳細&lt;/h2&gt;
&lt;h3 id="3種類の-vad-モデル"&gt;3種類の VAD モデル&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;モデル名&lt;/th&gt;
&lt;th&gt;サイズ&lt;/th&gt;
&lt;th&gt;用途&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DEFAULT_BF_VAD_EP_MD_UF_DARWINN_CONTINUOUS&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;436KB&lt;/td&gt;
&lt;td&gt;連続発話用 (字幕・ライブ)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DEFAULT_BF_EOQ_EP_MD_UF_DARWINN_SHORT&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;436KB&lt;/td&gt;
&lt;td&gt;短文用 EOQ (IME・コマンド)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SODA_DICTATION_EP_UNIFIED_FRONTEND_LANGID&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;471KB&lt;/td&gt;
&lt;td&gt;言語ID 統合 VAD (多言語)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="入力特徴量"&gt;入力特徴量&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;VAD 入力 = 256次元
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; = 80-mel × 3フレーム (240次元) ... 実測 mean ~6-8 (log-mel scale)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; + クラスタ ID 埋め込み (16次元) ... mean ~0 付近
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;クラスタ ID の種類:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; CONTINUOUS モード: VOICE_SEARCH, CAPTION, FARFIELD, TELEPHONY (4クラス)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; SHORT モード: FARFIELD のみ (1クラス)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;FARFIELD&lt;/code&gt; (遠距離マイク向け)が SHORT モードでのデフォルト → 近距離の発話も遠距離扱いで堅牢に処理。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="prefetch-の仕組み別モデルではない"&gt;prefetch の仕組み：別モデルではない&lt;/h2&gt;
&lt;h3 id="結論"&gt;結論&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;prefetch.decision&lt;/code&gt; は&lt;strong&gt;新しいモデルではない&lt;/strong&gt;。同じ VAD LSTM が出力する &lt;code&gt;vad.posterior&lt;/code&gt;（0〜1 の発話確率）を、
異なる閾値・パラメータを持つ別の &lt;code&gt;EndpointerStream&lt;/code&gt; インスタンスで処理したもの。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;vad.posterior (単一 LSTM の出力)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─ EndpointerStream(threshold=低め) → prefetch.decision ← 早く反応
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─ EndpointerStream(threshold=高め) → vad.decision ← 確実に判定
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─ EndpointerStream(threshold=同等) → vad.decision_for_segmenter → Encoder ゲート
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="config-バイナリから実測した閾値パラメータ"&gt;config バイナリから実測した閾値パラメータ&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;CONTINUOUS モード（字幕・ライブ）：&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ストリーム&lt;/th&gt;
&lt;th&gt;発話開始閾値&lt;/th&gt;
&lt;th&gt;備考&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;prefetch.decision&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.69&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;posterior &amp;gt; 69% でプリフェッチ開始&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;vad.decision&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.30&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;posterior &amp;gt; 30% で発話確定&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;vad.decision_for_segmenter&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.30&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Encoder へのゲート、同じ閾値&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;SHORT モード（IME・コマンド）：3ステージ構成&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ステージ&lt;/th&gt;
&lt;th&gt;ストリーム&lt;/th&gt;
&lt;th&gt;閾値&lt;/th&gt;
&lt;th&gt;役割&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1st&lt;/td&gt;
&lt;td&gt;&lt;code&gt;prefetch.decision&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.17&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;posterior &amp;gt; 17% で即バッファ開始&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2nd&lt;/td&gt;
&lt;td&gt;&lt;code&gt;confirmation&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.60&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;posterior &amp;gt; 60% で発話確定 ← SHORT 専用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3rd&lt;/td&gt;
&lt;td&gt;&lt;code&gt;vad.decision&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.10&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;最終判定&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gate&lt;/td&gt;
&lt;td&gt;&lt;code&gt;vad.decision_for_segmenter&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.01&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Encoder へのゲート（非常に低い）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="なぜ語頭をよく認識できるのか"&gt;なぜ「語頭をよく認識できる」のか&lt;/h3&gt;
&lt;p&gt;SHORT モードの設計から読み取れる意図：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;CONTINUOUS: prefetch 閾値 0.69 ← 発話がかなり確実になってから反応
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SHORT: prefetch 閾値 0.17 ← わずかでも音が来たら即バッファ開始
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;時間軸:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;音声波形: ...無音... |あ────────────────|
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;発話確率: ...0.0... 0.05→0.20→0.60→0.90...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SHORT mode:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─ prefetch (0.17): posterior が 0.17 を超えた瞬間にバッファ開始
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ → 「あ」の破裂音の立ち上がり (~5ms) を捕捉
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─ confirmation (0.60): 0.60 を超えたら「発話確定」
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ → エンコーダへ過去バッファ分を遡って投入
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─ vad.decision (0.10): 終了判定（非常に低い = 微妙な発話でも続行）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;CONTINUOUS mode:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─ prefetch (0.69): 確実な発話のみ反応 → 語頭クリッピングリスクあり
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;SHORT モードで語頭が取れる理由：&lt;/strong&gt; prefetch 閾値が 0.17 と低いため、発話確率が少し上がっただけで即座にバッファリングを開始する。その後 confirmation(0.60) で確定し、バッファ内の音声（語頭を含む）をエンコーダに渡す。&lt;/p&gt;
&lt;h3 id="音声バッファプリロールの実装"&gt;音声バッファ（プリロール）の実装&lt;/h3&gt;
&lt;p&gt;config パラメータから：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;prefetch.decision の追加パラメータ:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; field=3 int=360 ← バッファ長 360ms（推定）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; field=6 int=1 ← モード設定
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; field=7 float=0.0 ← オフセット
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;360ms 分の音声がバッファされる → 発話確定後、最大 360ms 遡って処理できる。&lt;/p&gt;
&lt;h4 id="常時録音とリングバッファ"&gt;常時録音とリングバッファ&lt;/h4&gt;
&lt;p&gt;SODA は&lt;strong&gt;常時マイク入力を録音し続けている&lt;/strong&gt;。発話を検出してから録音を開始するのではない。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;常時稼働しているもの：
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; マイク → ring buffer への書き込み（ずっと）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; VAD LSTM の推論（ずっと）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;発話検出後にのみ起動するもの：
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Conformer Encoder（重い）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; RNN-T Decoder
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; LAS Rescorer
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;VAD LSTM が小さい (436KB) のはこのためで、&lt;strong&gt;常時動かすコンポーネントは軽くする&lt;/strong&gt;という設計方針。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;リングバッファの構造：&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;物理メモリ（11,520 bytes の配列）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 16000 Hz × 2 bytes × 0.36s = 11,520 bytes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[0 ][1 ][2 ]...[N-1 ]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↑
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; write pointer が端まで達したら 0 に戻る
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; → データは連続して存在し続ける
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;prefetch が発火した瞬間（posterior &amp;gt; 0.17）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;read_start = (write_pos - 360ms分) % buffer_size
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;→ 360ms 前の位置から読み出し開始
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;→ Encoder への投入は「今から」ではなく「360ms 前から」
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;折り返し（wrap-around）について：&lt;/strong&gt;&lt;br&gt;
360ms 分の読み出しがバッファの端をまたぐ場合も、後半→前半の 2回読みで対応できる。物理的な切れ目はなく、データの欠損は発生しない。バッファサイズ (360ms) と読み戻し量 (360ms) が一致しているため、書き込みが読み出しを追い越すことはない。&lt;/p&gt;
&lt;h3 id="各-endpointerstream-の役割まとめ"&gt;各 EndpointerStream の役割まとめ&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ストリーム&lt;/th&gt;
&lt;th&gt;役割&lt;/th&gt;
&lt;th&gt;後段&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;prefetch.decision&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;バッファ開始のトリガー（低閾値）&lt;/td&gt;
&lt;td&gt;Decoder に注入（バッファリング指示）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;vad.decision&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;発話確定・終了判定（中閾値）&lt;/td&gt;
&lt;td&gt;Decoder に注入（エンドポインタ判断）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;vad.decision_for_segmenter&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Encoder ゲート（LOW 閾値）&lt;/td&gt;
&lt;td&gt;SegmenterStream → Encoder&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;confirmation&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;(SHORT のみ) 発話確認&lt;/td&gt;
&lt;td&gt;vad.decision の前段フィルタ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;vad.audio_level_events&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;音量レベル監視&lt;/td&gt;
&lt;td&gt;AudioLevelEventStream → デバッグ用&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="eotターン終了予測の完全な仕組み"&gt;EOT（ターン終了）予測の完全な仕組み&lt;/h2&gt;
&lt;p&gt;config バイナリからすべてのパラメータを実測した結果、EOT 判断は 4つの層が連携していることが判明した。&lt;/p&gt;
&lt;h3 id="layer-1音響層vad-lstm--endpointerstream--34"&gt;Layer 1：音響層（VAD LSTM → EndpointerStream × 3〜4）&lt;/h3&gt;
&lt;p&gt;同一の VAD LSTM posterior を、閾値の異なる複数の &lt;code&gt;EndpointerStream&lt;/code&gt; に通す：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ストリーム&lt;/th&gt;
&lt;th&gt;CONTINUOUS 閾値&lt;/th&gt;
&lt;th&gt;SHORT 閾値&lt;/th&gt;
&lt;th&gt;動作&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;prefetch.decision&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.69&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.17&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;バッファ開始トリガー（低確信でも反応）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;confirmation&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;―&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.60&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SHORT 専用：発話確認ステージ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;vad.decision&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.30&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.10&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;発話確定・終了判定&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;vad.decision_for_segmenter&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.30&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.01&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Encoder へのゲート（最終段）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;SHORT モードで &lt;code&gt;prefetch&lt;/code&gt; 閾値が 0.17 と極端に低い理由：&lt;br&gt;
→ 発話確率が 17% を超えた瞬間にバッファを開始し、語頭クリッピングを防ぐ。&lt;br&gt;
→ その後 &lt;code&gt;confirmation&lt;/code&gt; (0.60) で誤検出をフィルタする 2段階設計。&lt;/p&gt;
&lt;h3 id="layer-2言語層fst--las-rescorer"&gt;Layer 2：言語層（FST + LAS Rescorer）&lt;/h3&gt;
&lt;p&gt;FST ビーム探索で「文として完成しているか」をスコア化：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;パラメータ&lt;/th&gt;
&lt;th&gt;CONTINUOUS&lt;/th&gt;
&lt;th&gt;SHORT&lt;/th&gt;
&lt;th&gt;意味&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;acoustic_scale&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2.300&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2.125&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;音響モデルの重み係数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;beam&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;5.0&lt;/td&gt;
&lt;td&gt;5.0&lt;/td&gt;
&lt;td&gt;FST ビーム幅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;max_beam&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;10.0&lt;/td&gt;
&lt;td&gt;10.0&lt;/td&gt;
&lt;td&gt;最大ビーム幅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;word_end_weight&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;0.0693&lt;/td&gt;
&lt;td&gt;0.0693&lt;/td&gt;
&lt;td&gt;単語境界重み&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;insertion_penalty&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;−0.002&lt;/td&gt;
&lt;td&gt;−0.002&lt;/td&gt;
&lt;td&gt;挿入ペナルティ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LAS rescorer weight&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.3595&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.7043&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;N-best リスコアリングの重み&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LAS extra weight&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.4000&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SHORT 専用の追加重み&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;acoustic_scale&lt;/code&gt; 差の意味：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CONTINUOUS (2.30) → 音響モデルをより信頼（話者が何を言ったかを優先）&lt;/li&gt;
&lt;li&gt;SHORT (2.12) → 相対的に LM の影響を大きくし、コマンド文法を優先&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;LAS 重み差の意味：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SHORT (1.70) は CONTINUOUS (1.36) より 25% 高い → 2nd pass rescorer をより強く信頼&lt;/li&gt;
&lt;li&gt;SHORT に専用の追加重み 1.40 がある → confirmation 段階のスコアと組み合わせる&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="layer-3統合層decoderendpointerstream-内部パラメータ"&gt;Layer 3：統合層（DecoderEndpointerStream 内部パラメータ）&lt;/h3&gt;
&lt;p&gt;config のバイナリ extension フィールドから実測した固定パラメータ（&lt;strong&gt;CONTINUOUS / SHORT 共通&lt;/strong&gt;）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;acoustic_endpointer_weight = 3.803557 ← VAD 音響信号の重み
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;silence_penalty_floor = −32.002899 ← 無音時のログ確率床
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;large_beam_floor = −26837.197 ← ビーム探索の底値
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lm_endpointer_weight = 3.631859 ← 言語スコアの重み
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;threshold = −2.046974 ← ターン終了判定閾値（log 空間）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;score_bias = 604.288 ← 判断スコアのバイアス（log 空間）
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;SHORT 専用の追加パラメータ（extra 221 bytes）：&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;normalization_a = −2.1251 ← スコア正規化
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;normalization_b = 0.3751 ← スコア正規化
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;weight_extra_1 = 3.1500 ← EOQ 追加重み
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;weight_extra_2 = 2.0186 ← confirmation 重み
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;large_penalty_1 = −57.502 ← 強いペナルティ（誤検出防止）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;small_penalty = −0.3797
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;weight_extra_3 = 1.6000
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;micro_threshold = 0.0007 ← 極小閾値（hotword 判定？）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;small_threshold = 0.1000
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;large_penalty_2 = −47.450 ← 強いペナルティ
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;weight_final = 2.0000
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="layer-4ホットワード層short-専用"&gt;Layer 4：ホットワード層（SHORT 専用）&lt;/h3&gt;
&lt;p&gt;SHORT モードの DecoderEndpointerStream には、ホットワードが &lt;strong&gt;EOT ロジックに直接組み込まれている&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;#34;ok google&amp;#34; ← 検出 → ターン即リセット
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;#34;okay google&amp;#34; ← 同上
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;#34;hey google&amp;#34; ← 同上
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;#34; google&amp;#34; ← 同上
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;これらが検出されると EOT ではなく「新しいターンの開始」として処理される。&lt;/p&gt;
&lt;h3 id="全体の判断フロー"&gt;全体の判断フロー&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;音声フレーム
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─[VAD LSTM]─────────────────────────────────────────────────────────
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ posterior → EndpointerStream (4段)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ prefetch (0.17/0.69) → バッファ開始
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ confirmation (0.60 / SHORT only) → 発話確定
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ vad.decision (0.10/0.30) ──────────────────────────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ vad.decision_for_segmenter ──→ [Segmenter] ─→ [Encoder] │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ [FST Decoder] │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ acoustic_scale │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ = 2.30/2.12 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ [LAS Rescorer] │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ weight │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ = 1.36/1.70 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └──────────────────────────────────────────────────→ [DecoderEndpointerStream]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; acoustic_weight=3.80 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; lm_weight=3.63 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; silence_penalty=−32.0 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; threshold=−2.05 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ターン終了 / 継続
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="continuous-vs-short-の本質的な違い"&gt;CONTINUOUS vs SHORT の本質的な違い&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;観点&lt;/th&gt;
&lt;th&gt;CONTINUOUS&lt;/th&gt;
&lt;th&gt;SHORT&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;VAD 感度&lt;/td&gt;
&lt;td&gt;保守的 (prefetch=0.69)&lt;/td&gt;
&lt;td&gt;攻撃的 (prefetch=0.17)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;語頭クリッピング&lt;/td&gt;
&lt;td&gt;発生しやすい&lt;/td&gt;
&lt;td&gt;バッファ+2段階で防止&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;誤検出防止&lt;/td&gt;
&lt;td&gt;prefetch 閾値が高い&lt;/td&gt;
&lt;td&gt;confirmation (0.60) で防止&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LM 信頼度&lt;/td&gt;
&lt;td&gt;音響優先 (2.30)&lt;/td&gt;
&lt;td&gt;LM との均衡 (2.12)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LAS Rescorer&lt;/td&gt;
&lt;td&gt;軽め (1.36)&lt;/td&gt;
&lt;td&gt;重め (1.70+1.40)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ホットワード&lt;/td&gt;
&lt;td&gt;なし&lt;/td&gt;
&lt;td&gt;あり (ok/okay/hey google)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;追加パラメータ&lt;/td&gt;
&lt;td&gt;なし&lt;/td&gt;
&lt;td&gt;221 byte 分の拡張設定&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="全パラメータ詳細config-実測値"&gt;全パラメータ詳細（config 実測値）&lt;/h2&gt;
&lt;h3 id="fstsearchparamsビーム探索設定"&gt;FstSearchParams（ビーム探索設定）&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;パラメータ&lt;/th&gt;
&lt;th&gt;CONTINUOUS&lt;/th&gt;
&lt;th&gt;SHORT&lt;/th&gt;
&lt;th&gt;意味&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;beam&lt;/td&gt;
&lt;td&gt;5.0&lt;/td&gt;
&lt;td&gt;5.0&lt;/td&gt;
&lt;td&gt;FST ビーム幅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;max_beam&lt;/td&gt;
&lt;td&gt;10.0&lt;/td&gt;
&lt;td&gt;10.0&lt;/td&gt;
&lt;td&gt;最大ビーム幅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;word_end_weight&lt;/td&gt;
&lt;td&gt;0.0693&lt;/td&gt;
&lt;td&gt;0.0693&lt;/td&gt;
&lt;td&gt;単語境界重み (≈ln(1.072))&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;insertion_penalty&lt;/td&gt;
&lt;td&gt;−0.002&lt;/td&gt;
&lt;td&gt;−0.002&lt;/td&gt;
&lt;td&gt;挿入ペナルティ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;acoustic_scale&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2.300&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2.125&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;音響モデルのスケール係数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;n-best&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;Rescorer に渡す仮説数&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="lasnbestrescorer-パラメータ"&gt;LasNbestRescorer パラメータ&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;n-best candidates: 8 ← 上位8仮説を LAS でリスコアリング
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;score_weight: 1.0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="segmenterstream-パラメータ"&gt;SegmenterStream パラメータ&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;CONTINUOUS: max_silence ≈ 30,000単位 / max_session ≈ 60,000単位
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SHORT: より短い設定
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="eoq-接続グラフcontinuous-モード完全版"&gt;EOQ 接続グラフ（CONTINUOUS モード完全版）&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;input
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─ AudioDecoderStream → waveform_frame → windowed_frame → fft_energies
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─ filter_bank (80次元 log-mel)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─ frame_stacker
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─ sampled_stacked_filterbanks
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ┌─────────────────────────────────────────────────────────┤
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ 【VAD LSTM パス】 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; vad.cluster_id (AppendClusterIdStream) │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─ vad.posterior (LstmComputeStream, 436KB LSTM) │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ┌─────────┼─────────────────────┐ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ │ │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼ ▼ ▼ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; prefetch.decision vad.audio_level_events vad.decision │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; (EndpointerStream) (AudioLevelEventStream) (EndpointerStream) │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ ┌──────────────────┤ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ │ vad.decision │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ │ _for_segmenter │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ │ (EndpointerStream)│ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ │ │ │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ │ ▼ │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ │ endpointer_events │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ │ (EndpointerEventStream) │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ │ │ │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ └─► segmenter ◄────┘ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ (SegmenterStream) │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ │ ◄──────────────────────────────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ 【発話フレームのみ通過】
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ tflite_frame_normalize_stream (FrameNormalizeStream)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ └─ mean_stddev (240次元)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ audio_features.clusterid (AppendClusterIdStream)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ stack_for_stacking_layer (FrameStacker)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ sample_for_stacking_layer (SubsampleStream)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ conformer_encoder (CausalEncoderStream)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └──► decoder (DecoderEndpointerStream)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; (vad.decision + prefetch.decision + encoder出力 → ターン判断)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; concat_endpointer_events (ParallelConcatStream)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; concat_endpointer_event_filter (EndpointerEventFilterStream)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; finalize_result.combined_result (CombinedResultStream)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; frame_events → nbest_event_filter → recognition_events
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="vad-がエンコーダの前段にある理由"&gt;VAD が「エンコーダの前段」にある理由&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;懸念&lt;/th&gt;
&lt;th&gt;対策&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;エンコーダが重い (107MB) → 無音フレームへの無駄な計算&lt;/td&gt;
&lt;td&gt;VAD (436KB) で先にフィルタリング&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;無音フレームが Conformer の状態を汚染する可能性&lt;/td&gt;
&lt;td&gt;SegmenterStream が無音フレームをブロック&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;リアルタイム性の確保&lt;/td&gt;
&lt;td&gt;VAD が軽量 (436KB) → 低レイテンシで決定&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="ターン終了判断の仕組み"&gt;ターン終了判断の仕組み&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;DecoderEndpointerStream&lt;/code&gt; が複数信号を統合：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;音響信号 ─── vad.decision (無音検出)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; prefetch.decision (先読み予測)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;言語信号 ─── FST スコア (文の完成度)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; DecoderEndpointerStream
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ┌─────────────────────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ VAD: 「沈黙あり」 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ FST スコア高い → 文完成 │ → セッション終了・出力
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ FST スコア低い → 文未完成 │ → セッション継続
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─────────────────────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;EOQ だけではターンを閉じない&lt;/strong&gt;。言語的な文完成度と合わせて判断する。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="認識モード比較"&gt;認識モード比較&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;項目&lt;/th&gt;
&lt;th&gt;CONTINUOUS&lt;/th&gt;
&lt;th&gt;SHORT&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;用途&lt;/td&gt;
&lt;td&gt;字幕・ライブ文字起こし&lt;/td&gt;
&lt;td&gt;IME入力・音声コマンド&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VAD モデル&lt;/td&gt;
&lt;td&gt;&lt;code&gt;DEFAULT_BF_VAD_EP_MD_UF_DARWINN_CONTINUOUS&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;DEFAULT_BF_EOQ_EP_MD_UF_DARWINN_SHORT&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;エンドポインタ&lt;/td&gt;
&lt;td&gt;緩め (会話継続)&lt;/td&gt;
&lt;td&gt;厳しめ (発話終了検出)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;クラスタ ID&lt;/td&gt;
&lt;td&gt;VOICE_SEARCH, CAPTION, FARFIELD, TELEPHONY&lt;/td&gt;
&lt;td&gt;FARFIELD のみ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;確認ステップ&lt;/td&gt;
&lt;td&gt;なし&lt;/td&gt;
&lt;td&gt;&lt;code&gt;confirmation&lt;/code&gt; EndpointerStream あり&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Entity Injection&lt;/td&gt;
&lt;td&gt;なし&lt;/td&gt;
&lt;td&gt;JDQ_ONDEVICE あり (連絡先・楽曲等)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ホットワード&lt;/td&gt;
&lt;td&gt;参照しない&lt;/td&gt;
&lt;td&gt;&amp;ldquo;ok google&amp;rdquo;, &amp;ldquo;okay google&amp;rdquo;, &amp;ldquo;hey google&amp;rdquo;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;識別子末尾&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ONDEVICE_LARGE_CONTINUOUS&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ONDEVICE_LARGE_SHORT&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="トークナイザー詳細"&gt;トークナイザー詳細&lt;/h2&gt;
&lt;h3 id="語彙規模"&gt;語彙規模&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;項目&lt;/th&gt;
&lt;th&gt;値&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;総トークン数&lt;/td&gt;
&lt;td&gt;約 &lt;strong&gt;7,388&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;うち日本語トークン&lt;/td&gt;
&lt;td&gt;約 &lt;strong&gt;6,902&lt;/strong&gt; (93%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;残り&lt;/td&gt;
&lt;td&gt;ASCII / 記号 / 特殊トークン&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ファイル&lt;/td&gt;
&lt;td&gt;&lt;code&gt;endtoendmodel/large.wpm.portable&lt;/code&gt; (188KB, protobuf)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;語彙シンボルテーブル&lt;/td&gt;
&lt;td&gt;&lt;code&gt;endtoendmodel/large.syms.compact&lt;/code&gt; (31KB, OpenFST CompactSymbolTable)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="単語境界マーカー"&gt;単語境界マーカー&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;▁&lt;/code&gt;（U+2581）を単語先頭に付与（SentencePiece と同方式）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;▁ありがとう ← 単語の先頭
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;う ← 単語の途中（サブワード継続）
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="特殊トークン"&gt;特殊トークン&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;sos&amp;gt; ← 文開始 (decoder 初期入力)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;/S&amp;gt; ← 文終了
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;UNK&amp;gt; ← 未知語
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;noise&amp;gt; ← 環境ノイズ
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;sil&amp;gt; ← 無音 (silence)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;epsilon&amp;gt; ← FST イプシロン遷移
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;text_only&amp;gt; ← テキストのみモード
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;phi&amp;gt; ← Entity Injection 用
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;sigma&amp;gt; ← Entity Injection 用
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="エンティティクラストークン動的コンテキスト注入"&gt;エンティティクラストークン（動的コンテキスト注入）&lt;/h3&gt;
&lt;p&gt;SHORT モードのみ有効：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;contacts&amp;gt; / &amp;lt;/contacts&amp;gt; ← 連絡先名 (CONTACTS)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;songs&amp;gt; / &amp;lt;/songs&amp;gt; ← 楽曲名 (SONG)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;pkg_contacts&amp;gt; / &amp;lt;/pkg_contacts&amp;gt; ← パッケージ連絡先
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;pkg_songs&amp;gt; / &amp;lt;/pkg_songs&amp;gt; ← パッケージ楽曲
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;pkg_artists&amp;gt; / &amp;lt;/pkg_artists&amp;gt; ← アーティスト名
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;apps&amp;gt; / &amp;lt;/apps&amp;gt; ← アプリ名 (APP)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;#NUMBER ← 数字エンティティ
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;JDQ_ONDEVICE (Just-in-time Dynamic Query) システムで実行時注入：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pattern_tagger.fst&lt;/code&gt; → 音素列をエンティティに対応付け&lt;/li&gt;
&lt;li&gt;&lt;code&gt;token_masker.fst&lt;/code&gt; → 語彙マスキング&lt;/li&gt;
&lt;li&gt;&lt;code&gt;blocklist.fst&lt;/code&gt; → ブロックリスト適用&lt;/li&gt;
&lt;li&gt;&lt;code&gt;base_wordlist.syms&lt;/code&gt; → ベース語彙リスト&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="句読点-lstm-詳細"&gt;句読点 LSTM 詳細&lt;/h2&gt;
&lt;h3 id="アーキテクチャ-1"&gt;アーキテクチャ&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;項目&lt;/th&gt;
&lt;th&gt;値&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ファイルサイズ&lt;/td&gt;
&lt;td&gt;2.4MB (int8量子化)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;アーキテクチャ&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Bidirectional LSTM&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;語彙サイズ&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2,332 トークン&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;量子化&lt;/td&gt;
&lt;td&gt;int8&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="重みテンソル構造bidirectionalsequencelstm"&gt;重みテンソル構造（BidirectionalSequenceLSTM）&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Forward LSTM (fw):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; fw_input2input_weights1 (I→I ゲート)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; fw_input2forget_weights2 (I→F ゲート)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; fw_input2cell_weights3 (I→C ゲート)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; fw_input2output_weights4 (I→O ゲート)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; fw_rec2input_weights5 (再帰→I)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; fw_rec2forget_weights6 (再帰→F)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; fw_rec2cell_weights7 (再帰→C)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; fw_rec2output_weights8 (再帰→O)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; fw_cell2input_weights9 (Peephole I)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; fw_cell2forget_weights10 (Peephole F)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; fw_cell2output_weights11 (Peephole O)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; fw_*_bias12-15
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; fw_activation_state35, fw_input_cell_state36
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Backward LSTM (bw): 同様の構造 (bw_*18-38)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;後段:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; weights50, bias51 → output52 → ... → output57
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Peephole 接続あり = cell state から各ゲートに直接接続する LSTM 拡張形。&lt;/p&gt;
&lt;h3 id="句読点変換ルール-punctuation_converter_configpb-から"&gt;句読点変換ルール (punctuation_converter_config.pb から)&lt;/h3&gt;
&lt;p&gt;日本語句読点は発話形から書字形へ変換：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;「まる」「ピリオド」→ &lt;code&gt;。&lt;/code&gt; / &lt;code&gt;．&lt;/code&gt;（ホモフォン複数対応）&lt;/li&gt;
&lt;li&gt;「てん」「コンマ」→ &lt;code&gt;、&lt;/code&gt; / &lt;code&gt;，&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;type: INTERMEDIATE&lt;/code&gt; = 文中にも挿入可能&lt;/li&gt;
&lt;li&gt;&lt;code&gt;upcase_after: false&lt;/code&gt; = 英語と異なり日本語は大文字化なし&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="言語モデル-fst-詳細"&gt;言語モデル FST 詳細&lt;/h2&gt;
&lt;h3 id="fst-とは"&gt;FST とは&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;FST = Finite State Transducer（有限状態変換器）&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;テキストコーパスから学習した n-gram 確率を、巨大なグラフ（状態遷移図）として事前にコンパイルしたもの。
「この単語の次に来やすい単語は何か」という言語的な自然さをスコア化する。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;#34;今日は&amp;#34; の次に来やすい単語は？
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; → &amp;#34;天気&amp;#34; (確率高)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; → &amp;#34;何を&amp;#34; (確率高)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; → &amp;#34;宇宙船&amp;#34; (確率低)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;FST の入力はテキストトークンであり、音声（メルスペクトログラム等）ではない。&lt;/strong&gt;&lt;br&gt;
音声は Encoder → RNN-T Decoder でトークン列に変換された後、FST に渡される。&lt;/p&gt;
&lt;h3 id="なぜニューラル-lm-ではなく-fst-を使うか"&gt;なぜニューラル LM ではなく FST を使うか&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;観点&lt;/th&gt;
&lt;th&gt;FST&lt;/th&gt;
&lt;th&gt;ニューラル LM&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;速度&lt;/td&gt;
&lt;td&gt;非常に速い（グラフ探索のみ）&lt;/td&gt;
&lt;td&gt;遅い（行列演算）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ビーム探索との統合&lt;/td&gt;
&lt;td&gt;同時実行可能&lt;/td&gt;
&lt;td&gt;バッチ処理が必要&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;メモリ&lt;/td&gt;
&lt;td&gt;小さい（pruning 後 31KB）&lt;/td&gt;
&lt;td&gt;大きい&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;精度&lt;/td&gt;
&lt;td&gt;n-gram レベル&lt;/td&gt;
&lt;td&gt;高い（文脈理解）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;RNN-T のビーム探索（100本同時）と FST スコアリングをリアルタイムで並走させるために FST が採用されている。&lt;/p&gt;
&lt;h3 id="ファイル構成"&gt;ファイル構成&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ファイル&lt;/th&gt;
&lt;th&gt;サイズ&lt;/th&gt;
&lt;th&gt;説明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;lm.pruned.sorted.fst&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;12MB&lt;/td&gt;
&lt;td&gt;主 LM FST（プルーニング・ソート済み）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;transducer.pruned.fst&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;3.6MB&lt;/td&gt;
&lt;td&gt;トランスデューサ FST&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;lm.pruned.sorted.syms&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1.4MB&lt;/td&gt;
&lt;td&gt;語彙シンボルテーブル&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;large.syms.compact&lt;/code&gt; (ja)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;31KB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Decoder が使うシンボルテーブル（極限 pruning 後）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;large.syms.compact&lt;/code&gt; (en)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;22KB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;英語版&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;SigmaFst&lt;/code&gt; 型 = sigma 遷移（全記号にマッチ）を持つ FST&lt;/li&gt;
&lt;li&gt;ビーム探索時に &lt;code&gt;FstSearchParams&lt;/code&gt; でビーム幅等を制御&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DecoderEndpointerStream&lt;/code&gt; が FST スコアを参照して文完成度を判断（lm_weight=3.632）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="soda-のパイプライン内での位置づけ"&gt;SODA のパイプライン内での位置づけ&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;RNN-T Decoder（ビーム探索 n-best=100）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓ トークン列の仮説
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FST 言語モデル
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓ 言語スコア付き仮説
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;LAS Rescorer（上位 8本に絞って精密評価）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DecoderEndpointerStream（EOT 判定）
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="las-rescorer-が必要な理由"&gt;LAS Rescorer が必要な理由&lt;/h2&gt;
&lt;h3 id="rnn-t-単体の限界"&gt;RNN-T 単体の限界&lt;/h3&gt;
&lt;p&gt;RNN-T はフレームごとに左から右へ逐次的にトークンを生成する（一方向・局所的）。
「文全体を見て最も自然な解釈はどれか」という大局的な判断が苦手。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ビーム探索の結果（スコアが僅差）：
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 仮説1: &amp;#34;今日は天気がいいですね&amp;#34; score: -12.3
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 仮説2: &amp;#34;今日は点気がいいですね&amp;#34; score: -12.5 ← &amp;#34;天&amp;#34; を &amp;#34;点&amp;#34; と聞き違え
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 仮説3: &amp;#34;今日は天気がいい世ね&amp;#34; score: -12.7
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;スコアが近い場合、RNN-T + FST だけでは誤りを弾けないことがある。&lt;/p&gt;
&lt;h3 id="las-rescorer-の解決方法"&gt;LAS Rescorer の解決方法&lt;/h3&gt;
&lt;p&gt;Encoder 出力と仮説テキストを &lt;strong&gt;双方向 Attention で全体を見渡しながら&lt;/strong&gt;照合して再評価。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Encoder 出力（音声の全文脈）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;LAS cross-attention ← &amp;#34;点気&amp;#34; は音響的にあり得るか？
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;#34;天気&amp;#34; の方が音響・言語両面で自然 → 仮説1を選択
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;RNN-T が「速さ優先で生成」し、LAS が「精度優先で選別」する役割分担。&lt;/p&gt;
&lt;h3 id="日英のモデルサイズ比較"&gt;日英のモデルサイズ比較&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;コンポーネント&lt;/th&gt;
&lt;th&gt;日本語&lt;/th&gt;
&lt;th&gt;英語&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;VAD LSTM&lt;/td&gt;
&lt;td&gt;437KB&lt;/td&gt;
&lt;td&gt;471KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FST (syms.compact)&lt;/td&gt;
&lt;td&gt;31KB&lt;/td&gt;
&lt;td&gt;22KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LAS Rescorer (acoustic)&lt;/td&gt;
&lt;td&gt;3.9MB&lt;/td&gt;
&lt;td&gt;3.1MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LAS Rescorer (full)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;なし&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;48MB&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;日本語には 48MB のフル LAS が存在しない。&lt;/strong&gt;&lt;br&gt;
英語は self-attention + cross-attention のフル構成、日本語は音響特徴のみの軽量版で代用している。&lt;/p&gt;
&lt;h3 id="特殊トークン一覧英語版から判明"&gt;特殊トークン一覧（英語版から判明）&lt;/h3&gt;
&lt;p&gt;音声認識の語彙（wpm.portable）に含まれる特殊トークン：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;トークン&lt;/th&gt;
&lt;th&gt;用途&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;s&amp;gt;&lt;/code&gt; / &lt;code&gt;&amp;lt;/s&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;文の開始・終了（FST が使う）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;UNK&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;未知語&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;noise&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;雑音&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;epsilon&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;RNN-T の blank（「何も出力しない」）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;reject&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;認識拒否&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;{comma}&lt;/code&gt;, &lt;code&gt;{period}&lt;/code&gt;, &lt;code&gt;{new-line}&lt;/code&gt; 等&lt;/td&gt;
&lt;td&gt;音声コマンドによる句読点入力（dictation 用）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;{smiley-face}&lt;/code&gt;, &lt;code&gt;{heart}&lt;/code&gt; 等&lt;/td&gt;
&lt;td&gt;絵文字の発話認識&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;contacts&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;song&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;app&amp;gt;&lt;/code&gt; 等&lt;/td&gt;
&lt;td&gt;エンティティ注入用の文脈タグ&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Googleの論文にあった、&lt;strong&gt;&lt;code&gt;&amp;lt;pause&amp;gt;&lt;/code&gt; や &lt;code&gt;&amp;lt;eos&amp;gt;&lt;/code&gt; は存在しない。&lt;/strong&gt; EOT 判定はトークンレベルではなく DecoderEndpointerStream が担う。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="fst-と-las-rescorer-の自前構築"&gt;FST と LAS Rescorer の自前構築&lt;/h2&gt;
&lt;h3 id="fstn-gram-lm-gpu-不要kenlm-で構築可能"&gt;FST（n-gram LM）→ GPU 不要、KenLM で構築可能&lt;/h3&gt;
&lt;p&gt;FST はニューラルネットではなく、テキストコーパスから n-gram を数えてグラフにコンパイルするだけ。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# n-gram 学習&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kenlm/build/bin/lmplz -o &lt;span class="m"&gt;4&lt;/span&gt; --memory 8G &amp;lt; corpus.txt &amp;gt; lm.arpa
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# バイナリ化&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kenlm/build/bin/build_binary trie lm.arpa lm.bin
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;必要データ量の目安：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;データ&lt;/th&gt;
&lt;th&gt;サイズ&lt;/th&gt;
&lt;th&gt;品質&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Wikipedia のみ&lt;/td&gt;
&lt;td&gt;約 20GB（展開後）&lt;/td&gt;
&lt;td&gt;書き言葉のみ、口語弱&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wikipedia + ニュース&lt;/td&gt;
&lt;td&gt;30〜50GB&lt;/td&gt;
&lt;td&gt;実用的な最低ライン&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;+ Common Crawl (CC-100)&lt;/td&gt;
&lt;td&gt;85GB 追加&lt;/td&gt;
&lt;td&gt;口語・SNS 表現を補強&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;日本語は口語データ（SNS・会話）が入っているかどうかが品質を大きく左右する。&lt;/p&gt;
&lt;h3 id="sherpa-onnx-への統合"&gt;sherpa-onnx への統合&lt;/h3&gt;
&lt;p&gt;sherpa-onnx は KenLM による LM rescoring をネイティブサポートしている。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sherpa-onnx &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --lm&lt;span class="o"&gt;=&lt;/span&gt;lm_4gram.bin &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --lm-scale&lt;span class="o"&gt;=&lt;/span&gt;0.1 &lt;span class="se"&gt;\ &lt;/span&gt; &lt;span class="c1"&gt;# SODA の acoustic_scale の逆数に相当&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;--lm-scale&lt;/code&gt; は 0.05〜0.3 の範囲で WER が最小になる値を探す。&lt;/p&gt;
&lt;h3 id="las-rescorer--3090-24gb-で学習可能だがデータが課題"&gt;LAS Rescorer → 3090 (24GB) で学習可能だがデータが課題&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;項目&lt;/th&gt;
&lt;th&gt;状況&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;モデルサイズ (48MB)&lt;/td&gt;
&lt;td&gt;3090 (24GB VRAM) で余裕&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;アーキテクチャ&lt;/td&gt;
&lt;td&gt;Transformer、OSS 実装多数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;学習データ&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;ここがボトルネック&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;LAS の学習には「Encoder 出力 × 大量音声データ」が必要。
SODA の Encoder は使えないため、sherpa-onnx の Zipformer 等を Encoder として代用する構成になる。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;現実的な構成（3090 で実現可能）：&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Zipformer encoder（sherpa-onnx、OSS）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓ Encoder 出力
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;自前 LAS Rescorer（PyTorch で学習）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;自前 FST（KenLM + 大規模コーパス）
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;GPU 的には問題ない。壁になるのはペアデータ（音声＋正解テキスト）の量。&lt;br&gt;
日本語なら最低数百時間、英語なら数千時間規模が現実的な目安。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="言語識別-langid-モデル"&gt;言語識別 (LangID) モデル&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;項目&lt;/th&gt;
&lt;th&gt;値&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ファイルサイズ&lt;/td&gt;
&lt;td&gt;2.4MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;アーキテクチャ&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Conformer Encoder&lt;/strong&gt; (12層、ASR より小型)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;対応言語数&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;43言語&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;使用 VAD&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SODA_DICTATION_EP_UNIFIED_FRONTEND_LANGID&lt;/code&gt; (471KB)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;特徴量次元&lt;/td&gt;
&lt;td&gt;528次元 (mean_stddev ファイルサイズから算出)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;対応言語リスト：
af-ZA, ar-EG, bg-BG, ca-ES, cmn-Hans-CN, cs-CZ, da-DK, de-DE, el-GR, en-US,
es-US, eu-ES, fa-IR, fi-FI, fil-PH, fr-FR, gl-ES, he-IL, hi-IN, hu-HU, id-ID,
is-IS, it-IT, &lt;strong&gt;ja-JP&lt;/strong&gt;, ko-KR, lt-LT, ms-MY, nb-NO, nl-NL, pl-PL, pt-BR,
ro-RO, ru-RU, sk-SK, sl-SI, sr-RS, sv-SE, th-TH, tr-TR, uk-UA, vi-VN,
yue-Hant-HK, zu-ZA&lt;/p&gt;
&lt;p&gt;LangID モデルも ASR と同じ Conformer アーキテクチャを使用（&lt;code&gt;conf_0〜conf_11&lt;/code&gt;、&lt;code&gt;trans_atten&lt;/code&gt; の &lt;code&gt;multihead_atten&lt;/code&gt; が確認できる）。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="コンテキスト機能devicecontext"&gt;コンテキスト機能（DeviceContext）&lt;/h2&gt;
&lt;p&gt;config から読み取れる端末状態フィーチャー（アシスタント連携時のみ）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;alarm-status ← アラーム状態 (FIRING/SCHEDULED/SNOOZED)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;timer-status ← タイマー状態 (FIRING/PAUSED/RUNNING)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;call-state ← 通話状態 (INCOMING/OUTGOING/IN_CALL)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;media-state ← 再生状態 (PLAYING)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hotword-active ← ホットワード検出中かどうか
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;client-id ← クライアント種別:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; AUTO, MOBILE_WARM_WORDS, NGA, ENHANCED_VOICE_DICTATION, HUB_MODE
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;foreground-app ← フォアグラウンドアプリ (Android パッケージ名):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; com.google.android.gm (Gmail)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; com.google.android.keep (Keep)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; com.google.android.apps.messaging
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; com.whatsapp
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; com.google.android.apps.dynamite (Chat)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; com.google.android.apps.docs.editors.docs
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;input-field-type ← 入力フィールド種別 (TYPE_TEXT_VARIATION_EMAIL_ADDRESS 等)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;latitude/longitude ← 位置情報
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;asr-state ← ASR状態 (HOTQUERY/not-found)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;experiment-labels ← A/Bテストラベル
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;フォアグラウンドアプリ別にコンテキストモジュールが切り替わる&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gmail 起動中 → メールアドレス・連絡先を優先認識&lt;/li&gt;
&lt;li&gt;Keep 起動中 → ノート内容を優先&lt;/li&gt;
&lt;li&gt;Messages/WhatsApp → 連絡先名を優先&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="クローン設計のポイント"&gt;クローン設計のポイント&lt;/h2&gt;
&lt;h3 id="必要なコンポーネントと代替"&gt;必要なコンポーネントと代替&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;コンポーネント&lt;/th&gt;
&lt;th&gt;このモデル&lt;/th&gt;
&lt;th&gt;OSS 代替&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Conformer Encoder (Causal)&lt;/td&gt;
&lt;td&gt;12層、Macaron style, 107MB&lt;/td&gt;
&lt;td&gt;ESPnet / k2 / NeMo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RNN-T Decoder&lt;/td&gt;
&lt;td&gt;シンプル LSTM&lt;/td&gt;
&lt;td&gt;Torchaudio RNN-T / ESPnet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Joint Network (posterior+prior)&lt;/td&gt;
&lt;td&gt;分離設計で LM fusion 可能&lt;/td&gt;
&lt;td&gt;標準 RNN-T joint でも可&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LAS Rescorer&lt;/td&gt;
&lt;td&gt;2nd pass, 3.8MB&lt;/td&gt;
&lt;td&gt;オプション (品質向上用)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;語彙&lt;/td&gt;
&lt;td&gt;WordPiece ~7400&lt;/td&gt;
&lt;td&gt;SentencePiece (BPE/Unigram)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;言語モデル&lt;/td&gt;
&lt;td&gt;剪定済みFST (12MB)&lt;/td&gt;
&lt;td&gt;KenLM + OpenFST&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VAD&lt;/td&gt;
&lt;td&gt;LSTM 436KB&lt;/td&gt;
&lt;td&gt;Silero VAD / WebRTC VAD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;句読点&lt;/td&gt;
&lt;td&gt;BiLSTM int8 2.4MB&lt;/td&gt;
&lt;td&gt;CTranslate2 + punct model&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="日本語固有の処理"&gt;日本語固有の処理&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mozc.dic&lt;/code&gt; (9.4MB): Google 日本語入力の辞書 → 代替: NEologd, UniDic&lt;/li&gt;
&lt;li&gt;&lt;code&gt;JapaneseSegmentedVariantsProvider&lt;/code&gt;: Mozc で読み仮名バリアント生成&lt;/li&gt;
&lt;li&gt;&lt;code&gt;JapaneseContactNameTextTransformer&lt;/code&gt;: 人名の読み処理&lt;/li&gt;
&lt;li&gt;&lt;code&gt;JapaneseTextSegmentationTransformer&lt;/code&gt;: TTS向け分かち書き&lt;/li&gt;
&lt;li&gt;&lt;code&gt;portable_ja_verbalizer.far&lt;/code&gt; (1.2MB): 数字・記号→日本語読み上げ FST&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="クローン時のスケール参考"&gt;クローン時のスケール参考&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;要素&lt;/th&gt;
&lt;th&gt;この SODA モデル&lt;/th&gt;
&lt;th&gt;一般的な OSS 日本語 ASR&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Encoder 層数&lt;/td&gt;
&lt;td&gt;12 (Conformer)&lt;/td&gt;
&lt;td&gt;12〜24 (Transformer/Conformer)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;入力特徴量&lt;/td&gt;
&lt;td&gt;80-mel, 10ms shift&lt;/td&gt;
&lt;td&gt;80-mel, 10ms shift ← 同じ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;語彙&lt;/td&gt;
&lt;td&gt;7,388 WordPiece&lt;/td&gt;
&lt;td&gt;3,000〜10,000 BPE/Unigram&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;合計サイズ&lt;/td&gt;
&lt;td&gt;138MB&lt;/td&gt;
&lt;td&gt;100〜300MB (精度依存)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;モデル訓練規模&lt;/td&gt;
&lt;td&gt;不明 (Google 内部)&lt;/td&gt;
&lt;td&gt;ESPnet推奨: 1,000h+&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="デバッグメモ"&gt;デバッグメモ&lt;/h2&gt;
&lt;h3 id="問題1-libsodaso-が読み込めない"&gt;問題1: libsoda.so が読み込めない&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;OSError: libc++.so.1: cannot open shared object file&lt;/code&gt;
→ &lt;code&gt;sudo apt-get install -y libc++1&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="問題2-img-展開失敗-0バイト"&gt;問題2: .img 展開失敗 (0バイト)&lt;/h3&gt;
&lt;p&gt;ChromeOS DLC は Squashfs 形式。7z 非対応。
→ &lt;code&gt;unsquashfs&lt;/code&gt; を使う (&lt;code&gt;squashfs-tools&lt;/code&gt; パッケージ)&lt;/p&gt;
&lt;h3 id="問題3-arecord-device-or-resource-busy"&gt;問題3: arecord &amp;ldquo;Device or resource busy&amp;rdquo;&lt;/h3&gt;
&lt;p&gt;PipeWire が &lt;code&gt;plughw:X,X&lt;/code&gt; を専有。
→ &lt;code&gt;parec&lt;/code&gt; (PulseAudio録音) を使う&lt;/p&gt;
&lt;h3 id="問題4-音声受信できるが認識結果が出ない-volteer"&gt;問題4: 音声受信できるが認識結果が出ない (volteer)&lt;/h3&gt;
&lt;p&gt;volteer の libsoda.so は bitflip パッチ未実装。
→ &lt;code&gt;hatch&lt;/code&gt; (Intel 10th gen) の libsoda.so を使う (x86_64 互換)&lt;/p&gt;
&lt;h3 id="問題5-マイクゲイン低すぎ"&gt;問題5: マイクゲイン低すぎ&lt;/h3&gt;
&lt;p&gt;デフォルト27% → RMS が小さすぎて認識されない。
→ &lt;code&gt;pactl set-source-volume &amp;lt;source&amp;gt; 65%&lt;/code&gt;
→ 100%はクリッピング (peak=32768) するので 60〜70% が安定&lt;/p&gt;
&lt;h3 id="問題6-audio_level-の-rms-が常に-00"&gt;問題6: &lt;code&gt;AUDIO_LEVEL&lt;/code&gt; の rms が常に 0.0&lt;/h3&gt;
&lt;p&gt;AUDIO_LEVEL メッセージの rms はループバック音声のレベル。マイクではない。正常動作。&lt;/p&gt;
&lt;p&gt;マイク音声レベルの確認:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;struct&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nn"&gt;math&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;samples&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;struct&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;unpack_from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;lt;h&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;audio&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;audio&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;rms&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sqrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;samples&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;samples&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 無音: ~100-500、発話: ~1000-5000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="実行ログ"&gt;実行ログ&lt;/h2&gt;
&lt;p&gt;実際にローカルでデバッグように動かした時のログ:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt; 10
&lt;/span&gt;&lt;span class="lnt"&gt; 11
&lt;/span&gt;&lt;span class="lnt"&gt; 12
&lt;/span&gt;&lt;span class="lnt"&gt; 13
&lt;/span&gt;&lt;span class="lnt"&gt; 14
&lt;/span&gt;&lt;span class="lnt"&gt; 15
&lt;/span&gt;&lt;span class="lnt"&gt; 16
&lt;/span&gt;&lt;span class="lnt"&gt; 17
&lt;/span&gt;&lt;span class="lnt"&gt; 18
&lt;/span&gt;&lt;span class="lnt"&gt; 19
&lt;/span&gt;&lt;span class="lnt"&gt; 20
&lt;/span&gt;&lt;span class="lnt"&gt; 21
&lt;/span&gt;&lt;span class="lnt"&gt; 22
&lt;/span&gt;&lt;span class="lnt"&gt; 23
&lt;/span&gt;&lt;span class="lnt"&gt; 24
&lt;/span&gt;&lt;span class="lnt"&gt; 25
&lt;/span&gt;&lt;span class="lnt"&gt; 26
&lt;/span&gt;&lt;span class="lnt"&gt; 27
&lt;/span&gt;&lt;span class="lnt"&gt; 28
&lt;/span&gt;&lt;span class="lnt"&gt; 29
&lt;/span&gt;&lt;span class="lnt"&gt; 30
&lt;/span&gt;&lt;span class="lnt"&gt; 31
&lt;/span&gt;&lt;span class="lnt"&gt; 32
&lt;/span&gt;&lt;span class="lnt"&gt; 33
&lt;/span&gt;&lt;span class="lnt"&gt; 34
&lt;/span&gt;&lt;span class="lnt"&gt; 35
&lt;/span&gt;&lt;span class="lnt"&gt; 36
&lt;/span&gt;&lt;span class="lnt"&gt; 37
&lt;/span&gt;&lt;span class="lnt"&gt; 38
&lt;/span&gt;&lt;span class="lnt"&gt; 39
&lt;/span&gt;&lt;span class="lnt"&gt; 40
&lt;/span&gt;&lt;span class="lnt"&gt; 41
&lt;/span&gt;&lt;span class="lnt"&gt; 42
&lt;/span&gt;&lt;span class="lnt"&gt; 43
&lt;/span&gt;&lt;span class="lnt"&gt; 44
&lt;/span&gt;&lt;span class="lnt"&gt; 45
&lt;/span&gt;&lt;span class="lnt"&gt; 46
&lt;/span&gt;&lt;span class="lnt"&gt; 47
&lt;/span&gt;&lt;span class="lnt"&gt; 48
&lt;/span&gt;&lt;span class="lnt"&gt; 49
&lt;/span&gt;&lt;span class="lnt"&gt; 50
&lt;/span&gt;&lt;span class="lnt"&gt; 51
&lt;/span&gt;&lt;span class="lnt"&gt; 52
&lt;/span&gt;&lt;span class="lnt"&gt; 53
&lt;/span&gt;&lt;span class="lnt"&gt; 54
&lt;/span&gt;&lt;span class="lnt"&gt; 55
&lt;/span&gt;&lt;span class="lnt"&gt; 56
&lt;/span&gt;&lt;span class="lnt"&gt; 57
&lt;/span&gt;&lt;span class="lnt"&gt; 58
&lt;/span&gt;&lt;span class="lnt"&gt; 59
&lt;/span&gt;&lt;span class="lnt"&gt; 60
&lt;/span&gt;&lt;span class="lnt"&gt; 61
&lt;/span&gt;&lt;span class="lnt"&gt; 62
&lt;/span&gt;&lt;span class="lnt"&gt; 63
&lt;/span&gt;&lt;span class="lnt"&gt; 64
&lt;/span&gt;&lt;span class="lnt"&gt; 65
&lt;/span&gt;&lt;span class="lnt"&gt; 66
&lt;/span&gt;&lt;span class="lnt"&gt; 67
&lt;/span&gt;&lt;span class="lnt"&gt; 68
&lt;/span&gt;&lt;span class="lnt"&gt; 69
&lt;/span&gt;&lt;span class="lnt"&gt; 70
&lt;/span&gt;&lt;span class="lnt"&gt; 71
&lt;/span&gt;&lt;span class="lnt"&gt; 72
&lt;/span&gt;&lt;span class="lnt"&gt; 73
&lt;/span&gt;&lt;span class="lnt"&gt; 74
&lt;/span&gt;&lt;span class="lnt"&gt; 75
&lt;/span&gt;&lt;span class="lnt"&gt; 76
&lt;/span&gt;&lt;span class="lnt"&gt; 77
&lt;/span&gt;&lt;span class="lnt"&gt; 78
&lt;/span&gt;&lt;span class="lnt"&gt; 79
&lt;/span&gt;&lt;span class="lnt"&gt; 80
&lt;/span&gt;&lt;span class="lnt"&gt; 81
&lt;/span&gt;&lt;span class="lnt"&gt; 82
&lt;/span&gt;&lt;span class="lnt"&gt; 83
&lt;/span&gt;&lt;span class="lnt"&gt; 84
&lt;/span&gt;&lt;span class="lnt"&gt; 85
&lt;/span&gt;&lt;span class="lnt"&gt; 86
&lt;/span&gt;&lt;span class="lnt"&gt; 87
&lt;/span&gt;&lt;span class="lnt"&gt; 88
&lt;/span&gt;&lt;span class="lnt"&gt; 89
&lt;/span&gt;&lt;span class="lnt"&gt; 90
&lt;/span&gt;&lt;span class="lnt"&gt; 91
&lt;/span&gt;&lt;span class="lnt"&gt; 92
&lt;/span&gt;&lt;span class="lnt"&gt; 93
&lt;/span&gt;&lt;span class="lnt"&gt; 94
&lt;/span&gt;&lt;span class="lnt"&gt; 95
&lt;/span&gt;&lt;span class="lnt"&gt; 96
&lt;/span&gt;&lt;span class="lnt"&gt; 97
&lt;/span&gt;&lt;span class="lnt"&gt; 98
&lt;/span&gt;&lt;span class="lnt"&gt; 99
&lt;/span&gt;&lt;span class="lnt"&gt;100
&lt;/span&gt;&lt;span class="lnt"&gt;101
&lt;/span&gt;&lt;span class="lnt"&gt;102
&lt;/span&gt;&lt;span class="lnt"&gt;103
&lt;/span&gt;&lt;span class="lnt"&gt;104
&lt;/span&gt;&lt;span class="lnt"&gt;105
&lt;/span&gt;&lt;span class="lnt"&gt;106
&lt;/span&gt;&lt;span class="lnt"&gt;107
&lt;/span&gt;&lt;span class="lnt"&gt;108
&lt;/span&gt;&lt;span class="lnt"&gt;109
&lt;/span&gt;&lt;span class="lnt"&gt;110
&lt;/span&gt;&lt;span class="lnt"&gt;111
&lt;/span&gt;&lt;span class="lnt"&gt;112
&lt;/span&gt;&lt;span class="lnt"&gt;113
&lt;/span&gt;&lt;span class="lnt"&gt;114
&lt;/span&gt;&lt;span class="lnt"&gt;115
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981769.242031 131504 terse_processor.cc:956] Final recognition has been created.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981769.292684 81168 terse_processor.cc:3025] TerseProcessor HasRecognitionEvent With Final
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981769.292715 81168 terse_processor.cc:3355] Audio pin advanced by: 3.27s
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981769.292757 81168 terse_processor.cc:3415] Longform resets session because this session is 3.27s long.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981769.292768 81168 terse_processor.cc:1645] Cancelling session.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;W0000 00:00:1780981769.293127 81168 decoder_endpointer_stream.cc:242] Acoustic ep reader thread cancelled.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;W0000 00:00:1780981769.293153 81168 decoder_endpointer_stream.cc:242] Prefetch reader thread cancelled.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981769.293413 81168 terse_processor.cc:1492] Starting session.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981772.313959 131538 terse_processor.cc:956] Final recognition has been created.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981772.361874 81168 terse_processor.cc:3025] TerseProcessor HasRecognitionEvent With Final
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981772.361964 81168 terse_processor.cc:3355] Audio pin advanced by: 3.09s
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981772.362024 81168 terse_processor.cc:3415] Longform resets session because this session is 3.09s long.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981772.362034 81168 terse_processor.cc:1645] Cancelling session.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;W0000 00:00:1780981772.362443 81168 decoder_endpointer_stream.cc:242] Acoustic ep reader thread cancelled.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;W0000 00:00:1780981772.362457 81168 decoder_endpointer_stream.cc:242] Prefetch reader thread cancelled.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981772.362697 81168 terse_processor.cc:1492] Starting session.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;* こんにちは。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;* 今日 は 暑 いっ す ね。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981778.144007 131597 terse_processor.cc:956] Final recognition has been created.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981778.183203 81168 terse_processor.cc:3025] TerseProcessor HasRecognitionEvent With Final
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981778.183354 81168 terse_processor.cc:3355] Audio pin advanced by: 5.82s
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981778.183476 81168 terse_processor.cc:3415] Longform resets session because this session is 5.82s long.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981778.183500 81168 terse_processor.cc:1645] Cancelling session.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;W0000 00:00:1780981778.183914 81168 decoder_endpointer_stream.cc:242] Acoustic ep reader thread cancelled.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;W0000 00:00:1780981778.183933 81168 decoder_endpointer_stream.cc:242] Prefetch reader thread cancelled.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981778.184291 81168 terse_processor.cc:1492] Starting session.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981780.743660 81168 soda_async_impl.cc:1291] Current audio timestamp: 1780981780087778
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981782.286159 131631 terse_processor.cc:956] Final recognition has been created.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981782.343491 81168 terse_processor.cc:3025] TerseProcessor HasRecognitionEvent With Final
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981782.343561 81168 terse_processor.cc:3355] Audio pin advanced by: 4.08s
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981782.343734 81168 terse_processor.cc:3415] Longform resets session because this session is 4.08s long.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981782.343751 81168 terse_processor.cc:1645] Cancelling session.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;W0000 00:00:1780981782.344365 81168 decoder_endpointer_stream.cc:242] Acoustic ep reader thread cancelled.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;W0000 00:00:1780981782.344380 81168 decoder_endpointer_stream.cc:242] Prefetch reader thread cancelled.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981782.344607 81168 terse_processor.cc:1492] Starting session.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;* トゥワード ファースト アンド アキュレイト お なかなか いい。 度 い や い い。 よ く で き
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981785.503698 131657 terse_processor.cc:956] Final recognition has been created.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981785.543589 81168 terse_processor.cc:3025] TerseProcessor HasRecognitionEvent With Final
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981785.543892 81168 terse_processor.cc:3355] Audio pin advanced by: 3.24s
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981785.543985 81168 terse_processor.cc:3415] Longform resets session because this session is 3.24s long.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981785.543999 81168 terse_processor.cc:1645] Cancelling session.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;W0000 00:00:1780981785.544823 81168 decoder_endpointer_stream.cc:242] Acoustic ep reader thread cancelled.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;W0000 00:00:1780981785.544850 81168 decoder_endpointer_stream.cc:242] Prefetch reader thread cancelled.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981785.545216 81168 terse_processor.cc:1492] Starting session.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;* 制度 いや いい。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981787.976933 131684 terse_processor.cc:956] Final recognition has been created.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981788.042046 81168 terse_processor.cc:3025] TerseProcessor HasRecognitionEvent With Final
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981788.042132 81168 terse_processor.cc:3355] Audio pin advanced by: 2.46s
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981788.042187 81168 terse_processor.cc:3415] Longform resets session because this session is 2.46s long.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981788.042198 81168 terse_processor.cc:1645] Cancelling session.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;W0000 00:00:1780981788.042530 81168 decoder_endpointer_stream.cc:242] Acoustic ep reader thread cancelled.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;W0000 00:00:1780981788.042550 81168 decoder_endpointer_stream.cc:242] Prefetch reader thread cancelled.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981788.042832 81168 terse_processor.cc:1492] Starting session.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981791.378381 131706 terse_processor.cc:956] Final recognition has been created.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981791.434164 81168 terse_processor.cc:3025] TerseProcessor HasRecognitionEvent With Final
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981791.434272 81168 terse_processor.cc:3355] Audio pin advanced by: 3.42s
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981791.434355 81168 terse_processor.cc:3415] Longform resets session because this session is 3.42s long.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981791.434371 81168 terse_processor.cc:1645] Cancelling session.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;W0000 00:00:1780981791.434811 81168 decoder_endpointer_stream.cc:242] Acoustic ep reader thread cancelled.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;W0000 00:00:1780981791.434831 81168 decoder_endpointer_stream.cc:242] Prefetch reader thread cancelled.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981791.435088 81168 terse_processor.cc:1492] Starting session.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;* よく でき てる じゃん ま そら そっ か モデル の 重 さ が 全然 違う から な。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981810.275178 131733 terse_processor.cc:956] Final recognition has been created.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981810.314296 81168 terse_processor.cc:3025] TerseProcessor HasRecognitionEvent With Final
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981810.314378 81168 terse_processor.cc:3355] Audio pin advanced by: 18.87s
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981810.314577 81168 terse_processor.cc:3415] Longform resets session because this session is 18.87s long.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981810.314622 81168 terse_processor.cc:1645] Cancelling session.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;W0000 00:00:1780981810.315045 81168 decoder_endpointer_stream.cc:242] Acoustic ep reader thread cancelled.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;W0000 00:00:1780981810.315065 81168 decoder_endpointer_stream.cc:242] Prefetch reader thread cancelled.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981810.315482 81168 terse_processor.cc:1492] Starting session.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981810.692990 81168 soda_async_impl.cc:1291] Current audio timestamp: 1780981810087778
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;* ふう、 疲れ た。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981818.837511 131828 terse_processor.cc:956] Final recognition has been created.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981818.893274 81168 terse_processor.cc:3025] TerseProcessor HasRecognitionEvent With Final
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981818.893306 81168 terse_processor.cc:3355] Audio pin advanced by: 8.55s
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981818.893395 81168 terse_processor.cc:3415] Longform resets session because this session is 8.55s long.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981818.893421 81168 terse_processor.cc:1645] Cancelling session.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;W0000 00:00:1780981818.893979 81168 decoder_endpointer_stream.cc:242] Acoustic ep reader thread cancelled.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;W0000 00:00:1780981818.893999 81168 decoder_endpointer_stream.cc:242] Prefetch reader thread cancelled.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981818.894312 81168 terse_processor.cc:1492] Starting session.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981822.227670 131905 terse_processor.cc:956] Final recognition has been created.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981822.282227 81168 terse_processor.cc:3025] TerseProcessor HasRecognitionEvent With Final
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981822.282250 81168 terse_processor.cc:3355] Audio pin advanced by: 3.39s
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981822.282292 81168 terse_processor.cc:3415] Longform resets session because this session is 3.39s long.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981822.282306 81168 terse_processor.cc:1645] Cancelling session.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;W0000 00:00:1780981822.282704 81168 decoder_endpointer_stream.cc:242] Acoustic ep reader thread cancelled.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;W0000 00:00:1780981822.282722 81168 decoder_endpointer_stream.cc:242] Prefetch reader thread cancelled.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981822.282949 81168 terse_processor.cc:1492] Starting session.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981839.129265 131926 terse_processor.cc:956] Final recognition has been created.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981839.173272 81168 terse_processor.cc:3025] TerseProcessor HasRecognitionEvent With Final
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981839.173296 81168 terse_processor.cc:3355] Audio pin advanced by: 16.92s
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981839.173470 81168 terse_processor.cc:3415] Longform resets session because this session is 16.92s long.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981839.173500 81168 terse_processor.cc:1645] Cancelling session.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;W0000 00:00:1780981839.173929 81168 decoder_endpointer_stream.cc:242] Acoustic ep reader thread cancelled.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;W0000 00:00:1780981839.173948 81168 decoder_endpointer_stream.cc:242] Prefetch reader thread cancelled.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981839.174332 81168 terse_processor.cc:1492] Starting session.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981840.714665 81168 soda_async_impl.cc:1291] Current audio timestamp: 1780981840087778
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981870.732931 81168 soda_async_impl.cc:1291] Current audio timestamp: 1780981870087778
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981877.912018 132051 terse_processor.cc:956] Final recognition has been created.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981877.962263 81168 terse_processor.cc:3025] TerseProcessor HasRecognitionEvent With Final
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981877.962296 81168 terse_processor.cc:3355] Audio pin advanced by: 38.85s
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981877.962633 81168 terse_processor.cc:3415] Longform resets session because this session is 38.85s long.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981877.962689 81168 terse_processor.cc:1645] Cancelling session.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;W0000 00:00:1780981877.963052 81168 decoder_endpointer_stream.cc:242] Acoustic ep reader thread cancelled.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;W0000 00:00:1780981877.963075 81168 decoder_endpointer_stream.cc:242] Prefetch reader thread cancelled.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981877.963615 81168 terse_processor.cc:1492] Starting session.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981886.348369 132223 terse_processor.cc:956] Final recognition has been created.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981886.412668 81168 terse_processor.cc:3025] TerseProcessor HasRecognitionEvent With Final
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981886.412775 81168 terse_processor.cc:3355] Audio pin advanced by: 8.37s
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981886.412905 81168 terse_processor.cc:3415] Longform resets session because this session is 8.37s long.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981886.412921 81168 terse_processor.cc:1645] Cancelling session.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;W0000 00:00:1780981886.413291 81168 decoder_endpointer_stream.cc:242] Acoustic ep reader thread cancelled.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;W0000 00:00:1780981886.413313 81168 decoder_endpointer_stream.cc:242] Prefetch reader thread cancelled.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I0000 00:00:1780981886.413729 81168 terse_processor.cc:1492] Starting session.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;* そら そっ か。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="感想"&gt;感想&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;GoogleのSODAは単一の巨大モデルではなく、かなり実用品寄りのパイプラインだった&lt;/li&gt;
&lt;li&gt;モデルは一般的なReazonSpeechを学習したicefallと同じようにパラメーターの約90%がEncoder&lt;/li&gt;
&lt;li&gt;そして、その巨大なEncoderを常時回さず、436KBのVADを先に置く&lt;/li&gt;
&lt;li&gt;語頭を落とさないためにprefetch とリングバッファを使う&lt;/li&gt;
&lt;li&gt;発話終了はVADだけで決めず、FSTとLASの言語スコアも見る&lt;/li&gt;
&lt;li&gt;日本語のために Mozc辞書、読み変換、姓名辞書、動的コンテキスト注入も入っている&lt;/li&gt;
&lt;li&gt;音声会話システムを作ると、ASRのモデル精度だけを見がちになる&lt;/li&gt;
&lt;li&gt;でも体験として効くのは、発話開始、語頭保持、発話終了、partial/final result、句読点、コンテキスト注入、マイクゲイン、UI 表示の全部&lt;/li&gt;
&lt;li&gt;数十億人に使われている仕組みだけあってよくできていた&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="参考文献"&gt;参考文献&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://cloud.google.com/blog/ja/products/ai-machine-learning/speech-on-device-run-server-quality-speech-ai-locally?hl=ja" target="_blank" rel="noopener"
&gt;インターネット接続せずに Google Cloud 音声認識 AI をローカルで実行 | Google Cloud 公式ブログ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/biemster/gasr" target="_blank" rel="noopener"
&gt;biemster/gasr: Google Chrome SODA Offline Speech Recognition command line client&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://hackaday.io/project/164399-android-offline-speech-recognition-natively-on-pc" target="_blank" rel="noopener"
&gt;Android offline speech recognition natively on PC | Hackaday.io&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://hackaday.io/project/164399/logs" target="_blank" rel="noopener"
&gt;Project | Android offline speech recognition natively on PC | Hackaday.io&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>