Engineer Quest検証、ポートフォリオ更新
- #Engineer Quest
- #ポートフォリオ
今日のまとめ
AI整形2026-10-21は合計90分取り組みました。[Engineer Quest]では75分、ブラウザ不要でローカル動作する音声AIパイプラインを検証しました。[ポートフォリオ]では15分、過去日の学習記録も入力できるように修正しました。
1. エンジニアクエストのAI検証
Engineer Quest ・ 75分2. 過去日の学習記録ができるように修正。
ポートフォリオ ・ 15分作業内容
- AI検証
- ポートフォリオ、過去日についても記録を入れられるように修正。
検証内容
Engineer Quest — Voice PoC
ローカル音声AIパイプライン 技術まとめ
2026-10-21
概要
Engineer QuestのAI技術面談・AI上司突発電話機能の検証用に構築した、 ブラウザ不要・ローカル動作の音声AIパイプライン。
参考リポジトリ proj-airi/webai-example-realtime-voice-chat(Vue/TypeScript製ブラウザアプリ)の アーキテクチャをPython CLIに移植した。 STT・TTS・LLMのすべてをローカルで完結させ、レイテンシと日本語精度を検証する。
目標 TTFA(Time To First Audio):発話終了からAI音声開始まで 0.7〜1.5秒
全体アーキテクチャ
Microphone ↓ sounddevice (16kHz / mono / float32) VAD エネルギーベース(RMS閾値) ↓ 発話区間をバッファに蓄積 → 0.8秒無音で終了判定 STT faster-whisper-server(Docker :8000) ↓ POST /v1/audio/transcriptions model: large-v3-turbo lang: ja LLM Ollama(localhost:11434) model: qwen2.5:7b ↓ Server-Sent Events ストリーミング 文章分割 。!?\n で区切り → TTSキューに投入 ↓ 最初の文が確定した時点で合成開始(全文を待たない) TTS VOICEVOX Engine(Docker :50021) ↓ POST /audio_query → POST /synthesis → WAV Speaker
使用技術スタック
| カテゴリ | 技術 | 役割 |
|---|---|---|
| Audio I/O | sounddevice | Pythonからマイク・スピーカーをlow-levelで操作 |
| VAD | RMS energy | numpy で RMS 計算、閾値超えで発話判定(PoC用簡易実装) |
| STT | faster-whisper-server | OpenAI /v1/audio/transcriptions 互換の Whisper サーバー |
| STT Model | Whisper large-v3-turbo | 日本語高精度・turboで速度改善版 |
| LLM Runtime | Ollama 0.34.2 | ローカルLLMランタイム。OpenAI API互換 |
| LLM Model | Qwen2.5 7B | 中国Alibaba製。日本語・技術語の精度が高い |
| TTS | VOICEVOX Engine | 高品質な日本語TTS。REST API経由で音声合成 |
| Container | Docker Compose | STT・TTSサービスをコンテナで管理 |
| SDK | openai (Python) | STT・LLMともにOpenAI API互換のため同一SDKで呼び出し |
| Env | uv + venv | 高速パッケージ管理・仮想環境 |
各技術の詳細
faster-whisper-server
STT サーバー(Docker)
OpenAIの /v1/audio/transcriptions と互換のREST API。 Whisper を CTranslate2 で高速化した faster-whisper をベースに構築。 音声をWAVで POST するとテキストが返る。 large-v3-turbo モデルで日本語技術用語も精度が高い。
Ollama
ローカル LLM ランタイム
localhost:11434/v1 でOpenAI API互換のエンドポイントを提供。 ollama pull qwen2.5:7b でモデルをローカルに保存。 RTX 4060でqwen2.5:7bがGPU推論可能。
VOICEVOX Engine
日本語 TTS サービス(Docker)
2段階API:① POST /audio_query でクエリ生成、 ② POST /synthesis でWAV合成。 スピーカーIDで声を切り替え。 面談AI→1(ずんだもん)、上司AI→13(青山龍星・男性)。
TTSキューイング
低レイテンシ化の工夫
LLMのストリーミングレスポンスを 。!?\n で文単位に分割し、 Pythonの queue.Queue + スレッドでTTSを非同期処理。 最初の文が確定した時点で合成を開始するため、全文生成を待たずに音声再生が始まる。
VAD(エネルギーベース)
発話区間検出
numpyで RMS = √(mean(x²)) を計算し、 閾値(0.015)超えで発話、0.8秒の無音で発話終了と判定。 本番では silero-VAD(PyTorchモデル)への置き換えを検討。
システムプロンプト設計
AI上司・面談官の振る舞い制御
シナリオJSON(hidden_info)で段階的情報開示を制御。 「質問されるまで情報を開示しない」を禁止ルールとして強調することで LLMの早期開示を抑制。
エンドポイント一覧
:8000 faster-whisper-server — POST /v1/audio/transcriptions
:11434 Ollama — POST /v1/chat/completions
:50021 VOICEVOX — POST /audio_query POST /synthesis
レイテンシ目標
STT latency
~0.4s
発話終了 → テキスト確定
LLM first token
~0.2s
ストリーム開始 → 最初トークン
TTS + 文分割
~0.5s
最初の文確定 → 音声再生開始
TTFA 目標
0.7〜1.5s
発話終了 → AI音声開始
実装のポイント
- STT・LLM・TTSをすべてOpenAI互換APIで統一 → 同じ openai SDK で呼び出せる
- DockerでSTT・TTSを分離 → Pythonの依存を最小限(重いML系ライブラリ不要)
- LLMストリーミング + 文単位TTS → 全文待ち不要で体感レイテンシを改善
- --text-only モードで音声なしでロジック検証可能
- シナリオをJSONで外部定義 → プロンプトを変えずにシナリオ差し替えが可能
次のステップ候補: silero-VAD への置き換え、 GPU版 faster-whisper(RTX 4060活用)、 Barge-in(割り込み発話)対応、 行動評価ロジック(Rubric Mapping)の実装
日付・時間・タグ・メモは本人の入力です。「今日のまとめ」のみAIが文章を整えています。