<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>AI &gt; 音声 on M1KE BL0G</title><link>https://www.m1ke.org/categories/ai_speech/</link><description>Recent content in AI &gt; 音声 on M1KE BL0G</description><generator>Hugo -- gohugo.io</generator><language>ja-jp</language><copyright>mike</copyright><atom:link href="https://www.m1ke.org/categories/ai_speech/index.xml" rel="self" type="application/rss+xml"/><item><title>ビタビアルゴリズム</title><link>https://www.m1ke.org/p/%E3%83%93%E3%82%BF%E3%83%93%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0/</link><pubDate>Tue, 08 Sep 2026 13:00:00 +0900</pubDate><guid>https://www.m1ke.org/p/%E3%83%93%E3%82%BF%E3%83%93%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0/</guid><description>&lt;img src="https://www.m1ke.org/p/%E3%83%93%E3%82%BF%E3%83%93%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0/Viterbi_algorithm.png" alt="Featured image of post ビタビアルゴリズム" /&gt;&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;「pyopenjtalkの仕組み」という記事で、MeCabの形態素解析に使われているビタビアルゴリズムに触れた&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;Andrew J. Viterbiが1967年に発表した論文&lt;code&gt;Error bounds for convolutional codes and an asymptotically optimum decoding algorithm&lt;/code&gt;（&lt;code&gt;IEEE Transactions on Information Theory&lt;/code&gt;, vol. 13, pp. 260-269）が出典&lt;/li&gt;
&lt;li&gt;元々は、通信における畳み込み符号の復号のために考案されたアルゴリズム&lt;/li&gt;
&lt;li&gt;その後、隠れマルコフモデル（HMM）のデコーディング、音声認識、そしてMeCabのような形態素解析まで、幅広い分野に応用されるようになった&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="マルコフ連鎖と隠れマルコフモデル"&gt;マルコフ連鎖と隠れマルコフモデル&lt;/h2&gt;
&lt;p&gt;ビタビアルゴリズムの背景には、マルコフ連鎖と隠れマルコフモデル（HMM）という考え方がある。&lt;/p&gt;
&lt;h3 id="マルコフ連鎖markov-chain"&gt;マルコフ連鎖（Markov Chain）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ある時点の状態が、直前の状態だけに依存し、それ以前の履歴には依存しないという性質（マルコフ性）を持つ確率過程&lt;/li&gt;
&lt;li&gt;状態の集合と、状態間の遷移確率によって定義される&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="隠れマルコフモデルhmm"&gt;隠れマルコフモデル（HMM）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;マルコフ連鎖に従って遷移する状態の系列が、直接には観測できない（隠れている）というモデル&lt;/li&gt;
&lt;li&gt;代わりに、各状態から確率的に出力される観測値だけが観測できる&lt;/li&gt;
&lt;li&gt;HMMは、以下の3つの要素で定義される
&lt;ul&gt;
&lt;li&gt;初期状態確率（Initial probabilities, $\pi$）: 最初にどの状態から始まるかの確率分布&lt;/li&gt;
&lt;li&gt;状態遷移確率行列（Transition matrix, $A$）: ある状態から別の状態へ遷移する確率&lt;/li&gt;
&lt;li&gt;出力確率（Emission probabilities, $B$）: ある状態にいるときに、特定の観測値が出力される確率&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;MeCabの形態素解析に当てはめると、品詞や単語といった裏の系列（状態）が直接には観測できず、実際に書かれた表層文字列（観測値）だけが見えている、という構造に対応する&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ブルートフォース法との比較"&gt;ブルートフォース法との比較&lt;/h2&gt;
&lt;p&gt;観測系列$O$が与えられたとき、それを生み出した可能性が最も高い状態系列$Q$を求める問題を、デコーディング問題と呼ぶ。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;最も素朴な解法は、あり得る全ての状態系列を列挙し、それぞれの尤度を計算して比較するブルートフォース法（総当たり法）&lt;/li&gt;
&lt;li&gt;状態数を$N$、系列の長さを$T$とすると、あり得る状態系列の数は$N^T$通りになり、系列が長くなるほど組み合わせが指数的に爆発する&lt;/li&gt;
&lt;li&gt;例えば$N=10$、$T=20$でも$10^{20}$通りという非現実的な数になり、実用上は計算できない&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ビタビアルゴリズムは、この組み合わせ爆発を避けながら、ブルートフォース法と同じ最適解を多項式時間で求める方法。&lt;/p&gt;
&lt;h2 id="動的計画法としてのビタビアルゴリズム"&gt;動的計画法としてのビタビアルゴリズム&lt;/h2&gt;
&lt;p&gt;ビタビアルゴリズムの核心は、「未来を全部見る」のではなく「ここまでで一番いい過去だけを持って進む」という考え方。これは動的計画法（Dynamic Programming, DP）の典型例になる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ある地点に複数の経路で到達できる場合、そこから先の話には、その地点までの累積コストが最小の経路だけが関係する&lt;/li&gt;
&lt;li&gt;つまり、同じ地点に到達した経路のうち、負けている経路はその時点で切り捨ててよい&lt;/li&gt;
&lt;li&gt;全ての分割パターンを総当たりする代わりに、各地点で最良の経路だけを覚えておくことで、計算量を大きく減らせる&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="mecabでの具体例"&gt;MeCabでの具体例&lt;/h2&gt;
&lt;p&gt;MeCabの形態素解析を例に、ビタビアルゴリズムの動きを追ってみる。&lt;/p&gt;
&lt;h3 id="ラティスの構築"&gt;ラティスの構築&lt;/h3&gt;
&lt;p&gt;例えば「東京都」という文があったとき、辞書から複数の分割候補が出てくる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;「東京」＋「都」&lt;/li&gt;
&lt;li&gt;「東」＋「京都」&lt;/li&gt;
&lt;li&gt;「東京都」&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;MeCabはまず、文の各位置から始まる単語候補を全て並べて、ラティスと呼ばれる網目状のグラフを作る。ラティスの各ノードには、以下2種類のコストが割り当てられる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;単語そのもののコスト（辞書に登録された、その単語らしさを表すコスト）&lt;/li&gt;
&lt;li&gt;直前の単語との接続コスト（品詞の並びとしての自然さを表すコスト）&lt;/li&gt;
&lt;/ul&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;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;BOS
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─ 東京 (100)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ └─ 都 (+50)
&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; ├─ 東 (200)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ └─ 京都 (+300)
&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; └─ 東京都 (80)
&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; EOS
&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;ビタビアルゴリズムは、文の先頭（BOS）から順番に、各ノードまでの最小累積コストを、以下の式で計算していく。&lt;/p&gt;
$$
C(v) = \min_{u} \{ C(u) + \mathrm{connectionCost}(u,v) + \mathrm{wordCost}(v) \}
$$&lt;p&gt;$C(v)$はノード$v$までの最小累積コスト、$u$は$v$の直前になりうる各ノード。重要なのは、同じ地点に複数の経路で到達したとき、一番安かった経路だけを覚えておけばよいという点。&lt;/p&gt;
&lt;h3 id="具体的な計算結果"&gt;具体的な計算結果&lt;/h3&gt;
&lt;p&gt;上の例で言えば、以下のようになる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;「東京」→「都」: 累積コスト150&lt;/li&gt;
&lt;li&gt;「東」→「京都」: 累積コスト500&lt;/li&gt;
&lt;li&gt;「東京都」: 累積コスト80&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;このうち「東京都」1語だけの経路が最も安いため、これが採用される。文末（EOS）まで計算した後、EOSから「どのノードから来たか」を逆向きに辿る（バックトラック）ことで、最適な形態素列が得られる。&lt;/p&gt;
&lt;h3 id="処理の流れ"&gt;処理の流れ&lt;/h3&gt;
&lt;p&gt;MeCabの処理の流れをまとめると、以下のようになる。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;辞書から形態素候補を出す&lt;/li&gt;
&lt;li&gt;ラティスを作る&lt;/li&gt;
&lt;li&gt;各ノードについて最小累積コストを計算する&lt;/li&gt;
&lt;li&gt;各ノードについて、最良の直前ノードを記録する&lt;/li&gt;
&lt;li&gt;文末から先頭へバックトラックする&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="hmmにおける一般的な定式化"&gt;HMMにおける一般的な定式化&lt;/h2&gt;
&lt;p&gt;MeCabのラティスでの定式化は、コストの最小化という形だったが、隠れマルコフモデル（HMM）の文脈では、前述の初期状態確率$\pi$・遷移確率行列$A$・出力確率$B$を使った確率の最大化という形で、同じアルゴリズムが使われる。&lt;/p&gt;
&lt;p&gt;まず、時刻1（最初の観測）における各状態の確率は、初期状態確率と出力確率から以下のように求まる。&lt;/p&gt;
$$
\delta_1(j) = \pi_j \cdot b_j(o_1)
$$&lt;p&gt;時刻$t$、状態$j$における最良経路の確率$\delta_t(j)$は、以下の漸化式で計算できる。&lt;/p&gt;
$$
\delta_t(j) = \max_{i} \left[ \delta_{t-1}(i) \cdot a_{ij} \right] \cdot b_j(o_t)
$$&lt;p&gt;$a_{ij}$は遷移確率行列$A$の要素（状態$i$から状態$j$への遷移確率）、$b_j(o_t)$は出力確率$B$の要素（状態$j$で観測値$o_t$が出力される確率）。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MeCabのコスト最小化は、確率の対数を取って符号を反転させたもの（負の対数尤度）とみなせば、この確率最大化の定式化と本質的に同じ計算になる&lt;/li&gt;
&lt;li&gt;ブルートフォース法が全ての状態系列について愚直に尤度を計算するのに対し、この漸化式は各時刻・各状態について直前までの最良値だけを使い回すことで、同じ最適解を効率的に求めている&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="計算量のメリット"&gt;計算量のメリット&lt;/h2&gt;
&lt;p&gt;ブルートフォース法とビタビアルゴリズムとでは、計算量に大きな差がある。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;文の長さを$n$、各位置での候補数を$k$とすると、全ての分割パターンを総当たりで比較する場合、組み合わせの数は指数的に増えていく&lt;/li&gt;
&lt;li&gt;ビタビアルゴリズムでは、各地点で最良の経路だけを保持しながら進むため、計算量は文の長さと候補数にほぼ比例する程度に収まる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;全探索を避けながら、最終的には全体最適な経路を見つけられるというのが、動的計画法としてのビタビアルゴリズムの強み。&lt;/p&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;ビタビアルゴリズムは、1967年にAndrew Viterbiが畳み込み符号の復号のために考案した動的計画法&lt;/li&gt;
&lt;li&gt;背景には、初期状態確率$\pi$・遷移確率行列$A$・出力確率$B$で定義される隠れマルコフモデル（HMM）がある&lt;/li&gt;
&lt;li&gt;素朴なブルートフォース法では状態数$N$・系列長$T$に対し$N^T$通りの組み合わせを比較する必要があるが、「ここまでの最良の経路だけを残しながら進む」ことで、同じ最適解を効率的に求められる&lt;/li&gt;
&lt;li&gt;MeCabの形態素解析では、単語コストと接続コストの和を最小化する経路探索として使われている&lt;/li&gt;
&lt;li&gt;HMMの文脈では、確率の最大化という形で同じアルゴリズムが使われ、コスト最小化と数学的に対応している&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;Viterbi, A.J. (1967). &amp;ldquo;Error bounds for convolutional codes and an asymptotically optimum decoding algorithm.&amp;rdquo; IEEE Transactions on Information Theory, Vol. 13, pp. 260-269.&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://cs.rice.edu/~ogilvie/comp571/viterbi-algorithm/" target="_blank" rel="noopener"
&gt;Viterbi algorithm - Species and Gene Evolution&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>G2Pライブラリを作る時に調査した先行文献などのメモ</title><link>https://www.m1ke.org/p/g2p%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%82%92%E4%BD%9C%E3%82%8B%E6%99%82%E3%81%AB%E8%AA%BF%E6%9F%BB%E3%81%97%E3%81%9F%E5%85%88%E8%A1%8C%E6%96%87%E7%8C%AE%E3%81%AA%E3%81%A9%E3%81%AE%E3%83%A1%E3%83%A2/</link><pubDate>Thu, 03 Sep 2026 12:00:00 +0900</pubDate><guid>https://www.m1ke.org/p/g2p%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%82%92%E4%BD%9C%E3%82%8B%E6%99%82%E3%81%AB%E8%AA%BF%E6%9F%BB%E3%81%97%E3%81%9F%E5%85%88%E8%A1%8C%E6%96%87%E7%8C%AE%E3%81%AA%E3%81%A9%E3%81%AE%E3%83%A1%E3%83%A2/</guid><description>&lt;img src="https://www.m1ke.org/p/g2p%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%82%92%E4%BD%9C%E3%82%8B%E6%99%82%E3%81%AB%E8%AA%BF%E6%9F%BB%E3%81%97%E3%81%9F%E5%85%88%E8%A1%8C%E6%96%87%E7%8C%AE%E3%81%AA%E3%81%A9%E3%81%AE%E3%83%A1%E3%83%A2/kanji.png" alt="Featured image of post G2Pライブラリを作る時に調査した先行文献などのメモ" /&gt;&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;日本語のG2P（Grapheme-to-Phoneme、漢字仮名交じり文から読みへの変換）ライブラリを自作する機会があった&lt;/li&gt;
&lt;li&gt;素朴なG2P（辞書引きベースの変換）は「明日」のような多音字・ヘテロニム（同じ表記で複数の読みを持つ語）を文脈から判定できない&lt;/li&gt;
&lt;li&gt;この課題に対して国内外でどんな研究・手法・OSSがあるかを調査した際のメモをまとめておく&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ホモグラフとヘテロニムの違い"&gt;ホモグラフとヘテロニムの違い&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;ホモグラフ（Homograph）は、綴り（表記）が同じ語同士を指す上位概念で、発音が同じか異なるかによってさらに2つに分かれる
&lt;ul&gt;
&lt;li&gt;ヘテロニム（Heteronym）: 表記は同じだが発音が異なるもの（例: 英語の&amp;quot;lead&amp;quot;、金属の鉛／導くのlead）&lt;/li&gt;
&lt;li&gt;狭義のhomonym: 表記も発音も同じもの（例: 英語の&amp;quot;bat&amp;quot;、動物のコウモリと野球のバット）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;つまり、ヘテロニムと狭義のhomonymはどちらもホモグラフの部分集合であり、互いに排反（同時には成り立たない）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;集合の関係で表すと、以下のようになる。&lt;/p&gt;
$$
\text{Heteronym} \subset \text{Homograph}
$$&lt;p&gt;ヘテロニムと狭義のhomonymは排反で、かつ合わせるとホモグラフ全体になるため、以下のように直和で表せる。&lt;/p&gt;
$$
\text{Homograph} = \text{Heteronym} \sqcup \text{Homonym}_{\text{narrow}}
$$&lt;ul&gt;
&lt;li&gt;日本語の「市場」（いちば/しじょう）のように、同じ表記で読みが複数ある語は、英語でいうヘテロニムに相当する&lt;/li&gt;
&lt;li&gt;日本語ではこの現象を「多音字」（元は中国語由来の概念）や「同形異音語」と呼ぶことが多く、英語の論文では単に&amp;quot;homograph&amp;quot;と呼ばれることも多い。本メモでは、参照する文献の原語に合わせてホモグラフ・ヘテロニム・多音字を使い分けている&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;辞書ベースのG2Pはどちらか一方を機械的に返すだけで、文脈による判定ができない&lt;/li&gt;
&lt;li&gt;中国語圏では同じ問題が「多音字（Polyphone）」として研究されており、日本語より事例が多い&lt;/li&gt;
&lt;li&gt;発想は大きく3つに分けられる
&lt;ul&gt;
&lt;li&gt;候補を絞り込んでから文脈で判定する&lt;/li&gt;
&lt;li&gt;音声を使って実際の発話から読みを検証する&lt;/li&gt;
&lt;li&gt;辞書知識を後付けで注入する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="pyopenjtalk"&gt;pyopenjtalk&lt;/h2&gt;
&lt;p&gt;日本語のG2P・TTSでデファクトスタンダードになっている&lt;a class="link" href="https://github.com/r9y9/pyopenjtalk" target="_blank" rel="noopener"
&gt;pyopenjtalk&lt;/a&gt;が実際にどう動いているか、パッケージ内のCythonバインディング定義を読んで確認した。&lt;/p&gt;
&lt;h3 id="openjtalk"&gt;OpenJTalk&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;pyopenjtalkの実体は、OpenJTalkという日本語テキスト音声合成エンジンのPythonバインディング&lt;/li&gt;
&lt;li&gt;OpenJTalk本体はC/C++で書かれており、テキストを入力すると形態素解析から音声波形の生成までを一貫して行う&lt;/li&gt;
&lt;li&gt;pyopenjtalkはこのOpenJTalk本体をCythonでラップし、Pythonから呼び出せるようにしたもの&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="mecab"&gt;MeCab&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;OpenJTalkが内部の形態素解析エンジンとして使っている、汎用の日本語形態素解析器&lt;/li&gt;
&lt;li&gt;工藤拓氏によって開発され、単語コスト・連接コストをCRF（条件付き確率場）などの機械学習手法で学習する設計が特徴&lt;/li&gt;
&lt;li&gt;単体では辞書を差し替えて使う汎用ツールで、IPAdicやUniDicなど複数の辞書が使われる&lt;/li&gt;
&lt;li&gt;OpenJTalkはMeCabのライブラリをそのまま組み込み、辞書だけをTTS用に用意したものに差し替えて使っている&lt;/li&gt;
&lt;li&gt;実際に&lt;code&gt;pyopenjtalk&lt;/code&gt;に同梱されている辞書一式（&lt;code&gt;sys.dic&lt;/code&gt;・&lt;code&gt;matrix.bin&lt;/code&gt;・&lt;code&gt;left-id.def&lt;/code&gt;・&lt;code&gt;right-id.def&lt;/code&gt;・&lt;code&gt;unk.dic&lt;/code&gt;・&lt;code&gt;char.bin&lt;/code&gt;）のライセンス表記を確認すると、NAIST（奈良先端科学技術大学院大学）の辞書とUniDicの両方の著作権表記が含まれており、これらを元にした辞書が使われている&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="openjtalkの仕組み"&gt;OpenJTalkの仕組み&lt;/h3&gt;
&lt;p&gt;テキストから音声波形まで、以下のパイプラインで処理する。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;text2mecab&lt;/code&gt;: 入力テキストを正規化し、MeCabに渡せる形式に変換&lt;/li&gt;
&lt;li&gt;&lt;code&gt;MeCab&lt;/code&gt;による形態素解析: 文をラティス（考えられる分割・品詞の候補を網羅したグラフ構造）として展開し、各形態素の単語コスト（辞書由来）と形態素間の連接コスト（&lt;code&gt;matrix.bin&lt;/code&gt;、左右の文脈IDで定義）の合計が最小になる経路を探索する。これが最終的な分かち書き結果になる&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mecab2njd&lt;/code&gt;: MeCabの出力をNJD（Natural Japanese Dictionary）というノードのリンクリストに変換&lt;/li&gt;
&lt;li&gt;&lt;code&gt;njd_set_pronunciation&lt;/code&gt;: 辞書に登録された発音をノードにセットする。多音字の読みはここで辞書エントリの値がそのまま採用される&lt;/li&gt;
&lt;li&gt;&lt;code&gt;njd_set_digit&lt;/code&gt;: 数詞・助数詞の読み処理&lt;/li&gt;
&lt;li&gt;&lt;code&gt;njd_set_accent_phrase&lt;/code&gt; / &lt;code&gt;njd_set_accent_type&lt;/code&gt;: アクセント句の切れ目とアクセント型を規則ベースで付与&lt;/li&gt;
&lt;li&gt;&lt;code&gt;njd_set_long_vowel&lt;/code&gt; / &lt;code&gt;njd_set_unvoiced_vowel&lt;/code&gt;: 長音化・母音の無声化などの音韻規則を適用&lt;/li&gt;
&lt;li&gt;&lt;code&gt;njd2jpcommon&lt;/code&gt;: NJDを「単語→モーラ→音素」の階層構造に変換し、音声合成エンジン向けのフルコンテキストラベルを生成&lt;/li&gt;
&lt;li&gt;&lt;code&gt;htsengine&lt;/code&gt;: フルコンテキストラベルと統計モデル（htsvoice）から波形を合成&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;ポイント:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;重要なのは、多音字の読みはMeCabが選んだ辞書エントリの発音フィールドがそのまま使われるという点&lt;/li&gt;
&lt;li&gt;文の意味を理解して読みを判定しているわけではなく、あくまで形態素の連接コスト（品詞列としての自然さ）に基づく分割の副産物として、結果的に読みが決まる&lt;/li&gt;
&lt;li&gt;したがって「上手」のように品詞そのものが変わる語はある程度読み分けられる&lt;/li&gt;
&lt;li&gt;一方、「市場」のように品詞も分割位置も変わらない同形異音語は原理的に判定できない&lt;/li&gt;
&lt;li&gt;これが、このメモで挙げた各種の先行研究が対応しようとしている限界そのものにあたる&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="ビタビアルゴ"&gt;ビタビアルゴ&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;MeCabの形態素解析ラティスから最小コスト経路を求める探索に使われている動的計画法&lt;/li&gt;
&lt;li&gt;ラティスの各ノード（形態素候補）は、文頭からそのノードまでの累積コスト（辞書の単語コスト＋直前ノードとの連接コスト）を持つ&lt;/li&gt;
&lt;li&gt;各位置で、直前になりうる全ノードとの連接コストを比較し、累積コストが最小になる経路だけを残しながら文末まで進む&lt;/li&gt;
&lt;li&gt;全経路を総当たりで比較するのではなく、途中の最小コストだけを保持して使い回すため、計算量を抑えられる&lt;/li&gt;
&lt;li&gt;実際に&lt;code&gt;pyopenjtalk&lt;/code&gt;が使っているMeCabの内部構造体（&lt;code&gt;mecab_node_t&lt;/code&gt;）にも、単語コスト（&lt;code&gt;wcost&lt;/code&gt;）と文頭からの累積コスト（&lt;code&gt;cost&lt;/code&gt;）というフィールドがあり、この累積最小コストの構造がそのままビタビアルゴリズムのDPテーブルに対応している&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="中国語多言語の先行研究"&gt;中国語・多言語の先行研究&lt;/h2&gt;
&lt;p&gt;多音字判定の研究は、CPP（Chinese Polyphone Prediction）というベンチマークを軸に中国語圏で活発に進んでいる。&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;g2pW&lt;/td&gt;
&lt;td&gt;&lt;a class="link" href="https://arxiv.org/abs/2203.10430" target="_blank" rel="noopener"
&gt;arXiv:2203.10430&lt;/a&gt;（Taiwan AI Labs、Interspeech 2022）&lt;/td&gt;
&lt;td&gt;読みの語彙全体を1つの共有出力層にし、対象字ごとにありうる読みだけをハードマスクと条件付きソフト重みで絞り込むConditional Weighted Softmax。CPPでAccuracy 99.08%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Polyphone BERT&lt;/td&gt;
&lt;td&gt;&lt;a class="link" href="https://arxiv.org/abs/2207.12089" target="_blank" rel="noopener"
&gt;arXiv:2207.12089&lt;/a&gt;（Interspeech 2022）&lt;/td&gt;
&lt;td&gt;g2pWと同時期の中国語多音字BERT。Accuracy 92.1→94.1%とg2pWに劣る&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;半教師あり学習&lt;/td&gt;
&lt;td&gt;&lt;a class="link" href="https://arxiv.org/html/2102.00621v3" target="_blank" rel="noopener"
&gt;arXiv:2102.00621&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;ラベル無しデータをlexicon-based labelingとentropy-thresholdingで疑似ラベル化。Accuracy 0.864→0.928&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Back-Translation型データ拡張&lt;/td&gt;
&lt;td&gt;&lt;a class="link" href="https://arxiv.org/pdf/2211.09495" target="_blank" rel="noopener"
&gt;arXiv:2211.09495&lt;/a&gt;（APSIPA ASC 2022）&lt;/td&gt;
&lt;td&gt;G2Pと逆方向のP2Gを両方学習し、予測の往復一貫性で疑似ラベルを検証&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LLM＋外部知識（Ant Group）&lt;/td&gt;
&lt;td&gt;&lt;a class="link" href="https://arxiv.org/pdf/2312.11920" target="_blank" rel="noopener"
&gt;arXiv:2312.11920&lt;/a&gt;（2023）&lt;/td&gt;
&lt;td&gt;多音字判定を分類でなく生成タスクとして解く。辞書からのRetrievalとChatGLM-6Bの組み合わせで、学習データに無い未知の多音字も辞書にあれば予測できる。CPPでAccuracy 99.29%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DLM&lt;/td&gt;
&lt;td&gt;&lt;a class="link" href="https://aclanthology.org/2024.naacl-long.294.pdf" target="_blank" rel="noopener"
&gt;ACL Anthology 2024.naacl-long.294&lt;/a&gt;（NAACL 2024）&lt;/td&gt;
&lt;td&gt;長尾分布対策として、表現学習（自然分布のまま）と分類学習（バックボーン凍結＋低頻度クラス優遇再学習）を分離するDecoupled Learning。CPPでAccuracy 99.07%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Logit Adjustment&lt;/td&gt;
&lt;td&gt;&lt;a class="link" href="https://arxiv.org/abs/2007.07314" target="_blank" rel="noopener"
&gt;arXiv:2007.07314&lt;/a&gt;（Google Research、ICLR 2021）&lt;/td&gt;
&lt;td&gt;共有softmaxを前提に、推論時または損失関数側でクラス事前確率のlogをロジットから減算し長尾偏りを補正するシンプルな手法&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVTE-Poly&lt;/td&gt;
&lt;td&gt;&lt;a class="link" href="https://www.isca-archive.org/interspeech_2023/zhang23h_interspeech.pdf" target="_blank" rel="noopener"
&gt;ISCA Interspeech 2023&lt;/a&gt;（CVTE社/華東師範大学）&lt;/td&gt;
&lt;td&gt;既存CPPベンチマークの誤ラベルと不均衡による精度の過大評価を指摘し、拡張データセットと3種類の評価指標を提案&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dict-TTS&lt;/td&gt;
&lt;td&gt;&lt;a class="link" href="https://ar5iv.labs.arxiv.org/html/2206.02147" target="_blank" rel="noopener"
&gt;ar5iv 2206.02147&lt;/a&gt;（NeurIPS 2022）&lt;/td&gt;
&lt;td&gt;辞書の意味表現を注意機構で照合するSemantics-to-Pronunciation Attention。中国語・日本語・広東語で評価したが、日本語だけ大きく精度が悪く、pyopenjtalk等の既存G2Pに劣ると論文自身が明記している&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Dict-TTSの結果は興味深く、辞書の意味知識だけに頼るニューラル手法でも、日本語では既存のルールベースG2Pに勝てないという結果になっている。表語文字と表音文字が混在し、音読み・訓読みという体系を持つ日本語特有の難しさが背景にあると考えられる。&lt;/p&gt;
&lt;h2 id="日本語特化の先行研究"&gt;日本語特化の先行研究&lt;/h2&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;Sony 日本語TTS front-end&lt;/td&gt;
&lt;td&gt;&lt;a class="link" href="https://ar5iv.labs.arxiv.org/html/2201.09427" target="_blank" rel="noopener"
&gt;ar5iv 2201.09427&lt;/a&gt;（2022）&lt;/td&gt;
&lt;td&gt;形態素解析由来の特徴とBERT/Flair埋め込みをBiLSTMに入力し、多音字判定とアクセント推定を同時学習。KyTeaベースライン比でPolyphone Disambiguation +5.7pt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;疑似訓練データ×one-shot&lt;/td&gt;
&lt;td&gt;&lt;a class="link" href="https://www.anlp.jp/proceedings/annual_meeting/2023/pdf_dir/B3-5.pdf" target="_blank" rel="noopener"
&gt;言語処理学会2023 B3-5&lt;/a&gt;（小林・古宮・新納）&lt;/td&gt;
&lt;td&gt;BCCWJの大量疑似データで事前学習し、対象ドメインの正解例を1単語1例だけ追加学習するだけで、全データ学習に近い精度まで到達。「市場」「大勢」などが構造的に難しい語として報告されている&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NHK技研 Transformer+BERTハイブリッド&lt;/td&gt;
&lt;td&gt;&lt;a class="link" href="https://www.isca-archive.org/interspeech_2024/kurihara24_interspeech.pdf" target="_blank" rel="noopener"
&gt;ISCA Interspeech 2024&lt;/a&gt;（Kurihara &amp;amp; Sano）&lt;/td&gt;
&lt;td&gt;外部辞書から引いた読み・アクセント情報をタグとして文中に埋め込み、Transformerがタグ部分をそのまま素通ししてG2P変換する設計。Open JTalk比で助数詞のCERを16.24%から1.42%まで改善&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sarashina2.2-TTS&lt;/td&gt;
&lt;td&gt;&lt;a class="link" href="https://arxiv.org/abs/2606.25369" target="_blank" rel="noopener"
&gt;arXiv:2606.25369&lt;/a&gt;（SB Intuitions、2026）&lt;/td&gt;
&lt;td&gt;多音字現象を「読み判定」と「連濁・促音化などの音韻変異」に分けて扱うデータ合成パイプライン。LLMによる文生成、UniDicによる検証、TTSとASRの往復検証を組み合わせ、常用漢字全体に対して約28万件の合成サンプルを生成している&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LLMベース日本語G2Pベンチマーク（CyberAgent）&lt;/td&gt;
&lt;td&gt;&lt;a class="link" href="https://arxiv.org/abs/2606.22009" target="_blank" rel="noopener"
&gt;arXiv:2606.22009&lt;/a&gt;（Koriyama、Interspeech 2026採択）&lt;/td&gt;
&lt;td&gt;30以上のLLMを、形態素解析JSONを出力させるParse modeと全文カナを直接出力させるDirect modeで評価し、OpenJTalkやMeCab等の従来ツールと比較。最良はClaude Opus 4.6（parse mode）でCER 0.52%、従来ツール最良のOpenJTalkは1.03%。LLMは辞書に無い低頻度語に強く、Parse modeがDirect modeを一貫して上回るという知見が得られている&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;YOMI-Bench&lt;/td&gt;
&lt;td&gt;&lt;a class="link" href="https://arxiv.org/abs/2607.00664" target="_blank" rel="noopener"
&gt;arXiv:2607.00664&lt;/a&gt;（Mibayashi, Takamura, Yanaka、2026）&lt;/td&gt;
&lt;td&gt;常用漢字から約2,000問の4択選択式ベンチマークを構築し、LLMの漢字読み理解を評価&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CC-G2PnP&lt;/td&gt;
&lt;td&gt;&lt;a class="link" href="https://arxiv.org/abs/2602.17157" target="_blank" rel="noopener"
&gt;arXiv:2602.17157&lt;/a&gt;（Shirahata &amp;amp; Yamamoto、ICASSP 2026採択）&lt;/td&gt;
&lt;td&gt;Conformer-CTCによるストリーミングG2P＋プロソディ予測。CTCデコーダが学習中に書記素と音素の対応を自動学習するため、明確な単語境界を持たない日本語のような言語でも分かち書きに依存せず動作する。入力をチャンク単位で処理し、最小限の先読みでストリーミング推論を実現&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;All-Words Pronunciation Estimation of Japanese Homographs&lt;/td&gt;
&lt;td&gt;Kobayashi, Komiya, Shinnou（NLDB 2024, Springer LNCS 14762、2025年ScienceDirect拡張版）&lt;/td&gt;
&lt;td&gt;日本語ホモグラフの「全語」を対象にした読み推定を初めて試みた研究。BERTベースのモデルを、BCCWJの非コアデータに形態素解析器で自動タグ付けした読みラベルで学習し、CSJ（日本語話し言葉コーパス）で評価している&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pronunciation Ambiguities in Japanese Kanji&lt;/td&gt;
&lt;td&gt;&lt;a class="link" href="https://aclanthology.org/2023.cawl-1.7.pdf" target="_blank" rel="noopener"
&gt;ACL Anthology CAWL 2023&lt;/a&gt;（Wen Zhang, CUNY）&lt;/td&gt;
&lt;td&gt;単漢字（複合語ではない）のホモグラフ判定に特化した研究。UD Japanese-GSDとオンライン辞書から100の頻出ホモグラフを抽出し、フィルタリングを経て26語・1,903用例のデータセットを構築。ニューラルネットではなく前後n-gram特徴のロジスティック回帰で判定し、品詞情報は判定にほとんど寄与しないと報告している&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="非公開の商用モデル参考記録"&gt;非公開の商用モデル（参考記録）&lt;/h2&gt;
&lt;p&gt;論文やOSSではないが、多音字判定という点で無視できない先行事例としてParakeet社の&lt;strong&gt;Parayomi v1.0.0&lt;/strong&gt;がある。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;自社の日本語読み推定モデルで、JKYB-Parakeet（後述のベンチマーク）でAccuracy 99.808%を公開している&lt;/li&gt;
&lt;li&gt;同ベンチマークでGPT-5.5と同率、Gemini 3.1 Proの99.749%を上回る&lt;/li&gt;
&lt;li&gt;Parakeet社自身の説明では、大規模言語モデルのような重いモデルは使わず、外部APIも使わずCPUでも高速に動作するとされている&lt;/li&gt;
&lt;li&gt;モデルの重み・アーキテクチャ・学習データ・パラメータ数は公開されておらず、公開されているHugging Face Spaceもフロントエンドのみでバックエンドは非公開&lt;/li&gt;
&lt;li&gt;公開情報は&lt;a class="link" href="https://zenn.dev/parakeet_tech/articles/936532be817118" target="_blank" rel="noopener"
&gt;Zenn記事&lt;/a&gt;とベンチマーク数値に限られる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;精度そのものは高いが再現性のある手法として参照はできず、あくまで「ここまでの精度が実用レベルで達成可能」という目標値としての位置づけになる。&lt;/p&gt;
&lt;h2 id="英語圏のヘテロニム研究"&gt;英語圏のヘテロニム研究&lt;/h2&gt;
&lt;p&gt;英語の&amp;quot;read&amp;quot;（過去形/現在形）のようなホモグラフも同種の問題として研究されている。&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;SoundChoice&lt;/td&gt;
&lt;td&gt;&lt;a class="link" href="https://arxiv.org/abs/2207.13703" target="_blank" rel="noopener"
&gt;arXiv:2207.13703&lt;/a&gt;（Mila/Concordia、Interspeech 2022）&lt;/td&gt;
&lt;td&gt;通常のNLL損失に加えて、ヘテロニムに対応する音素部分だけを切り出して重み付けするヘテロニム損失を導入。ヘテロニム損失ありでAccuracy 82%から87%まで改善している&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RAD-TTS Alignerによる自動ラベリング&lt;/td&gt;
&lt;td&gt;&lt;a class="link" href="https://arxiv.org/pdf/2302.14523" target="_blank" rel="noopener"
&gt;arXiv:2302.14523&lt;/a&gt;（NVIDIA）&lt;/td&gt;
&lt;td&gt;音声とテキストのアライメントモデルで、ヘテロニムの各読み候補の音素表現と実際の音声フレームとの距離を計算し、最も近い候補を正解ラベルとして自動採用する。人手ラベリングコストを避けつつデータを増やす手法&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="学習手法評価基準に関する研究"&gt;学習手法・評価基準に関する研究&lt;/h2&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;Deep Long-Tailed Learning&lt;/td&gt;
&lt;td&gt;&lt;a class="link" href="https://arxiv.org/pdf/2110.04596" target="_blank" rel="noopener"
&gt;arXiv:2110.04596&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;ロングテール分類のサーベイ論文。集計Accuracyで早期打ち切りを判断すると高頻度クラスに支配されるため、クラスバランス済み指標（macro accuracy／balanced accuracy）を使う方が適切と指摘&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Early Period of Training Impacts Adaptation for OOD Generalization&lt;/td&gt;
&lt;td&gt;&lt;a class="link" href="https://arxiv.org/abs/2403.15210" target="_blank" rel="noopener"
&gt;arXiv:2403.15210&lt;/a&gt;（2024）&lt;/td&gt;
&lt;td&gt;学習初期の動的挙動が、その後のID（学習データと同分布）性能とOOD（分布外）性能の乖離に大きく影響すると指摘。対策としてgradual unfreezing（ULMFiT由来、上位層から段階的に凍結解除する手法）を提案&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DoAug&lt;/td&gt;
&lt;td&gt;&lt;a class="link" href="https://arxiv.org/abs/2502.11671" target="_blank" rel="noopener"
&gt;arXiv:2502.11671&lt;/a&gt;（2025）&lt;/td&gt;
&lt;td&gt;LLMによるデータ拡張で「サンプル数を増やす」ことより「サンプル分布の多様性」を重視する手法。専用のパラフレーザーLLMを多様性志向でファインチューンし、12データセットで平均+10.52%の性能向上&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;On the Stability of Fine-tuning BERT&lt;/td&gt;
&lt;td&gt;&lt;a class="link" href="https://arxiv.org/abs/2006.04884" target="_blank" rel="noopener"
&gt;arXiv:2006.04884&lt;/a&gt;（Mosbach et al., ICLR 2021）&lt;/td&gt;
&lt;td&gt;BERTファインチューニングをseedを変えて繰り返すと性能が大きくばらつく問題を分析。従来「破滅的忘却」や「データセットが小さいこと」が原因とされていたが、いずれも説明として不十分であることを示し、実際の原因は勾配消失を招く最適化上の困難であると特定。標準的な学習率（2e-5〜5e-5）より高い学習率（1e-4クラス）は不安定化を招きやすいと報告している&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="seq2seq型g2p候補制限型とは異なる系譜"&gt;seq2seq型G2P（候補制限型とは異なる系譜）&lt;/h2&gt;
&lt;p&gt;ここまでの手法の多くは「候補を絞り込んでから分類する」（g2pW系）という設計だが、文字列を直接生成するseq2seq型という別の系譜もある。未登録語にも原理上対応できる一方、現状の公開実装は候補制限型より精度が低い傾向にある。&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;Seq2Seq G2Pの起源&lt;/td&gt;
&lt;td&gt;&lt;a class="link" href="https://www.isca-archive.org/interspeech_2015/yao15_interspeech.pdf" target="_blank" rel="noopener"
&gt;ISCA Interspeech 2015&lt;/a&gt;（Yao &amp;amp; Zweig）&lt;/td&gt;
&lt;td&gt;双方向LSTMのseq2seqを英語G2Pに適用した初期研究。この系譜の出発点&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;KWJA&lt;/td&gt;
&lt;td&gt;&lt;a class="link" href="https://github.com/ku-nlp/kwja" target="_blank" rel="noopener"
&gt;GitHub&lt;/a&gt;（京都大学、ACL 2023 Demo）&lt;/td&gt;
&lt;td&gt;形態素解析・正規化・読み推定・見出し語化を統合的にこなす日本語解析器。seq2seqモジュールにはRetrieva社の&lt;code&gt;retrieva-jp/t5-base-long&lt;/code&gt;／&lt;code&gt;retrieva-jp/t5-large-long&lt;/code&gt;を採用しているが、CyberAgentのベンチマーク（前述）ではCER 2.52%とOpenJTalk（1.03%）に劣る&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ByT5によるG2P&lt;/td&gt;
&lt;td&gt;&lt;a class="link" href="https://arxiv.org/abs/2204.03067" target="_blank" rel="noopener"
&gt;arXiv:2204.03067&lt;/a&gt;（Zhu et al.、Interspeech 2022）&lt;/td&gt;
&lt;td&gt;バイト単位のByT5が、サブワード分割ベースのmT5より少ないパラメータ数で多言語G2Pの精度を上回ることを示した研究。NVIDIA NeMoのByT5 G2Pの土台になっている&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NVIDIA NeMo G2Pモジュール&lt;/td&gt;
&lt;td&gt;&lt;a class="link" href="https://docs.nvidia.com/nemo-framework/user-guide/latest/nemotoolkit/tts/g2p.html" target="_blank" rel="noopener"
&gt;公式ドキュメント&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;ByT5 G2P（バイト単位のT5で未知の文字・スクリプトも原理上扱える）とG2P-Conformer（CTC損失で訓練するConformerエンコーダ＋線形デコーダ、ByT5比約1/20のパラメータ数）の2種類を提供&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MixedG2P-T5&lt;/td&gt;
&lt;td&gt;&lt;a class="link" href="https://arxiv.org/pdf/2509.01391" target="_blank" rel="noopener"
&gt;arXiv:2509.01391&lt;/a&gt;（2025）&lt;/td&gt;
&lt;td&gt;明示的なG2P規則設計を不要にする（G2P-free）ことを目指した手法。事前学習済みT5を音声の自己教師学習信号でファインチューンし、文字列から直接音声表現へマッピングする。日本語のような漢字・かな混在スクリプト言語を主な対象として想定している&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;ByT5自体はG2P専用ではなく、汎用のバイト単位T5だが、その後継となるバイト単位言語モデルの系譜もG2Pの設計を考える上で参考になる（いずれもG2Pへの直接応用は未確認、一般的な言語モデルアーキテクチャとして）。&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;Charformer&lt;/td&gt;
&lt;td&gt;&lt;a class="link" href="https://arxiv.org/abs/2106.12672" target="_blank" rel="noopener"
&gt;arXiv:2106.12672&lt;/a&gt;（Tay et al., Google Research/DeepMind、ICLR 2022）&lt;/td&gt;
&lt;td&gt;バイト列から「準サブワード」のブロックを、勾配ベースの学習（GBST）でモデル内部で動的にグループ化する仕組み。ByT5のようなバイト単位モデルの「シーケンスが伸びすぎる」弱点を狙った改良で、素のバイト単位Transformerより28〜100%高速化&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MEGABYTE&lt;/td&gt;
&lt;td&gt;&lt;a class="link" href="https://arxiv.org/abs/2305.07185" target="_blank" rel="noopener"
&gt;arXiv:2305.07185&lt;/a&gt;（Yu et al., Meta AI、NeurIPS 2023）&lt;/td&gt;
&lt;td&gt;バイト列をパッチ単位でまとめ、ローカルモデルとグローバルモデルの階層構造にすることで、100万バイト規模の系列でも扱えるようにした設計&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Byte Latent Transformer（BLT）&lt;/td&gt;
&lt;td&gt;&lt;a class="link" href="https://arxiv.org/abs/2412.09871" target="_blank" rel="noopener"
&gt;arXiv:2412.09871&lt;/a&gt;（Meta FAIR、2024年12月）&lt;/td&gt;
&lt;td&gt;バイト列を次バイトの情報量（エントロピー）に応じて動的にパッチ分割する設計。トークン化ベースのLLMと同等の性能を、80億パラメータ・4兆バイト規模のスケーリング実験で確認したと報告している&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multiscale Byte Language Models（MBLM）&lt;/td&gt;
&lt;td&gt;&lt;a class="link" href="https://arxiv.org/abs/2502.14553" target="_blank" rel="noopener"
&gt;arXiv:2502.14553&lt;/a&gt;（2025年2月）&lt;/td&gt;
&lt;td&gt;MEGABYTEの階層構造を、段数に制限のない一般的なアーキテクチャへ拡張した設計。単一GPUで500万バイトのコンテキストウィンドウでの学習を可能にしている&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;KWJAが使っている&lt;code&gt;retrieva-jp/t5-base-long&lt;/code&gt;のように、日本語事前学習済みT5にはいくつか系統がある。&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;sonoisa&lt;/td&gt;
&lt;td&gt;&lt;code&gt;t5-base-japanese&lt;/code&gt;、&lt;code&gt;t5-base-japanese-mC4-Wikipedia&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Wikipedia・OSCAR・CC-100（約100GB）、mC4+Wikipedia版は約890GB&lt;/td&gt;
&lt;td&gt;最も広く使われている日本語T5の1つ。バリエーションが豊富&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;megagonlabs&lt;/td&gt;
&lt;td&gt;&lt;code&gt;t5-base-japanese-web&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;日本語のWebテキスト&lt;/td&gt;
&lt;td&gt;語彙サイズ32K（8K版もあり）、Web文書向け&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;retrieva-jp&lt;/td&gt;
&lt;td&gt;&lt;code&gt;t5-small-short&lt;/code&gt;／&lt;code&gt;t5-base-medium&lt;/code&gt;／&lt;code&gt;t5-base-long&lt;/code&gt;／&lt;code&gt;t5-large-medium&lt;/code&gt;／&lt;code&gt;t5-large-long&lt;/code&gt;／&lt;code&gt;t5-xl&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;mC4の日本語部分＋日本語Wikipedia（2022年9月時点）&lt;/td&gt;
&lt;td&gt;T5 v1.1アーキテクチャ。small〜xlのモデルサイズと、short/medium/longの学習ステップ数（系列長）を組み合わせたバリエーションを提供。KWJAはこの系列を採用&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;いずれも汎用の日本語T5であり、G2P専用に設計されたものではない。KWJAのように読み推定を含む複数タスクを1つのT5でこなす場合はこうした汎用モデルをファインチューンする一方、ByT5 G2PやMixedG2P-T5のように、そもそもサブワードではなくバイト・文字単位で扱う設計にすることで、日本語特有の未知語・混在スクリプト問題を回避しようとする流れもある。&lt;/p&gt;
&lt;h2 id="ハイブリッドg2p設計規則ベースニューラルの併用"&gt;ハイブリッドG2P設計（規則ベース＋ニューラルの併用）&lt;/h2&gt;
&lt;p&gt;候補制限型・seq2seq型のどちらでもなく、規則的に決まる部分は軽量な手法に任せ、未知・不規則な部分だけニューラルモデルに回すという設計も、低〜中資源言語のG2P研究では繰り返し見られる。&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;Fast, Not Fancy&lt;/td&gt;
&lt;td&gt;&lt;a class="link" href="https://arxiv.org/abs/2505.12973" target="_blank" rel="noopener"
&gt;arXiv:2505.12973&lt;/a&gt;（EMNLP 2025 Findings）&lt;/td&gt;
&lt;td&gt;ペルシャ語のホモグラフ解消。半自動パイプラインでホモグラフ特化データセット（HomoRich）を構築し、ルールベースのeSpeakを改良（HomoFast eSpeak）。ホモグラフ解消精度が約30%向上し、「豊富なデータ×ルールベース」が派手な深層学習単体に必ずしも劣らないと主張&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ブルガリア語のFST+seq2seq&lt;/td&gt;
&lt;td&gt;（詳細未調査）&lt;/td&gt;
&lt;td&gt;FST（有限状態トランスデューサ）で規則的な変換（子音対応・母音変化等）を処理し、seq2seq/LSTMは不規則な部分（アクセント予測等）に限定して使用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;タイ語の辞書引き+ニューラルフォールバック&lt;/td&gt;
&lt;td&gt;（詳細未調査）&lt;/td&gt;
&lt;td&gt;通常は辞書引きで高速処理し、辞書に無い語（OOV）のみニューラルフォールバックに回す。OOV率0.5%、平均レイテンシ0.15ms/発話&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Massively Multilingual Neural G2P&lt;/td&gt;
&lt;td&gt;&lt;a class="link" href="https://arxiv.org/pdf/1708.01464" target="_blank" rel="noopener"
&gt;arXiv:1708.01464&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;多言語間の転移学習で低資源言語のG2P精度を底上げ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multimodal, Multilingual G2P for Low-Resource Languages&lt;/td&gt;
&lt;td&gt;&lt;a class="link" href="https://aclanthology.org/D19-6121/" target="_blank" rel="noopener"
&gt;ACL Anthology D19-6121&lt;/a&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;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;「既知・規則的な部分は軽量な手法に任せ、未知・不規則な部分だけ重いモデルに回す」という設計は、パシュト語・タガログ語・リトアニア語などのRNN低資源G2P研究にも共通して見られる。データが潤沢でない言語ほど合理的な設計とされ、逆に英語のような高資源言語では、候補制限・ハイブリッドを介さないフルニューラルのend-to-endが主流になる傾向がある。&lt;/p&gt;
&lt;h2 id="手法の見取り図-bert系seq2seq系ハイブリッド系"&gt;手法の見取り図: BERT系・seq2seq系・ハイブリッド系&lt;/h2&gt;
&lt;p&gt;ここまで挙げた手法をアーキテクチャの系統で整理すると、大きく3つに分かれる。&lt;/p&gt;
&lt;h3 id="bert系候補制限型分類ベース"&gt;BERT系（候補制限型・分類ベース）&lt;/h3&gt;
&lt;p&gt;候補を絞り込んだ上で、BERT等のエンコーダでどれが正解かを分類する設計。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;g2pW&lt;/li&gt;
&lt;li&gt;yomikata／tsqyomi&lt;/li&gt;
&lt;li&gt;Sony 日本語TTS front-end&lt;/li&gt;
&lt;li&gt;NHK技研 Transformer+BERTハイブリッド&lt;/li&gt;
&lt;li&gt;DLM&lt;/li&gt;
&lt;li&gt;Logit Adjustment&lt;/li&gt;
&lt;li&gt;CVTE-Poly&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="seq2seq系文字列を直接生成"&gt;seq2seq系（文字列を直接生成）&lt;/h3&gt;
&lt;p&gt;候補を絞らず、文字列から読みを直接生成する設計。未登録語にも原理上対応できる一方、現状の公開実装は候補制限型より精度が低い傾向にある。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Seq2Seq G2Pの起源（Yao &amp;amp; Zweig）&lt;/li&gt;
&lt;li&gt;KWJA&lt;/li&gt;
&lt;li&gt;ByT5によるG2P&lt;/li&gt;
&lt;li&gt;NVIDIA NeMo G2Pモジュール&lt;/li&gt;
&lt;li&gt;MixedG2P-T5&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="ハイブリッド系規則ベースニューラルの併用"&gt;ハイブリッド系（規則ベース＋ニューラルの併用）&lt;/h3&gt;
&lt;p&gt;規則的に決まる部分は軽量な手法に任せ、未知・不規則な部分だけニューラルモデルに回す設計。低〜中資源言語で繰り返し見られるパターン。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fast, Not Fancy（HomoFast eSpeak）&lt;/li&gt;
&lt;li&gt;ブルガリア語のFST+seq2seq&lt;/li&gt;
&lt;li&gt;タイ語の辞書引き+ニューラルフォールバック&lt;/li&gt;
&lt;li&gt;モンゴル語のハイブリッドアプローチ&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="どちらにも分類しづらい例外"&gt;どちらにも分類しづらい例外&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;LLM生成型（Ant Group、CyberAgentのLLMベンチマーク）: 広い意味ではseq2seq（生成）寄りだが、専用に学習した小型モデルではなく汎用LLMをプロンプトで使う点が異なる&lt;/li&gt;
&lt;li&gt;furigana_whisper_small_jsut: テキストではなく音声を条件に使うWhisperベースのseq2seqで、入力モダリティが他と異なる&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2系統の境界は実は曖昧"&gt;2系統の境界は実は曖昧&lt;/h3&gt;
&lt;p&gt;BERT系とseq2seq系は、設計思想としては対照的だが、どちらも辞書知識を使って出力を制約できるという点では収束する。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;BERT系（g2pW）は、対象語ごとにありうる読みだけを残すハードマスクで、共有出力層の分類先を辞書から絞り込んでいる&lt;/li&gt;
&lt;li&gt;seq2seq系でも、デコーダの各生成ステップで辞書に無い文字列を候補から除外する制約付きデコーディング（lexically constrained decoding）を使えば、同じように辞書で出力を絞り込める&lt;/li&gt;
&lt;li&gt;つまり「候補を絞ってから分類するか、生成しながら絞り込むか」という違いであって、辞書知識を使うこと自体は両系統に共通する選択肢&lt;/li&gt;
&lt;li&gt;逆に言えば、seq2seq系の最大の弱点である未知語へのハルシネーション（辞書に無い読みをもっともらしく生成してしまう問題）も、制約をかければ候補制限型と同じ土俵に戻ってきてしまうため、seq2seq本来の強み（辞書に無い語にも対応できること）とのトレードオフになる&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="oss公開モデル"&gt;OSS・公開モデル&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;a class="link" href="https://github.com/r9y9/pyopenjtalk" target="_blank" rel="noopener"
&gt;pyopenjtalk&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;OpenJTalkのPythonバインディング。辞書ベースのルールベースG2P&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class="link" href="https://github.com/passaglia/yomikata" target="_blank" rel="noopener"
&gt;yomikata&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;ファインチューン済みBERTによる同形異音語判定ライブラリ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class="link" href="https://github.com/tsukumijima/pyopenjtalk-plus" target="_blank" rel="noopener"
&gt;tsukumijima/pyopenjtalk-plus&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;pyopenjtalk拡張版。ヘテロニム判定モデル（tsqyomi）を同梱&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class="link" href="https://huggingface.co/sbintuitions" target="_blank" rel="noopener"
&gt;modernbert-ja&lt;/a&gt;（SB Intuitions）&lt;/td&gt;
&lt;td&gt;ModernBERTアーキテクチャの日本語版事前学習モデル群&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class="link" href="https://github.com/lingjzhu/CharsiuG2P" target="_blank" rel="noopener"
&gt;CharsiuG2P&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;多言語対応のG2Pツール&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class="link" href="https://huggingface.co/Parakeet-Inc/furigana_whisper_small_jsut" target="_blank" rel="noopener"
&gt;furigana_whisper_small_jsut&lt;/a&gt;（Parakeet Inc.）&lt;/td&gt;
&lt;td&gt;Whisperのプロンプトに書記素列を挿入し、Decoderのみをファインチューンして実際に発話された音素列を出力するモデル。音声を条件に使う点が特徴だが、公開小モデル単体の精度は限定的で、MeCabのN-best読み候補との編集距離でフィルタリングする運用が前提になっている。元記事は&lt;a class="link" href="https://zenn.dev/parakeet_tech/articles/2591e71094ea58" target="_blank" rel="noopener"
&gt;Zenn&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class="link" href="https://github.com/miurahr/pykakasi" target="_blank" rel="noopener"
&gt;pykakasi&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;かな漢字文からローマ字/ひらがな変換。文脈依存の読み分けは無い&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class="link" href="https://github.com/WorksApplications/SudachiPy" target="_blank" rel="noopener"
&gt;SudachiPy&lt;/a&gt; / &lt;a class="link" href="https://github.com/polm/fugashi" target="_blank" rel="noopener"
&gt;fugashi&lt;/a&gt; / &lt;a class="link" href="https://github.com/taishi-i/nagisa" target="_blank" rel="noopener"
&gt;nagisa&lt;/a&gt; / &lt;a class="link" href="https://github.com/mocobeta/janome" target="_blank" rel="noopener"
&gt;Janome&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;形態素解析器。分かち書きを担うツール群で、多音字判定そのものは解決しない&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class="link" href="https://github.com/ku-nlp/jumanpp" target="_blank" rel="noopener"
&gt;Juman++&lt;/a&gt;（京都大学）&lt;/td&gt;
&lt;td&gt;形態素解析器。RNN言語モデルで単語列の意味的妥当性を考慮するのが特徴。Apache-2.0。出力に読み情報を含むが、辞書ベースの読みを返す点は他の形態素解析器と同様で、文脈依存のヘテロニム判定に特化した機能ではない&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;日本語NLP全般のcuratedリストである&lt;a class="link" href="https://github.com/taishi-i/awesome-japanese-nlp-resources" target="_blank" rel="noopener"
&gt;taishi-i/awesome-japanese-nlp-resources&lt;/a&gt;も一通り確認したが、上記に挙げた以外で多音字・ヘテロニム判定に直接効く新規のツールは見当たらなかった。&lt;/p&gt;
&lt;h2 id="辞書"&gt;辞書&lt;/h2&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;&lt;a class="link" href="http://ftp.edrdg.org/pub/Nihongo/JMdict_e.gz" target="_blank" rel="noopener"
&gt;JMdict&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;CC BY-SA 4.0&lt;/td&gt;
&lt;td&gt;日本語の一般語彙辞書。見出し語・読み・英語訳&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class="link" href="http://ftp.edrdg.org/pub/Nihongo/JMnedict.xml.gz" target="_blank" rel="noopener"
&gt;JMnedict&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;CC BY-SA 4.0&lt;/td&gt;
&lt;td&gt;人名・地名などの固有名詞辞書&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class="link" href="http://ftp.edrdg.org/pub/Nihongo/kanjidic2.xml.gz" target="_blank" rel="noopener"
&gt;KANJIDIC2&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;CC BY-SA 4.0&lt;/td&gt;
&lt;td&gt;漢字ごとの音読み・訓読みデータベース&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class="link" href="https://github.com/WorksApplications/SudachiDict" target="_blank" rel="noopener"
&gt;SudachiDict&lt;/a&gt;（small/core/notcore）&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;
&lt;td&gt;形態素解析器Sudachiの辞書。見出し語・品詞・読みカナなど&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class="link" href="https://clrd.ninjal.ac.jp/unidic/en/back_number_en.html" target="_blank" rel="noopener"
&gt;UniDic-cwj&lt;/a&gt; 3.1.0（国語研）&lt;/td&gt;
&lt;td&gt;GPL v2.0／LGPL v2.1／New BSD選択制&lt;/td&gt;
&lt;td&gt;現代書き言葉UniDic。MeCab等の形態素解析器で使われる辞書&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class="link" href="https://github.com/google/mozc/tree/master/src/data/dictionary_oss" target="_blank" rel="noopener"
&gt;Mozc辞書&lt;/a&gt;（dictionary_oss）&lt;/td&gt;
&lt;td&gt;コード本体はBSD-3、辞書の中身はIPAdic系&lt;/td&gt;
&lt;td&gt;Google日本語入力（Mozc）の辞書。IPAdic＋沖縄辞書由来&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class="link" href="https://github.com/Doublevil/JmdictFurigana" target="_blank" rel="noopener"
&gt;jmdict-furigana&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;CC BY-SA 4.0（JMdict/JMnedict由来）&lt;/td&gt;
&lt;td&gt;JMdict/JMnedictの見出し語について、複合語内の各漢字がどの仮名に対応するかを機械的に算出したデータ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class="link" href="https://github.com/ndl-lab/huriganacorpus-ndlbib" target="_blank" rel="noopener"
&gt;huriganacorpus-ndlbib&lt;/a&gt;（国立国会図書館）&lt;/td&gt;
&lt;td&gt;CC BY 4.0&lt;/td&gt;
&lt;td&gt;全国書誌（図書・雑誌タイトル）の分かち書き＋振り仮名。人名・地名・書名など固有名詞の読みカバレッジに強い&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;JMdict・JMnedict・jmdict-furiganaなどはCC BY-SA 4.0のShare-Alike条件があり、派生データやモデルを外部公開する場合は帰属表示・同一ライセンス継承が必要になる点に注意。UniDic-cwjもNew BSD選択時に「営利目的利用は要問い合わせ」という注記があり、商用利用前の確認が推奨される。&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;a class="link" href="https://github.com/CyberAgentAILab/jvs_nonpara_kana" target="_blank" rel="noopener"
&gt;jvs_nonpara_kana&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;JVS nonpara100への手動カナ読み注釈3,000文&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Joyo-Kanji-Yomi-Benchmark（JKYB）&lt;/td&gt;
&lt;td&gt;常用漢字読みベンチマーク原典&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Joyo-Kanji-Yomi-Benchmark-Parakeet-Edition（JKYB-Parakeet）&lt;/td&gt;
&lt;td&gt;JKYB拡張版、4,512組×3文=13,536文&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NDL「読みの基準（2021年1月）」別紙5&lt;/td&gt;
&lt;td&gt;国立国会図書館による日本語読みの標準化基準&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class="link" href="https://github.com/ku-nlp/WikipediaAnnotatedCorpus" target="_blank" rel="noopener"
&gt;ku-nlp/WikipediaAnnotatedCorpus&lt;/a&gt;（京都大学言語メディア研究室）&lt;/td&gt;
&lt;td&gt;日本語Wikipedia記事に形態素解析・固有表現・係り受け・述語項構造・共参照のアノテーションを付与したコーパス。KNP形式で、読みが形態素ごとに個別付与されている点が特徴。CC BY-SA 4.0、約9,419文&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class="link" href="https://github.com/ku-nlp/KWDLC" target="_blank" rel="noopener"
&gt;KWDLC&lt;/a&gt;（Kyoto University Web Document Leads Corpus）&lt;/td&gt;
&lt;td&gt;ウェブ文書冒頭3文からなるコーパス。WikipediaAnnotatedCorpusと同じアノテーション仕様（形態素の読み・固有表現・係り受け・述語項構造・共参照・談話関係）。約5,000文書・15,000文。ライセンスは明記されておらず学術研究目的での公開&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class="link" href="https://github.com/Morise-Lab/ROHAN" target="_blank" rel="noopener"
&gt;ROHAN&lt;/a&gt;（森勢将雅、日本音響学会誌2023）&lt;/td&gt;
&lt;td&gt;モーラバランス型日本語テキストコーパス。常用漢字と読みを全て含み、出現頻度の低いモーラもカバーするよう設計された4,600文。22のサブセットから構成。CC0（パブリックドメイン）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;jsut-label&lt;/td&gt;
&lt;td&gt;&lt;a class="link" href="https://sites.google.com/site/shinnosuketakamichi/publication/jsut" target="_blank" rel="noopener"
&gt;JSUT corpus&lt;/a&gt;（BASIC5000サブセット）に対する、手動アノテーションのHTS形式音韻・韻律コンテキストラベル。読み・かな表記も付属。CC BY-SA 4.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class="link" href="https://github.com/mmorise/ita-corpus" target="_blank" rel="noopener"
&gt;ITAコーパス&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;朗読・感情表現用に設計された424文（recitation 324＋emotion 100）。漢字仮名交じり文＋ふりがな＋カナ表記付き。パブリックドメイン（Unlicense）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class="link" href="https://github.com/ndl-lab/huriganacorpus-aozora" target="_blank" rel="noopener"
&gt;huriganacorpus-aozora&lt;/a&gt;（国立国会図書館）&lt;/td&gt;
&lt;td&gt;青空文庫（著作権保護期間満了作品）1,944作品に振り仮名を注釈したコーパス。形態素単位で入力文字列・振り仮名・種別を記載。パース後約4,900万文字。近代文学・翻訳文学中心で現代口語とはドメインが異なる点に注意。Public Domain Mark&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class="link" href="https://github.com/ndl-lab/hurigana-speech-corpus-aozora" target="_blank" rel="noopener"
&gt;hurigana-speech-corpus-aozora&lt;/a&gt;（国立国会図書館）&lt;/td&gt;
&lt;td&gt;青空文庫振り仮名注釈付き音声コーパスver.2。3,632作品・4,892時間の音声を含む（フル71.58GB）が、テキスト・CSVのみの抽出も可能。428万レコード、約8,000万文字。Whisper音声認識由来の読み推定のためsilver-quality（ノイズあり）。Public Domain Mark&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class="link" href="https://huggingface.co/datasets/katsukiono/kana-kanji-context" target="_blank" rel="noopener"
&gt;katsukiono/kana-kanji-context&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;日本語版WikipediaのダンプをMeCab+UniDicで形態素解析し、かな表記の位置と前後最大30字の文脈から漢字候補を対応付けた大規模データセット。7,727万7,970件、約7.4GB、JSONL形式。同音異義語判別や文脈依存の漢字推定に使える。CC BY-SA 4.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a class="link" href="https://tatoeba.org" target="_blank" rel="noopener"
&gt;Tatoeba&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;多言語の例文コーパス。日本語文は248,896件、CC BY 2.0 FR。読みのアノテーションは無いが、常用漢字表付表のように文脈に関係なく読みが1つに固定されている語であれば、対象語を含む実例文をそのまま抽出するだけで学習データに使える&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;同じ京都大学系列の&lt;a class="link" href="https://github.com/ku-nlp/KyotoCorpus" target="_blank" rel="noopener"
&gt;KyotoCorpus&lt;/a&gt;（1995年毎日新聞約4万文への構文注釈、読みも付与）も読み付きコーパスとして存在するが、原文は毎日新聞1995年版CD-ROMを別途入手する必要があり、GitHub上ではアノテーション情報のみが公開されているため、手軽に使えるデータではない。&lt;/p&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;ルビ、辞書、点字、音声と漢字の読み方に対するヒントは結構多かった&lt;/li&gt;
&lt;li&gt;多音字・ヘテロニム判定の海外研究は中国語（CPPデータセット）が主戦場で、g2pWのConditional Weighted Softmaxが1つの到達点&lt;/li&gt;
&lt;li&gt;その後もLLM活用、長尾分布対策、評価指標の精緻化という方向で改良が続いている&lt;/li&gt;
&lt;li&gt;日本語特化の研究は数が少なく、Sony、NHK技研、Sarashina2.2-TTS、CyberAgentのLLMベンチマークが主な直接的先行事例&lt;/li&gt;
&lt;li&gt;発想は「候補を絞り込んでから文脈で判定する」「音声を使って読みを検証する」「辞書知識を後付けで注入する」の3つの軸に大別できる&lt;/li&gt;
&lt;li&gt;辞書の意味知識だけに頼る手法は日本語では既存のルールベースG2Pに劣るという報告もあり、既存G2Pの出力を文脈で補正するアプローチの妥当性を支持する結果が多い&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>音声の基礎</title><link>https://www.m1ke.org/p/%E9%9F%B3%E5%A3%B0%E3%81%AE%E5%9F%BA%E7%A4%8E/</link><pubDate>Thu, 27 Aug 2026 12:00:00 +0900</pubDate><guid>https://www.m1ke.org/p/%E9%9F%B3%E5%A3%B0%E3%81%AE%E5%9F%BA%E7%A4%8E/</guid><description>&lt;img src="https://www.m1ke.org/p/%E9%9F%B3%E5%A3%B0%E3%81%AE%E5%9F%BA%E7%A4%8E/oto.png" alt="Featured image of post 音声の基礎" /&gt;&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;音声処理まわりの記事を書く機会が増えてきた&lt;/li&gt;
&lt;li&gt;その土台となる「音そのもの」の基礎を、ここで一度整理したメモ&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="音とは何か"&gt;音とは何か&lt;/h2&gt;
&lt;h3 id="音の正体空気の振動"&gt;音の正体（空気の振動）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;音源が振動すると、その振動が空気の疎密波（縦波）として周囲に伝わっていく現象が音&lt;/li&gt;
&lt;li&gt;音源から出た振動が、空気の分子を押したり引いたりしながら伝播していく&lt;/li&gt;
&lt;li&gt;空気のような媒質が必要なので、真空中では音は伝わらない&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="波の基本要素"&gt;波の基本要素&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;振幅（Amplitude）: 波の大きさ。音の大きさ（音量）に対応する&lt;/li&gt;
&lt;li&gt;周波数（Frequency）: 1秒間に振動する回数。単位はHz（ヘルツ）。音の高さ（ピッチ）に対応する&lt;/li&gt;
&lt;li&gt;波長（Wavelength）: 1周期分の波の長さ。周波数と音速から決まる&lt;/li&gt;
&lt;/ul&gt;
$$
\lambda = \frac{v}{f}
$$&lt;ul&gt;
&lt;li&gt;$\lambda$が波長、$v$が音速、$f$が周波数&lt;/li&gt;
&lt;li&gt;位相（Phase）: 波が今どの位置（山・谷のどこ）にいるかを表す&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="可聴域"&gt;可聴域&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;人間が聞き取れる周波数は、おおよそ20Hz〜20,000Hz（20kHz）程度&lt;/li&gt;
&lt;li&gt;年齢とともに、高音域が聞き取りにくくなっていく&lt;/li&gt;
&lt;li&gt;会話音声の情報は、主に100Hz〜8kHzあたりに集中している&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="アナログからデジタルへ"&gt;アナログからデジタルへ&lt;/h2&gt;
&lt;h3 id="サンプリング標本化"&gt;サンプリング（標本化）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;連続的なアナログ波形を、一定間隔で区切って数値の列に変換する処理&lt;/li&gt;
&lt;li&gt;サンプリング周波数（サンプルレート）: 1秒間に何回サンプリングするか。8kHz・16kHz・44.1kHz（CD音質）・48kHzなどがよく使われる&lt;/li&gt;
&lt;li&gt;サンプリング定理（ナイキストの定理）: 元の波形を正しく復元するには、含まれる最大周波数の2倍以上のサンプリング周波数が必要
&lt;ul&gt;
&lt;li&gt;例えば、20kHzまでの音を正しく扱うには、44.1kHz以上のサンプリングが必要（CD音質が44.1kHzなのはこれが理由）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;サンプリング周波数の半分の周波数をナイキスト周波数と呼び、それを超える周波数成分は正しく記録できない（エイリアシングという歪みの原因になる）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="量子化"&gt;量子化&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;サンプリングした各点の振幅を、有限のビット数の数値に変換する処理&lt;/li&gt;
&lt;li&gt;ビット深度: 16bit（$-32768$〜$32767$）・24bit・32bit floatなどがよく使われる&lt;/li&gt;
&lt;li&gt;ビット深度が大きいほど、表現できる音量の分解能が高くなり、量子化誤差（量子化ノイズ）が小さくなる&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="pcm"&gt;PCM&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;サンプリングと量子化だけで作られた、圧縮のない生のデジタル音声データ&lt;/li&gt;
&lt;li&gt;WAVファイルなどの基本フォーマットになっている&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="adcとdac"&gt;ADCとDAC&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ADC（Analog-to-Digital Converter、A/Dコンバータ）: 前述のサンプリング・量子化を、実際にハードウェアとして行う部品
&lt;ul&gt;
&lt;li&gt;マイクが拾った連続的な電気信号（アナログ）を、一定間隔で区切って数値化し、PCMのようなデジタルデータに変換する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;DAC（Digital-to-Analog Converter、D/Aコンバータ）: ADCの逆で、デジタルデータ（PCMのサンプル列）を、連続的な電気信号（アナログ）に戻す部品
&lt;ul&gt;
&lt;li&gt;この電気信号がスピーカーやヘッドホンを物理的に振動させ、実際の音になる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;録音の流れ: マイク（音→電気信号）→ ADC（電気信号→デジタルデータ）→ PCMなどとして保存・処理&lt;/li&gt;
&lt;li&gt;再生の流れ: PCMなどのデジタルデータ → DAC（デジタルデータ→電気信号）→ アンプ・スピーカー（電気信号→音）&lt;/li&gt;
&lt;li&gt;後述のリングバッファは、ちょうどこのADC/DACと、CPU上で動くソフトウェアとの間をつなぐ役割を果たしている&lt;/li&gt;
&lt;li&gt;サウンドカードやオーディオインターフェースの性能でよく話題になる「ビット深度」「サンプリング周波数」「S/N比」なども、実質的にはこのADC/DACの変換精度に関する話&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="音の大きさを表す指標"&gt;音の大きさを表す指標&lt;/h2&gt;
&lt;h3 id="rmsエネルギーとは"&gt;RMSエネルギーとは&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;波形のエネルギー（音量）を表す、最も基本的な指標の1つ&lt;/li&gt;
&lt;li&gt;一定区間の波形のサンプル値を2乗して平均し、平方根を取ったもの&lt;/li&gt;
&lt;/ul&gt;
$$
\text{RMS} = \sqrt{\frac{1}{N}\sum_{i=1}^{N} x_i^2}
$$&lt;ul&gt;
&lt;li&gt;$x_i$がその区間の$i$番目のサンプル値、$N$がサンプル数&lt;/li&gt;
&lt;li&gt;音量が大きいほど値も大きくなる、直感的にわかりやすい指標&lt;/li&gt;
&lt;li&gt;後述のdBは、このRMS（やパワー、振幅）を対数スケールに変換したもの。「RMSを計算してから、dBに変換する」という流れになることが多い&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="デシベルdbとは"&gt;デシベル（dB）とは&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;音の大きさ（パワーや振幅の比）を対数スケールで表す単位&lt;/li&gt;
&lt;li&gt;パワー比の場合、以下の式で表される&lt;/li&gt;
&lt;/ul&gt;
$$
\text{dB} = 10 \log_{10}\left(\frac{P}{P_{\text{ref}}}\right)
$$&lt;ul&gt;
&lt;li&gt;$P$が測定対象のパワー、$P_{\text{ref}}$が基準となるパワー&lt;/li&gt;
&lt;li&gt;人間の聴覚は、音の大きさを線形ではなく対数的に感じる（音のパワーが10倍になっても、感覚的には「少し大きくなった」程度にしか感じない）ため、dBのような対数スケールの方が感覚に合いやすい&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="dbfsdb-full-scaleとは"&gt;dBFS（dB Full Scale）とは&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;デジタル音声で使われる、基準の取り方が特殊なdB&lt;/li&gt;
&lt;li&gt;基準$P_{\text{ref}}$を「そのビット深度で表現できる最大振幅（クリッピング直前の値）」に取る&lt;/li&gt;
&lt;li&gt;そのため、0dBFSが表現できる最大値で、実際の音声データはほぼ常にそれより小さい負の値（例: -20dBFS、-40dBFS）になる&lt;/li&gt;
&lt;li&gt;アナログの音圧レベル（dB SPL）のような絶対的な物理量ではなく、「そのデジタルシステムの上限からどれだけ離れているか」という相対値である点に注意&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="snrsignal-to-noise-ratioとは"&gt;SNR（Signal-to-Noise Ratio）とは&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;欲しい信号（音声など）の強さと、それ以外のノイズの強さの比率&lt;/li&gt;
&lt;li&gt;通常dBで表す&lt;/li&gt;
&lt;/ul&gt;
$$
\text{SNR(dB)} = 10 \log_{10}\left(\frac{P_{\text{signal}}}{P_{\text{noise}}}\right)
$$&lt;ul&gt;
&lt;li&gt;値が大きいほど、信号がノイズに対してクリアに聞こえる（SNRが高い＝綺麗な音）&lt;/li&gt;
&lt;li&gt;値が小さい、あるいはマイナスだと、ノイズに埋もれて聞き取りにくくなる&lt;/li&gt;
&lt;li&gt;音声認識やVADの文脈では、マイクに近い目的話者ほど音量が大きくSNRが高くなりやすく、遠くの背景話者ほど音量が小さくSNRが低くなりやすい、という前提で距離のフィルタ代わりに使われることがある&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ノイズとノイズフロア"&gt;ノイズとノイズフロア&lt;/h2&gt;
&lt;h3 id="ノイズとは"&gt;ノイズとは&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;欲しい信号（音声など）に対して、不要に混ざり込む音や信号成分&lt;/li&gt;
&lt;li&gt;種類の例
&lt;ul&gt;
&lt;li&gt;環境音: 暗騒音（部屋や屋外の背景の音）、空調音、風切り音など&lt;/li&gt;
&lt;li&gt;電気的なノイズ: マイクやアンプなど、回路自体が生み出す熱雑音（サーマルノイズ）など&lt;/li&gt;
&lt;li&gt;量子化ノイズ: 量子化の際に生じる誤差（後述）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ホワイトノイズ: 全ての周波数帯域に渡って、均等なパワーを持つノイズ&lt;/li&gt;
&lt;li&gt;ピンクノイズ: 周波数が高くなるほどパワーが下がる（1/fの性質を持つ）ノイズ。自然界の音に近いとされる&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="ノイズフロアとは"&gt;ノイズフロアとは&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;マイクや録音機材、伝送路などの系が常に持っている、最低限のノイズレベル&lt;/li&gt;
&lt;li&gt;「フロア（床）」という名前の通り、それより下には信号を検出できない下限のライン、というイメージ&lt;/li&gt;
&lt;li&gt;ノイズフロアより小さい信号は、ノイズに埋もれてしまい、検出も区別もできなくなる&lt;/li&gt;
&lt;li&gt;前述のSNRは、言い換えると「信号のレベルと、このノイズフロアとの差（比）」を表している指標&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="量子化ノイズフロア"&gt;量子化ノイズフロア&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ビット深度によって生じる、量子化そのものに起因するノイズフロア&lt;/li&gt;
&lt;li&gt;ビット深度を$b$（ビット数）としたとき、理論上のダイナミックレンジ（表現できる最大音量と、量子化ノイズフロアとの比）は、以下の式でおおよそ求まる&lt;/li&gt;
&lt;/ul&gt;
$$
\text{SNR}_{\max} \approx 6.02b + 1.76 \ \text{dB}
$$&lt;ul&gt;
&lt;li&gt;例えば16bitなら、理論上のダイナミックレンジは約98dB&lt;/li&gt;
&lt;li&gt;ビット深度を上げるほど、量子化ノイズフロアが下がり、より小さい信号まで正しく表現できるようになる&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="ノイズ抑制音声強調speech-enhancement"&gt;ノイズ抑制・音声強調（Speech Enhancement）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;録音した音声からノイズを取り除き、目的の音声だけをクリアにする技術&lt;/li&gt;
&lt;li&gt;古典的な手法として、スペクトル減算（背景のノイズだけの区間からノイズのスペクトルを推定し、音声全体のスペクトルからそれを差し引く）などがある&lt;/li&gt;
&lt;li&gt;近年はディープラーニングを使い、ノイズを含む音声からクリーンな音声への変換を直接学習する手法が主流になっている&lt;/li&gt;
&lt;li&gt;前述のVAD（音声区間検出）や、複数の話者の声を分離する音源分離とも関連が深い技術領域&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="音声ファイルフォーマット"&gt;音声ファイルフォーマット&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;非圧縮: WAVなど。PCMのデータをそのままファイルに入れたもの&lt;/li&gt;
&lt;li&gt;可逆圧縮: FLACなど。ファイルサイズは小さくなるが、展開すれば元のデータと完全に一致する&lt;/li&gt;
&lt;li&gt;非可逆圧縮: MP3・AACなど。人間の聴覚特性を利用して、聞こえにくい成分を削ることで大きく圧縮する。一度削った情報は元に戻せない&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="周波数領域で見る"&gt;周波数領域で見る&lt;/h2&gt;
&lt;h3 id="時間領域と周波数領域"&gt;時間領域と周波数領域&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;波形をそのまま表示したもの（時間領域の表現）では、どんな高さの音がどれくらい混ざっているかが分かりにくい&lt;/li&gt;
&lt;li&gt;フーリエ変換を使うと、波形を「どの周波数の成分がどれだけ含まれているか」という周波数領域の表現に変換できる&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="fft高速フーリエ変換"&gt;FFT（高速フーリエ変換）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;離散フーリエ変換（DFT）を高速に計算するアルゴリズム&lt;/li&gt;
&lt;li&gt;音声処理では、一定区間（フレーム）ごとの周波数成分を計算するのに使われる&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="stftとスペクトログラム"&gt;STFTとスペクトログラム&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;音声は時間とともに周波数成分が変化していくので、全体を一度にFFTするのではなく、短い時間窓（フレーム）に区切って、それぞれにFFTをかける&lt;/li&gt;
&lt;li&gt;この手法をSTFT（短時間フーリエ変換）と呼ぶ&lt;/li&gt;
&lt;li&gt;STFTの結果を、時間×周波数×パワーの2次元画像として可視化したものがスペクトログラム&lt;/li&gt;
&lt;li&gt;フレームを切り出す際は、端で波形が不連続にならないよう、窓関数（Hann窓など）をかけてから変換するのが一般的&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="フレームサイズとホップサイズ"&gt;フレームサイズとホップサイズ&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;STFTでは、波形を切り出すフレームの長さ（フレームサイズ、窓長）と、次のフレームへどれだけずらすか（ホップサイズ、シフト幅）を決める必要がある&lt;/li&gt;
&lt;li&gt;フレームサイズが短いほど、いつ変化が起きたかを細かく捉えられる（時間分解能が高い）が、その分、周波数の細かい違いを見分けにくくなる（周波数分解能が低い）&lt;/li&gt;
&lt;li&gt;逆にフレームサイズを長くすると、周波数分解能は上がるが、時間分解能が下がる&lt;/li&gt;
&lt;li&gt;この2つはトレードオフの関係にあり、両方を同時に高めることはできない&lt;/li&gt;
&lt;li&gt;音声処理では、20〜30ms程度のフレームサイズが、声の性質が変化する速さとよく合うため、よく使われる&lt;/li&gt;
&lt;li&gt;ホップサイズは、フレームサイズの半分程度（50%オーバーラップ）にすることが多く、フレーム同士を重ねることで変化を滑らかに追えるようにする&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="具体的な計算例"&gt;具体的な計算例&lt;/h4&gt;
&lt;p&gt;例えば、サンプルレート16,000 Hz・フレーム長20 ms・サンプル幅16bit（2byte）という、音声処理でよく使われる設定を考える。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1フレームに含まれるサンプル数: $16000 \times 0.020 = 320$サンプル&lt;/li&gt;
&lt;li&gt;1フレームのバイト数: $320 \times 2 = 640$byte（&lt;code&gt;FRAME_BYTES = 640 byte&lt;/code&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;つまり、この設定では20msごとに640byteのデータを1フレームとして処理することになる。&lt;/p&gt;
&lt;h3 id="位相の扱い"&gt;位相の扱い&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;STFTの結果は、各周波数成分について振幅（大きさ）と位相（波のタイミングのずれ）の両方の情報を持っている&lt;/li&gt;
&lt;li&gt;しかし、スペクトログラムやlog-melスペクトログラム、MFCCなど、多くの音声処理の入力表現では、振幅（パワー）の情報だけを使い、位相の情報は捨てることが多い&lt;/li&gt;
&lt;li&gt;理由の一つは、人間の聴覚が位相のズレには比較的鈍感で、主に振幅（周波数ごとのエネルギー分布）で音を知覚しているとされるため&lt;/li&gt;
&lt;li&gt;ただし、音声を波形に「戻す」処理（音声合成、ボコーダーなど）では位相情報が必要になる。振幅だけから位相を推定し直すGriffin-Limアルゴリズムのような手法もある&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="メル尺度mel-scaleとは"&gt;メル尺度（Mel scale）とは&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;人間の聴覚は、低い周波数の変化には敏感だが、高い周波数になるほど変化を感じにくくなる&lt;/li&gt;
&lt;li&gt;この人間の知覚特性に合わせて周波数を変換した尺度がメル尺度で、以下のような式で変換する&lt;/li&gt;
&lt;/ul&gt;
$$
m = 2595 \log_{10}\left(1 + \frac{f}{700}\right)
$$&lt;ul&gt;
&lt;li&gt;$f$が実際の周波数（Hz）、$m$がメル尺度上の値&lt;/li&gt;
&lt;li&gt;低周波数では実周波数とほぼ線形の関係になり、高周波数になるほど圧縮されていく&lt;/li&gt;
&lt;li&gt;700と2595という定数は、理論から導かれたものではなく、「1000Hzの音＝1000mel」という基準点を通るように、心理音響実験のデータへ対数カーブをフィットさせた近似式のパラメータ&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="log-melスペクトログラムとは"&gt;log-melスペクトログラムとは&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;音声をSTFTでスペクトログラムにした後、周波数軸をメル尺度に沿ったフィルタバンク（メルフィルタバンク、通常20〜80程度）でまとめ、さらにdB（対数）に変換したもの&lt;/li&gt;
&lt;li&gt;音声認識・話者認識・音声合成など、ディープラーニングを使う音声モデルで、生波形の次によく使われる入力表現&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="mfccmel-frequency-cepstral-coefficientsとは"&gt;MFCC（Mel-Frequency Cepstral Coefficients）とは&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;log-melスペクトログラムに、さらにDCT（離散コサイン変換）をかけて得られる係数&lt;/li&gt;
&lt;li&gt;DCTによって、隣り合うメルバンド同士の相関（情報の重複）を取り除き、少ない次元（通常12〜13次元程度）に情報を圧縮できる&lt;/li&gt;
&lt;li&gt;音声認識・話者認識で長年使われてきた定番の特徴量&lt;/li&gt;
&lt;li&gt;近年はディープラーニングの発展により、DCTで圧縮する前のlog-melスペクトログラムをそのまま入力に使うケースも増えている
&lt;ul&gt;
&lt;li&gt;次元圧縮の仕方を人間が設計するより、ニューラルネットワーク自身に学習させた方が精度が良いことが多いため&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;チャンネル数: 1本のマイクで録音したものがモノラル、2本（左右）で録音したものがステレオ&lt;/li&gt;
&lt;li&gt;音声認識・VADなどの処理では、扱いを単純にするため、まずモノラルに変換してから処理することが多い&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="リアルタイム音声処理とバッファ"&gt;リアルタイム音声処理とバッファ&lt;/h2&gt;
&lt;h3 id="なぜバッファが必要か"&gt;なぜバッファが必要か&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;オーディオのハードウェア（前述のDAC・ADC）は、決まった一定のクロックで動いていて、待ってくれない
&lt;ul&gt;
&lt;li&gt;例えば48kHzなら、1秒間に48000回、絶対に休まず一定間隔でサンプルを出し入れし続ける&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;一方、ソフトウェア（アプリ、OS）はCPUのスケジューリングで断続的にしか動けない
&lt;ul&gt;
&lt;li&gt;他のプロセスに割り込まれたり、処理に時間がかかったりする&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;この「常に一定で待たないハードウェア」と「断続的にしか動けないソフトウェア」のギャップを埋める緩衝材が、バッファ&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="リングバッファの仕組み"&gt;リングバッファの仕組み&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;バッファの実態は、「リングバッファ（円環状の配列）」というデータ構造になっていることが多い&lt;/li&gt;
&lt;li&gt;一定サイズのメモリ領域に、「書き込み位置（write pointer）」と「読み込み位置（read pointer）」という2つのポインタを置き、端まで行ったら先頭に戻る&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;再生（出力）の場合は、以下のような流れになる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;アプリが計算した音のサンプルを、バッファの書き込み位置に順番に詰めていく&lt;/li&gt;
&lt;li&gt;ハードウェアのクロックが「次のサンプルをくれ」というタイミングで、バッファの読み込み位置からサンプルを取り出し、スピーカーへ物理的に出力する&lt;/li&gt;
&lt;li&gt;読み込み位置が書き込み位置に追いついてしまう（アプリがまだ次のデータを用意できていないのに、ハードウェアがデータを要求してくる）と、渡せるデータがなくなる。これが後述のunderrun&lt;/li&gt;
&lt;li&gt;そのため、書き込み位置は読み込み位置より少し「先」を進めておく必要があり、この先行分がそのまま遅延（レイテンシ）になる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;録音（入力）の場合は、この逆になる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ハードウェア（マイク）が一定クロックでサンプルを取り込み、バッファの書き込み位置に詰めていく&lt;/li&gt;
&lt;li&gt;アプリが定期的に読み込み位置からデータを取り出して処理する&lt;/li&gt;
&lt;li&gt;アプリの処理が遅れて、書き込み位置（ハードウェア）が読み込み位置（アプリ）に追いついてしまうと、まだ読んでいない古いデータが上書きされて消える。これが後述のoverrun&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="linuxの音声システム"&gt;Linuxの音声システム&lt;/h2&gt;
&lt;h3 id="pulseaudio"&gt;PulseAudio&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Linuxで長く標準的に使われてきたサウンドサーバー&lt;/li&gt;
&lt;li&gt;ALSA（カーネルレベルのオーディオドライバ）とアプリケーションの間に入り、複数アプリの音をミキシングしたり、アプリごとの音量調整、ネットワーク越しの音声出力などの機能を提供する&lt;/li&gt;
&lt;li&gt;「どのアプリの音を、どのスピーカー/マイクに出し入れするか」をOSレベルでルーティングする役割を持つ&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="pipewire"&gt;PipeWire&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;PulseAudio（コンシューマ向け）とJACK（プロ向けの低遅延オーディオ）の両方を置き換えることを目指した、より新しいサウンドサーバー&lt;/li&gt;
&lt;li&gt;Fedora、Ubuntu（22.10以降）など主要ディストリビューションで標準になりつつある&lt;/li&gt;
&lt;li&gt;PulseAudio互換レイヤーを持っているため、既存のアプリはそのまま動くことが多い&lt;/li&gt;
&lt;li&gt;低遅延が求められる音楽制作や、後述のリアルタイム処理の要件にも対応できるよう設計されている&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="xrunアンダーランオーバーラン"&gt;xrun（アンダーラン・オーバーラン）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;前述のリングバッファで、読み込み位置と書き込み位置の関係が崩れ、音が途切れたり、プチプチというノイズが乗ったりする現象&lt;/li&gt;
&lt;li&gt;underrun: 再生時、読み込み位置が書き込み位置に追いついてしまい、渡せるデータがなくなる状態&lt;/li&gt;
&lt;li&gt;overrun: 録音時、書き込み位置が読み込み位置に追いついてしまい、未読のデータが上書きされて失われる状態&lt;/li&gt;
&lt;li&gt;CPU負荷が高い、バッファサイズが小さすぎる、スレッドの優先度設定が適切でない、などが主な原因&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="クオンタムquantum"&gt;クオンタム（Quantum）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;PipeWireやJACKで、1回の処理サイクルで扱うサンプル数（バッファサイズ）のこと&lt;/li&gt;
&lt;li&gt;クオンタムが小さいほど遅延（レイテンシ）は小さくなるが、その分処理が間に合わなくなりやすく、前述のxrunが起きやすくなる&lt;/li&gt;
&lt;li&gt;逆にクオンタムを大きくすると、遅延は増える代わりに安定して処理できる&lt;/li&gt;
&lt;li&gt;レイテンシは、おおよそ以下の関係になる&lt;/li&gt;
&lt;/ul&gt;
$$
\text{レイテンシ} = \frac{\text{クオンタム}}{\text{サンプリング周波数}}
$$&lt;h2 id="声の音響的な仕組み"&gt;声の音響的な仕組み&lt;/h2&gt;
&lt;h3 id="周期波基音倍音"&gt;周期波・基音・倍音&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;声のような周期的な音（周期波）は、単一の周波数の波ではなく、複数の周波数成分が重なり合ってできている&lt;/li&gt;
&lt;li&gt;そのうち、最も低い周波数の成分を基音（fundamental tone）と呼ぶ&lt;/li&gt;
&lt;li&gt;基音の整数倍の周波数を持つ成分を倍音（harmonic/overtone）と呼ぶ&lt;/li&gt;
&lt;/ul&gt;
$$
f_n = n f_0 \quad (n = 1, 2, 3, \dots)
$$&lt;ul&gt;
&lt;li&gt;$f_0$が基音の周波数、$f_n$が$n$番目の成分の周波数&lt;/li&gt;
&lt;li&gt;$n=1$が基音そのもの、$n \geq 2$の成分を倍音と呼ぶ&lt;/li&gt;
&lt;li&gt;用語の注意点: 英語の&amp;quot;harmonic&amp;quot;には基音自体を含めて数える流儀（1st harmonic＝基音そのもの）もあるが、日本語の「倍音」は基音を含めず、その上に乗る成分だけを指すことが多い。この記事では後者に合わせ、基音と倍音を別のものとして扱う&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;例えば、基音が200Hzの場合、以下のようになる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;基音: 200Hz&lt;/li&gt;
&lt;li&gt;倍音: 400Hz、600Hz、800Hz…&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://www.m1ke.org/p/%E9%9F%B3%E5%A3%B0%E3%81%AE%E5%9F%BA%E7%A4%8E/harmonics-1.png"
width="1280"
height="720"
srcset="https://www.m1ke.org/p/%E9%9F%B3%E5%A3%B0%E3%81%AE%E5%9F%BA%E7%A4%8E/harmonics-1_hu_c22c83fdf9974756.png 480w, https://www.m1ke.org/p/%E9%9F%B3%E5%A3%B0%E3%81%AE%E5%9F%BA%E7%A4%8E/harmonics-1_hu_2436a46b00e2fd51.png 1024w"
loading="lazy"
alt="200 Hz の周期波のスペクトルの例"
class="gallery-image"
data-flex-grow="177"
data-flex-basis="426px"
&gt;&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;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;200 400 600 800 1000 Hz
&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; └─200Hz─┴─200Hz──┴─200Hz──┴─200Hz──┘
&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; 間隔 = f₀
&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="基本周波数f0"&gt;基本周波数（F0）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;声帯が1秒間に振動する回数が、そのまま基音の周波数＝基本周波数（F0）になる&lt;/li&gt;
&lt;li&gt;例えば、声帯が1秒間に100回振動していれば、F0は100Hz&lt;/li&gt;
&lt;li&gt;F0が高いほど「高い声」、低いほど「低い声」に感じる&lt;/li&gt;
&lt;li&gt;実際の声には、F0（基音）だけでなく、その整数倍の倍音も同時に含まれている（前述の周期波の構造そのもの）&lt;/li&gt;
&lt;li&gt;F0は、声の「音程・ピッチ」に強く関係する要素&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="有声音無声音"&gt;有声音・無声音&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;声帯を振動させて出す音を有声音（voiced sound）、声帯を振動させずに出す音を無声音（unvoiced sound）と呼ぶ&lt;/li&gt;
&lt;li&gt;母音（あ・い・う・え・お等）は基本的に有声音で、周期的な波形になり、F0（基本周波数）を持つ&lt;/li&gt;
&lt;li&gt;子音には、有声のもの（例: 日本語の「が」「だ」「ば」行など）と、無声のもの（例: 日本語の「さ」「た」行や「か」行の一部など）がある&lt;/li&gt;
&lt;li&gt;無声音では声帯が振動しないため、口や喉の狭めを通る空気の乱流に近い、ノイズのような波形になる。周期性がなく、F0を持たない&lt;/li&gt;
&lt;li&gt;この違いは、前述のZCR（無声音でZCRが高くなりやすい）や、F0が検出できるかどうかを使って、機械的に判定できる&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="共鳴と声道"&gt;共鳴と声道&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;共鳴（きょうめい）: 同じ振動数を持つ別の物体がその影響を受けて一緒に揺れ動き、音が大きくなる現象。物体固有の振動数（固有振動数）で発生する&lt;/li&gt;
&lt;li&gt;声道（せいどう）: 声帯から口唇（くちびる）や鼻孔に至るまでの空気の通り道（空洞部分）&lt;/li&gt;
&lt;li&gt;共鳴は、この声道の形状によってもたらされる。例えば「ア」と「イ」では、声道の形状が大きく異なる&lt;/li&gt;
&lt;li&gt;「ア」を高い声・低い声で出し分けるのは、声道の形（共鳴のしかた）はそのままに、音源（声帯振動＝F0）の周波数だけを変えているということ&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="フォルマント"&gt;フォルマント&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;基音・倍音を含む声の周波数成分のうち、声道の共鳴によって特に強められた周波数帯を、フォルマント（formant）と呼ぶ&lt;/li&gt;
&lt;li&gt;フォルマントは、低い方から順に第一フォルマント（F1）、第二フォルマント（F2）…と呼ばれる&lt;/li&gt;
&lt;li&gt;母音は声道の形（＝共鳴のしかた）によって特徴づけられるため、フォルマントは声の「母音・声質」を強く反映する
&lt;ul&gt;
&lt;li&gt;F0が「音程・ピッチ」に対応するのに対し、フォルマント（F1、F2…）は「どの母音か・どんな声質か」に対応する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;音響分析では特にF1とF2の2つに注目することが多く、多くの言語で母音の音響的特徴はこの2変数でおおよそ捉えられる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://www.m1ke.org/p/%E9%9F%B3%E5%A3%B0%E3%81%AE%E5%9F%BA%E7%A4%8E/vowel.png"
width="1536"
height="1408"
srcset="https://www.m1ke.org/p/%E9%9F%B3%E5%A3%B0%E3%81%AE%E5%9F%BA%E7%A4%8E/vowel_hu_fba7c886e16f4f01.png 480w, https://www.m1ke.org/p/%E9%9F%B3%E5%A3%B0%E3%81%AE%E5%9F%BA%E7%A4%8E/vowel_hu_91f2c3ee4974760f.png 1024w"
loading="lazy"
alt="日本語の「イ、エ、ア、オ、ウ」のサウンド・スペクトログラム"
class="gallery-image"
data-flex-grow="109"
data-flex-basis="261px"
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;横長の黒い帯のように見えるのが、フォルマント。母音によって異なる周波数に現れる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://www.m1ke.org/p/%E9%9F%B3%E5%A3%B0%E3%81%AE%E5%9F%BA%E7%A4%8E/vowel2.png"
width="768"
height="704"
srcset="https://www.m1ke.org/p/%E9%9F%B3%E5%A3%B0%E3%81%AE%E5%9F%BA%E7%A4%8E/vowel2_hu_91e6deb3b61feec4.png 480w, https://www.m1ke.org/p/%E9%9F%B3%E5%A3%B0%E3%81%AE%E5%9F%BA%E7%A4%8E/vowel2_hu_f854c5ece4be2e2a.png 1024w"
loading="lazy"
alt="日本語の「イ、エ、ア、オ、ウ」のサウンド・スペクトログラムとピーク"
class="gallery-image"
data-flex-grow="109"
data-flex-basis="261px"
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Praatでフォルマントのピークを自動検出し、赤いドットでプロットしたもの&lt;/li&gt;
&lt;li&gt;各母音において、一番下の赤線が第一フォルマント（F1）、下から2番目の赤線が第二フォルマント（F2）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://www.m1ke.org/p/%E9%9F%B3%E5%A3%B0%E3%81%AE%E5%9F%BA%E7%A4%8E/vowel3.png"
width="689"
height="281"
srcset="https://www.m1ke.org/p/%E9%9F%B3%E5%A3%B0%E3%81%AE%E5%9F%BA%E7%A4%8E/vowel3_hu_9f64867e5039ce59.png 480w, https://www.m1ke.org/p/%E9%9F%B3%E5%A3%B0%E3%81%AE%E5%9F%BA%E7%A4%8E/vowel3_hu_3833efc391e6f426.png 1024w"
loading="lazy"
alt="日本語の5母音のフォルマント計測値"
class="gallery-image"
data-flex-grow="245"
data-flex-basis="588px"
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;各母音の時間軸上の中央における第一フォルマント（F1）と第二フォルマント（F2）を計測し、表にまとめたもの&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://www.m1ke.org/p/%E9%9F%B3%E5%A3%B0%E3%81%AE%E5%9F%BA%E7%A4%8E/vowel5.png"
width="768"
height="461"
srcset="https://www.m1ke.org/p/%E9%9F%B3%E5%A3%B0%E3%81%AE%E5%9F%BA%E7%A4%8E/vowel5_hu_57a06a9b2610d08f.png 480w, https://www.m1ke.org/p/%E9%9F%B3%E5%A3%B0%E3%81%AE%E5%9F%BA%E7%A4%8E/vowel5_hu_5eac6f4027accc29.png 1024w"
loading="lazy"
alt="日本語のフォルマントの散布図"
class="gallery-image"
data-flex-grow="166"
data-flex-basis="399px"
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;それを散布図にしたもの&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://www.m1ke.org/p/%E9%9F%B3%E5%A3%B0%E3%81%AE%E5%9F%BA%E7%A4%8E/vowel7.png"
width="768"
height="461"
srcset="https://www.m1ke.org/p/%E9%9F%B3%E5%A3%B0%E3%81%AE%E5%9F%BA%E7%A4%8E/vowel7_hu_da20d71cf7190b9f.png 480w, https://www.m1ke.org/p/%E9%9F%B3%E5%A3%B0%E3%81%AE%E5%9F%BA%E7%A4%8E/vowel7_hu_59a5a3ac4ef45baf.png 1024w"
loading="lazy"
alt="日本語のフォルマントの散布図（F1を縦軸、F2を横軸にし、それぞれの軸を反転させたもの）"
class="gallery-image"
data-flex-grow="166"
data-flex-basis="399px"
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;軸を入れ替えたもの&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://www.m1ke.org/p/%E9%9F%B3%E5%A3%B0%E3%81%AE%E5%9F%BA%E7%A4%8E/vowel8.png"
width="649"
height="405"
srcset="https://www.m1ke.org/p/%E9%9F%B3%E5%A3%B0%E3%81%AE%E5%9F%BA%E7%A4%8E/vowel8_hu_4905c206548cabe9.png 480w, https://www.m1ke.org/p/%E9%9F%B3%E5%A3%B0%E3%81%AE%E5%9F%BA%E7%A4%8E/vowel8_hu_6b2c348ce1760092.png 1024w"
loading="lazy"
alt="IPAにおける母音チャート"
class="gallery-image"
data-flex-grow="160"
data-flex-basis="384px"
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IPA（国際音声記号）の母音チャートと、ほぼ同じ配置になる&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="音声処理でよく使われる特徴量"&gt;音声処理でよく使われる特徴量&lt;/h2&gt;
&lt;h3 id="ゼロ交差率zero-crossing-rate-zcrとは"&gt;ゼロ交差率（Zero-Crossing Rate, ZCR）とは&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;波形が正から負、または負から正に切り替わる回数を、一定区間内で数えた指標&lt;/li&gt;
&lt;li&gt;以下のような式で表される&lt;/li&gt;
&lt;/ul&gt;
$$
\text{ZCR} = \frac{1}{2(N-1)} \sum_{i=1}^{N-1} \left| \text{sign}(x_i) - \text{sign}(x_{i+1}) \right|
$$&lt;ul&gt;
&lt;li&gt;$\text{sign}(x)$は、$x$の符号（正なら1、負なら-1）を返す関数&lt;/li&gt;
&lt;li&gt;隣り合うサンプルの符号が変わるたびに差の絶対値が2になるので、それを$2(N-1)$で割ることで「切り替わった割合」になる&lt;/li&gt;
&lt;li&gt;高い周波数成分が多いほどZCRは大きくなる傾向がある&lt;/li&gt;
&lt;li&gt;無声子音（s、shなど、声帯を震わせずに出す音）はノイズに近い波形になりやすく、ZCRが高くなる&lt;/li&gt;
&lt;li&gt;逆に母音のような有声音は、周期的な波形になりやすく、ZCRは低くなる傾向がある&lt;/li&gt;
&lt;li&gt;古典的なVADでは、エネルギー（音量が小さい＝無音）だけでなく、ZCR（ノイズっぽい波形かどうか）も組み合わせて判定に使うことがある&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="基本周波数f0ピッチを特徴量として使う"&gt;基本周波数（F0・ピッチ）を特徴量として使う&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;F0の定義そのものは、前述の「声の音響的な仕組み」を参照&lt;/li&gt;
&lt;li&gt;有声音（母音など、声帯が振動する音）にはF0が存在し、無声音（子音の一部など、声帯が振動しない音）にはF0が存在しない&lt;/li&gt;
&lt;li&gt;F0が検出できるかどうかは、有声音/無声音の判定や、話者の特定（声の高さの特徴）に使われる&lt;/li&gt;
&lt;li&gt;抽出方法としては、自己相関関数を使う方法、YINアルゴリズム、CREPEのようなディープラーニングベースの手法などがある&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="スペクトル重心スペクトル平坦度とは"&gt;スペクトル重心・スペクトル平坦度とは&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;どちらも、周波数スペクトル（音をどの周波数がどれだけ含むかに分解したもの）の形状を要約する指標&lt;/li&gt;
&lt;li&gt;スペクトル重心（Spectral Centroid）は、スペクトルの「重心」にあたる周波数&lt;/li&gt;
&lt;/ul&gt;
$$
\text{Centroid} = \frac{\sum_{k} f_k \, S(f_k)}{\sum_{k} S(f_k)}
$$&lt;ul&gt;
&lt;li&gt;$f_k$が周波数、$S(f_k)$がその周波数のパワー&lt;/li&gt;
&lt;li&gt;値が高いほど高周波成分が多く「明るい」音、低いほど「こもった」音という印象になる&lt;/li&gt;
&lt;li&gt;スペクトル平坦度（Spectral Flatness）は、スペクトルがノイズのように平坦か、特定の周波数に偏っているかを表す指標&lt;/li&gt;
&lt;li&gt;幾何平均と算術平均の比で計算され、1に近いほどホワイトノイズのような平坦なスペクトル、0に近いほど特定の周波数（ピッチなど）に偏ったスペクトルになる&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="音源定位gcc-phat"&gt;音源定位（GCC-PHAT）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;複数のマイク（マイクアレイ）を使って、音がどの方向から来たかを推定する技術を音源定位（Sound Source Localization）と呼ぶ&lt;/li&gt;
&lt;li&gt;GCC-PHAT（Generalized Cross-Correlation with PHAse Transform）は、その代表的な古典的手法の1つ&lt;/li&gt;
&lt;li&gt;基本的な考え方は、2つのマイクに音が届くタイミングのズレ（到達時間差、TDOA: Time Difference of Arrival）を、相互相関（クロスコリレーション）を使って推定するというもの&lt;/li&gt;
&lt;li&gt;通常の相互相関は振幅の大きさに影響されやすいため、GCC-PHATでは周波数領域で振幅成分を正規化し、位相情報だけを使って相互相関を計算する。これが「PHAT（Phase Transform）」という名前の由来&lt;/li&gt;
&lt;li&gt;マイク間の距離と、推定した到達時間差から、音源がどの方向にあるかを計算できる&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;/li&gt;
&lt;li&gt;デジタル化は、サンプリング（時間方向の離散化）と量子化（振幅方向の離散化）の2段階で行われ、その生データがPCM。これを実際のハードウェアとして行うのがADC（録音）とDAC（再生）&lt;/li&gt;
&lt;li&gt;サンプリング定理により、記録したい最大周波数の2倍以上のサンプリング周波数が必要になる&lt;/li&gt;
&lt;li&gt;音声ファイルには、非圧縮（WAV）・可逆圧縮（FLAC）・非可逆圧縮（MP3など）がある&lt;/li&gt;
&lt;li&gt;FFT・STFTを使うと、波形を周波数領域（スペクトログラム）に変換して、音の中身を分析できる。フレームサイズとホップサイズの選び方には、時間分解能と周波数分解能のトレードオフがある&lt;/li&gt;
&lt;li&gt;多くの音声処理は振幅（パワー）の情報だけを使い、位相の情報は捨てることが多い&lt;/li&gt;
&lt;li&gt;RMS・dB・dBFS・SNRは、音の大きさやノイズとの関係を表すための一連の指標&lt;/li&gt;
&lt;li&gt;ノイズフロアは、系が持つ最低限のノイズレベルで、それより小さい信号は検出できない。ビット深度が生む量子化ノイズフロアもその一種。ノイズを除去する技術がノイズ抑制・音声強調&lt;/li&gt;
&lt;li&gt;メル尺度は人間の聴覚特性に合わせた周波数の圧縮で、log-melスペクトログラムやMFCCの土台になっている&lt;/li&gt;
&lt;li&gt;声は基音（F0）とその整数倍の倍音からなる周期波で、声道の共鳴が特定の周波数帯（フォルマント）を強める。F0は音程、フォルマント（F1・F2）は母音・声質に対応する&lt;/li&gt;
&lt;li&gt;声帯が振動する有声音と、振動しない無声音の違いは、F0の有無やZCRで機械的に判定できる&lt;/li&gt;
&lt;li&gt;ZCR・F0・スペクトル重心/平坦度は、VADや音声分類などで昔からよく使われてきた古典的な特徴量&lt;/li&gt;
&lt;li&gt;ハードウェアの一定クロックとソフトウェアの断続的な処理のギャップを、リングバッファが埋めている。読み込み位置が書き込み位置に追いつくとunderrun、その逆でoverrunが起きる&lt;/li&gt;
&lt;li&gt;Linuxでは、PulseAudioやPipeWireのようなサウンドサーバーがアプリとハードウェアの間の音声ルーティングを担う。クオンタム（処理単位のサンプル数）が小さいほど低遅延だが、xrunが起きやすくなる&lt;/li&gt;
&lt;li&gt;複数マイクを使った音源定位には、位相情報を使うGCC-PHATのような手法がある&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://er-music.jp/theory/1160/" target="_blank" rel="noopener"
&gt;音の3要素とは何？音楽の理解に欠かせない基礎知識│er-theory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://qiita.com/GeneLab_999/items/1229564ffaf9779f37f5" target="_blank" rel="noopener"
&gt;[1分でわかる]Speech Enhancementってなんだ？音源分離との違いと、その概念編 #音声AI - Qiita&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://arxiv.org/html/2511.02269v1" target="_blank" rel="noopener"
&gt;Energy-Efficient Hardware Acceleration of Whisper ASR on a CGLA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/ja-jp/azure/foundry/openai/how-to/realtime-audio?tabs=keyless%2Clinux&amp;amp;pivots=ai-foundry-portal" target="_blank" rel="noopener"
&gt;Azure OpenAI で音声とオーディオに GPT Realtime API を使用する - Microsoft Foundry | Microsoft Learn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.convergence-lab.com/blog/2025-06-11-zipformer/" target="_blank" rel="noopener"
&gt;音声認識AIモデル ZipFormer - Convergence Lab.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://fast-d.hmcom.co.jp/techblog/melspectrum-mfcc/" target="_blank" rel="noopener"
&gt;音響特徴量「メルスペクトル」と「MFCC（メル周波数ケプストラム係数）」の解説と実例紹介｜お知らせ/ブログ｜「FAST-D」AI異音検知ソリューション | Hmcomm株式会社&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://acp.amivoice.com/blog/2023-03-06-094430/#%E9%9F%B3%E9%9F%BF%E3%83%A2%E3%83%87%E3%83%AB" target="_blank" rel="noopener"
&gt;音声認識の仕組みをざっくり解説！ - AmiVoice Techblog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.youtube.com/watch?v=mJiu5tWs3zo" target="_blank" rel="noopener"
&gt;エントロピーの再発明 | 圧縮と知能 Part 1 - YouTube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://utsugi-phonetics.com/phonetics_introduction/acoustic_phonetics/formant/" target="_blank" rel="noopener"
&gt;共鳴と母音のフォルマント | 音声学入門 | 発音と音声学の資料室&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://spice-of-englishgrammar.com/vowel/" target="_blank" rel="noopener"
&gt;【音声学】英語の母音の種類/分類、IPAチャートをわかりやすく解説&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>WebRTC VADの仕組み</title><link>https://www.m1ke.org/p/webrtc-vad%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF/</link><pubDate>Sun, 23 Aug 2026 12:00:00 +0900</pubDate><guid>https://www.m1ke.org/p/webrtc-vad%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF/</guid><description>&lt;img src="https://www.m1ke.org/p/webrtc-vad%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF/webrtcvad.jpg" alt="Featured image of post WebRTC VADの仕組み" /&gt;&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;音声区間検出（VAD）でよく使われる&lt;code&gt;webrtcvad&lt;/code&gt;について調べていた&lt;/li&gt;
&lt;li&gt;精度はDNNベースのものに勝てないが、中身がGMM（混合ガウス分布）と尤度比で構成される&lt;/li&gt;
&lt;li&gt;中身が面白いので、その中身をAIで詳解した&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="vadvoice-activity-detectionとは"&gt;VAD（Voice Activity Detection）とは&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;音声データの中から「人が喋っている区間」と「喋っていない区間」を判定する技術&lt;/li&gt;
&lt;li&gt;無音部分のトリミング、音声認識（ASR）の前処理、通話の帯域節約など、幅広く使われる&lt;/li&gt;
&lt;li&gt;&lt;code&gt;webrtcvad&lt;/code&gt;は、Google WebRTCプロジェクトのVADエンジンをPythonから使えるようにしたライブラリ&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="webrtc-vadの全体像"&gt;WebRTC VADの全体像&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;音声を短いフレーム（10ms・20ms・30msのいずれか）に分割し、フレームごとにspeech/non-speechを判定する&lt;/li&gt;
&lt;li&gt;対応サンプリングレートは8k/16k/32k/48kHzのモノラルPCM&lt;/li&gt;
&lt;li&gt;内部処理は8kHzで行われており、16k/32k/48kHzの入力は、まず8kHzにダウンサンプルしてから同じ判定ロジックにかけている&lt;/li&gt;
&lt;li&gt;判定の厳しさを&lt;code&gt;aggressiveness&lt;/code&gt;（0〜3）で指定でき、数字が大きいほどnon-speech寄りに判定する&lt;/li&gt;
&lt;li&gt;ディープラーニングは使っておらず、GMMという古典的な統計モデルで判定している&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="処理の流れ"&gt;処理の流れ&lt;/h3&gt;
&lt;p&gt;WebRTC VADの判定は、大まかに以下の流れで行われる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;音声をフレーム単位に分割する&lt;/li&gt;
&lt;li&gt;各フレームを6つの周波数帯域（チャンネル）に分け、帯域ごとのエネルギーを計算する&lt;/li&gt;
&lt;li&gt;帯域ごとに、そのエネルギーをspeech用・noise用のGMMに入力して尤度比を計算する&lt;/li&gt;
&lt;li&gt;全帯域の尤度比を合算し、speechらしい方を採用する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;この流れを理解するには、GMMと尤度という2つの概念を知っておく必要がある。（この後、実際のソースコードで確認したより正確な仕組みも解説する）&lt;/p&gt;
&lt;h2 id="gmm混合ガウス分布とは"&gt;GMM（混合ガウス分布）とは&lt;/h2&gt;
&lt;h3 id="正規分布のおさらい"&gt;正規分布のおさらい&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;正規分布（ガウス分布）は、平均$\mu$を中心とした釣鐘型の分布&lt;/li&gt;
&lt;li&gt;以下の式で表される&lt;/li&gt;
&lt;/ul&gt;
$$
\mathcal{N}(x \mid \mu, \sigma^2) = \frac{1}{\sqrt{2\pi\sigma^2}} \exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right)
$$&lt;ul&gt;
&lt;li&gt;$\mu$は分布の中心、$\sigma^2$は分布の広がり（分散）を表す&lt;/li&gt;
&lt;li&gt;山が1つしかない、単純な形の分布&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;実際、WebRTC VADのソース（&lt;code&gt;vad_gmm.c&lt;/code&gt;の&lt;code&gt;WebRtcVad_GaussianProbability&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;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// For a normal distribution, the probability of |input| is calculated and
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// returned (in Q20). The formula for normal distributed probability is
&lt;/span&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;&lt;span class="c1"&gt;// 1 / s * exp(-(x - m)^2 / (2 * s^2))
&lt;/span&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;&lt;span class="c1"&gt;// where the parameters are given in the following Q domains:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// m = |mean| (Q7)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// s = |std| (Q7)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// x = |input| (Q4)
&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;ul&gt;
&lt;li&gt;&lt;code&gt;Q7&lt;/code&gt;・&lt;code&gt;Q4&lt;/code&gt;・&lt;code&gt;Q20&lt;/code&gt;は固定小数点の表現方法（浮動小数点を使わない代わりに、整数のどこまでを小数部として扱うかを表す）&lt;/li&gt;
&lt;li&gt;数式としては$\frac{1}{s}\exp\left(-\frac{(x-m)^2}{2s^2}\right)$そのもので、前述の$\mathcal{N}(x \mid \mu, \sigma^2)$と完全に一致する&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="正規分布1つでは表現できない分布"&gt;正規分布1つでは表現できない分布&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;実際のデータは、山が複数ある分布になることが多い&lt;/li&gt;
&lt;li&gt;例えば「静かな部屋のノイズのエネルギー」と「人が喋っているときのエネルギー」を混ぜて集計すると、低い値のあたりと高い値のあたりに、それぞれ山ができる&lt;/li&gt;
&lt;li&gt;こうした分布は、正規分布1つでは無理に1つの山として近似することになり、うまく表現できない&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="複数の正規分布を混ぜる"&gt;複数の正規分布を混ぜる&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;そこで、複数の正規分布を重みつきで足し合わせたものがGMM&lt;/li&gt;
&lt;li&gt;以下の式で表される&lt;/li&gt;
&lt;/ul&gt;
$$
p(x) = \sum_{k=1}^{K} \pi_k \, \mathcal{N}(x \mid \mu_k, \sigma_k^2)
$$&lt;ul&gt;
&lt;li&gt;$K$個の正規分布を混ぜ合わせる&lt;/li&gt;
&lt;li&gt;各正規分布は、自分専用の平均$\mu_k$・分散$\sigma_k^2$を持つ&lt;/li&gt;
&lt;li&gt;$\pi_k$は「その正規分布がどれくらいの割合で混ざっているか」を表す重みで、全て足すと1になる&lt;/li&gt;
&lt;li&gt;イメージとしては、複数の釣鐘型の山を、それぞれ違う高さ・違う場所に立てて、足し合わせたもの&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="gmmの学習"&gt;GMMの学習&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;$\mu_k$・$\sigma_k^2$・$\pi_k$は、手元のデータから推定する必要がある&lt;/li&gt;
&lt;li&gt;一般にはEM（Expectation-Maximization）アルゴリズムという手法で推定する&lt;/li&gt;
&lt;li&gt;大まかには以下の2ステップを繰り返す
&lt;ul&gt;
&lt;li&gt;Eステップ: 今のパラメータのもとで、各データ点がどの正規分布に属していそうかを確率的に割り当てる&lt;/li&gt;
&lt;li&gt;Mステップ: その割り当てをもとに、各正規分布の$\mu_k$・$\sigma_k^2$・$\pi_k$を更新する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;これを収束するまで繰り返すことで、データの分布にフィットするGMMが得られる&lt;/li&gt;
&lt;li&gt;一般的には、こうして学習したパラメータは固定して使うことが多いが、WebRTC VADは少し違う（後述の「モデルは学習後も動き続ける」を参照）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="尤度で分析するとは"&gt;尤度で分析するとは&lt;/h2&gt;
&lt;h3 id="尤度likelihoodの意味"&gt;尤度（Likelihood）の意味&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;尤度とは、「あるモデルのもとで、このデータが観測される確からしさ」を表す値&lt;/li&gt;
&lt;li&gt;GMMの場合、あるデータ点$x$に対する尤度は、前述の$p(x)$そのもの&lt;/li&gt;
&lt;li&gt;$p(x)$が大きいほど、そのモデルにとって「よくあるデータ」、小さいほど「珍しいデータ」ということになる&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="対数尤度とはなぜ対数を取るのか"&gt;対数尤度とは（なぜ対数を取るのか）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;対数尤度（log-likelihood）とは、尤度$p(x)$そのものではなく、その対数$\log p(x)$を指す&lt;/li&gt;
&lt;li&gt;わざわざ対数を取る理由は、主に以下の2つ&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;理由1は、掛け算が足し算になること。&lt;/p&gt;
&lt;p&gt;以下は、独立した2つのデータ点$x_1$・$x_2$を同時に観測する尤度（同時尤度）の式である。&lt;/p&gt;
$$
p(x_1, x_2) = p(x_1) \cdot p(x_2)
$$&lt;ul&gt;
&lt;li&gt;複数のデータを同時に扱うとき、各データが互いに独立なら、全体の尤度はそれぞれの尤度の掛け算になる&lt;/li&gt;
&lt;li&gt;しかし対数を取ると、この掛け算が足し算に変わる&lt;/li&gt;
&lt;/ul&gt;
$$
\log p(x_1, x_2) = \log p(x_1) + \log p(x_2)
$$&lt;ul&gt;
&lt;li&gt;足し算の方が、掛け算より計算コストが低く、桁あふれ（多くの小さい確率を掛け続けると、値がどんどん0に近づいてアンダーフローする問題）にも強い&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;理由2は、大小関係が変わらないこと。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$\log$は単調増加関数なので、$p_A(x)$と$p_B(x)$の大小関係は、$\log p_A(x)$と$\log p_B(x)$の大小関係とそのまま一致する&lt;/li&gt;
&lt;li&gt;つまり、分類のために大小を比較する用途では、対数を取っても比較結果は変わらない&lt;/li&gt;
&lt;li&gt;こうした理由から、尤度は生の値ではなく対数を取った状態（対数尤度）で扱われることが多い&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="尤度比によるクラス判定"&gt;尤度比によるクラス判定&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;クラスごとに別々のGMMを学習しておけば、そのGMM同士の尤度を比較することで分類ができる&lt;/li&gt;
&lt;li&gt;具体的には、以下のような手順になる
&lt;ul&gt;
&lt;li&gt;クラスAのデータだけを使ってGMM_Aを学習する&lt;/li&gt;
&lt;li&gt;クラスBのデータだけを使ってGMM_Bを学習する&lt;/li&gt;
&lt;li&gt;新しいデータ$x$が来たら、$p_A(x)$と$p_B(x)$を両方計算する&lt;/li&gt;
&lt;li&gt;$p_A(x)$の方が大きければクラスA、$p_B(x)$の方が大きければクラスBと判定する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;以下のような尤度比（対数を取ったもの）を閾値と比較する形で実装されることが多い&lt;/li&gt;
&lt;/ul&gt;
$$
\log p_A(x) - \log p_B(x) &gt; \text{threshold}
$$&lt;ul&gt;
&lt;li&gt;これは「そのデータが、クラスAのモデルとクラスBのモデル、どちらにとってより自然か」を比較しているだけで、仕組みとしてはシンプル&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="webrtc-vadの判定の仕組み"&gt;WebRTC VADの判定の仕組み&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;前述のGMM・尤度比の考え方を、そのままspeech/non-speechの2クラス分類に当てはめたものがWebRTC VAD&lt;/li&gt;
&lt;li&gt;ここから先は、実際に&lt;code&gt;libwebrtc&lt;/code&gt;のソース（&lt;code&gt;vad_core.c&lt;/code&gt;・&lt;code&gt;vad_gmm.c&lt;/code&gt;）をcloneして確認した内容を元に、より正確な仕組みを解説する&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="特徴量6つの周波数帯域のlog-energy"&gt;特徴量：6つの周波数帯域のlog-energy&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;前半で「帯域ごとのエネルギー」と書いたが、正確にはエネルギーをdBスケールに変換したもの（log-energy）を特徴量として使っている&lt;/li&gt;
&lt;li&gt;内部は8kHzで動くので、ナイキスト周波数は4kHz。この0〜4kHzを、以下のように繰り返し半分に分割して6つの帯域を作る（&lt;code&gt;vad_filterbank.c&lt;/code&gt;の&lt;code&gt;WebRtcVad_CalculateFeatures&lt;/code&gt;）&lt;/li&gt;
&lt;/ul&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;0&lt;/td&gt;
&lt;td&gt;80 - 250 Hz&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;250 - 500 Hz&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;500 - 1000 Hz&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;1000 - 2000 Hz&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;2000 - 3000 Hz&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;3000 - 4000 Hz&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;分割には、ローパス/ハイパスに分ける&lt;code&gt;SplitFilter&lt;/code&gt;（オールパスフィルタ2つの組み合わせ）を使い、それを繰り返し適用して帯域を半分ずつに絞り込んでいく&lt;/li&gt;
&lt;li&gt;80Hz未満は、別途ハイパスフィルタで除去している（無音時の低周波ノイズ・DCオフセットの影響を避けるため）&lt;/li&gt;
&lt;li&gt;各帯域のエネルギーは、&lt;code&gt;LogOfEnergy&lt;/code&gt;という関数で対数（dB相当、Q4固定小数点）に変換されてから特徴量になる。以下がそのコメント部分（&lt;code&gt;vad_filterbank.c&lt;/code&gt;より抜粋）&lt;/li&gt;
&lt;/ul&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-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Calculates the energy of |data_in| in dB, and also updates an overall
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// |total_energy| if necessary.
&lt;/span&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;&lt;span class="c1"&gt;// - log_energy [o] : 10 * log10(&amp;#34;energy of |data_in|&amp;#34;) given in Q4.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;LogOfEnergy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;int16_t&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;data_in&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;size_t&lt;/span&gt; &lt;span class="n"&gt;data_length&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="kt"&gt;int16_t&lt;/span&gt; &lt;span class="n"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int16_t&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;total_energy&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="kt"&gt;int16_t&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;log_energy&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&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;ul&gt;
&lt;li&gt;つまりGMMに入力される$x$は「その帯域の生のエネルギー」ではなく「その帯域のエネルギーをdB変換した値」であり、これによって音量の桁の違い（静かな音と大きい音の差）を扱いやすくしている&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="チャンネルごとに独立したgmm"&gt;チャンネルごとに独立したGMM&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;WebRTC VADは、音声を6つの周波数帯域（チャンネル）に分けて処理する&lt;/li&gt;
&lt;li&gt;各チャンネルに、noise用・speech用それぞれ2つの正規分布を混ぜたGMM（$K=2$）を持っている&lt;/li&gt;
&lt;li&gt;つまり全体では、6チャンネル×2クラス×2つの正規分布で、合計24個の正規分布が使われている&lt;/li&gt;
&lt;li&gt;前半で説明した「1つのGMMで全体を判定する」という書き方は簡略化しすぎで、正確には「チャンネルごとに独立したGMMを持ち、後で結果を合算する」という構造になっている&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="ローカル判定とグローバル判定"&gt;ローカル判定とグローバル判定&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;各チャンネルについて、noise側の尤度とspeech側の尤度から、対数尤度比（log-likelihood ratio）を計算する&lt;/li&gt;
&lt;li&gt;各チャンネルの尤度比に、周波数帯域ごとの重み（高い帯域ほど大きい重み）をかけて合算し、全チャンネルまとめたグローバルな尤度比を作る&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以下は、$C=6$個のチャンネルの尤度比$\text{LLR}_c$を、重み$w_c$で合算する式である。&lt;/p&gt;
$$
\text{LLR}\_{\text{global}} = \sum_{c=1}^{C} w_c \cdot \text{LLR}_c
$$&lt;ul&gt;
&lt;li&gt;「掛け算」ではなく「足し算」で合算しているのは、前述の対数の性質（各チャンネルが独立なら、全体の尤度は各チャンネルの尤度の掛け算になり、対数を取ると足し算になる）を使っているため&lt;/li&gt;
&lt;li&gt;6つのチャンネルをそれぞれ独立な情報源とみなし、各チャンネルの対数尤度比を（重みつきで）足し合わせることで、全帯域を総合した1つの証拠にまとめている、という考え方&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;判定は、以下の2つのテストの組み合わせ（どちらか一方でも満たせばspeech）で行われる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ローカル判定: いずれか1つのチャンネルだけでも、尤度比が強くspeech寄りであればspeechとする&lt;/li&gt;
&lt;li&gt;グローバル判定: 全チャンネル合算の$\text{LLR}_{\text{global}}$が閾値を超えていればspeechとする&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;実際の該当コードは以下（&lt;code&gt;vad_core.c&lt;/code&gt;の&lt;code&gt;GmmProbability&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;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;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// The detection scheme is an LRT with hypothesis
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// H0: Noise
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// H1: Speech
&lt;/span&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;&lt;span class="c1"&gt;// We combine a global LRT with local tests, for each frequency sub-band,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// here defined as |channel|.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;channel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;channel&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;kNumChannels&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;channel&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&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="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;// Calculate the log likelihood ratio: log2(Pr{X|H1} / Pr{X|H0}).
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&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;sum_log_likelihood_ratios&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int32_t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;log_likelihood_ratio&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;kSpectrumWeight&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;channel&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Local VAD decision.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;log_likelihood_ratio&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;individualTest&lt;/span&gt;&lt;span class="p"&gt;)&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;vadflag&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&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="p"&gt;}&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;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Make a global VAD decision.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;vadflag&lt;/span&gt; &lt;span class="o"&gt;|=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sum_log_likelihood_ratios&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;totalTest&lt;/span&gt;&lt;span class="p"&gt;);&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;ul&gt;
&lt;li&gt;H0（帰無仮説）を「ノイズ」、H1（対立仮説）を「音声」とする、統計学の仮説検定（LRT: Likelihood Ratio Test）そのものの形になっている&lt;/li&gt;
&lt;li&gt;&lt;code&gt;kSpectrumWeight[channel]&lt;/code&gt;は、チャンネル（帯域）ごとの重み。値は&lt;code&gt;{ 6, 8, 10, 12, 14, 16 }&lt;/code&gt;で、高い周波数帯域ほど大きい重みがついている&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="対数尤度比をビットシフトだけで近似計算する仕組み"&gt;対数尤度比をビットシフトだけで近似計算する仕組み&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;組み込み機器向けの実装なので、浮動小数点の&lt;code&gt;log&lt;/code&gt;関数は一切使わず、整数のビットシフトだけで対数尤度比を近似している&lt;/li&gt;
&lt;li&gt;該当コードとコメントは以下（&lt;code&gt;vad_core.c&lt;/code&gt;より抜粋）&lt;/li&gt;
&lt;/ul&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-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Calculate the log likelihood ratio: log2(Pr{X|H1} / Pr{X|H1}).
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Approximation:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// log2(Pr{X|H1} / Pr{X|H1}) = log2(Pr{X|H1}*2^Q) - log2(Pr{X|H1}*2^Q)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// = log2(h1_test) - log2(h0_test)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// = log2(2^(31-shifts_h1)*(1+b1))
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// - log2(2^(31-shifts_h0)*(1+b0))
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// = shifts_h0 - shifts_h1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// + log2(1+b1) - log2(1+b0)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// ~= shifts_h0 - shifts_h1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;shifts_h0&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;WebRtcSpl_NormW32&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;h0_test&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;shifts_h1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;WebRtcSpl_NormW32&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;h1_test&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="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;h0_test&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&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;shifts_h0&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;31&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="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;h1_test&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&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;shifts_h1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;31&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="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;log_likelihood_ratio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;shifts_h0&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;shifts_h1&lt;/span&gt;&lt;span class="p"&gt;;&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;ul&gt;
&lt;li&gt;&lt;code&gt;h0_test&lt;/code&gt;・&lt;code&gt;h1_test&lt;/code&gt;は、それぞれH0（ノイズ）・H1（音声）の尤度に相当する32bit整数値&lt;/li&gt;
&lt;li&gt;&lt;code&gt;WebRtcSpl_NormW32(v)&lt;/code&gt;は、「符号ビットを除いた最上位ビットが1になるまで、&lt;code&gt;v&lt;/code&gt;を何ビット左シフトできるか」を返す関数
&lt;ul&gt;
&lt;li&gt;言い換えると、&lt;code&gt;v&lt;/code&gt;の最上位の1が立っているビット位置を求めているのと同じ&lt;/li&gt;
&lt;li&gt;ある正の整数の最上位ビットの位置は、おおよそ$\lfloor \log_2 v \rfloor$に一致する（例えば&lt;code&gt;v&lt;/code&gt;が$2^{20}$〜$2^{21}-1$の範囲なら、最上位ビット位置は20で、シフト数は「31引く21」あたりの値になる）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;つまり、必要なシフト数は「$v$の桁の大きさ」を表す指標であり、$v$が大きいほどシフト数は小さく、$v$が小さいほどシフト数は大きくなる、という$-\log_2 v$に近い性質を持つ&lt;/li&gt;
&lt;li&gt;コメントの式変形が示す通り、以下の近似が成り立つ&lt;/li&gt;
&lt;/ul&gt;
$$
\log_2 h_1 - \log_2 h_0 \approx \text{shifts(H0)} - \text{shifts(h1)}
$$&lt;ul&gt;
&lt;li&gt;右辺には&lt;code&gt;log&lt;/code&gt;計算が一切登場せず、整数の左シフト回数を数えるだけなので、組み込み機器でも高速に計算できる&lt;/li&gt;
&lt;li&gt;誤差として捨てているのは、最上位ビットより下の桁（コメント中の$b_0$・$b_1$）の情報だが、これは$0$以上$1$未満の小さい値で、H0側とH1側で平均的に打ち消し合うため、実用上は無視できるとされている&lt;/li&gt;
&lt;li&gt;&lt;code&gt;h0_test&lt;/code&gt;または&lt;code&gt;h1_test&lt;/code&gt;が0（アンダーフロー）の場合は、シフト数を最大値&lt;code&gt;31&lt;/code&gt;にして「その仮説の尤度はほぼ0（=強く否定される）」ことを表現している&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="モデルは学習後も動き続けるオンライン適応"&gt;モデルは学習後も動き続ける（オンライン適応）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;一般的なGMM分類器は、事前に学習したパラメータを固定して使うことが多い&lt;/li&gt;
&lt;li&gt;しかしWebRTC VADは、noise用・speech用それぞれのGMMの平均を、判定結果に応じてフレームごとに更新し続ける
&lt;ul&gt;
&lt;li&gt;そのフレームがspeechと判定されれば、speech側GMMの平均をそのフレームの特徴量に近づける&lt;/li&gt;
&lt;li&gt;noiseと判定されれば、同様にnoise側GMMの平均を近づける&lt;/li&gt;
&lt;li&gt;更新の強さは&lt;code&gt;kSpeechUpdateConst&lt;/code&gt;・&lt;code&gt;kNoiseUpdateConst&lt;/code&gt;という定数で決まっていて、急激に動きすぎないよう抑えられている&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;さらに、noise側の平均には長期的な補正もかかる
&lt;ul&gt;
&lt;li&gt;チャンネルごとに、直近の特徴量（log-energy）の中で特に小さかった値を16個、経過フレーム数（最大100フレーム）つきで保持し続ける仕組みがあり（&lt;code&gt;vad_sp.c&lt;/code&gt;の&lt;code&gt;WebRtcVad_FindMinimum&lt;/code&gt;）、そこから長期的な最小値（ノイズの床）を推定する&lt;/li&gt;
&lt;li&gt;noise側の平均は、その推定値の方向へ&lt;code&gt;kBackEta&lt;/code&gt;という定数の分だけゆっくり引き寄せられる（該当コード: &lt;code&gt;nmk3 = nmk2 + (int16_t)((ndelt * kBackEta) &amp;gt;&amp;gt; 9);&lt;/code&gt;、コメントには&amp;quot;Long term correction of the noise mean&amp;quot;とある）&lt;/li&gt;
&lt;li&gt;これにより、周囲のノイズレベル自体が時間とともに変化しても（エアコンが止まる、環境音が変わる等）、noiseモデルがその変化に追従できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;つまり、事前学習したパラメータはあくまでスタート地点であり、実際に動かしている環境に合わせてモデル自体が少しずつ適応し続ける仕組みになっている&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="aggressivenessによる閾値の違い"&gt;aggressivenessによる閾値の違い&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;aggressiveness&lt;/code&gt;（0〜3）は、ローカル判定・グローバル判定それぞれの閾値のセットを切り替えるパラメータ&lt;/li&gt;
&lt;li&gt;例えば、10ms（80サンプル）フレームでの閾値は以下のように変わる&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;aggressiveness&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;0（Quality）&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;57&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3（Very Aggressive）&lt;/td&gt;
&lt;td&gt;94&lt;/td&gt;
&lt;td&gt;1100&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;数字が大きいほど、speechと判定するためにより強い証拠（尤度比の差）が必要になり、non-speech寄りに判定が倒れやすくなる&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="判定のちらつきを抑える仕組みhangover"&gt;判定のちらつきを抑える仕組み（hangover）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;フレーム単位の判定をそのまま出力すると、speechの終わり際などで判定がON/OFFを細かく繰り返してしまう&lt;/li&gt;
&lt;li&gt;WebRTC VADは、これを抑えるためにhangover（一種の余韻）という仕組みを持つ
&lt;ul&gt;
&lt;li&gt;一度speechと判定されると、その後しばらくnoise判定が続いてもspeechのまま扱う&lt;/li&gt;
&lt;li&gt;直近でspeechが長く続いていたかどうかに応じて、hangoverの長さを切り替える&lt;/li&gt;
&lt;li&gt;hangoverの長さも&lt;code&gt;aggressiveness&lt;/code&gt;によって変わる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="webrtc-vadの特徴と限界"&gt;WebRTC VADの特徴と限界&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;特徴量が6帯域のlog-energyだけで、log-melやMFCCのようなメル尺度ベースの特徴量は使っていないため、計算が軽く高速&lt;/li&gt;
&lt;li&gt;ディープラーニング以前の手法のため、ノイズや残響で音質が劣化した音声には弱く、拾い漏れ（recallの低下）が起きやすい&lt;/li&gt;
&lt;li&gt;話者性・方向・距離といった情報は一切使っていないため、「誰が喋っているか」「どの方向の声か」は区別できない
&lt;ul&gt;
&lt;li&gt;カフェなど雑音の多い環境で、目的の話者以外の声（雑談など）を除外したい場合は、VAD単体では対応できない&lt;/li&gt;
&lt;li&gt;その用途には、話者のembeddingを使ったtarget speaker extractionや、ビームフォーミングなど別の技術が必要になる&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;WebRTC VADは、GMMと尤度比という古典的な統計モデルでspeech/non-speechを判定している&lt;/li&gt;
&lt;li&gt;GMMは、複数の正規分布を重みつきで混ぜ合わせて、複雑な分布を表現するモデル&lt;/li&gt;
&lt;li&gt;尤度は「あるモデルからそのデータが出てくる確からしさ」で、クラスごとにGMMを学習して尤度を比較すれば、そのまま分類器として使える&lt;/li&gt;
&lt;li&gt;対数尤度（尤度の対数）を使うと、独立なデータの同時尤度の掛け算が足し算になり、計算が軽く数値的にも安定する。WebRTC VADが各帯域の尤度比を足し算で合算しているのもこの性質による&lt;/li&gt;
&lt;li&gt;dB・dBFS・log-mel・MFCCは、いずれも音声処理でよく出てくる基礎的な特徴量表現だが、WebRTC VADはそのどれでもなく、オールパスフィルタで再帰的に分割した6帯域のlog-energyというシンプルな特徴量を使っている&lt;/li&gt;
&lt;li&gt;実際のソースコードを確認すると、以下のようなことが分かった
&lt;ul&gt;
&lt;li&gt;特徴量は6つの周波数帯域（80-250, 250-500, 500-1000, 1000-2000, 2000-3000, 3000-4000 Hz）ごとのlog-energy&lt;/li&gt;
&lt;li&gt;帯域ごとに独立したGMMがあり、ローカル判定（帯域単体）とグローバル判定（重みつき合算）を組み合わせている&lt;/li&gt;
&lt;li&gt;これはH0: ノイズ／H1: 音声という尤度比検定（LRT）そのものの形になっている&lt;/li&gt;
&lt;li&gt;対数尤度比は&lt;code&gt;log&lt;/code&gt;関数を使わず、32bit整数の正規化に必要なビットシフト数の差だけで近似計算されている&lt;/li&gt;
&lt;li&gt;GMMのパラメータは事前学習した値で固定ではなく、動作中もフレームごとにオンラインで適応し続けている（ノイズの床の長期的なドリフトにも追従する）&lt;/li&gt;
&lt;li&gt;hangoverという仕組みで、判定のちらつきを抑えている&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;WebRTC VADは軽量・高速な反面、話者を区別する仕組みがなく、ノイズへの頑健性もニューラルVADに比べて劣る&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://github.com/wiseman/py-webrtcvad" target="_blank" rel="noopener"
&gt;wiseman/py-webrtcvad&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>無料で使える音声・音響データセットカタログ</title><link>https://www.m1ke.org/p/%E7%84%A1%E6%96%99%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B%E9%9F%B3%E5%A3%B0%E9%9F%B3%E9%9F%BF%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BB%E3%83%83%E3%83%88%E3%82%AB%E3%82%BF%E3%83%AD%E3%82%B0/</link><pubDate>Thu, 13 Aug 2026 09:52:00 +0900</pubDate><guid>https://www.m1ke.org/p/%E7%84%A1%E6%96%99%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B%E9%9F%B3%E5%A3%B0%E9%9F%B3%E9%9F%BF%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BB%E3%83%83%E3%83%88%E3%82%AB%E3%82%BF%E3%83%AD%E3%82%B0/</guid><description>&lt;img src="https://www.m1ke.org/p/%E7%84%A1%E6%96%99%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B%E9%9F%B3%E5%A3%B0%E9%9F%B3%E9%9F%BF%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BB%E3%83%83%E3%83%88%E3%82%AB%E3%82%BF%E3%83%AD%E3%82%B0/onsei.jpg" alt="Featured image of post 無料で使える音声・音響データセットカタログ" /&gt;&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;仕事で、ASR(音声認識)・TTS(音声合成)・VAD/話者ダイアライゼーション・ターン検出などのモデルを作った&lt;/li&gt;
&lt;li&gt;そのために、無料で使える音声・音響データセットを探してかき集めた&lt;/li&gt;
&lt;li&gt;手元に貯まった数十個のデータセットを整理して、後から見返せるようにカタログ化した&lt;/li&gt;
&lt;li&gt;量が多いのでAIにローカルの物を全部まとめてもらった結果なのでいくつか間違いがあるかもしれないところは注意&lt;/li&gt;
&lt;li&gt;データセットごとに「どんなデータか」「何に使えるか」「どこから落とせるか」「件数・サイズ」「ライセンス」をまとめた&lt;/li&gt;
&lt;li&gt;ライセンス欄は各配布元の記載をそのまま転記しただけで、「記載なし」は自由に使ってよいという意味ではない&lt;/li&gt;
&lt;li&gt;調査の過程で見つかった商用・研究専用など無料で使えないデータセットも、比較の参考として一部残してある(ライセンス欄に⚠️で明記)&lt;/li&gt;
&lt;li&gt;ダウンロード・変換用のスクリプトや作業用キャッシュなど、データセットそのものではないものはこのカタログには含めていない&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="会話雑談音声"&gt;会話・雑談音声&lt;/h2&gt;
&lt;h3 id="ami-meeting-corpus"&gt;AMI Meeting Corpus&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;英語の多人数会議録音(近接マイクIHM + 単一遠隔マイクSDM)、発話単位の書き起こし・話者ID付き、非ネイティブ英語話者が多い&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;会議音声のASR・話者分離モデルの学習/評価&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/datasets/edinburghcstr/ami" target="_blank" rel="noopener"
&gt;huggingface.co/datasets/edinburghcstr/ami&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;原コーパス: &lt;a class="link" href="https://groups.inf.ed.ac.uk/ami/corpus/" target="_blank" rel="noopener"
&gt;groups.inf.ed.ac.uk/ami&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CC BY 4.0&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;件数/サイズ
&lt;ul&gt;
&lt;li&gt;IHM 108,502/13,098/12,643件(train/val/test)、SDMも同規模、28G&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;形式
&lt;ul&gt;
&lt;li&gt;Parquet(16kHz)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="callfriend"&gt;CALLFRIEND&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;友人・家族間の自然な電話会話、話者ダイアライゼーション形式(発話区間タイムスタンプ+話者ラベル)、英語(2方言)・カナダ仏語・日本語&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;自然会話のダイアライゼーション/ASR研究&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/datasets/talkbank/callfriend" target="_blank" rel="noopener"
&gt;huggingface.co/datasets/talkbank/callfriend&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;バックアップ: &lt;a class="link" href="https://huggingface.co/datasets/0x3/callfriend" target="_blank" rel="noopener"
&gt;huggingface.co/datasets/0x3/callfriend&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;記載なし(TalkBank利用規約に準拠、下記注意参照)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;件数/サイズ
&lt;ul&gt;
&lt;li&gt;72件(2.5G)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;形式
&lt;ul&gt;
&lt;li&gt;Parquet&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="sakuratalkbank"&gt;SAKURA(TalkBank)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;長尺の会話音声+タイムスタンプ付き話者ターン(失語症/談話インタビュー系コレクション)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;談話分析・長尺対話ダイアライゼーション研究&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/datasets/talkbank/sakura" target="_blank" rel="noopener"
&gt;huggingface.co/datasets/talkbank/sakura&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;記載なし(TalkBank規約準拠)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;件数/サイズ
&lt;ul&gt;
&lt;li&gt;18件(845M)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;形式
&lt;ul&gt;
&lt;li&gt;Parquet&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="btsj日本語自然会話コーパス"&gt;BTSJ日本語自然会話コーパス&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;国立国語研究所/宇佐美まゆみ研究室、32トピックの日本語会話、ターン交替・ポーズ・重なり・イントネーション注記付きExcel文字化&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;日本語会話の言語学的分析、ターン交替・相槌研究&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://mmsrv.ninjal.ac.jp/btsj/corpus.html" target="_blank" rel="noopener"
&gt;mmsrv.ninjal.ac.jp/btsj/corpus.html&lt;/a&gt;(NINJAL公式)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;記載なし(NINJAL独自の研究利用規約、オープンライセンスではない)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;件数/サイズ
&lt;ul&gt;
&lt;li&gt;mp3 390件、xlsx文字化549件(12G)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;形式
&lt;ul&gt;
&lt;li&gt;mp3 + xlsx&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="real-personachat"&gt;Real-PersonaChat&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;音声なし・テキストのみ、日本語雑談対話+話者パーソナリティ(Big Five等)注釈、GPT-3.5/4によるペルソナ対話ログも含む&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;対話システム・ペルソナ対話生成の研究&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/datasets/nu-dialogue/real-persona-chat" target="_blank" rel="noopener"
&gt;huggingface.co/datasets/nu-dialogue/real-persona-chat&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CC BY-SA 4.0&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;件数/サイズ
&lt;ul&gt;
&lt;li&gt;対話13,583件・発話408,619件(141M)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;形式
&lt;ul&gt;
&lt;li&gt;JSON(テキストのみ)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="seniortalk"&gt;SeniorTalk&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;75〜85歳の中国語話者202名による高品質会話音声、文字レベルの手動転写+発話・話者レベルのアノテーション付き&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;高齢者向けASR・話者検証・話者分離の研究&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/datasets/0x3/SeniorTalk" target="_blank" rel="noopener"
&gt;huggingface.co/datasets/0x3/SeniorTalk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;複製元: &lt;a class="link" href="https://huggingface.co/datasets/BAAI/SeniorTalk" target="_blank" rel="noopener"
&gt;huggingface.co/datasets/BAAI/SeniorTalk&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CC BY-NC-SA 4.0&lt;/strong&gt;(非商用)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;件数/サイズ
&lt;ul&gt;
&lt;li&gt;対話101件・55.53時間(ASR用60,029発話・37.81時間)、20.9G&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;形式
&lt;ul&gt;
&lt;li&gt;wav(16kHz)+ テキスト転写&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="j-chat"&gt;J-CHAT&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;YouTube・ポッドキャストから収集した日本語大規模対話音声コーパス、音声言語モデリング研究向け&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;日本語の音声対話モデリング、対話音声の事前学習&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/datasets/sarulab-speech/J-CHAT" target="_blank" rel="noopener"
&gt;huggingface.co/datasets/sarulab-speech/J-CHAT&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;⚠️&lt;strong&gt;CC BY-NC 4.0&lt;/strong&gt;(非商用)、日本国著作権法第30条の4の目的に限り使用可という制限も明記&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;件数/サイズ
&lt;ul&gt;
&lt;li&gt;約76,000時間&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;形式
&lt;ul&gt;
&lt;li&gt;lhotse/WebDataset形式(音声+JSON転写)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;備考
&lt;ul&gt;
&lt;li&gt;実際に試した限りではモノラル音声で、話者分離(話者ダイアライゼーション)はされていなかった&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="magichub-日本語自然会話"&gt;MagicHub 日本語自然会話&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;日本語の自然な2者間電話/会話音声、話者・性別・[LAUGHTER][PII][MUSIC]等のタグ付き時刻同期書き起こし&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;日本語自然会話ASRモデルの学習(商用データセット)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.magichub.com/" target="_blank" rel="noopener"
&gt;magichub.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;⚠️独自ライセンス(全権利留保)、著作権者の許可なく複製・再配布禁止&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;件数/サイズ
&lt;ul&gt;
&lt;li&gt;wav 20件・話者10名(1.8G)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;形式
&lt;ul&gt;
&lt;li&gt;wav + txt&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="global-conversational-speech"&gt;Global Conversational Speech&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;18言語(日本語含む)の会話音声(医療・会議・コールセンター等)、原本は305時間/199GB&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;多言語会話ASR/翻訳モデルの学習(商用)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/datasets/UsergyAI/Global-Conversational-Speech" target="_blank" rel="noopener"
&gt;huggingface.co/datasets/UsergyAI/Global-Conversational-Speech&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;⚠️商用ライセンス(有償・ゲート付き)、$65/時間&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;件数/サイズ
&lt;ul&gt;
&lt;li&gt;未ダウンロード(READMEのみ)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;形式
&lt;ul&gt;
&lt;li&gt;—&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="音声認識asrコーパス"&gt;音声認識(ASR)コーパス&lt;/h2&gt;
&lt;h3 id="common-voice-170"&gt;Common Voice 17.0&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;Mozillaのクラウドソース多言語読み上げ音声、約122言語(日本語含む)、年齢/性別/アクセント等のメタデータ付き&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;多言語ASRモデルの学習・評価の定番データ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/datasets/fsicoli/common_voice_17_0" target="_blank" rel="noopener"
&gt;huggingface.co/datasets/fsicoli/common_voice_17_0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;原本: &lt;a class="link" href="https://commonvoice.mozilla.org/" target="_blank" rel="noopener"
&gt;commonvoice.mozilla.org&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CC0-1.0&lt;/strong&gt;(パブリックドメイン)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;件数/サイズ
&lt;ul&gt;
&lt;li&gt;validated分だけで約1,478万件(521G)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;形式
&lt;ul&gt;
&lt;li&gt;mp3(tar格納)+ tsv&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="librispeech-asr"&gt;LibriSpeech ASR&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;英語の朗読音声(オーディオブック)ASRコーパス、clean/other/all構成、train/val/test分割、書き起こし・話者ID付き&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;英語ASRモデルの標準ベンチマーク・学習&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/datasets/librispeech_asr" target="_blank" rel="noopener"
&gt;huggingface.co/datasets/librispeech_asr&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;原著者: Panayotov et al.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CC BY 4.0&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;件数/サイズ
&lt;ul&gt;
&lt;li&gt;全構成合計 約29.2万件(116G)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;形式
&lt;ul&gt;
&lt;li&gt;Parquet(16kHz)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="ja_asrcommon_voice_8_0"&gt;ja_asr.common_voice_8_0&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;Common Voice 8.0の日本語ASRサブセット(testのみ)、音声+書き起こしペア&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;日本語ASRモデルの評価(testセットのみ)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/datasets/0x3/ja_asr.common_voice_8_0" target="_blank" rel="noopener"
&gt;huggingface.co/datasets/0x3/ja_asr.common_voice_8_0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;記載なし(元のCommon VoiceはCC0)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;件数/サイズ
&lt;ul&gt;
&lt;li&gt;4,483件(145M)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;形式
&lt;ul&gt;
&lt;li&gt;FLAC(48kHz)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="genshin-voice-ja"&gt;Genshin-Voice-Ja&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;ゲーム「原神」から抽出した日本語キャラクターボイス+対応する台詞テキスト&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;日本語ASR・TTS・多言語音声処理モデルの学習&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/datasets/0x3/Genshin-Voice-Ja" target="_blank" rel="noopener"
&gt;huggingface.co/datasets/0x3/Genshin-Voice-Ja&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;複製元: &lt;a class="link" href="https://huggingface.co/datasets/OpenSpeechHub/Genshin-Voice-Ja" target="_blank" rel="noopener"
&gt;huggingface.co/datasets/OpenSpeechHub/Genshin-Voice-Ja&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;⚠️記載なし(READMEが空、ゲーム由来のキャラクターボイスのため二次利用は要注意)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;件数/サイズ
&lt;ul&gt;
&lt;li&gt;109,630件(60.3G)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;形式
&lt;ul&gt;
&lt;li&gt;Parquet&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="reazonspeech"&gt;ReazonSpeech&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;地上波テレビ放送から抽出した自然な日本語音声、FLAC音声+テキスト転記。tiny/small/medium/large/allの5段階のサイズで提供されており、small・medium・largeを実際に試した&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;日本語ASRモデルの学習(実放送音声)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/datasets/reazon-research/reazonspeech" target="_blank" rel="noopener"
&gt;huggingface.co/datasets/reazon-research/reazonspeech&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CDLA-Sharing-1.0&lt;/strong&gt;、⚠️加えて日本国著作権法第30条の4の目的に限り使用可という制限付き&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;件数/サイズ
&lt;ul&gt;
&lt;li&gt;tiny: 600MB/8.5時間、small: 6GB/100時間(実測62,047件・6.7G)、medium: 65GB/1000時間、large: 330GB/5000時間、all: 2.3TB/35000時間&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;形式
&lt;ul&gt;
&lt;li&gt;FLAC(16kHz)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="whisper_transcriptionsreazonspeechsmallwer_100"&gt;whisper_transcriptions.reazonspeech.small.wer_10.0&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;ReazonSpeech smallをWhisperで再書き起こしし、WER≤10.0でフィルタしたASR蒸留用データ、&lt;code&gt;text&lt;/code&gt;(正解)・&lt;code&gt;whisper_transcript&lt;/code&gt;(トークン列)付き&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;Whisper蒸留・擬似ラベル付きASRファインチューニング&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/datasets/japanese-asr/whisper_transcriptions.reazonspeech.small.wer_10.0" target="_blank" rel="noopener"
&gt;huggingface.co/datasets/japanese-asr/whisper_transcriptions.reazonspeech.small.wer_10.0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;記載なし&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;件数/サイズ
&lt;ul&gt;
&lt;li&gt;20,900件(2.7G)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;形式
&lt;ul&gt;
&lt;li&gt;Parquet(16kHz)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="google-speech-commands"&gt;Google Speech Commands&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;Googleが公開する1秒間の英語音声集、「Yes」「No」「Up」等10個のコマンド単語を中心に補助単語・沈黙音声も収録&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;キーワードスポッティング(限定語彙音声認識)、小規模モデルの学習・評価の定番ベンチマーク&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/datasets/google/speech_commands" target="_blank" rel="noopener"
&gt;huggingface.co/datasets/google/speech_commands&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CC BY 4.0&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;件数/サイズ
&lt;ul&gt;
&lt;li&gt;v0.01: 30単語・64,727件、v0.02: 35単語・105,829件&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;形式
&lt;ul&gt;
&lt;li&gt;wav(16kHz)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="asr-noise-robust-en"&gt;asr-noise-robust-en&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;CAIMAN・ノイズ付きLibriSpeech・Buckeye・Switchboard・AMI-validationの混合クリップ集(HF &lt;code&gt;m-aliabbas1/asr-noise-robust-en&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;ノイズ耐性ASRの評価(未確認)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/datasets/m-aliabbas1/asr-noise-robust-en" target="_blank" rel="noopener"
&gt;huggingface.co/datasets/m-aliabbas1/asr-noise-robust-en&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;記載なし&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;件数/サイズ
&lt;ul&gt;
&lt;li&gt;READMEのみで実データは未確認&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;形式
&lt;ul&gt;
&lt;li&gt;—&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="音声合成tts用コーパス"&gt;音声合成(TTS)用コーパス&lt;/h2&gt;
&lt;h3 id="libritts-r"&gt;LibriTTS-R&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;LibriTTSをMiipherという音声修復モデルで高音質化した、24kHzの英語TTS用コーパス。train_clean_100(約100時間)・train_clean_360(約360時間)などのサブセットがある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;英語TTSモデルの学習&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.openslr.org/141/" target="_blank" rel="noopener"
&gt;openslr.org/141&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;原著者: Koizumi et al.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CC BY 4.0&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;件数/サイズ
&lt;ul&gt;
&lt;li&gt;train_clean_100: 7.6G、train_clean_360: 27G(全体では約585時間・84.7G)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;形式
&lt;ul&gt;
&lt;li&gt;tar.gz(24kHz)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="hi-fi-tts"&gt;Hi-Fi TTS&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;LibriVoxのオーディオブック音声とProject Gutenbergのテキストを組み合わせた、44.1kHz・10話者(各17時間以上)・計291.6時間の高音質英語TTSコーパス&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;高音質な英語TTSモデルの学習&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.openslr.org/109/" target="_blank" rel="noopener"
&gt;openslr.org/109&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;原著者: Bakhturina et al.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CC BY 4.0&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;件数/サイズ
&lt;ul&gt;
&lt;li&gt;約291.6時間(39G)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;形式
&lt;ul&gt;
&lt;li&gt;tar.gz(44.1kHz)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="環境音ノイズ非音声イベント"&gt;環境音・ノイズ・非音声イベント&lt;/h2&gt;
&lt;h3 id="freesound-laion-640k"&gt;Freesound LAION-640k&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;LAION-Audio-630k向けにキュレーションされたFreesound.org音声+テキスト(タイトル/説明/タグ)、クリップごとにライセンス情報付き&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;音声-テキスト対照学習(CLAP等)、音響イベント検索&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/datasets/benjamin-paine/freesound-laion-640k" target="_blank" rel="noopener"
&gt;huggingface.co/datasets/benjamin-paine/freesound-laion-640k&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;メタデータは&lt;strong&gt;MIT&lt;/strong&gt;、音声はクリップごとに異なる(CC0/CC-BY/CC-BY-NC/CC-Sampling+が混在)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;件数/サイズ
&lt;ul&gt;
&lt;li&gt;505,618件(633G)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;形式
&lt;ul&gt;
&lt;li&gt;Parquet&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="clotho-ja"&gt;clotho-ja&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;環境音の音声ファイルに複数の英語キャプションとその日本語訳を付与した音声キャプショニング用データセット(Clothoの日本語版)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;音声キャプション生成、音声-テキスト対応学習&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/datasets/0x3/clotho-ja" target="_blank" rel="noopener"
&gt;huggingface.co/datasets/0x3/clotho-ja&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;複製元: &lt;a class="link" href="https://huggingface.co/datasets/Atotti/clotho-ja" target="_blank" rel="noopener"
&gt;huggingface.co/datasets/Atotti/clotho-ja&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;記載なし&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;件数/サイズ
&lt;ul&gt;
&lt;li&gt;19,700件、音声長15〜30秒&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;形式
&lt;ul&gt;
&lt;li&gt;Parquet&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="tau-urban-acoustic-scenes-2022-mobilesplit5"&gt;TAU Urban Acoustic Scenes 2022 Mobile(split5)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;空港・駅など都市環境の音響シーンを録音した音声+ラベル付きメタデータ、DCASE 2024 Task1公式スプリット&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;音響シーン分類モデルの学習・評価(DCASE Task1)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/datasets/0x3/tau-urban-acoustic-scenes-2022-mobile-split5" target="_blank" rel="noopener"
&gt;huggingface.co/datasets/0x3/tau-urban-acoustic-scenes-2022-mobile-split5&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;原本: &lt;a class="link" href="https://zenodo.org/record/6337421" target="_blank" rel="noopener"
&gt;Zenodo #6337421&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;⚠️非商用研究目的のみの使用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;件数/サイズ
&lt;ul&gt;
&lt;li&gt;1.33G&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;形式
&lt;ul&gt;
&lt;li&gt;wav + tsv(メタデータ)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="dns-challenge"&gt;DNS-Challenge&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;Microsoft Deep Noise Suppression Challenge(Interspeech 2020)一式、クリーン音声・ノイズ・合成スクリプト・テストセットの寄せ集め(下の内訳参照)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;音声強調・ノイズ抑圧モデルの学習・評価&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/microsoft/DNS-Challenge" target="_blank" rel="noopener"
&gt;github.com/microsoft/DNS-Challenge&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;音源ごとに個別ライセンス(下記内訳を参照)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;件数/サイズ
&lt;ul&gt;
&lt;li&gt;wav計 11,277件(約10G)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;形式
&lt;ul&gt;
&lt;li&gt;wav&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;単一のデータセットではなく、音源ごとにライセンスが異なる複数コーパスの合成なので、要素ごとに分けて確認する&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;クリーン音声(LibriVox収録分)
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;読み上げ音声、ノイズ抑圧モデルの「正解」信号用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;元の出所
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://librivox.org/" target="_blank" rel="noopener"
&gt;LibriVox&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;パブリックドメイン&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;クリーン音声(Edinburgh 56話者)
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;スタジオ収録の英語音声&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;元の出所
&lt;ul&gt;
&lt;li&gt;Edinburgh大学56-speaker corpus&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;個別のカスタムライセンス&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;クリーン音声(PTDB-TUG)
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;ピッチ参照付き音声&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;元の出所
&lt;ul&gt;
&lt;li&gt;PTDB-TUG corpus&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;ODbL&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ノイズ(AudioSet由来)
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;環境ノイズ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;元の出所
&lt;ul&gt;
&lt;li&gt;Google AudioSet&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;CC BY 4.0&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ノイズ(Freesound由来)
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;環境ノイズ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;元の出所
&lt;ul&gt;
&lt;li&gt;Freesound.org&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;CC0&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ノイズ(DEMAND由来)
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;多チャンネル環境ノイズ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;元の出所
&lt;ul&gt;
&lt;li&gt;DEMAND&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;CC BY-SA 3.0&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;リポジトリ全体のコード
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;ノイズ合成・SNR混合スクリプト&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;元の出所
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;microsoft/DNS-Challenge&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;MIT&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="demand"&gt;DEMAND&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;多チャンネル実環境ノイズDB、15環境、16chの環境音録音&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;ノイズ拡張・音声強調学習用の背景ノイズ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/datasets/voice-biomarkers/DEMAND-acoustic-noise" target="_blank" rel="noopener"
&gt;huggingface.co/datasets/voice-biomarkers/DEMAND-acoustic-noise&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;原本: &lt;a class="link" href="https://zenodo.org/record/1227121" target="_blank" rel="noopener"
&gt;Zenodo #1227121&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CC BY 4.0&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;件数/サイズ
&lt;ul&gt;
&lt;li&gt;560件(9.8G)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;形式
&lt;ul&gt;
&lt;li&gt;Parquet(wav埋め込み)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="wham"&gt;WHAM!&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;音声分離タスク向けのノイズデータセット、「WHAM!: Extending Speech Separation to Noisy Environments」の公式データ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;ノイズを含む環境での音声分離・音声強調モデルの学習・評価&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/datasets/0x3/wham" target="_blank" rel="noopener"
&gt;huggingface.co/datasets/0x3/wham&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;原本: &lt;a class="link" href="http://wham.whisper.ai/" target="_blank" rel="noopener"
&gt;wham.whisper.ai&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CC BY-NC 4.0&lt;/strong&gt;(非商用)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;件数/サイズ
&lt;ul&gt;
&lt;li&gt;28,273件(train 21,216・val 4,444・test 2,613)、4.31G、48kHz/2ch&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;形式
&lt;ul&gt;
&lt;li&gt;Opus&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="audioset-nonspeech"&gt;AudioSet-NonSpeech&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;Google AudioSetから人の発話が明確に含まれるクリップを除去したサブセット、非音声の環境音・イベント音のみ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;非音声音響イベント分類、ノイズ拡張&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/datasets/bond005/audioset-nonspeech" target="_blank" rel="noopener"
&gt;huggingface.co/datasets/bond005/audioset-nonspeech&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CC BY 4.0&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;件数/サイズ
&lt;ul&gt;
&lt;li&gt;13,994件(4.1G)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;形式
&lt;ul&gt;
&lt;li&gt;Parquet&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="musannoise"&gt;MUSAN(noise)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;技術音(DTMF等)と非技術音(雷・動物・クラクション等)、計約6時間7分&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;音声認識/話者照合のノイズ拡張(SpecAugment等)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.openslr.org/17/" target="_blank" rel="noopener"
&gt;openslr.org/17&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CC BY 4.0&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;件数/サイズ
&lt;ul&gt;
&lt;li&gt;930件(690M)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;形式
&lt;ul&gt;
&lt;li&gt;wav&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="speech-noise-dataset"&gt;speech-noise-dataset&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;クリーン音声・ノイズ混合音声・ノイズのみの3種類の録音で構成&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;音声強調・ノイズ低減、ロバストなASRモデルの学習&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/datasets/0x3/speech-noise-dataset" target="_blank" rel="noopener"
&gt;huggingface.co/datasets/0x3/speech-noise-dataset&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;複製元: &lt;a class="link" href="https://huggingface.co/datasets/haydarkadioglu/speech-noise-dataset" target="_blank" rel="noopener"
&gt;huggingface.co/datasets/haydarkadioglu/speech-noise-dataset&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CC0-1.0&lt;/strong&gt;(パブリックドメイン)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;件数/サイズ
&lt;ul&gt;
&lt;li&gt;3,381件(5.93G)、各20秒wav&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;形式
&lt;ul&gt;
&lt;li&gt;Parquet(wav埋め込み)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="esc-50"&gt;ESC-50&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;環境音分類データセット、5秒クリップ×2,000件、50クラス(各40件)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;環境音分類モデルのベンチマーク&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/datasets/ashraq/esc50" target="_blank" rel="noopener"
&gt;huggingface.co/datasets/ashraq/esc50&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;原本: &lt;a class="link" href="https://github.com/karolpiczak/ESC-50" target="_blank" rel="noopener"
&gt;github.com/karolpiczak/ESC-50&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CC BY-NC&lt;/strong&gt;(非商用)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;件数/サイズ
&lt;ul&gt;
&lt;li&gt;2,000件(738M)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;形式
&lt;ul&gt;
&lt;li&gt;Parquet(wav埋め込み)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="話者ダイアライゼーションvad"&gt;話者ダイアライゼーション・VAD&lt;/h2&gt;
&lt;h3 id="callhome"&gt;CALLHOME&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;電話の自然会話を&lt;code&gt;diarizers-community&lt;/code&gt;が話者ダイアライゼーション用に整形、中国語・英語・ドイツ語・日本語・スペイン語(原データはTalkBank)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;話者ダイアライゼーションモデル(pyannote等)のファインチューニング&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/datasets/diarizers-community/callhome" target="_blank" rel="noopener"
&gt;huggingface.co/datasets/diarizers-community/callhome&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CC BY-NC-SA 4.0&lt;/strong&gt;(非商用)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;件数/サイズ
&lt;ul&gt;
&lt;li&gt;660件(11G)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;形式
&lt;ul&gt;
&lt;li&gt;Parquet&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="voxconverse"&gt;VoxConverse&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;英語多人数会話(YouTube由来)を&lt;code&gt;diarizers-community&lt;/code&gt;が話者ダイアライゼーション用に整形、話者ターンのタイムスタンプ・ラベル付き&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;話者ダイアライゼーションモデルの学習・評価&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/datasets/diarizers-community/voxconverse" target="_blank" rel="noopener"
&gt;huggingface.co/datasets/diarizers-community/voxconverse&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;原本: &lt;a class="link" href="https://www.robots.ox.ac.uk/~vgg/data/voxconverse/" target="_blank" rel="noopener"
&gt;Oxford VGG&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CC BY 4.0&lt;/strong&gt;(再配布版、原本のOxford VGG版は研究専用の制限が強め)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;件数/サイズ
&lt;ul&gt;
&lt;li&gt;dev 216件・test 232件(6.8G)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;形式
&lt;ul&gt;
&lt;li&gt;Parquet&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="ava-speechvad向け再パッケージ"&gt;AVA-Speech(VAD向け再パッケージ)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;映画中の発話区間検出データセットをWhisperSeg向けに再パッケージ、発話の開始/終了時刻JSON付き&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;VAD(発話区間検出)モデルの学習・評価&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/datasets/nccratliri/vad-human-ava-speech" target="_blank" rel="noopener"
&gt;huggingface.co/datasets/nccratliri/vad-human-ava-speech&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Apache-2.0&lt;/strong&gt;(再パッケージ部分)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;件数/サイズ
&lt;ul&gt;
&lt;li&gt;train 158件・test 2件(4.3G)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;形式
&lt;ul&gt;
&lt;li&gt;wav + json&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="感情非言語発声声質日本語コーパス群"&gt;感情・非言語発声・声質(日本語コーパス群)&lt;/h2&gt;
&lt;h3 id="vocal-bursts"&gt;Vocal Bursts&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;笑い・咳・泣き・くしゃみ・ため息・叫び・あくび等18カテゴリ、非発話の声のみのコーパス、複数の既存コーパスを寄せ集めて再パッケージしたもの&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;非言語発声・パラ言語情報の分類研究&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/datasets/0x3/vocal-bursts" target="_blank" rel="noopener"
&gt;huggingface.co/datasets/0x3/vocal-bursts&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CC BY 4.0&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;件数/サイズ
&lt;ul&gt;
&lt;li&gt;28,564件(3.4G)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;形式
&lt;ul&gt;
&lt;li&gt;FLAC&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="つくよみちゃんコーパス"&gt;つくよみちゃんコーパス&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;フリー素材キャラクター「つくよみちゃん」(CV: 夢前黎)公式の声優統計コーパス(JVSコーパス準拠)、高音ウィスパー系の少女ボイス、100文+別途1,500文程度の追加データ、96.0kHz/24bit&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;TTS・音声変換の学習(実際にPiper-Plusのファインチューニングにも使用、前掲)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://tyc.rei-yumesaki.net/material/corpus/" target="_blank" rel="noopener"
&gt;tyc.rei-yumesaki.net/material/corpus&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;⚠️独自ライセンス、商用・非商用・個人法人問わず利用可だが、ソフト配布時はクレジット表記必須、再配布は原則禁止(配布ページへの誘導を推奨)、素材としての二次配布や政治・宗教勧誘等への利用は禁止&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;件数/サイズ
&lt;ul&gt;
&lt;li&gt;100文(+追加約1,500文)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="rohan4600-ずんだもん読み上げ音声"&gt;ROHAN4600 ずんだもん読み上げ音声&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;ROHAN4600(後述の「テキストのみの台本コーパス」参照)のテキストをVOICEVOX「ずんだもん」ボイスで読み上げた音声+音素・アクセントラベル(PyOpenJTalk出力を人手で補正)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;日本語TTSの学習・評価、口唇同期(リップシンク)研究向けの口の動き画像・座標データも同梱される場合あり&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;音声本体: &lt;a class="link" href="https://zunko.jp/multimodal_dev/login.php" target="_blank" rel="noopener"
&gt;zunko.jp/multimodal_dev&lt;/a&gt;(研究者向けマルチモーダルデータベース、申請・ログインが必要)&lt;/li&gt;
&lt;li&gt;ラベル: &lt;a class="link" href="https://github.com/RRR-troisR/Zundamon_ROHAN_label" target="_blank" rel="noopener"
&gt;github.com/RRR-troisR/Zundamon_ROHAN_label&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;⚠️音声本体は zunko.jp の研究者向け利用規約に個別に従う。ラベルは配布者により「自由に使用・改変・改変版の再配布可、利用による不利益について責任を負わない」と明記&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;件数/サイズ
&lt;ul&gt;
&lt;li&gt;ROHAN4600の4,600文に対応する音声・ラベル&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="takamichi研究室コーパス群"&gt;Takamichi研究室コーパス群&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;東京大学・高道慎之介研究室が公開する日本語音声コーパス群(JVS/JVNV/PJS等)、コーパスごとに用途・ライセンスが異なる(下の内訳参照)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;日本語TTS・音声変換・感情音声合成の学習&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://sites.google.com/site/shinnosuketakamichi/research-topics/gap2019" target="_blank" rel="noopener"
&gt;高道研究室サイト&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;コーパスごとに異なる(下記内訳を参照)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;件数/サイズ
&lt;ul&gt;
&lt;li&gt;合計61G前後&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;形式
&lt;ul&gt;
&lt;li&gt;主にwav(16〜48kHz)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;1つのデータセットではなく、高道研(東京大学)が公開した18種類前後の別々のコーパス+外部の実験デモデータの寄せ集めなので、サブコーパスごとに分けて確認する&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JVS
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;プロ声優100名の並列/非並列/ささやき/裏声読み上げ、約30時間&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;マルチスピーカーTTS・話者変換の学習&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;タグはCC BY-SA 4.0だが⚠️音声本体は非商用研究・個人利用限定・再配布不可&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;JVNV
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;感情音声+非言語発声(笑い・すすり泣き)、4話者×6感情、3.94時間&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;感情音声合成・非言語発声を含むTTSの学習&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CC BY-SA 4.0&lt;/strong&gt;(商用含め制限なし)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;PJS
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;音素バランス型・歌唱+朗読対応コーパス、1話者×100曲+100読み上げ、MIDI/musicXML付き&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;歌声合成(Singing Voice Synthesis)の学習&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CC BY-SA 4.0&lt;/strong&gt;(商用可)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;JVS-MuSiC
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;100名の歌唱コーパス、歌手類似度/キー/テンポタグ付き&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;マルチシンガー歌声合成の学習&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;タグCC BY-SA 4.0だが⚠️音声本体は非商用・個人利用限定・再配布不可&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;CPJD
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;日本各地(岡山・宮崎・大阪・石川・福井・徳島・静岡・福島・奈良・広島・青森・高知等)の方言音声、話者フォルダ名に方言名(例: &lt;code&gt;F001_hiroshima_hiroshimaben&lt;/code&gt;)付き、ノイズ抑圧版(&lt;code&gt;wav16k_norm_cleaned&lt;/code&gt;)も同梱、F0範囲情報付き&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;方言音声認識・方言TTSの研究&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;記載なし(READMEにライセンス記述なし)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;CPJD text-only
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;上記CPJDの台本(共通文)のみのテキスト版、音声なし&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;方言横断の読み上げ台本設計の参考&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;記載なし&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;JTubeSpeech-ASV
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;YouTube由来の話者照合用コーパス、1,792話者・484時間(うち日本語245時間)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;話者照合(Speaker Verification)モデルの学習&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;⚠️「研究開発目的限定(暫定)」と明記、Takamichi群の中でも制限が強い&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;tri-jek
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;単一の女性トリリンガル話者による日本語・英語・韓国語の朗読音声、計11時間(日2.8h/韓6.7h/英1.5h)、コロナ禍収録のためやや低品質&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;多言語TTS・言語間の声質転移研究&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;テキストは言語ごとにCC BY(-SA) 4.0系だが⚠️音声は学術・非商用研究・個人利用限定・再配布不可(ブログ等での一部抜粋公開のみ許可)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Laughterscape
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;YouTube由来の大規模日本語「独話笑い」コーパス、6.04時間、24kHz、Demucsで雑音除去済みの&lt;code&gt;denoised/&lt;/code&gt;のみ収録(生データは別途問い合わせ制)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;笑い声合成・笑い声検出の研究&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CC BY-SA 4.0&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;東北地方民話コーパス
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;昔話収集家が1957年から収集したオープンリール/アナログテープ由来の東北方言民話を書き起こし付きでデジタル化、16kHz wav、2話者&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;東北方言の音声認識・音声合成、方言保存研究&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;独自ライセンスだが比較的緩く、公序良俗に反する用途・話者を誹謗中傷する用途等を除き商用・非商用問わず音声言語の情報解析に利用可&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;JECS
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;日英コードスイッチング音声コーパス、バイリンガル声優1名、通常/単語強調/感情(少量)の発話、2.5時間、24kHz&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;コードスイッチングTTS、多言語音声合成の研究&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;テキストは&lt;strong&gt;CC BY 3.0&lt;/strong&gt;、⚠️音声はアカデミック・非商用研究・個人利用(ブログ含む)限定で再配布不可&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;JSSS
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;単一女性話者(無響室収録)による8時間の音声、音声要約・発話スタイル平易化(やさしい日本語)・短文/長文発話のタスク別サブセット&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;TTSの音声要約・スタイル平易化研究&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;テキストはサブセットごとに異なる(CC BY-ND 2.1、非商用利用限定、CC BY-SA 4.0等)、⚠️音声はアカデミック・非商用研究・個人利用限定で再配布不可&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;JSSS-misc
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;JSSSと同一話者・収録環境のおまけコーパス、ささやき声・低い声・裏声・方言パラレル発話のスタイル&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;発話スタイル(パラ言語)を変えたTTSの研究&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;テキストはJVS/JMDコーパスから引用、⚠️音声はアカデミック・非商用研究・個人利用限定で再配布不可&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;JNV(Japanese Nonverbal Vocalization corpus)
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;笑い・すすり泣き・悲鳴等、感情を表す日本語の非言語発声コーパス、4話者(プロ1名含む)、420ファイル、406.9秒、48kHz&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;感情表現を伴う非言語発声の合成・認識研究&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CC BY-SA 4.0&lt;/strong&gt;(商用含め制限なし、Takamichi群の中では珍しく音声も緩いライセンス)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;JMD(熊本・大阪方言)
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;音声合成研究用の日本語方言テキスト+音声、熊本弁・大阪弁のサブセット&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;方言TTS・方言ASRの研究&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;⚠️アカデミック・非商用研究・個人利用限定で再配布不可(全データ共通)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Himawari(&lt;code&gt;Himawari_CSJ_sample&lt;/code&gt;・&lt;code&gt;Himawari_meidai&lt;/code&gt;の2種類)
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;CSJ(日本語話し言葉コーパス)サンプルと名大会話コーパスを、独自の全文検索ツール「Himawari」用のXML索引パッケージとして同梱したもの、素のwav音声集ではなく検索ツール込みの配布形式&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;話し言葉コーパスの全文検索・談話分析&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;記載なし(CSJ・名大会話コーパス本体は別途ライセンスあり、ここには含まれない可能性)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;HTSデモデータ
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;高道研のコーパスではなく、名古屋工業大学HTS Working Groupが配布するHMM音声合成デモ用データ(ATR503文、単一男性話者、mgc/bap/lf0等のボコーダ特徴量)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;HTS/HMM方式の音声合成チュートリアル・デモ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CC BY 3.0&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;出所不明の小規模コーパス(&amp;ldquo;EMOTION100&amp;rdquo;)
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;&amp;ldquo;EMOTION100&amp;quot;と命名された90文の日本語音声(話者コード&lt;code&gt;fm44&lt;/code&gt;)、感情ラベルなし、READMEなし&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;用途不明(感情音声のサンプルと推測)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;⚠️記載なし・出所も未特定(他コーパスよりだいぶ後の日付でダウンロードされており、高道研サイト由来か別ソースか未確認)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="テキストのみの台本コーパス"&gt;テキストのみの台本コーパス&lt;/h2&gt;
&lt;p&gt;音声を含まず、朗読・録音用の台本(文章リスト)だけを配布しているコーパス。上記の音声コーパス群とは違い、それ自体を読み上げて誰かが別途録音する前提のもの&lt;/p&gt;
&lt;h3 id="itaコーパス"&gt;ITAコーパス&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;音素バランスを考慮したパブリックドメインの日本語テキストコーパス、Emotion(100文)とRecitation(324文)のサブセットで構成、音声は含まれずテキストのみ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;TTS/ASR研究用の朗読・録音台本、音素バランス評価のベンチマーク(実際に自前のTTS学習データ生成にも使用)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/mmorise/ita-corpus" target="_blank" rel="noopener"
&gt;github.com/mmorise/ita-corpus&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;パブリックドメイン(Unlicense)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;件数/サイズ
&lt;ul&gt;
&lt;li&gt;424文(テキストのみ)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;形式
&lt;ul&gt;
&lt;li&gt;txt&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="rohanrohan4600"&gt;ROHAN(ROHAN4600)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;モーラバランス型の日本語テキストコーパス、常用漢字と読みを全て含み低頻度モーラもカバーする4,600文、22のサブセットで構成、音声は含まれずテキストのみ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;TTS研究用の朗読・録音台本、モーラバランス評価(実際に自前のTTS学習データ生成にも使用)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/mmorise/rohan4600" target="_blank" rel="noopener"
&gt;github.com/mmorise/rohan4600&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CC0-1.0&lt;/strong&gt;(パブリックドメイン)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;件数/サイズ
&lt;ul&gt;
&lt;li&gt;4,600文(テキストのみ)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;形式
&lt;ul&gt;
&lt;li&gt;txt&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;備考
&lt;ul&gt;
&lt;li&gt;森勢将雅氏(明治大学)の研究成果、高道研コーパス群とは別の配布元(ローカルで同じフォルダに保存していたため混同していた)。VOICEVOX「ずんだもん」で読み上げた音声版は前掲の「感情・非言語発声・声質」を参照&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ターン検出対話制御"&gt;ターン検出・対話制御&lt;/h2&gt;
&lt;h3 id="smart-turn-v32test"&gt;Smart Turn v3.2(test)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;ターン検出モデル「Smart Turn v3.2」のテストセット、発話終端/フィラー等のラベル付き短い会話音声、23言語、CC0のFreesoundノイズも一部含む&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;音声対話のターン検出(発話終端検出)モデルの評価&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/datasets/pipecat-ai/smart-turn-data-v3.2-test" target="_blank" rel="noopener"
&gt;huggingface.co/datasets/pipecat-ai/smart-turn-data-v3.2-test&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;明記なし(関連コードはBSD-2-Clause)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;件数/サイズ
&lt;ul&gt;
&lt;li&gt;31,527件(4.6G)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;形式
&lt;ul&gt;
&lt;li&gt;Parquet&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="smart-turn-v32train"&gt;Smart Turn v3.2(train)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;同モデルの学習セット&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;同上のモデルの学習&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/datasets/pipecat-ai/smart-turn-data-v3.2-train" target="_blank" rel="noopener"
&gt;huggingface.co/datasets/pipecat-ai/smart-turn-data-v3.2-train&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;明記なし(関連コードはBSD-2-Clause)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;件数/サイズ
&lt;ul&gt;
&lt;li&gt;270,946件(39G)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;形式
&lt;ul&gt;
&lt;li&gt;Parquet&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="easy-turn-trainset"&gt;Easy-Turn-Trainset&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;発話交替検出用の大規模データセット、完全/不完全/バックチャネル/待機の4状態、テキスト転記+発話交替状態ラベル付き、合計約1,100時間&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;全二重音声対話システムにおける堅牢な発話交替(ターン)検出モデルの学習&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/datasets/0x3/Easy-Turn-Trainset" target="_blank" rel="noopener"
&gt;huggingface.co/datasets/0x3/Easy-Turn-Trainset&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;複製元: &lt;a class="link" href="https://huggingface.co/datasets/ASLP-lab/Easy-Turn-Trainset" target="_blank" rel="noopener"
&gt;huggingface.co/datasets/ASLP-lab/Easy-Turn-Trainset&lt;/a&gt;(Northwestern Polytechnical University・Huawei)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Apache-2.0&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;件数/サイズ
&lt;ul&gt;
&lt;li&gt;約1,906行(97.3G)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;形式
&lt;ul&gt;
&lt;li&gt;webdataset(Parquetに変換済み)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="音声合成ttsエンジンツール"&gt;音声合成(TTS)エンジン(ツール)&lt;/h2&gt;
&lt;p&gt;ここまではデータセットだったが、ここからは自前で音声を生成したり、VAD・ASR・感情分析に使ったツール・学習済みモデルもまとめておく&lt;/p&gt;
&lt;h3 id="style-bert-vits2"&gt;Style-Bert-VITS2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;Bert-VITS2をベースにした日本語向け高品質音声合成エンジン、話者ごとにスタイル(感情等)を制御可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;日本語TTS、感情表現付き音声合成、単語リスト・全二重対話音声などの自前データ生成&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/litagin02/Style-Bert-VITS2" target="_blank" rel="noopener"
&gt;github.com/litagin02/Style-Bert-VITS2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AGPL-3.0 / LGPL-3.0&lt;/strong&gt;(コード。利用する話者ボイスモデルは別途各ボイスのライセンスに従う、例: JVNVボイス利用時はCC BY-SA 4.0)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;備考
&lt;ul&gt;
&lt;li&gt;文脈埋め込みに日本語BERT(&lt;a class="link" href="https://huggingface.co/ku-nlp/deberta-v2-large-japanese-char-wwm" target="_blank" rel="noopener"
&gt;ku-nlp/deberta-v2-large-japanese-char-wwm&lt;/a&gt;、&lt;strong&gt;CC BY-SA 4.0&lt;/strong&gt;)を使用し、疑問文/断定など文脈由来の韻律をピッチ・duration予測に反映している&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="qwen3-tts"&gt;Qwen3-TTS&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;Qwenチームによる多言語TTSモデル、3秒の音声サンプルで声質クローンやスタイル指示による制御に対応&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;音声合成、話者クローン、感情・話速をコントロールした音声生成&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/Qwen/Qwen3-TTS-12Hz-1.7B-Base" target="_blank" rel="noopener"
&gt;huggingface.co/Qwen/Qwen3-TTS-12Hz-1.7B-Base&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Apache-2.0&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;備考
&lt;ul&gt;
&lt;li&gt;日本語を含む10言語対応、0.6B/1.7Bの2サイズ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="irodori-tts-server"&gt;Irodori-TTS-Server&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;OpenAI TTS API互換の推論サーバ、&lt;code&gt;Irodori-TTS-500M-v3&lt;/code&gt;モデルをラップしたもの&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;日本語ASRの弱点(パ行・促音・濁音等)を狙った音声合成データの生成&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/Aratako/Irodori-TTS-Server" target="_blank" rel="noopener"
&gt;github.com/Aratako/Irodori-TTS-Server&lt;/a&gt;(モデル: &lt;a class="link" href="https://huggingface.co/Aratako/Irodori-TTS-500M-v3" target="_blank" rel="noopener"
&gt;huggingface.co/Aratako/Irodori-TTS-500M-v3&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MIT&lt;/strong&gt;(サーバ部分)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;備考
&lt;ul&gt;
&lt;li&gt;音声コーデック(波形の潜在表現への圧縮・復元)には&lt;code&gt;facebook/dacvae-watermarked&lt;/code&gt;を日本語音声でファインチューニングした&lt;a class="link" href="https://huggingface.co/Aratako/Semantic-DACVAE-Japanese-32dim" target="_blank" rel="noopener"
&gt;Aratako/Semantic-DACVAE-Japanese-32dim&lt;/a&gt;(WavLMによる意味蒸留を導入、潜在次元128→32に圧縮)を使用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="piper-plus"&gt;Piper-Plus&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;軽量・ローカル動作のニューラルTTS「Piper」の後継フォーク、VITS+韻律制御、ストリーミング対応&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;軽量・高速な音声合成(CPU・組み込み用途にも対応)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/ayutaz/piper-plus" target="_blank" rel="noopener"
&gt;github.com/ayutaz/piper-plus&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MIT&lt;/strong&gt;(オリジナルの&lt;code&gt;rhasspy/piper&lt;/code&gt;はアーカイブ済み、後継の&lt;code&gt;OHF-Voice/piper1-gpl&lt;/code&gt;はGPL-3.0化されたため、MIT系フォークとして利用)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;備考
&lt;ul&gt;
&lt;li&gt;日本語含む6言語対応(JA/EN/ZH/ES/FR/PT)、espeak-ng不要&lt;/li&gt;
&lt;li&gt;つくよみちゃんコーパスでファインチューニングした配布済みモデルも利用: &lt;a class="link" href="https://huggingface.co/ayousanz/piper-plus-tsukuyomi-chan" target="_blank" rel="noopener"
&gt;huggingface.co/ayousanz/piper-plus-tsukuyomi-chan&lt;/a&gt;(MB-iSTFT+PQMFデコーダ、6言語、ベースは571話者で学習した&lt;a class="link" href="https://huggingface.co/ayousanz/piper-plus-base" target="_blank" rel="noopener"
&gt;piper-plus-base&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="kokoro"&gt;Kokoro&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;8,200万パラメータの軽量TTSモデル&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;軽量・高速な音声合成&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/hexgrad/Kokoro-82M" target="_blank" rel="noopener"
&gt;huggingface.co/hexgrad/Kokoro-82M&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Apache-2.0&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;備考
&lt;ul&gt;
&lt;li&gt;⚠️推論コード・学習済み重みは公開されているが、自前でモデルを学習するための学習コードは公開されていない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="voicevox"&gt;VOICEVOX&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;無料のテキスト読み上げ・歌声合成ソフトウェア、43話者127スタイル(2026年時点)のキャラクターボイスを収録&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;日本語TTS、学習用の正例・hard negativeサンプルの大量合成(例: 「ヘイレオ」等の呼びかけフレーズ+紛らわしい語を全話者×全スタイルで合成)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://voicevox.hiroshiba.jp/" target="_blank" rel="noopener"
&gt;voicevox.hiroshiba.jp&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;エンジン本体は&lt;strong&gt;LGPL-3.0&lt;/strong&gt;。生成音声はクレジット表記により商用・非商用問わず利用可だが、⚠️キャラクターごとに個別の利用規約があるため使用前に要確認&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;備考
&lt;ul&gt;
&lt;li&gt;Linux版はCPU/NVIDIA GPU版のランタイムが配布されている&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="kvoicewalk"&gt;KVoiceWalk&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;ランダムウォークとResemblyzer類似度等を組み合わせたスコアリングで、Kokoroのスタイルベクトル(声質)を目標音声に近づけて探索するツール&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;Kokoroの学習コードが非公開のため、既存スタイルベクトルの合成・探索によって新しい声を作る代替手段&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/RobViren/kvoicewalk" target="_blank" rel="noopener"
&gt;github.com/RobViren/kvoicewalk&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Apache-2.0&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;備考
&lt;ul&gt;
&lt;li&gt;探索文への過学習(未知テキストで類似度が大幅低下)や、英語声が混ざると韻律が汚染される等の限界を実際に確認済み&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="kokovoicelab"&gt;kokovoicelab&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;Kokoroの既存話者を補間・ブレンドして新しい声を作り、SQLiteデータベースで管理するツール(KVoiceWalkと同じ作者)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;Kokoroの声を混ぜ合わせた新規ボイスの生成、生成した声のDB管理&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/RobViren/kokovoicelab" target="_blank" rel="noopener"
&gt;github.com/RobViren/kokovoicelab&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;記載なし(リポジトリにLICENSEファイルなし)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="qwen-audio-30-tts-flash参考"&gt;Qwen-Audio-3.0-TTS-Flash(参考)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;Alibaba Tongyi Labが2026年7月にリリースしたホスト専用TTS API、Flash/Plusの2ティア構成&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;低レイテンシ(初回パケット200ms以内)なリアルタイム音声対話用TTSの参考(重み非公開のためローカル・組み込み用途には使えない)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://openrouter.ai/qwen/qwen-audio-3.0-tts-flash" target="_blank" rel="noopener"
&gt;qwen-audio-3.0-tts-flash(OpenRouter)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;⚠️非OSS(ホスト専用API、DashScope経由でのみ利用可能)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;備考
&lt;ul&gt;
&lt;li&gt;16言語対応、$15/100万文字&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="styletts2"&gt;StyleTTS2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;スタイル拡散とAdversarial Trainingを組み合わせたTTSアーキテクチャ、Kokoroのベースにもなっている&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;高品質TTSのアーキテクチャ調査・比較検討(自前運用はせず比較対象として利用)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/yl4579/StyleTTS2" target="_blank" rel="noopener"
&gt;github.com/yl4579/StyleTTS2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MIT&lt;/strong&gt;(コード)、ただし推論はGPLライセンスのパッケージに依存する箇所があり、学習済みモデル利用時は追加の倫理条項(合成音声である旨の告知、話者の許諾なき音声クローン利用の禁止等)に同意が必要&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;備考
&lt;ul&gt;
&lt;li&gt;検証の結果、Kokoroの日本語モデル(jf_alpha)はStyleTTS2ベースでも音素CERでSBV2(VITS2系)に劣っており、「アーキテクチャよりデータと言語別フロントエンドが効く」という結論の根拠になった&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="vadターン検出ツール"&gt;VAD・ターン検出(ツール)&lt;/h2&gt;
&lt;h3 id="silero-vad"&gt;Silero VAD&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;事前学習済みの軽量VADモデル、30ms以上の音声チャンクを1ms未満で判定&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;発話区間検出、無音除去、ASR前処理&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/snakers4/silero-vad" target="_blank" rel="noopener"
&gt;github.com/snakers4/silero-vad&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MIT&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="smart-turn-v2"&gt;Smart Turn v2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;生の音声波形から「発話が終わったか」を判定するターン検出モデル、wav2vec2エンコーダ+線形分類ヘッド構成&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;音声対話エージェントのターン検出、リアルタイム文字起こし&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/pipecat-ai/smart-turn-v2" target="_blank" rel="noopener"
&gt;huggingface.co/pipecat-ai/smart-turn-v2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;BSD-2-Clause&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;備考
&lt;ul&gt;
&lt;li&gt;14言語対応(日本語含む)、94.8Mパラメータ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="smart-turn-v3"&gt;Smart Turn v3&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;Smart Turnの後継版、Whisper Tinyをベースにした軽量ターン検出モデル&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;CPUのみでのリアルタイムターン検出(GPU不要)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/pipecat-ai/smart-turn-v3" target="_blank" rel="noopener"
&gt;huggingface.co/pipecat-ai/smart-turn-v3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;BSD-2-Clause&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;備考
&lt;ul&gt;
&lt;li&gt;23言語対応、約8Mパラメータ、int8量子化版・fp32版あり、CPU推論12ms(最新CPU)。前掲の&lt;code&gt;smart-turn-data-v3.2-test/train&lt;/code&gt;はさらに後継のv3.2系列の学習データ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="ultravad"&gt;UltraVAD&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;Llama-8Bベースの音声・対話履歴融合型エンドポイント検出モデル、発話終了トークンの確率を推定&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;文脈を考慮したターン検出(Smart Turn v2より高精度)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/fixie-ai/ultraVAD" target="_blank" rel="noopener"
&gt;huggingface.co/fixie-ai/ultraVAD&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;記載なし&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;備考
&lt;ul&gt;
&lt;li&gt;26言語対応(日本語含む)、文脈依存ターン交代タスクで精度77.5%(Smart Turn v2は63.0%)、推論にVRAM約10GBを使用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="maai京都大学"&gt;MaAI(京都大学)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;会話AI・ロボット向けの軽量リアルタイム非言語行動予測ソフトウェア、VAD・ターンテイキング・バックチャネル・頷きを予測、Voice Activity Projection(VAP)モデルがベース&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;対話システムのターンテイキング予測・相槌タイミング推定&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/MaAI-Kyoto/MaAI" target="_blank" rel="noopener"
&gt;github.com/MaAI-Kyoto/MaAI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;コードは&lt;strong&gt;MIT&lt;/strong&gt;、学習済みモデルは個別ライセンス(Mimiエンコーダは&lt;strong&gt;CC BY 4.0&lt;/strong&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;備考
&lt;ul&gt;
&lt;li&gt;京都大学・井上昂治氏らが開発、日本語含む複数言語対応、CPUでも動作&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="sparrow-1tavus参考"&gt;Sparrow-1(Tavus、参考)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;リアルタイム音声・映像対話における会話タイミング制御モデル、「いつ聞き・待ち・話すか」を予測&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;人間らしい会話タイミングを持つ音声対話エージェントの参考(自前では未使用、比較調査のみ)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.tavus.io/blog/sparrow-1-human-level-conversational-timing-in-real-time-voice" target="_blank" rel="noopener"
&gt;tavus.io/blog/sparrow-1&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;⚠️非OSS(Tavus独自、APIを通じてのみ利用可能)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="easy-turn"&gt;Easy-Turn&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;発話交替検出モデル本体、「対話終了」「不完全な発話」「バックチャネル」「待機要求」の4状態を音声+言語情報から予測(前掲のEasy-Turn-Trainsetで学習)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;フルデュプレックス音声対話システムでの「話す/聞く/沈黙する」タイミング判定&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/0x3/Easy-Turn" target="_blank" rel="noopener"
&gt;huggingface.co/0x3/Easy-Turn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;複製元: &lt;a class="link" href="https://huggingface.co/ASLP-lab/Easy-Turn" target="_blank" rel="noopener"
&gt;huggingface.co/ASLP-lab/Easy-Turn&lt;/a&gt;(Northwestern Polytechnical University)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Apache-2.0&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;備考
&lt;ul&gt;
&lt;li&gt;モデルサイズ約850MB&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ウェイクワード検出ツール"&gt;ウェイクワード検出(ツール)&lt;/h2&gt;
&lt;h3 id="openwakeword"&gt;openWakeWord&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;音声埋め込みモデル+軽量な検知ヘッドで構成されるオープンソースのウェイクワード(呼びかけ語)検出フレームワーク&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;「ヘイ〇〇」のような呼びかけ語の検出、独自ウェイクワードの学習(埋め込みの上に自前ヘッドを追加して学習可能)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/dscripka/openWakeWord" target="_blank" rel="noopener"
&gt;github.com/dscripka/openWakeWord&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;コードは&lt;strong&gt;Apache-2.0&lt;/strong&gt;だが、同梱の学習済みモデルは⚠️&lt;strong&gt;CC BY-NC-SA 4.0&lt;/strong&gt;(非商用、ライセンス不明なデータセットを学習に含むため)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;備考
&lt;ul&gt;
&lt;li&gt;実プロジェクトでは埋め込み抽出器のみ利用し、その上に独自の小型MLPヘッドをBCE損失で学習する構成で使用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="livekit-wakeword"&gt;LiveKit WakeWord&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;LiveKitによるオープンソースのウェイクワード検出ライブラリ、音声対話アプリケーション向け&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;リアルタイム音声対話エージェントでの呼びかけ語検出(openWakeWordの比較対象として調査)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/livekit/livekit-wakeword" target="_blank" rel="noopener"
&gt;github.com/livekit/livekit-wakeword&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Apache-2.0&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="asr音声認識ツール"&gt;ASR(音声認識ツール)&lt;/h2&gt;
&lt;h3 id="faster-whisper"&gt;faster-whisper&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;OpenAI WhisperをCTranslate2で高速再実装したASR実装、精度を保ちつつ最大4倍高速化&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;音声認識の高速推論(ローカル・バッチ処理)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/SYSTRAN/faster-whisper" target="_blank" rel="noopener"
&gt;github.com/SYSTRAN/faster-whisper&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MIT&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="kotoba-whisper"&gt;Kotoba-Whisper&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;ReazonSpeechで学習した日本語ASR向けの蒸留Whisperモデル、large-v3と同等の精度を保ちつつ6.3倍高速&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;高速な日本語ASR推論&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/kotoba-tech/kotoba-whisper-v2.0" target="_blank" rel="noopener"
&gt;huggingface.co/kotoba-tech/kotoba-whisper-v2.0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Apache-2.0&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;備考
&lt;ul&gt;
&lt;li&gt;v1.0はReazonSpeechのlargeサブセット、v2.0は全サブセットで学習、v2.2は後処理パイプライン統合版&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="sensevoice"&gt;SenseVoice&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;ASR・言語識別(LID)・音声感情認識(SER)・音響イベント検出(AED)を1モデルでこなす音声基盤モデル、中国語(標準語・広東語)・英語・日本語・韓国語に対応&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;多言語ASRに加え、感情認識・音響イベント検出を同時に行いたい用途&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/FunAudioLLM/SenseVoiceSmall" target="_blank" rel="noopener"
&gt;huggingface.co/FunAudioLLM/SenseVoiceSmall&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;⚠️独自ライセンス(&lt;a class="link" href="https://github.com/modelscope/FunASR/blob/main/MODEL_LICENSE" target="_blank" rel="noopener"
&gt;FunASR Model License Agreement&lt;/a&gt;、Alibaba独自の利用規約、標準的なOSSライセンスではない)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="whisper-large-v3--large--large-v3-turbo"&gt;Whisper large-v3 / large / large-v3-turbo&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;OpenAIの多言語音声認識モデル、turboは軽量化されたデコーダ構成で高速化された派生版&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;汎用ASR、ReazonSpeechの再書き起こし(前掲の&lt;code&gt;whisper_transcriptions.reazonspeech.small.wer_10.0&lt;/code&gt;参照)等&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/openai/whisper-large-v3" target="_blank" rel="noopener"
&gt;huggingface.co/openai/whisper-large-v3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;turbo版: &lt;a class="link" href="https://huggingface.co/openai/whisper-large-v3-turbo" target="_blank" rel="noopener"
&gt;huggingface.co/openai/whisper-large-v3-turbo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;large-v3は&lt;strong&gt;Apache-2.0&lt;/strong&gt;、turboは&lt;strong&gt;MIT&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="parakeet-06b-janvidia-nemo"&gt;Parakeet 0.6B ja(NVIDIA NeMo)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;ReazonSpeech v2.0(3.5万時間超)で学習した日本語ASRモデル、Hybrid FastConformer TDT-CTC構成&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;高速・高精度な日本語ASR&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/nvidia/parakeet-tdt_ctc-0.6b-ja" target="_blank" rel="noopener"
&gt;huggingface.co/nvidia/parakeet-tdt_ctc-0.6b-ja&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CC BY 4.0&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;備考
&lt;ul&gt;
&lt;li&gt;NVIDIA NeMoフレームワーク上で推論・ファインチューニング&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="reazonspeech-nemo-v2"&gt;ReazonSpeech-NeMo-v2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;ReazonSpeech開発元自身が公開するNeMoベースの日本語ASRモデル(NVIDIA製Parakeetとは別に、Reazon自身が学習・配布)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;日本語ASR(自社データで学習した公式モデル)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/reazon-research/reazonspeech-nemo-v2" target="_blank" rel="noopener"
&gt;huggingface.co/reazon-research/reazonspeech-nemo-v2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Apache-2.0&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="qwen3-asr"&gt;Qwen3-ASR&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;Qwen3-Omniをベースにした多言語ASRモデル、言語識別+音声認識に対応&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;多言語ASR(52言語・方言)、雑音下での頑健な認識&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/Qwen/Qwen3-ASR-1.7B" target="_blank" rel="noopener"
&gt;huggingface.co/Qwen/Qwen3-ASR-1.7B&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Apache-2.0&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;備考
&lt;ul&gt;
&lt;li&gt;0.6B/1.7Bの2サイズ、タイムスタンプ推定用の&lt;code&gt;Qwen3-ForcedAligner&lt;/code&gt;も同系統で提供&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="kaldi"&gt;Kaldi&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;音声認識研究で長年使われてきた伝統的なASRツールキット(GMM-HMM〜DNN-HMM)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;音声認識モデルの学習・研究、MFA(後述)のバックエンドとしても利用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/kaldi-asr/kaldi" target="_blank" rel="noopener"
&gt;github.com/kaldi-asr/kaldi&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Apache-2.0&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="sherpasherpa-onnx"&gt;Sherpa(sherpa-onnx)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;k2-fsaによる「次世代Kaldi」ベースの音声処理フレームワーク、ASR・TTS・話者ダイアライゼーション・音声強調・VAD等をonnxruntimeでオフライン実行&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;組み込み・オフライン環境での音声認識・音声合成・VAD等&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/k2-fsa/sherpa-onnx" target="_blank" rel="noopener"
&gt;github.com/k2-fsa/sherpa-onnx&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Apache-2.0&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="julius"&gt;Julius&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;京都大学・奈良先端科学技術大学院大学・名古屋工業大学が開発した日本語大語彙連続音声認識エンジン&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;日本語ASR&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/julius-speech/julius" target="_blank" rel="noopener"
&gt;github.com/julius-speech/julius&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;独自ライセンス(BSD系、改変版を含め商用利用可)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="espnet"&gt;ESPnet&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;PyTorchベースのEnd-to-End音声処理ツールキット、ASR・TTS・話者ダイアライゼーション・音声翻訳等に対応&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;End-to-Endな音声認識・音声合成モデルの学習・研究&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/espnet/espnet" target="_blank" rel="noopener"
&gt;github.com/espnet/espnet&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Apache-2.0&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="vosk"&gt;VOSK&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;Kaldiベースのオフライン音声認識ツールキット、モデルサイズが小さく(約50MB〜)、20以上の言語・方言に対応&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;オフライン・省リソース環境でのASR、ストリーミング認識、話者識別&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/alphacep/vosk-api" target="_blank" rel="noopener"
&gt;github.com/alphacep/vosk-api&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Apache-2.0&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;備考
&lt;ul&gt;
&lt;li&gt;Python/Java/Node.js/C#/C++/Rust/Go等多言語バインディング対応、日本語モデルも配布されている&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="日本語hubertrinnajapanese-hubert-base"&gt;日本語HuBERT(rinna/japanese-hubert-base)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;自己教師あり学習による日本語音声表現モデル(CTCヘッド等の下流タスク層は無し、音声の生の隠れ層を出力)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;ASRの出力に頼らず、音声の隠れ層を直接使う音韻・音響特徴の分析(例: 線形プローブでの音韻構造の分類)、下流タスクのファインチューニングのベースモデル&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/rinna/japanese-hubert-base" target="_blank" rel="noopener"
&gt;huggingface.co/rinna/japanese-hubert-base&lt;/a&gt;(公開ミラー: &lt;a class="link" href="https://huggingface.co/yky-h/japanese-hubert-base" target="_blank" rel="noopener"
&gt;huggingface.co/yky-h/japanese-hubert-base&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Apache-2.0&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;備考
&lt;ul&gt;
&lt;li&gt;実プロジェクトでは、CTCデコード後のテキストに頼るASRよりも生の隠れ層(特に中間層)の方が音韻構造を線形分離可能な形で保持しているという知見が得られた&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="forced-alignmentツール"&gt;Forced Alignment(ツール)&lt;/h2&gt;
&lt;h3 id="montreal-forced-alignermfa"&gt;Montreal Forced Aligner(MFA)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;音声と書き起こしテキストから音素単位のタイムスタンプを推定するForced Alignmentツール、日本語音響モデル+G2Pモデル(&lt;code&gt;japanese_mfa&lt;/code&gt;)を使用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;音素レベルのアラインメント生成(例: 「レオ」を子音ɾ・母音e・母音oに分解)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/MontrealCorpusTools/Montreal-Forced-Aligner" target="_blank" rel="noopener"
&gt;github.com/MontrealCorpusTools/Montreal-Forced-Aligner&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MIT&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;備考
&lt;ul&gt;
&lt;li&gt;バージョン3.4.1で使用、内部エンジンはKaldiベース&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="感情分析ツール"&gt;感情分析(ツール)&lt;/h2&gt;
&lt;h3 id="lukestudio-ousialuke-japanese-large-lite"&gt;LUKE(studio-ousia/luke-japanese-large-lite)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;RoBERTa系のTransformerをベースに、単語だけでなくWikipediaのエンティティ(固有名詞などが指す実体)も同時に埋め込む、エンティティ認識型のSelf-Attentionを持つテキストエンコーダ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;固有表現認識(NER)、関係分類、エンティティが絡む質問応答など、ベースモデルとしての利用。下記のluke-japanese-large-sentiment-analysis-wrimeのように、感情分析等へファインチューニングして使うことも多い&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/studio-ousia/luke-japanese-large-lite" target="_blank" rel="noopener"
&gt;huggingface.co/studio-ousia/luke-japanese-large-lite&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Apache-2.0&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;備考
&lt;ul&gt;
&lt;li&gt;音声ではなくテキスト入力。原論文はYamada et al., 2020(Studio Ousia)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="luke-japanese-large-sentiment-analysis-wrime"&gt;luke-japanese-large-sentiment-analysis-wrime&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;日本語テキストの8感情(喜び・悲しみ・期待・驚き・怒り・恐れ・嫌悪・信頼)を推定するテキスト分類モデル&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;ASRの書き起こしテキストに対する感情分析、対話ログの感情ラベリング&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/Mizuiro-sakura/luke-japanese-large-sentiment-analysis-wrime" target="_blank" rel="noopener"
&gt;huggingface.co/Mizuiro-sakura/luke-japanese-large-sentiment-analysis-wrime&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MIT&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;備考
&lt;ul&gt;
&lt;li&gt;ベースモデルは&lt;code&gt;studio-ousia/Luke-japanese-large-lite&lt;/code&gt;、WRIMEデータセットでファインチューニング、音声ではなくテキスト入力&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="modernbert"&gt;ModernBERT&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;Answer.AI・LightOnが2024年に公開した、BERTを現代的なアーキテクチャ(RoPE、GeGLU、Flash Attention、8192トークンまでの長いコンテキスト長など)で作り直したテキストエンコーダ。base(149M)・large(395M)の2サイズ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;音声そのものは扱わないが、ASRの書き起こしテキストへの後処理(句読点復元、感情分析等のファインチューニングのベースモデル)に使える汎用テキストエンコーダ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/answerdotai/ModernBERT-base" target="_blank" rel="noopener"
&gt;huggingface.co/answerdotai/ModernBERT-base&lt;/a&gt; / &lt;a class="link" href="https://huggingface.co/answerdotai/ModernBERT-large" target="_blank" rel="noopener"
&gt;ModernBERT-large&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Apache-2.0&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;備考
&lt;ul&gt;
&lt;li&gt;学習データは主に英語・コードのため、日本語タスクへは追加の日本語ファインチューニングが必要。音声ではなくテキスト入力&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="音声透かしツール"&gt;音声透かし(ツール)&lt;/h2&gt;
&lt;h3 id="silentcipher"&gt;SilentCipher&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;音声信号にメッセージを埋め込む音声透かし(オーディオウォーターマーキング)モデル、心理音響モデルに基づく閾値制御で人間に知覚されにくい透かしを実現&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;生成音声への出所情報の埋め込み、音声の改ざん検知&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/Sony/SilentCipher" target="_blank" rel="noopener"
&gt;huggingface.co/Sony/SilentCipher&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MIT&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;備考
&lt;ul&gt;
&lt;li&gt;16kHz/44.1kHzの音声に対応&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="音声データをネットから調達する方法サイトツール"&gt;音声データをネットから調達する方法(サイト・ツール)&lt;/h2&gt;
&lt;p&gt;配布済みのデータセットだけでなく、特定の単語・フレーズの発話サンプルが少量だけ欲しい場合は、動画・音声検索サイトから自分で音声を切り出して集める方法もある。実際に特定の単語の発話サンプルを集めるために使った方法をまとめる&lt;/p&gt;
&lt;h3 id="単語フレーズ検索サイト"&gt;単語・フレーズ検索サイト&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;YouTubeやアニメ・映画の字幕/文字起こしから、特定の単語やフレーズが登場する場面を検索して再生できるサイト群&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;対象サイト
&lt;ul&gt;
&lt;li&gt;YouGlish(&lt;a class="link" href="https://youglish.com/japanese" target="_blank" rel="noopener"
&gt;youglish.com/japanese&lt;/a&gt;): YouTube動画の字幕から検索語が出る場面を探し、該当箇所から再生できる、自然な会話中の発話を連続で聞くのに向く&lt;/li&gt;
&lt;li&gt;Filmot(&lt;a class="link" href="https://filmot.com/" target="_blank" rel="noopener"
&gt;filmot.com&lt;/a&gt;): YouTubeの字幕・文字起こしを横断検索できる、特定の単語を含む動画を一覧で探すのに向く&lt;/li&gt;
&lt;li&gt;Nadeshiko(&lt;a class="link" href="https://nadeshiko.co/" target="_blank" rel="noopener"
&gt;nadeshiko.co&lt;/a&gt;): アニメやドラマなどの日本語セリフを音声・画像付きで検索できる&lt;/li&gt;
&lt;li&gt;Immersion Kit(&lt;a class="link" href="https://www.immersionkit.com/" target="_blank" rel="noopener"
&gt;immersionkit.com&lt;/a&gt;): アニメの日本語例文を音声・画像付きで検索できる&lt;/li&gt;
&lt;li&gt;Japanese Sentence Search(&lt;a class="link" href="https://sentencesearch.neocities.org/" target="_blank" rel="noopener"
&gt;sentencesearch.neocities.org&lt;/a&gt;): ネイティブ音声付きの日本語例文を検索できる&lt;/li&gt;
&lt;li&gt;Forvo(&lt;a class="link" href="https://ja.forvo.com/languages/ja/" target="_blank" rel="noopener"
&gt;ja.forvo.com/languages/ja&lt;/a&gt;): ネイティブ話者による単語・短文の発音辞書&lt;/li&gt;
&lt;li&gt;PlayPhrase.me(&lt;a class="link" href="https://www.playphrase.me/" target="_blank" rel="noopener"
&gt;playphrase.me&lt;/a&gt;): 映画・ドラマのセリフを短い映像クリップで検索できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;⚠️各サイトの利用規約に従う、著作物由来の音声のため個人の学習・研究目的を超える利用(再配布・商用データセット化等)は要確認&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="データセットの索引サイト"&gt;データセットの索引サイト&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;配布済みの音声・言語データセットをまとめて探せる索引サイト&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;対象サイト
&lt;ul&gt;
&lt;li&gt;OpenSLR(&lt;a class="link" href="https://www.openslr.org/resources.php" target="_blank" rel="noopener"
&gt;openslr.org/resources.php&lt;/a&gt;): 音声認識・音声合成向けの公開データセットを番号付きリソースとして一覧できる索引サイト(前掲のMUSAN等もここで配布されている)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="yt-dlp"&gt;yt-dlp&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内容
&lt;ul&gt;
&lt;li&gt;YouTube等の動画・音声・字幕をダウンロードするコマンドラインツール&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;想定用途
&lt;ul&gt;
&lt;li&gt;上記サイトで見つけた動画の音声・字幕の取得、自動字幕からのキーワード検索によるデータ収集パイプラインの構築&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;入手元
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/yt-dlp/yt-dlp" target="_blank" rel="noopener"
&gt;github.com/yt-dlp/yt-dlp&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ライセンス
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;パブリックドメイン(Unlicense)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;備考
&lt;ul&gt;
&lt;li&gt;実際のパイプラインでは、自動字幕(vttのみ先にチェック)→ヒットした動画のみ音声DL→前掲のfaster-whisper(large-v3)で単語タイムスタンプを特定して切り出し→再文字起こしで検証、という流れで使用した&lt;/li&gt;
&lt;li&gt;大量アクセスでbot検知に引っかかる場合は、無料プロキシリスト(&lt;a class="link" href="https://github.com/iplocate/free-proxy-list" target="_blank" rel="noopener"
&gt;iplocate/free-proxy-list&lt;/a&gt;等)から動作確認済みのものを経由することを検討するとよい&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;TalkBank系(CALLFRIEND・CALLHOME・SAKURA)は、HF上のライセンスタグが無い、または緩く見えても、TalkBank本体は独自の&lt;a class="link" href="https://talkbank.org/rules.html" target="_blank" rel="noopener"
&gt;Ground Rules&lt;/a&gt;(研究利用・倫理規定への同意必須、再配布制限)に従う必要がある&lt;/li&gt;
&lt;li&gt;ReazonSpeech系は「日本国著作権法第30条の4の目的に限り使用可」という日本法特有の制限が明記されており、単純なCC-BY-SAと誤解しないこと&lt;/li&gt;
&lt;li&gt;MagicHubの日本語自然会話・Global Conversational Speechは商用データセットで、再配布・商用利用不可、または利用前に別途契約が必要&lt;/li&gt;
&lt;li&gt;非商用限定のものとして、CALLHOME(CC-BY-NC-SA)・ESC-50(CC-BY-NC)・JVS/JVS-MuSiC(音声は非商用研究限定)・TAU Urban Acoustic Scenes 2022(非商用研究目的限定)・WHAM!(CC BY-NC 4.0)・SeniorTalk(CC BY-NC-SA 4.0)がある&lt;/li&gt;
&lt;li&gt;Genshin-Voice-Jaのようにゲーム等の著作物由来のキャラクターボイスは、配布元にライセンス記載がなくても元コンテンツの著作権・商標が別途及ぶ可能性があるので特に注意&lt;/li&gt;
&lt;li&gt;1つのデータセット名の下に複数コーパスが混在しているもの(DNS-Challenge、Takamichi研究室コーパス群)は、まとめて1つのライセンスとして扱わず個別コーパス・ファイル単位で確認すること&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;/li&gt;
&lt;li&gt;あわせて、自前で音声生成やVAD・ASR・感情分析に使ったツール・学習済みモデル、特定の単語・フレーズをネットから自分で集める方法もまとめた&lt;/li&gt;
&lt;li&gt;CC0やCC BYなど素直に使えるものが多い一方で、TalkBank系や日本国著作権法30条の4限定のものなど、「無料公開」に見えて実は利用条件が細かく決まっているデータセットも少なくない&lt;/li&gt;
&lt;li&gt;「記載なし」のライセンスは自由利用の許可ではないので、使う前に一次配布元を必ず確認する&lt;/li&gt;
&lt;li&gt;新しく良いデータセット・ツールを見つけたら随時追記していく&lt;/li&gt;
&lt;li&gt;まあ、色々と使ったものだ、20TBぐらいのHDDが結構満パンになってしまった&lt;/li&gt;
&lt;/ul&gt;</description></item><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><item><title>音声系の技術の備忘録ノート</title><link>https://www.m1ke.org/p/%E9%9F%B3%E5%A3%B0%E7%B3%BB%E3%81%AE%E6%8A%80%E8%A1%93%E3%81%AE%E5%82%99%E5%BF%98%E9%8C%B2%E3%83%8E%E3%83%BC%E3%83%88/</link><pubDate>Fri, 24 Apr 2026 20:57:39 +0900</pubDate><guid>https://www.m1ke.org/p/%E9%9F%B3%E5%A3%B0%E7%B3%BB%E3%81%AE%E6%8A%80%E8%A1%93%E3%81%AE%E5%82%99%E5%BF%98%E9%8C%B2%E3%83%8E%E3%83%BC%E3%83%88/</guid><description>&lt;img src="https://www.m1ke.org/p/%E9%9F%B3%E5%A3%B0%E7%B3%BB%E3%81%AE%E6%8A%80%E8%A1%93%E3%81%AE%E5%82%99%E5%BF%98%E9%8C%B2%E3%83%8E%E3%83%BC%E3%83%88/sound.png" alt="Featured image of post 音声系の技術の備忘録ノート" /&gt;&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;音声系技術を実装した時にメモしていた事を残す&lt;/li&gt;
&lt;li&gt;次のようなシステムやモデルを作っていた
&lt;ul&gt;
&lt;li&gt;LLM会話システム、TTSモデル、ASRモデル、VADモデル&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;記憶がフレッシュなうちに備忘録として残す&lt;/li&gt;
&lt;li&gt;特に音周りの技術は初めてだったので、用語を整理した&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="用語--技術"&gt;用語 / 技術&lt;/h2&gt;
&lt;h3 id="会話の組み立て"&gt;会話の組み立て&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;LLM
&lt;ul&gt;
&lt;li&gt;Large Language Model&lt;/li&gt;
&lt;li&gt;膨大なテキストデータを学習し、人間のように自然な文章を生成・理解するAI技術&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Llama.cpp
&lt;ul&gt;
&lt;li&gt;Gemma4をサーバー化するのに使用&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/ggml-org/llama.cpp" target="_blank" rel="noopener"
&gt;https://github.com/ggml-org/llama.cpp&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Gemma 4
&lt;ul&gt;
&lt;li&gt;Googleが開発した2026年4月時点で最新のEdge LLM&lt;/li&gt;
&lt;li&gt;今回は、量子化されたQ4_K_M.ggufを使用&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://huggingface.co/unsloth/gemma-4-E2B-it-GGUF" target="_blank" rel="noopener"
&gt;https://huggingface.co/unsloth/gemma-4-E2B-it-GGUF&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="音声発話"&gt;音声発話&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;TTS
&lt;ul&gt;
&lt;li&gt;Text to Speech&lt;/li&gt;
&lt;li&gt;テキストを音声に変換する技術&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;piper-plus
&lt;ul&gt;
&lt;li&gt;高速・高品質なニューラルテキスト音声合成 (TTS) システム&lt;/li&gt;
&lt;li&gt;英語版のpiperを日本人がforkしたリポジトリ&lt;/li&gt;
&lt;li&gt;今回は日本語のTTSに使用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;VITS
&lt;ul&gt;
&lt;li&gt;Conditional Variational Autoencoder with Adversarial Learning for End-to-End Text-to-Speech&lt;/li&gt;
&lt;li&gt;piper-plusのモデルの名前&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="音声認識"&gt;音声認識&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;STT
&lt;ul&gt;
&lt;li&gt;Speech to Text&lt;/li&gt;
&lt;li&gt;音声をテキストに変換する技術&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ASR
&lt;ul&gt;
&lt;li&gt;automatic speech recognition&lt;/li&gt;
&lt;li&gt;音声認識技術&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;LID
&lt;ul&gt;
&lt;li&gt;language identification&lt;/li&gt;
&lt;li&gt;言語識別&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;SER
&lt;ul&gt;
&lt;li&gt;speech emotion recognition&lt;/li&gt;
&lt;li&gt;音声感情認識&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;AED
&lt;ul&gt;
&lt;li&gt;audio event detection&lt;/li&gt;
&lt;li&gt;音響イベント検出&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;AEC （分類）
&lt;ul&gt;
&lt;li&gt;audio event classification&lt;/li&gt;
&lt;li&gt;音響イベント分類&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Speaker identification / Speaker verification
&lt;ul&gt;
&lt;li&gt;Speaker Identification（話者識別）&lt;/li&gt;
&lt;li&gt;Speaker Verification（話者照合/認証）&lt;/li&gt;
&lt;li&gt;違いは、「誰であるか特定する（1対N）」か、「主張された本人か確認する（1対1）」かという点&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;speech enhancement
&lt;ul&gt;
&lt;li&gt;「音声を綺麗にする技術」の総称&lt;/li&gt;
&lt;li&gt;ノイズ除去、残響除去、帯域拡張など&lt;/li&gt;
&lt;li&gt;タスク: 「音声 + ノイズ」→「音声」&lt;/li&gt;
&lt;li&gt;サブtopics:
&lt;ul&gt;
&lt;li&gt;Speech Denoising（ノイズ除去）
&lt;ul&gt;
&lt;li&gt;背景ノイズの除去&lt;/li&gt;
&lt;li&gt;例：エアコン、車、カフェの雑音など&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Dereverberation（残響除去）
&lt;ul&gt;
&lt;li&gt;残響、リバーブの除去&lt;/li&gt;
&lt;li&gt;部屋の反射音を取り除く&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bandwidth Extension（BWE／帯域拡張）
&lt;ul&gt;
&lt;li&gt;狭帯域音声を高音質化&lt;/li&gt;
&lt;li&gt;例：電話音声（8kHz）→ 高音質音声（48kHz）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Declipping
&lt;ul&gt;
&lt;li&gt;クリッピング歪みの修復&lt;/li&gt;
&lt;li&gt;音割れした音声の復元&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Packet Loss Concealment
&lt;ul&gt;
&lt;li&gt;パケットロスの補完&lt;/li&gt;
&lt;li&gt;通信で欠落した部分を補間&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Codec Artifact Removal
&lt;ul&gt;
&lt;li&gt;圧縮による劣化の修復&lt;/li&gt;
&lt;li&gt;例：MP3、AACなどの圧縮ノイズ除去&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Source separation
&lt;ul&gt;
&lt;li&gt;Speech Separationは音源分離の技術&lt;/li&gt;
&lt;li&gt;タスク: 「音声A + 音声B」→「音声A」と「音声B」&lt;/li&gt;
&lt;li&gt;lib:
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/deezer/spleeter" target="_blank" rel="noopener"
&gt;https://github.com/deezer/spleeter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/Anjok07/ultimatevocalremovergui" target="_blank" rel="noopener"
&gt;https://github.com/Anjok07/ultimatevocalremovergui&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Audio tagging
&lt;ul&gt;
&lt;li&gt;Audio taggingは、音声データ内の特定の音響イベントやシーン（会話、音楽、環境音など）を自動または手動で識別し、ラベル（タグ）を付ける技術&lt;/li&gt;
&lt;li&gt;音声を「セリフ」「BGM」などに分類できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;KWS
&lt;ul&gt;
&lt;li&gt;Keyword Spotting&lt;/li&gt;
&lt;li&gt;「OK Google」などのような、キーワード認識技術&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Kotoba Whisper
&lt;ul&gt;
&lt;li&gt;日本語に強いWhisper&lt;/li&gt;
&lt;li&gt;今回は、tiny版のGGML版の量子化されたq5を使用&lt;/li&gt;
&lt;li&gt;最速で動かすため、Greedy decodingとBeam Searchを調整した&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Whisper.cpp
&lt;ul&gt;
&lt;li&gt;whisper.cppは音声データを読み込んでテキスト文章に変えてくれるソフト&lt;/li&gt;
&lt;li&gt;Kotoba Whisperをサーバー化するのに使用&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/ggerganov/whisper.cpp" target="_blank" rel="noopener"
&gt;https://github.com/ggerganov/whisper.cpp&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;sherpa
&lt;ul&gt;
&lt;li&gt;次世代KaldiとONNX Runtimeを活用した軽量な音声処理ツールボックス&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/k2-fsa/sherpa-onnx" target="_blank" rel="noopener"
&gt;https://github.com/k2-fsa/sherpa-onnx&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Kaldi
&lt;ul&gt;
&lt;li&gt;Kaldi Speech Recognition Toolkit&lt;/li&gt;
&lt;li&gt;長らく音声認識のデファクトスタンダードツールとして利用されていたC++ライブラリ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;VOSK
&lt;ul&gt;
&lt;li&gt;エッジで動く音声認識ツールキット&lt;/li&gt;
&lt;li&gt;日本語モデルは、small: 48M、big: 1GBが用意されている&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;SenseVoice
&lt;ul&gt;
&lt;li&gt;ASR、LID、SER、AEC（分類）、AEDを含む音声理解能力を備えた音声基盤モデル&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/FunAudioLLM/SenseVoice/tree/main" target="_blank" rel="noopener"
&gt;https://github.com/FunAudioLLM/SenseVoice/tree/main&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="音認識"&gt;音認識&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;VAD
&lt;ul&gt;
&lt;li&gt;Voice Activity Detection&lt;/li&gt;
&lt;li&gt;発話区間検出のための技術&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Silero VAD
&lt;ul&gt;
&lt;li&gt;高性能で軽量（約2MB）なオープンソースのVADモデル&lt;/li&gt;
&lt;li&gt;CPUで1ms以下で動作する高速性を持ち、WebRTC VADよりも高精度で、ノイズの多い環境でも音声を正確に検知 (according to the AI)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;PCM
&lt;ul&gt;
&lt;li&gt;Pulse Code Modulation：パルス符号変調&lt;/li&gt;
&lt;li&gt;非圧縮・高品質: 音波を一定周期でサンプリングし、量子化してデータ化するため、原音に忠実&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;VAP
&lt;ul&gt;
&lt;li&gt;Voice Activity Projection&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/inokoj/VAP-Realtime" target="_blank" rel="noopener"
&gt;https://github.com/inokoj/VAP-Realtime&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/maai-kyoto/maai" target="_blank" rel="noopener"
&gt;https://github.com/maai-kyoto/maai&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="音の精度向上"&gt;音の精度向上&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;PipeWire
&lt;ul&gt;
&lt;li&gt;Linuxのマルチメディアサーバー&lt;/li&gt;
&lt;li&gt;AEC（キャンセル）やNS、AGCの機能がある&lt;/li&gt;
&lt;li&gt;&lt;code&gt;aec_method=webrtc&lt;/code&gt;を今回は使用した&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;AEC （キャンセル）
&lt;ul&gt;
&lt;li&gt;acoustic echo cancellation&lt;/li&gt;
&lt;li&gt;スピーカーから出た周り込みを消す技術&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;NS
&lt;ul&gt;
&lt;li&gt;Noise Suppression&lt;/li&gt;
&lt;li&gt;扇風機、キーボード、エアコンなどの雑音を減らす技術&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;AGC
&lt;ul&gt;
&lt;li&gt;Automatic Gain Control&lt;/li&gt;
&lt;li&gt;声などの音量を自動調整する技術&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="音の理解向上"&gt;音の理解向上&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Punctuation
&lt;ul&gt;
&lt;li&gt;意味は句読点で、句読点や記号を自動で補うこと&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Speaker Diarization
&lt;ul&gt;
&lt;li&gt;録音された音声データから「いつ、誰が話したか（Who spoke when?）」を特定し、発言ごとに分割・分類する技術&lt;/li&gt;
&lt;li&gt;いわゆる話者分離&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="aiモデルの処理速度向上"&gt;AIモデルの処理速度向上&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;LLMの量子化
&lt;ul&gt;
&lt;li&gt;Quantization&lt;/li&gt;
&lt;li&gt;モデルのパラメータを高精度な数値（16/32bit浮動小数点）から低精度な数値（4/8bit整数）に変換し、モデルサイズを大幅に軽量化・高速化する技術&lt;/li&gt;
&lt;li&gt;精度低下を最小限に抑えつつ、少ないVRAM（GPUメモリ）で動作させ、安価なハードウェアでの推論を可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ONNX
&lt;ul&gt;
&lt;li&gt;Open Neural Network Exchangeの意味&lt;/li&gt;
&lt;li&gt;異なるAIフレームワーク間でモデルを共有・実行するためのフォーマット&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;OpenMP
&lt;ul&gt;
&lt;li&gt;C/C++のマルチスレッド並列処理を簡単に書くための仕組み&lt;/li&gt;
&lt;li&gt;共有メモリ環境での並列プログラミングを支援する技術&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="双方向会話"&gt;双方向会話&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Full Duplex
&lt;ul&gt;
&lt;li&gt;Full Duplex（全二重）音声技術は、AI対話システムにおいて、ユーザーとAIが「話しながら聞く（同時双方向）」ことを可能にする技術&lt;/li&gt;
&lt;li&gt;従来の「話して、待って、聞く」というターンベースの音声対話とは異なり、人間同士のような自然な相槌や発話のオーバーラップを実現する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;GPT Realtime
&lt;ul&gt;
&lt;li&gt;リアルタイムで低遅延の会話操作を処理するように設計された音声入力、音声出力の会話システム&lt;/li&gt;
&lt;li&gt;Function ToolやMCPも使える&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;j-moshi
&lt;ul&gt;
&lt;li&gt;日本語版のmoshi&lt;/li&gt;
&lt;li&gt;同時双方向的な特徴をモデル化できるfull-duplex音声対話システム&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;personaplex
&lt;ul&gt;
&lt;li&gt;real-time, full-duplex speech-to-speech conversational model&lt;/li&gt;
&lt;li&gt;システムプロンプトを入れる事ができる&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/NVIDIA/personaplex" target="_blank" rel="noopener"
&gt;https://github.com/NVIDIA/personaplex&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="処理速度向上"&gt;処理速度向上&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;見える化
&lt;ul&gt;
&lt;li&gt;わかりにくい状態を見て分かる形にすること&lt;/li&gt;
&lt;li&gt;例えば、処理している事がわかる用にインジケータを出さないと処理速度が遅く感じた&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;非同期
&lt;ul&gt;
&lt;li&gt;処理の完了を待っている間に、別の処理を進める仕組み&lt;/li&gt;
&lt;li&gt;応答性とスループットを最大化する手法&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;マルチスレッド化
&lt;ul&gt;
&lt;li&gt;計算タスクを複数コアで並列処理する仕組み&lt;/li&gt;
&lt;li&gt;応答性とスループットを最大化する手法&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;CPU Affinity
&lt;ul&gt;
&lt;li&gt;処理ごとにCPUのCoreを分離する技術&lt;/li&gt;
&lt;li&gt;複数の重い処理がありOSのスケジューラーに邪魔されず処理したい時に使う&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;CPU clock scaling
&lt;ul&gt;
&lt;li&gt;OSが消費電力の削減やパフォーマンスの向上のために CPU の周波数を上げ下げする技術&lt;/li&gt;
&lt;li&gt;Jetsonでは性能と消費電力・発熱のバランスを取るためのCPU周波数制御をしている&lt;/li&gt;
&lt;li&gt;今回はこれをOffにした&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Producer-Consumerパターン
&lt;ul&gt;
&lt;li&gt;データを生成する「プロデューサー」と処理する「コンシューマー」の間にキュー（Queue）を挟み、非同期で処理を行う設計パターン&lt;/li&gt;
&lt;li&gt;タスクキュー、ジョブキュー、メッセージキューなど色々な呼び方がある&lt;/li&gt;
&lt;li&gt;デカップリングの一種&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;TinyML
&lt;ul&gt;
&lt;li&gt;超低消費電力・小型のデバイス上で機械学習を動かす技術&lt;/li&gt;
&lt;li&gt;数KB〜数MB程度のメモリしかない小さなチップ上で、音声認識・異常検知・画像分類などを行うAI&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="音声分離と話者分離"&gt;音声分離と話者分離&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;音声分離（speech separation）
&lt;ul&gt;
&lt;li&gt;話者ごとに音声を分離するモデル&lt;/li&gt;
&lt;li&gt;例えば、Aさんの音声、Bさんの音声のように、一つの音声を物理的に分ける&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;話者分離（diarization）
&lt;ul&gt;
&lt;li&gt;時間ごとに誰が喋っているか分類するモデル&lt;/li&gt;
&lt;li&gt;例えば、ある音声で0&lt;del&gt;10秒はAさん、11&lt;/del&gt;12秒はBさんのように&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;有名なモデル:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pyannote.audio&lt;/li&gt;
&lt;li&gt;Asteroid / ConvTasNet&lt;/li&gt;
&lt;li&gt;SepFormer / SpeechBrain&lt;/li&gt;
&lt;li&gt;MossFormer2 / ClearerVoice-Studio&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="音声分離の用語"&gt;音声分離の用語&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;bleed / leakage / crosstalk&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;本来ほしい音源に、別の音が漏れ込んでいる状態&lt;/li&gt;
&lt;li&gt;音声分離では、分離しきれなかった他パートの残留音を指すことが多い&lt;/li&gt;
&lt;li&gt;例：ボーカル stem にドラムや伴奏がうっすら残る&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;artifacts&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AI分離やノイズ除去などの処理で生じる不自然な副作用&lt;/li&gt;
&lt;li&gt;例：「金属っぽい音」「水中っぽさ」「揺れ」「チリチリ音」「音の欠け」など&lt;/li&gt;
&lt;li&gt;bleed とは違い、元の音がそのまま漏れているというより、処理によって変質した音&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;doubling / ダブリング&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;同じ音や声が重なって二重に聞こえること&lt;/li&gt;
&lt;li&gt;意図的な録音手法の場合もあるし、分離処理の副作用として起きる場合もある&lt;/li&gt;
&lt;li&gt;例：ボーカルが一枚ではなく、薄く二枚重なって聞こえる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;phasing / フェイジング&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;似た音が少しズレて重なり、位相干渉でシュワシュワ・うねうね・薄く聞こえる現象&lt;/li&gt;
&lt;li&gt;ダブリングに近いが、より「干渉」「位相ズレ」感が強い&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ghosting / ゴースト成分&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;本来そこに残ってほしくない、薄い残像のような音&lt;/li&gt;
&lt;li&gt;例：消したはずのボーカルや伴奏の輪郭が、影のように残っている&lt;/li&gt;
&lt;li&gt;技術的に厳密な用語というより、聴感上の説明として使われることが多い&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;residual / residual component / 残留成分&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;分離・除去しきれずに残った音&lt;/li&gt;
&lt;li&gt;bleed や ghosting を含めて広めに表せる、やや技術寄りで無難な言い方&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="相槌とフィラー"&gt;相槌とフィラー&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;フィラー（filler / filler word / filler sound）
&lt;ul&gt;
&lt;li&gt;フィラーは、話し手が「間を埋める」ために入れる音や言葉&lt;/li&gt;
&lt;li&gt;例: um, uh, well, like, you know, I mean, sort of / kind of&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;相槌（backchannel / backchannel response）
&lt;ul&gt;
&lt;li&gt;相槌は、聞き手が「聞いていますよ」「理解していますよ」と示す反応、verbal nodsという事&lt;/li&gt;
&lt;li&gt;例: yeah, uh-huh, right, I see, really?, sure, exactly, that makes sense&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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;フィラー&lt;/td&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;td&gt;うん、はい、なるほど&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="プロソディ"&gt;プロソディ&lt;/h3&gt;
&lt;p&gt;プロソディ（韻律）とは、話す速度、音の強弱（ストレス）、高低（イントネーション）、ポーズなど、発話に伴う音声の音楽的・律動的な要素の総称。&lt;/p&gt;
&lt;p&gt;プロソディは主に以下の5つの要素で構成される。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;イントネーション（抑揚）： 文末のピッチの上げ下げ。疑問形や感情を表す。&lt;/li&gt;
&lt;li&gt;ストレス・アクセント： 単語や文の中で、どの音を強く・高く発音するか。&lt;/li&gt;
&lt;li&gt;リズム： 言葉の長短や強弱が織りなす拍子。&lt;/li&gt;
&lt;li&gt;ポーズ： 話の切れ目に入る「間」。意味のまとまりを作る。&lt;/li&gt;
&lt;li&gt;プロミネンス： 文中で特に強調したい部分を際立たせること。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="wavとpcm"&gt;WAVとPCM&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;WAV
&lt;ul&gt;
&lt;li&gt;音声ファイルの形式&lt;/li&gt;
&lt;li&gt;音声データを入れる「コンテナ」のようなもの&lt;/li&gt;
&lt;li&gt;拡張子は &lt;code&gt;.wav&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;PCM
&lt;ul&gt;
&lt;li&gt;Pulse Code Modulation：パルス符号変調&lt;/li&gt;
&lt;li&gt;音波を一定間隔でサンプリングし、音量を数値化したもの&lt;/li&gt;
&lt;li&gt;非圧縮の音声データとして扱われることが多い&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="mel尺度とメルスペクトログラム"&gt;Mel尺度とメルスペクトログラム&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Mel尺度
&lt;ul&gt;
&lt;li&gt;Mel尺度 は、人間の聴覚に近い周波数スケールの事&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;メルスペクトログラム
&lt;ul&gt;
&lt;li&gt;メルスペクトログラムは、音の周波数成分（音のエネルギー分布）を メル尺度で表したもの&lt;/li&gt;
&lt;li&gt;普通のスペクトルは、たとえば 100Hz、200Hz、1000Hz、5000Hz……のように物理的な周波数で音を分解する&lt;/li&gt;
&lt;li&gt;でも人間の耳は、周波数を等間隔には感じず、低い音の違いには敏感で、高い音の細かい違いにはやや鈍い&lt;/li&gt;
&lt;li&gt;そこでメル尺度で、音を人間の耳に近い感覚で周波数ごとに分ける&lt;/li&gt;
&lt;li&gt;深層学習・CNN/Transformer系だとlog-mel spectrogramが使われがち&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="stftとmfcc"&gt;STFTとMFCC&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;STFT
&lt;ul&gt;
&lt;li&gt;Short-Time Fourier Transform&lt;/li&gt;
&lt;li&gt;音声を短い時間窓に区切り、それぞれの区間で周波数成分を計算する手法&lt;/li&gt;
&lt;li&gt;出力は時間 × 周波数のスペクトログラム&lt;/li&gt;
&lt;li&gt;実際の音声特徴量では、STFTの複素スペクトルから振幅スペクトログラムやパワースペクトログラムを使うことが多い&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;MFCC
&lt;ul&gt;
&lt;li&gt;Mel-Frequency Cepstral Coefficients（メル周波数ケプストラム係数）&lt;/li&gt;
&lt;li&gt;MFCCはメル特徴量を圧縮したもの&lt;/li&gt;
&lt;li&gt;古典的な音声認識、特にGMM-HMM/HMM時代によく使われた特徴量&lt;/li&gt;
&lt;li&gt;深層学習ASRでは、MFCCよりもlog-mel spectrogram / log-mel filterbank featuresが使われることが多い&lt;/li&gt;
&lt;li&gt;ただし、wav2vec 2.0やHuBERTのようにraw waveformから特徴を学習するモデルもある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="mfccまでの処理のフロー"&gt;MFCCまでの処理のフロー&lt;/h3&gt;
&lt;p&gt;一例として、MFCCまでは、以下のようなフローになる。&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;/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;短い区間に分ける（フレーミング）
&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;窓関数をかける（Hamming窓など）
&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 / STFT で周波数成分に変換
&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; ↓
&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;logを取る
&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;fbank特徴量（log Mel filter bank）
&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;DCT
&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;MFCC
&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;CMVN
&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="サンプリング周波数ビット深度チャンネル"&gt;サンプリング周波数・ビット深度・チャンネル&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;サンプリング周波数
&lt;ul&gt;
&lt;li&gt;1秒間に何回、音を測るか&lt;/li&gt;
&lt;li&gt;例: 16kHz、44.1kHz、48kHz&lt;/li&gt;
&lt;li&gt;ASRでは16kHz monoに変換して扱うことが多い&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ビット深度
&lt;ul&gt;
&lt;li&gt;1サンプルの音量をどれくらい細かく表すか&lt;/li&gt;
&lt;li&gt;例: 16bit、24bit、32bit float&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;チャンネル数
&lt;ul&gt;
&lt;li&gt;monoは1ch、stereoは2ch&lt;/li&gt;
&lt;li&gt;音声認識ではmonoに変換して扱うことが多い&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;sample format
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;s16le&lt;/code&gt;、&lt;code&gt;float32&lt;/code&gt; など&lt;/li&gt;
&lt;li&gt;&lt;code&gt;s16le&lt;/code&gt; は signed 16bit little-endian の意味&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="windowhop-length"&gt;window、hop length&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;window size
&lt;ul&gt;
&lt;li&gt;1回の周波数分析に使う音声の長さ&lt;/li&gt;
&lt;li&gt;例: 25ms&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;hop length / stride
&lt;ul&gt;
&lt;li&gt;次の分析窓へどれくらいずらすか&lt;/li&gt;
&lt;li&gt;例: 10ms&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;spectrogram
&lt;ul&gt;
&lt;li&gt;時間ごとの周波数成分を並べたもの&lt;/li&gt;
&lt;li&gt;横軸が時間、縦軸が周波数、色や値がエネルギーを表す&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;log-mel spectrogram
&lt;ul&gt;
&lt;li&gt;メルスペクトルの値に対数を取ったもの&lt;/li&gt;
&lt;li&gt;音声認識や音声分類の入力特徴量としてよく使われる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="vadとendpointing"&gt;VADとEndpointing&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;VAD
&lt;ul&gt;
&lt;li&gt;Voice Activity Detection&lt;/li&gt;
&lt;li&gt;今この瞬間に音声があるかを判定する技術&lt;/li&gt;
&lt;li&gt;「声か、無音か」を見る&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Endpointing
&lt;ul&gt;
&lt;li&gt;発話が終わったかを判定する技術&lt;/li&gt;
&lt;li&gt;ASRやLLMにいつ入力を渡すかを決める&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="音声aiの評価指標"&gt;音声AIの評価指標&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;RTF
&lt;ul&gt;
&lt;li&gt;Real Time Factor&lt;/li&gt;
&lt;li&gt;音声の長さに対して、処理に何倍の時間がかかったか&lt;/li&gt;
&lt;li&gt;RTF &amp;lt; 1 ならリアルタイム処理可能&lt;/li&gt;
&lt;li&gt;例: 10秒の音声を2秒で処理できるならRTF=0.2&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;WER
&lt;ul&gt;
&lt;li&gt;Word Error Rate&lt;/li&gt;
&lt;li&gt;単語単位の音声認識エラー率&lt;/li&gt;
&lt;li&gt;英語など単語区切りが明確な言語でよく使われる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;CER
&lt;ul&gt;
&lt;li&gt;Character Error Rate&lt;/li&gt;
&lt;li&gt;文字単位の音声認識エラー率&lt;/li&gt;
&lt;li&gt;日本語ASRではWERよりCERの方が扱いやすい場合がある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;MOS
&lt;ul&gt;
&lt;li&gt;Mean Opinion Score&lt;/li&gt;
&lt;li&gt;TTSなどの音質を人間が主観評価する指標&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="gaindbfsclipping"&gt;Gain・dBFS・Clipping&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Gain
&lt;ul&gt;
&lt;li&gt;音量を増幅・減衰させる量&lt;/li&gt;
&lt;li&gt;マイク入力が小さすぎるとASR精度が落ち、大きすぎると音割れする&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;dBFS
&lt;ul&gt;
&lt;li&gt;デジタル音声における音量の単位&lt;/li&gt;
&lt;li&gt;0 dBFS が最大値で、それを超えるとクリッピングする&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Clipping
&lt;ul&gt;
&lt;li&gt;音量が大きすぎて波形の上下が潰れる現象&lt;/li&gt;
&lt;li&gt;音割れの原因になる&lt;/li&gt;
&lt;li&gt;一度クリッピングした音声は完全には元に戻せない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Normalization
&lt;ul&gt;
&lt;li&gt;音声全体の音量を一定基準に揃える処理&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="ring-buffer--chunking"&gt;Ring buffer / Chunking&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Ring buffer
&lt;ul&gt;
&lt;li&gt;固定長のバッファを循環させながら使うデータ構造&lt;/li&gt;
&lt;li&gt;マイクから連続的に入ってくる音声をリアルタイム処理する時に便利&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Chunking
&lt;ul&gt;
&lt;li&gt;音声を一定長の塊に分けて処理すること&lt;/li&gt;
&lt;li&gt;例: 10ms、20ms、30ms、1秒など&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;注意点:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;チャンクが短いほど低遅延だが、認識や判定が不安定になりやすい&lt;/li&gt;
&lt;li&gt;チャンクが長いほど安定するが、遅延が増える&lt;/li&gt;
&lt;li&gt;VAD、ASR、TTSで最適なチャンク長は異なる&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="cmvn"&gt;CMVN&lt;/h3&gt;
&lt;p&gt;画像の前処理でやるものと同じように、分布の中心を平均にして、スケールをSDにする処理の事。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CMVN
&lt;ul&gt;
&lt;li&gt;CMVN（Cepstral Mean and Variance Normalization）とは、音声特徴量を「平均0・分散1」にそろえる前処理&lt;/li&gt;
&lt;li&gt;CMVN = CMN + CVNで、画像の前処理と同じようなZ値化のための統計処理&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;CMN：平均を引く
&lt;ul&gt;
&lt;li&gt;特徴量の中心を0にする&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;CVN：標準偏差で割る
&lt;ul&gt;
&lt;li&gt;ばらつきを1にする&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="bankfbank"&gt;bank、fbank&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;filter bank
&lt;ul&gt;
&lt;li&gt;filter bank は、複数の周波数フィルタを並べたもの&lt;/li&gt;
&lt;li&gt;イメージとしては、音声に対するザルのようなもの&lt;/li&gt;
&lt;/ul&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;音声信号
&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
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[中低音フィルタ] → エネルギー2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[中音フィルタ] → エネルギー3
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[高音フィルタ] → エネルギー4
&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;/li&gt;
&lt;li&gt;fbank
&lt;ul&gt;
&lt;li&gt;各時間フレームごとに、メル周波数帯域ごとのログエネルギーを並べたもの&lt;/li&gt;
&lt;li&gt;例えば、80次元 fbank なら、1フレームごとにこういうベクトルになる
&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;frame 1: [band1, band2, band3, ..., band80]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;frame 2: [band1, band2, band3, ..., band80]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;frame 3: [band1, band2, band3, ..., band80]
&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;/li&gt;
&lt;li&gt;これが時間方向に並ぶので、画像っぽく見ると スペクトログラムみたいになる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="ctcとアライメント不明問題"&gt;CTCとアライメント不明問題&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;アライメント不明問題
&lt;ul&gt;
&lt;li&gt;音声の波形データ（いつ、どんな音が鳴ったか）と、テキスト（文字データ）の対応関係が不明・不正確になってしまう問題のこと&lt;/li&gt;
&lt;li&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;- 入力: 音声フレーム 100個
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- 出力: 文字列 &amp;#34;hello&amp;#34; 5文字
&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;/li&gt;
&lt;li&gt;上記のような、入力は長い時系列データだけど、出力は短いラベル列になる&lt;/li&gt;
&lt;li&gt;しかも、「どの音声フレームが h に対応するか」「どこから e か」みたいな対応関係は普通はわからなくなる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;CTC
&lt;ul&gt;
&lt;li&gt;Connectionist Temporal Classification&lt;/li&gt;
&lt;li&gt;日本語だと 「結合主義的時系列分類」&lt;/li&gt;
&lt;li&gt;入力と出力の対応位置がわからない時系列タスク（アライメント不明問題）で使う損失関数&lt;/li&gt;
&lt;li&gt;CTC では、通常の文字ラベルに加えてblank（&lt;code&gt;-&lt;/code&gt;）という特殊ラベルを使う&lt;/li&gt;
&lt;/ul&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;h - - e l - l o
&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;ul&gt;
&lt;li&gt;そして、最後にblank を消して、連続重複をまとめることで&lt;code&gt;hello&lt;/code&gt;にする&lt;/li&gt;
&lt;li&gt;つまり、CTCは、ある正解ラベル列に対応しうる多数のアライメント候補を全部考慮して、その合計確率を最大化するように学習する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="ctcとrnn-t"&gt;CTCとRNN-T&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;CTC
&lt;ul&gt;
&lt;li&gt;学習が速い&lt;/li&gt;
&lt;li&gt;encoder-onlyで構造がシンプル&lt;/li&gt;
&lt;li&gt;出力形状は主に 時間T × 語彙V&lt;/li&gt;
&lt;li&gt;ベースラインや高速学習に向いている&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;RNN-T
&lt;ul&gt;
&lt;li&gt;CTCより学習は重い&lt;/li&gt;
&lt;li&gt;encoder + prediction network + joint network を使う&lt;/li&gt;
&lt;li&gt;時間T × 出力長U の格子上で計算するため、CTCよりメモリ・計算量が大きい&lt;/li&gt;
&lt;li&gt;ただし、出力履歴を使えるため精度やストリーミングASRでは有利になりやすい&lt;/li&gt;
&lt;li&gt;pruned RNN-Tなどの最適化で学習速度はかなり改善できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="bpttとtbptt"&gt;BPTTとTBPTT&lt;/h3&gt;
&lt;p&gt;RNN 系モデルで長い系列を学習するときに使う誤差伝搬の仕組み。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;BPTT
&lt;ul&gt;
&lt;li&gt;BPTT / Backpropagation Through Time の略&lt;/li&gt;
&lt;li&gt;シリーズ全体に対して過去方向へずっと誤差を逆伝播する&lt;/li&gt;
&lt;li&gt;たとえば文章が 1,000 トークンあるなら、理屈上は 1,000 ステップぶん遡って勾配を計算する仕組み&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;TBPTT
&lt;ul&gt;
&lt;li&gt;Truncated Backpropagation Through Time の略で、日本語だと 「切り詰めた時間方向の誤差逆伝播」&lt;/li&gt;
&lt;li&gt;シリーズを短い区間に分割して、たとえば 20 ステップごと や 100 ステップごとに区切って学習する仕組み&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="conformeremformerzipformer"&gt;Conformer、Emformer、Zipformer&lt;/h3&gt;
&lt;p&gt;音響特徴量を高レベル表現に変換するacoustic encoder。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Conformer
&lt;ul&gt;
&lt;li&gt;Transformer + CNN の王道ASR encoder&lt;/li&gt;
&lt;li&gt;通常はchunk attention / causal convなどでストリーミング化&lt;/li&gt;
&lt;li&gt;精度が高く、実装・知見が多い&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Emformer
&lt;ul&gt;
&lt;li&gt;Streaming前提のmemory-efficient Transformer&lt;/li&gt;
&lt;li&gt;入力をsegmentに分け、left/right contextとmemory bankを使う&lt;/li&gt;
&lt;li&gt;低遅延streamingに素直。Torchaudioにも実装あり&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Zipformer
&lt;ul&gt;
&lt;li&gt;Conformerを高速・省メモリ・高精度に再設計した新しめのencoder&lt;/li&gt;
&lt;li&gt;chunk/cached attentionなどでstreaming対応&lt;/li&gt;
&lt;li&gt;icefall系でよく使われる&lt;/li&gt;
&lt;li&gt;速い・省メモリ・精度が良い傾向だが、構造が複雑。実装依存が強め&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="音素音節モーラ"&gt;音素、音節、モーラ&lt;/h3&gt;
&lt;p&gt;音の３つの単位のこと。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;音素（Phoneme）
&lt;ul&gt;
&lt;li&gt;意味を区別できる最小の音韻単位&lt;/li&gt;
&lt;li&gt;例えば日本語では /a/ や /k/ などが音素&lt;/li&gt;
&lt;li&gt;「か」は /k/ + /a/ から成る&lt;/li&gt;
&lt;li&gt;音声認識では、音素はラベル単位の一つとして使われることがある&lt;/li&gt;
&lt;li&gt;しかしが、近年のASRでは文字、サブワード、音節なども広く使われる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;モーラ（Mora）
&lt;ul&gt;
&lt;li&gt;日本語のリズムを構成する拍の単位&lt;/li&gt;
&lt;li&gt;普通の仮名1文字はおおむね1モーラ&lt;/li&gt;
&lt;li&gt;しかし、小さい「ゃ・ゅ・ょ」は単独では1モーラになならない&lt;/li&gt;
&lt;li&gt;一方で「っ」「ん」「ー」はそれぞれ1モーラとして数える&lt;/li&gt;
&lt;li&gt;例：「きっかけ」は「き・っ・か・け」で4モーラ、「にゃお」は「にゃ・お」で2モーラ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;音節（Syllable）
&lt;ul&gt;
&lt;li&gt;母音を中心とした発音のまとまり&lt;/li&gt;
&lt;li&gt;英語などではリズムや強勢を分析する基本単位になる&lt;/li&gt;
&lt;li&gt;日本語ではモーラと音節が一致する場合もある&lt;/li&gt;
&lt;li&gt;しかし、「かん」「きっ」「こう」のように、1音節が複数モーラを含む場合がある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="ラティスとn-best-list"&gt;ラティスとN-best list&lt;/h3&gt;
&lt;p&gt;ASRでは、N-Best Listはリストで、ラティスはGraphという違いがある。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;N-best list
&lt;ul&gt;
&lt;li&gt;N-best list は、音声認識が出した候補を上から順に並べたもの
&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;1. 明日は雨です
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2. 明日は飴です
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3. 明日は雨ですか
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4. 明日晴れです
&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;/li&gt;
&lt;li&gt;つまり、候補ごとに完成文が1本ずつあるイメージ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ラティス
&lt;ul&gt;
&lt;li&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;開始 → 明日 → は → 雨 → です → 終了
&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;/li&gt;
&lt;li&gt;実際には各枝に、音響スコア・言語モデルスコア・時間情報などが付いている&lt;/li&gt;
&lt;li&gt;ラティスでは、共通部分を共有しながら、途中の分岐を保持&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="n-gram"&gt;n-gram&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;n-gramは、文章や音声を 連続する n 個の単位のまとまりとして見る考え方&lt;/li&gt;
&lt;li&gt;単位は、文字・音素・モーラ・単語など何でもあり&lt;/li&gt;
&lt;li&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;n-gram言語モデルでは、たとえば bigram なら、$P(雨 | は)$&lt;/li&gt;
&lt;li&gt;つまり「『は』の次に『雨』が来る確率」を使う&lt;/li&gt;
&lt;li&gt;trigram なら、$P(雨 | 明日, は)$&lt;/li&gt;
&lt;li&gt;つまり「『明日 は』の次に『雨』が来る確率」を使う&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="greedyとbeam-search"&gt;greedyとbeam search&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;greedy
&lt;ul&gt;
&lt;li&gt;その瞬間いちばん良い候補だけを選ぶ&lt;/li&gt;
&lt;li&gt;たとえばASRで、音声から文字を1つずつ出すとする
&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;1文字目候補:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;あ 0.6
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;か 0.3
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;さ 0.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;/li&gt;
&lt;li&gt;greedy はここで &lt;code&gt;あ&lt;/code&gt; を選ぶ&lt;/li&gt;
&lt;li&gt;次に、以下なら &lt;code&gt;め&lt;/code&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;2文字目候補:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;め 0.5
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ね 0.4
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;れ 0.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;/li&gt;
&lt;li&gt;結果： &lt;code&gt;あめ&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;シンプルで速いが、弱点がある&lt;/li&gt;
&lt;li&gt;最初に選んだ「あ」があとで不自然になっても、戻れない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;beam search
&lt;ul&gt;
&lt;li&gt;上位いくつかの候補を残しながら進む&lt;/li&gt;
&lt;li&gt;beam search は、毎回1つだけに絞らず、上位いくつかを残す&lt;/li&gt;
&lt;li&gt;この「残す候補数」を beam width と言う&lt;/li&gt;
&lt;li&gt;beam width = 3 なら、各ステップで上位3候補くらいを保持する
&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;1文字目:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;あ 0.6
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;か 0.3
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;さ 0.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;/li&gt;
&lt;li&gt;ここで greedy なら「あ」だけだが、beam search は例えば以下を残す
&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;あ
&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;/li&gt;
&lt;li&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;あめ
&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;さね
&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;/li&gt;
&lt;li&gt;つまり、途中で多少スコアが低くても、後半で自然な文になる可能性がある候補を捨てにくい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="マシーンオートマトントランスデューサー"&gt;マシーン、オートマトン、トランスデューサー&lt;/h3&gt;
&lt;p&gt;マシーンは「状態を持つ広義の機械」、オートマトンが「状態遷移モデルで判定機」、トランスデューサーは「入力を出力に写す変換器」。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;マシーン
&lt;ul&gt;
&lt;li&gt;状態を持つ一般的な仕組み&lt;/li&gt;
&lt;li&gt;マシーン = 計算や処理を行う抽象的・実用的な「機械」一般&lt;/li&gt;
&lt;li&gt;実用・工学寄りの文脈でよく使われる&lt;/li&gt;
&lt;li&gt;例: Finite-State Machine = 有限個の状態を持つ機械&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;オートマトン
&lt;ul&gt;
&lt;li&gt;オートマトンは、入力を読みながら状態を変えていく抽象的な計算モデル&lt;/li&gt;
&lt;li&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;状態A --入力x--&amp;gt; 状態B
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;状態B --入力y--&amp;gt; 状態C
&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;/li&gt;
&lt;li&gt;重要なのは、基本的には 入力を受け取って、受理するかどうかを判定するものだという点&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;トランスデューサー
&lt;ul&gt;
&lt;li&gt;トランスデューサーは、入力を読みながら出力も出す変換器&lt;/li&gt;
&lt;li&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;/k a/ → か
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/a m e/ → 雨
&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;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="fstとwfst"&gt;FSTとWFST&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;FS
&lt;ul&gt;
&lt;li&gt;Finite State&lt;/li&gt;
&lt;li&gt;有限状態&lt;/li&gt;
&lt;li&gt;扱える状態の数が有限である、という意味&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;FST
&lt;ul&gt;
&lt;li&gt;Finite State Transducer&lt;/li&gt;
&lt;li&gt;有限状態トランスデューサー&lt;/li&gt;
&lt;li&gt;つまり、有限状態で変換するということ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;WFST
&lt;ul&gt;
&lt;li&gt;重み付きFST&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="lasとlas-scorer"&gt;LASとLAS Scorer&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;LAS
&lt;ul&gt;
&lt;li&gt;LAS は、ASR文脈では、Listen, Attend and Spell の略&lt;/li&gt;
&lt;li&gt;一言でいうと、「音声を聞いて、重要な部分に注意を向けながら、文字列を直接出力するEnd-to-End音声認識モデル」&lt;/li&gt;
&lt;/ul&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;Listen : 音声特徴量を読み取る（エンコーダ表現）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Attend : どの時間部分に注目するか決める（Attention）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Spell : 文字やサブワードを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;/li&gt;
&lt;li&gt;LAS Scorer
&lt;ul&gt;
&lt;li&gt;ASR文脈では、LASモデルの出力にスコアを付ける仕組&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="distillation-trainingと転移学習とftの違い"&gt;distillation trainingと転移学習とFTの違い&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Fine-tuning / 転移学習
&lt;ul&gt;
&lt;li&gt;事前学習済みモデルを持ってきて、追加データの正解ラベルで学習&lt;/li&gt;
&lt;li&gt;人間が用意した正解ラベルに合わせる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Distillation
&lt;ul&gt;
&lt;li&gt;大きいteacher モデルの挙動を、小さい student モデルに真似させる&lt;/li&gt;
&lt;li&gt;正解ラベルだけでなく、teacher が出す確率分布や中間表現を使う&lt;/li&gt;
&lt;li&gt;teacher モデルの挙動に合わせる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="forced-alignmentとsoft-alignmenthard-alignment"&gt;Forced alignmentとSoft alignment、Hard alignment&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Forced alignment
&lt;ul&gt;
&lt;li&gt;音声データと、すでに正しいと分かっている文字列・音素列を入力して、各単語や音素が音声のどの時刻に対応するかを推定する処理&lt;/li&gt;
&lt;li&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;音声：「今日は晴れです」
&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;今日：0.00〜0.45秒
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;は：0.45〜0.58秒
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;晴れ：0.58〜1.05秒
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;です：1.05〜1.30秒
&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;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Soft alignment、Hard alignment
&lt;ul&gt;
&lt;li&gt;各音声フレームや入力要素を、特定の1つの単語・音素・トークンに明確に割り当てる表現方法&lt;/li&gt;
&lt;li&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;たとえば、ある音声フレームを、
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;音素 /k/ に100％割り当てる → Hard alignment
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/k/ に70％、/a/ に30％割り当てる → Soft alignment
&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;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="促音拗音撥音など"&gt;促音・拗音・撥音など&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;清音（せいおん）
&lt;ul&gt;
&lt;li&gt;日本語のひらがなのこと&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;促音（そく音）
&lt;ul&gt;
&lt;li&gt;「がっこう」「さっぱり」などの語において、小さく「っ」と表記される音&lt;/li&gt;
&lt;li&gt;「っ」「ッ」（小さいつ）&lt;/li&gt;
&lt;li&gt;=&amp;gt; つまる音&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;拗音（よう音）
&lt;ul&gt;
&lt;li&gt;「きゃ」「きゅ」「きょ」などの語のように、一音節が仮名2文字で表記される音&lt;/li&gt;
&lt;li&gt;「〇ゃ 〇ゅ 〇ょ」「〇ャ 〇ュ 〇ョ」（小さいやゆよがつくもの）&lt;/li&gt;
&lt;li&gt;※拗音には、限定的ですが、小さい「〇ゎ」「〇ヮ」で表記されるものもある&lt;/li&gt;
&lt;li&gt;=&amp;gt; はねる音&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;撥音（はつ音）
&lt;ul&gt;
&lt;li&gt;「ん」と表記される音。通常、語中または語尾で一音節をなす鼻音&lt;/li&gt;
&lt;li&gt;「ん」「ン」&lt;/li&gt;
&lt;li&gt;=&amp;gt; ねじれる音&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;長音（ちょう音）
&lt;ul&gt;
&lt;li&gt;前の母音の音を伸ばして発音する音&lt;/li&gt;
&lt;li&gt;ひらがなでは「ー（長音符）」や母音（あ・い・う・え・お）をそのまま当てて表記&lt;/li&gt;
&lt;li&gt;=&amp;gt; のばす音&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;濁音
&lt;ul&gt;
&lt;li&gt;濁音は、濁った音&lt;/li&gt;
&lt;li&gt;「〝」がつく音のこと&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;半濁音
&lt;ul&gt;
&lt;li&gt;半濁音は、「ぱぴぷぺぽ」のような、丸がついた音&lt;/li&gt;
&lt;li&gt;「゜」がつく音のこと&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="ハイブリッド型とe2e型"&gt;ハイブリッド型とE2E型&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;DNN-HMMハイブリッド型
&lt;ul&gt;
&lt;li&gt;音声認識を複数の部品に分けて組み合わせる&lt;/li&gt;
&lt;li&gt;アーキ
&lt;ul&gt;
&lt;li&gt;DNN：各時刻の音声が、どの音素状態らしいかを推定&lt;/li&gt;
&lt;li&gt;HMM：音素が時間方向にどう遷移するかをモデル化&lt;/li&gt;
&lt;li&gt;さらに、発音辞書や言語モデルを使って単語列を決定&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&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;音声
&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;DNNによる音素・HMM状態の確率推定
&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;HMM＋発音辞書＋言語モデルで探索
&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;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;End-to-End型
&lt;ul&gt;
&lt;li&gt;音声から文字列までを、なるべく1つのモデルで直接学習する&lt;/li&gt;
&lt;li&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;音声
&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;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;代表的なモデル
&lt;ul&gt;
&lt;li&gt;CTC&lt;/li&gt;
&lt;li&gt;Attention Encoder-Decoder&lt;/li&gt;
&lt;li&gt;RNN-T&lt;/li&gt;
&lt;li&gt;Transformer / Conformer系&lt;/li&gt;
&lt;li&gt;WhisperのようなEncoder-Decoder型&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ハイブリッドとE2Eの違い:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;観点&lt;/th&gt;
&lt;th&gt;DNN-HMMハイブリッド型&lt;/th&gt;
&lt;th&gt;End-to-End型&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;1つのモデルとして統合的に学習&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;出力単位&lt;/td&gt;
&lt;td&gt;HMM状態や音素を経て単語へ変換&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;CTCやAttentionなどが内部で学習&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;外部言語モデルを明示的に使用&lt;/td&gt;
&lt;td&gt;モデル内に含む場合が多い。外部LMも併用可能&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;比較的少ないデータでも構築しやすい&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;辞書に発音を追加しやすい&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;RNN-Tなどは得意。モデル方式に依存&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="dnn-hmmハイブリッド型のコンポーネント"&gt;DNN-HMMハイブリッド型のコンポーネント&lt;/h3&gt;
&lt;p&gt;DNN-HMMハイブリッド型の音声認識システムは、主に次の4要素を組み合わせる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;音響モデル
&lt;ul&gt;
&lt;li&gt;音声信号から、どの音素・HMM状態らしいかを推定する&lt;/li&gt;
&lt;li&gt;入力された特徴量がどの単語の音声に該当する確率が高いかを表す、音響スコアを算出する&lt;/li&gt;
&lt;li&gt;音声認識においてHMMは、「単語内での音素の時系列変化」を表現するモデルとして使われる&lt;/li&gt;
&lt;li&gt;発話の速さによる影響を吸収するのが目的&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;発音辞書
&lt;ul&gt;
&lt;li&gt;単語と音素列の対応を定義する&lt;/li&gt;
&lt;li&gt;それぞれの単語が、どのような音素の並びで表現されるかを定義する&lt;/li&gt;
&lt;li&gt;発音辞書は、「秋」「紙」といった単語とその読み、そして ”a-k-i”・”k-a-m-i” といった音素の表記とを紐づける&lt;/li&gt;
&lt;li&gt;発音辞書により、単語を音素列（音素の並び）で表すことができる&lt;/li&gt;
&lt;li&gt;逆に言えば、発音辞書に書かれていない単語は音素列で表すことができないので、認識結果に登場しないということになる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;言語モデル
&lt;ul&gt;
&lt;li&gt;どの単語列が自然・起こりやすいかを評価する&lt;/li&gt;
&lt;li&gt;単語の並びが言語的に自然かどうかを表す、言語スコアを算出する&lt;/li&gt;
&lt;li&gt;「文脈」を判断する役割を果たしているのが言語モデル&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;デコーダ／探索アルゴリズム
&lt;ul&gt;
&lt;li&gt;特徴量がどの音っぽいかを判定し、その確率を出力&lt;/li&gt;
&lt;li&gt;（ハイブリッド型では音素単位、End-to-End型では文字や単語単位）&lt;/li&gt;
&lt;li&gt;「発音辞書」「音響モデル」「言語モデル」から得られた音響スコアと言語スコアをもとに判断すし、&lt;/li&gt;
&lt;li&gt;最もスコアが高い「単語の並び」を探索して認識結果とする処理をデコードと呼ぶ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="rnnとlstmとgru"&gt;RNNとLSTMとGRU&lt;/h3&gt;
&lt;p&gt;文章や音声のような時系列データを処理するニューラルネットワーク。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RNN
&lt;ul&gt;
&lt;li&gt;過去の隠れ状態と現在の入力から、新しい隠れ状態を計算する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;LSTM
&lt;ul&gt;
&lt;li&gt;LSTMは、通常のRNNに記憶を管理するゲートを追加したモデル&lt;/li&gt;
&lt;li&gt;主に3つのゲートがある
&lt;ul&gt;
&lt;li&gt;忘却ゲート：過去の情報をどれだけ忘れるか&lt;/li&gt;
&lt;li&gt;入力ゲート：新しい情報をどれだけ記憶するか&lt;/li&gt;
&lt;li&gt;出力ゲート：記憶から何を出力するか&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;また、LSTMは通常の隠れ状態とは別に、長期記憶を保持するセル状態を持つ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;GRU
&lt;ul&gt;
&lt;li&gt;Gated Recurrent Unit&lt;/li&gt;
&lt;li&gt;GRUもRNNの一種だが、情報を残すか忘れるかを制御するゲートを持っている&lt;/li&gt;
&lt;li&gt;主に2つのゲートがある
&lt;ul&gt;
&lt;li&gt;更新ゲート：過去の情報をどれくらい残すか&lt;/li&gt;
&lt;li&gt;リセットゲート：過去の情報をどれくらい無視する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;GRUもゲートを持つRNNだが、LSTMより構造を簡略化している&lt;/li&gt;
&lt;li&gt;BiGRUもよく利用される&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="共調音の順行性と逆行性"&gt;共調音の順行性と逆行性&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;順行性
&lt;ul&gt;
&lt;li&gt;前の音が後の音に影響する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;逆行性
&lt;ul&gt;
&lt;li&gt;予測的：後の音を発音する準備が前の音に現れる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;GRUは前から処理するため主に順行性の影響を捉えるが、BiGRUは前後の音声フレームを見るため、両方向の共調音をモデル化しやすい。&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;音声： k y o o
&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;GRU： ← 過去の音だけを見る
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;BiGRU： ← 過去 ＋ 未来を見る →
&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="mambaとgru"&gt;MambaとGRU&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;GRU
&lt;ul&gt;
&lt;li&gt;1ステップずつ、ゲートを使って過去の情報を更新するRNN&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Mamba
&lt;ul&gt;
&lt;li&gt;状態空間モデルを使い、入力に応じて「何を記憶し、何を捨てるか」を選択するモデル&lt;/li&gt;
&lt;li&gt;Mambaは、Selective State Space Modelという仕組みを使う&lt;/li&gt;
&lt;li&gt;Transformerより並列化しやすい構造になっている&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="bidirectional-vs-causal"&gt;Bidirectional vs Causal&lt;/h3&gt;
&lt;p&gt;基本的に情報量が多い分、BiXXXの方が精度が高い。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Causal（Unidirectional, UniXXX）
&lt;ul&gt;
&lt;li&gt;時刻tの出力は、現在までの情報だけで計算&lt;/li&gt;
&lt;li&gt;リアルタイム処理など&lt;/li&gt;
&lt;li&gt;onlineで使われる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bidirectional（BiXXX）
&lt;ul&gt;
&lt;li&gt;時刻tの出力を、前後両方の情報から計算&lt;/li&gt;
&lt;li&gt;前後の文脈を利用できる&lt;/li&gt;
&lt;li&gt;offlineで使われる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="tdnnとtdnn-f"&gt;TDNNとTDNN-F&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;TDNN
&lt;ul&gt;
&lt;li&gt;TDNN（Time-Delay Neural Network）は、時間方向の前後関係を扱うためのニューラルネットワーク&lt;/li&gt;
&lt;li&gt;ASR（自動音声認識）では、音声フレーム列のような時系列データを処理するために使われる&lt;/li&gt;
&lt;li&gt;音声は、ある瞬間だけを見ても「何の音か」が分かりにくく、前後数十ミリ秒の文脈が重要&lt;/li&gt;
&lt;li&gt;TDNNは例えば時刻 t の音響特徴に加えて、t−2, t−1, t+1, t+2 など離れたフレームも入力にして、現在の音素・サブワード・文字などを推定する&lt;/li&gt;
&lt;li&gt;イメージとしては、時間軸に対する1次元CNN&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;TDNN-F
&lt;ul&gt;
&lt;li&gt;TDNN-F は Factorized Time-Delay Neural Network の略&lt;/li&gt;
&lt;li&gt;通のTDNNを、低ランク分解（factorization）で軽量化・高速化したもの&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="parakeetのモデルの違い"&gt;Parakeetのモデルの違い&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;stt_en_fastconformer_hybrid_*_streaming_*&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;トリーミングASR専用に学習された Cache-aware Streaming FastConformer-Hybrid&lt;/li&gt;
&lt;li&gt;look-ahead を変えて、0 / 80 / 480 / 1040 ms級の遅延を選べる設計&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;parakeet-unified-en-0.6b&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;NVIDIAの新しめの offline と streaming を1モデルで両立させた Unified ASR&lt;/li&gt;
&lt;li&gt;ストリーミング専用ではなく、最低160 ms程度のストリーミング推論にも対応する、という位置づけ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;parakeet-tdt_ctc-0.6b-ja&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;日本語、基本オフライン&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="hmm系の目的関数の違い"&gt;HMM系の目的関数の違い&lt;/h3&gt;
&lt;p&gt;MMI / LF-MMI / MPE / sMBR / bMMI は、基本的にHMMを土台にしたASR、特に DNN-HMM / GMM-HMM 系で使われる系列識別目的関数。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MMI / bMMI
&lt;ul&gt;
&lt;li&gt;正解系列と競合系列の確率比を使う&lt;/li&gt;
&lt;li&gt;典型的な discriminative training&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;MPE
&lt;ul&gt;
&lt;li&gt;phone error を小さくするように最適化する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;sMBR
&lt;ul&gt;
&lt;li&gt;HMM state 単位の誤りを小さくする&lt;/li&gt;
&lt;li&gt;実装上は lattice 上で期待リスクを計算することが多い&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;LF-MMI
&lt;ul&gt;
&lt;li&gt;MMIの一種だが、分母側を lattice ではなく事前に作ったグラフで扱いやすくしたもの&lt;/li&gt;
&lt;li&gt;Kaldi chain model ではHMMの状態設計をかなり簡略化しているが、依然としてHMM/FST的な枠組みにいる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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;/td&gt;
&lt;td&gt;&lt;strong&gt;CE&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;強制アラインメントで得た各フレームのHMM状態を当てる&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;フレーム単位（古典的GMM-HMM）&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;ML / MLE&lt;/strong&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;strong&gt;MMI&lt;/strong&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;strong&gt;bMMI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;MMIで、誤りの大きい競合候補をより強く下げる&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;系列識別：期待誤り最小化&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;MPE&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;期待Phone Errorを小さくする&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;系列識別：期待誤り最小化&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;sMBR&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;期待state accuracyを最大化する（≒ state誤りを下げる）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;系列識別：lattice-free版&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;LF-MMI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;lattice-freeで計算するMMI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;任意・やや周辺&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;MPFE&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;phone frame errorを最小化する&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="tdtとrnn-tの違い"&gt;TDTとRNN-Tの違い&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;RNN-T
&lt;ul&gt;
&lt;li&gt;RNN-Tは Encoder、Prediction Network、Joiner からなり、時刻 t と出力済みトークン数 u の格子上でデコードする&lt;/li&gt;
&lt;li&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;blank → blank → blank → blank → 「こんにちは」→ blank → blank ...
&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;/li&gt;
&lt;li&gt;なお、RNN-Tは必ずしも内部がRNNとは限らず、EncoderにConformerやTransformerを使うことが普通&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;TDT
&lt;ul&gt;
&lt;li&gt;Token-and-Duration Transducer&lt;/li&gt;
&lt;li&gt;TDTは同じ Encoder／Prediction Network／Joiner 系の枠組み&lt;/li&gt;
&lt;li&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;blank, 4フレーム進む → 「こんにちは」, 5フレーム進む → ...
&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;/li&gt;
&lt;li&gt;TDTの本質は「blankを出し続けて1フレームずつ進む」処理を、duration予測で圧縮すること&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="n-gram-llm"&gt;N-gram LLM&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;N-gram LM は、直前の N個の単語（またはトークン） を見て、次の1個が出る確率を推定する言語モデル&lt;/li&gt;
&lt;li&gt;例
&lt;ul&gt;
&lt;li&gt;たとえば、&lt;code&gt;I want to eat ...&lt;/code&gt;という並びなら、4-gram LM は直前3語の&lt;code&gt;want to eat&lt;/code&gt;を条件にして、&lt;/li&gt;
&lt;li&gt;次の語が pizza、sushi、lunch などになる確率を出す&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="blank-collapseとcatastrophic-forgetting"&gt;blank collapseとcatastrophic forgetting&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;blank collapse
&lt;ul&gt;
&lt;li&gt;これは CTCモデルが blank をほぼ全フレームで高確率に出し、文字列をほとんど出せなくなる現象&lt;/li&gt;
&lt;li&gt;学習率、データ量・ラベル品質、長さの不整合、語彙設計、fine-tuning設定などが悪いと起きやすい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;catastrophic forgetting
&lt;ul&gt;
&lt;li&gt;新しい領域では良くなる一方、元々できていた領域の性能が大きく落ちること&lt;/li&gt;
&lt;li&gt;既存ASRモデルを新しい話者・方言・言語・ドメインのデータで追加学習したときに起きる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="マイクロcerとマクロcer"&gt;マイクロCERとマクロCER&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;マイクロCER
&lt;ul&gt;
&lt;li&gt;全体として何文字をどれだけ正しく認識できたか&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;マクロCER
&lt;ul&gt;
&lt;li&gt;典型的な発話・話者あたり、どのくらい安定しているか&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;例:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;たとえば、2発話ある。
&lt;ul&gt;
&lt;li&gt;発話A：100文字中10誤り → CER 10%&lt;/li&gt;
&lt;li&gt;発話B：10文字中5誤り → CER 50%&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;マイクロCER
&lt;ul&gt;
&lt;li&gt;(10+5)/(100+10)=13.6%&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;マク ロCER
&lt;ul&gt;
&lt;li&gt;(10%+50%)/2=30%&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="cerとwer"&gt;CERとWER&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;CER（Character Error Rate）
&lt;ul&gt;
&lt;li&gt;文字単位の誤り率&lt;/li&gt;
&lt;li&gt;日本語・中国語など、単語境界が曖昧な言語でよく使う&lt;/li&gt;
&lt;li&gt;CERでは文字レベルで比較&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;WER（Word Error Rate）
&lt;ul&gt;
&lt;li&gt;単語単位の誤り率&lt;/li&gt;
&lt;li&gt;英語など、単語を空白で区切りやすい言語でよく使う&lt;/li&gt;
&lt;li&gt;WERでは形態素解析などで、例えば、今日 / は / 晴れ / です と区切って比較&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;どちらも計算式は基本的に同じ。&lt;/p&gt;
$$
\frac{S+D+I}{N}
$$&lt;ul&gt;
&lt;li&gt;S：置換&lt;/li&gt;
&lt;li&gt;D：削除&lt;/li&gt;
&lt;li&gt;I：挿入&lt;/li&gt;
&lt;li&gt;N：正解文の文字数または単語数&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="情報量とエントロピーとクロスエントロピー"&gt;情報量とエントロピーとクロスエントロピー&lt;/h3&gt;
&lt;p&gt;言語モデルのエンコーダーは情報量の圧縮なのでエントロピーとも関係がある。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;情報量
&lt;ul&gt;
&lt;li&gt;ある事象の「情報量」&lt;/li&gt;
&lt;li&gt;確率 $p(x)$ の事象 $x$ が起きたときの情報量（自己情報量）は以下になる
$$
I(x)=−log_{2​} p(x)
$$&lt;/li&gt;
&lt;li&gt;単位は bit
&lt;ul&gt;
&lt;li&gt;起きやすい事象：情報量は小さい&lt;/li&gt;
&lt;li&gt;珍しい事象：情報量は大きい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;たとえば確率 1/2 なら 1 bit、確率 1/8 なら 3 bit&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;エントロピー
&lt;ul&gt;
&lt;li&gt;各事象の情報量を真の確率分布 $p$で平均したもの&lt;/li&gt;
&lt;li&gt;エントロピー = 平均的にどれくらい驚くか = 平均何bit必要か
$$
H(p) = -\sum_{x} p(x) \log_2 p(x)
$$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;クロスエントロピー
&lt;ul&gt;
&lt;li&gt;「真の分布は p なのに、モデルは q だと思って符号化・予測したら、平均どれだけ損をするか」&lt;/li&gt;
&lt;li&gt;なので、「単なる掛け算」というより、真の出現確率 $p(x)$ で重み付けした、モデル予測 $q(x)$ の負の対数確率の平均
$$
H(p, q) = -\sum_{x} p(x) \log_2 q(x)
$$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;単位の違い：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;log2を使う → bit&lt;/li&gt;
&lt;li&gt;ln=logeを使う → nat&lt;/li&gt;
&lt;li&gt;log10を使う → hartley&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="agcの用語"&gt;AGCの用語&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;AGC（Automatic Gain Control／自動gain制御）
&lt;ul&gt;
&lt;li&gt;入力音の大きさに合わせて、マイク音量のゲインを自動調整する仕組み&lt;/li&gt;
&lt;li&gt;声が小さいときはゲインを上げ、声が大きいときはゲインを下げる&lt;/li&gt;
&lt;li&gt;音量を一定に近づけて、ASRやVADが処理しやすい状態にする&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;アタック
&lt;ul&gt;
&lt;li&gt;大きな音が入ったとき、どれくらい速くゲインを下げるか&lt;/li&gt;
&lt;li&gt;速いほど、急な大声にもすぐ対応できる&lt;/li&gt;
&lt;li&gt;遅いと、ゲインが下がる前にクリッピングしやすい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;リリース
&lt;ul&gt;
&lt;li&gt;大きな音が終わったあと、どれくらいの速さでゲインを元に戻すか&lt;/li&gt;
&lt;li&gt;遅く戻すと、音量の変化が自然になりやすい&lt;/li&gt;
&lt;li&gt;速すぎると、音量が上下して不自然になることがある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;クリッピング
&lt;ul&gt;
&lt;li&gt;音が録音可能な上限を超え、波形の山が切れてしまうこと&lt;/li&gt;
&lt;li&gt;音割れや歪みが発生する&lt;/li&gt;
&lt;li&gt;一度クリッピングした音は、あとから完全には元に戻せない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;リミッター
&lt;ul&gt;
&lt;li&gt;音が上限を超えないよう、瞬時にゲインを下げる仕組み&lt;/li&gt;
&lt;li&gt;クリッピングを防ぐ安全装置のようなもの&lt;/li&gt;
&lt;li&gt;単純に波形を切るのではなく、上限に収まるよう音量全体を抑える&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;会話とはダンシングであり、交通整理が大事&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://qiita.com/GeneLab_999/items/1229564ffaf9779f37f5" target="_blank" rel="noopener"
&gt;[1分でわかる]Speech Enhancementってなんだ？音源分離との違いと、その概念編 #音声AI - Qiita&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://arxiv.org/html/2511.02269v1" target="_blank" rel="noopener"
&gt;Energy-Efficient Hardware Acceleration of Whisper ASR on a CGLA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/ja-jp/azure/foundry/openai/how-to/realtime-audio?tabs=keyless%2Clinux&amp;amp;pivots=ai-foundry-portal" target="_blank" rel="noopener"
&gt;Azure OpenAI で音声とオーディオに GPT Realtime API を使用する - Microsoft Foundry | Microsoft Learn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.convergence-lab.com/blog/2025-06-11-zipformer/" target="_blank" rel="noopener"
&gt;音声認識AIモデル ZipFormer - Convergence Lab.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://fast-d.hmcom.co.jp/techblog/melspectrum-mfcc/" target="_blank" rel="noopener"
&gt;音響特徴量「メルスペクトル」と「MFCC（メル周波数ケプストラム係数）」の解説と実例紹介｜お知らせ/ブログ｜「FAST-D」AI異音検知ソリューション | Hmcomm株式会社&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://acp.amivoice.com/blog/2023-03-06-094430/#%E9%9F%B3%E9%9F%BF%E3%83%A2%E3%83%87%E3%83%AB" target="_blank" rel="noopener"
&gt;音声認識の仕組みをざっくり解説！ - AmiVoice Techblog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.youtube.com/watch?v=mJiu5tWs3zo" target="_blank" rel="noopener"
&gt;エントロピーの再発明 | 圧縮と知能 Part 1 - YouTube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://utsugi-phonetics.com/phonetics_introduction/acoustic_phonetics/formant/" target="_blank" rel="noopener"
&gt;共鳴と母音のフォルマント | 音声学入門 | 発音と音声学の資料室&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://spice-of-englishgrammar.com/vowel/" target="_blank" rel="noopener"
&gt;【音声学】英語の母音の種類/分類、IPAチャートをわかりやすく解説&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>