31.【音声生成AI設計】音声AIをFSMで分解する|発話・無音・割り込みはすべて状態だった
tags: [“音声生成AI”, “FSM”, “設計思想”, “制御構造”, “生成AI”]
🧩【音声生成AI設計】音声AIをFSMで分解する
―― 🔄 発話・無音・割り込みはすべて状態だった
前回の記事(30)では、
🎧 音声生成AIは生成問題ではなく制御問題である
という結論を出した。
今回はそれを一段掘り下げ、
音声AIをFSM(有限状態機械)として完全に分解する。
🎯 本記事の目的
- 音声AIの挙動を「感覚」ではなく 状態で捉える
- 壊れるポイントを 状態遷移の欠落として明示する
- 次回(音を出す回)のための 設計土台を固める
👉 まだ音は出さない。
出す前に、壊れない骨組みを作る。
❌ よくある失敗構造(FSM不在)
多くの音声AIは、暗黙的にこう扱われている。
- 喋っている
- たぶん聞いている
- なんとなく待っている
これは 状態を定義していない のと同じ。
結果として:
- 無限発話
- 無音フリーズ
- 割り込み即死
が起きる。
🧠 音声AIは「状態の塊」
音声AIの挙動は、すべて次の問いに分解できる。
- 今、何をしているのか?
- いつ次に進んでいいのか?
- 何が起きたら中断するのか?
👉 これに答えるのが FSM。
📦 最小FSM構成(まずはこれだけ)
音声AIの最小構成FSMは、以下で足りる。
🧩 States(状態)
-
💤 Idle
待機状態(何もしていない) -
👂 Listening
音声入力を受けている -
🧠 Thinking
発話内容を準備している(LLM等) -
🔊 Speaking
音声を出力している -
✋ Interrupted
割り込みが発生した -
🚨 Error / Fallback
例外・失敗処理
🔄 状態遷移の全体像
💤 Idle
│ (音声入力開始)
▼
👂 Listening
│ (入力終了)
▼
🧠 Thinking
│ (生成完了)
▼
🔊 Speaking
│ (発話完了)
▼
💤 Idle
🔊 Speaking
│ (人が喋る)
▼
✋ Interrupted
│ (処理決定)
├──▶ 👂 Listening
└──▶ 💤 Idle
全状態
│ (例外)
▼
🚨 Error / Fallback
👉 音声AIの挙動は、これでほぼ尽きる。
⚠️ 重要:FSMは「音声の外側」にある
よくある誤解:
- ❌ 音声エンジンが状態を持つ
- ❌ LLMが会話状態を管理する
正解は:
🧩 FSMが音声・LLMの外側に立つ
FSMは、
- 音声入力を「いつ有効にするか」
- 音声出力を「いつ止めるか」
- LLMを「いつ呼ぶか」
を 強制的に管理する。
🤖 LLMが関与してよい状態・ダメな状態
⭕ LLMを使ってよい
- 🧠 Thinking
→ 発話内容の生成のみ
❌ LLMを使ってはいけない
- 🔊 Speaking(リアルタイム制御)
- 👂 Listening(割り込み判断)
- ✋ Interrupted(即時判断)
👉
時間制約のある状態にLLMを入れると壊れる。
🧊 「無音」はバグではない
無音フリーズはよくあるが、
FSM的には単なる 状態未定義。
- Speaking が終わったのか?
- Thinking が終わっていないのか?
- Idle に戻るべきなのか?
👉 遷移条件を書いていないだけ。
🧩 FSM化の最大のメリット
- 振る舞いが予測できる
- 失敗しても戻り先がある
- デバッグが可能になる
- 音を出す前に設計検証できる
これは モデル性能とは無関係。
🧩 FSM可視化デモ
音声AIをFSMとして分解した状態遷移を、
画面上で確認できる簡易デモを用意しました。
▶ デモ
https://samizo-aitl.github.io/qiita-articles/demos/audio-fsm-visual/
本デモは音を出さず、
状態と遷移の構造理解に特化しています。
📌 まとめ
- 🎧 音声AIの正体は状態遷移機械
- 🧩 FSMを書かない音声AIは必ず壊れる
- 🤖 LLMは Thinking 状態だけ担当する
- ✋ 割り込み・無音は「例外」ではない
- 🏗 音を出す前にFSMを完成させるべき
🔜 次の記事(32)
- 🔊 FSMに最小の音声出力を接続する
- 🎚 「自然さ」を捨てた最小実装
- 🧪 壊れないことを優先した音声AI
次は ちゃんと音が出る。
ただし、FSMの言うことを聞く音だけ。
(GitHub上のMarkdownを正本とし、Qiitaには抜粋・調整して投稿)