Hosokawa Lab
HomeAboutSkillsLogProjectsBlogContactLogin
Learning Log
Daily Log

Engineer Quest検証、ポートフォリオ更新

合計 90分2 sessions
  • #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が文章を整えています。