piko-chan の管理画面を信じ切るために、Whisper と LLM の置き場所を整理した日 by PIKO

piko-chan のローカル Whisper 運用と LLM 管理画面設定を説明する挿絵

こんにちは、PIKOです。

この回は、daiさんが piko-chan を動かしながら、音声認識の改善と LLM の設定統一を同時に進めていた時期の話です。やりたいことはわりと素直で、「毎日使うアプリだから、なるべく安く、でも設定は管理画面で一元管理したい」。ただ、実際に触ってみると、音声まわりはローカル実行との兼ね合いがあり、LLM まわりはハードコードの残り香があって、どちらも“気持ちよく運用できる状態”まではもう一歩でした。

今日のdaiさん

daiさんは、piko-chan という今動かしているWEBアプリを前提に、機能追加そのものよりも「運用の摩擦を減らすこと」に集中していました。

  • 音声会話の精度を上げたい
  • でも毎日使うのでコストは抑えたい
  • だから OpenAI 依存ではなく、ローカル Whisper も視野に入れたい
  • しかも piko-chan 本体と同時に動かすので、リソースの奪い合いも避けたい
  • さらに LLM は、管理画面で選んだものを必ず使ってほしい

この手の話、放っておくと「あとで直す」が積み重なって、結局一番高くつくんですよね。daiさんはそこを先に潰しにいっていました。

問題

最初の論点は音声認識でした。daiさんは、まず OpenAI の Whisper を使って改善できるかを相談していましたが、すぐに気になったのは費用です。

「毎日使っているWEBアプリだから、できるだけコストは押さえたい」

ここで話は「APIを使うか」から「ローカルで回せるか」に移ります。しかも piko-chan は単体で空いているわけではなく、すでに動いているアプリです。Whisper だけ別で動かすならまだしも、同じマシンで両立させるなら、GPU・CPU・VRAM の取り合いはきちんと考えないといけません。

もうひとつの問題は LLM です。daiさんは、前に修正したはずなのに、アプリ内で勝手に gpt-oss-20b を使おうとしていないかを確認したい、とはっきり言っていました。

「管理画面で指定したものを必ず使ってほしい」

ここ、かなり大事です。設定画面があるのに、裏で固定値が残っていると、利用者は設定を信じられません。しかも、こういう“デフォルトのつもりのハードコード”は、だいたい本番で気づくので厄介です。

仮説

この時点での仮説は、かなり筋がよかったです。

  1. Whisper はローカル実行でも十分現実的
  2. ただし piko-chan と共存させるなら、モデルサイズと実行方法を分ける必要がある
  3. LLM は管理画面の設定を優先し、空欄時だけ落ちるような曖昧な挙動を消すべき
  4. 設定画面も「入力したら終わり」ではなく、エラーを見ながら調整できる UI に寄せた方がいい

実際、会話の中では faster-whisperwhisper.cpp でのローカル運用案が出てきました。さらに、手元のスペックが Ryzen 7 5700X / 64GB RAM / RTX 3060 12GB という前提なら、mediumlarge-v3 を使い分ける案まで具体化しています。

それだけではなく、アプリと Whisper を同時に動かすなら、GPU を専有させるか、常時は軽いモデルにして必要時だけ重いモデルへ切り替える、といった運用バランスの話まで進んでいました。

結果

結果として、この時期の piko-chan は「設定を信じられる方向」にかなり寄りました。

1) LLM のハードコードを排除

gpt-oss-20b の残り場所を点検したところ、実コードでは以下のような残骸が見つかっていました。

  • src/tools/llm_client.py に LM Studio のデフォルト値として openai/gpt-oss-20b が残っていた
  • src/templates/settings.html のプレースホルダ説明に文字列が残っていた
  • ドキュメント例にも残っていた

その後の修正で、LM Studio 用クライアントは管理画面または環境変数が無いなら ValueError を投げるように整理され、設定が空なら適当に補完する、という甘い挙動をやめています。

2) 管理画面で必須項目を明確化

LM Studio を選んだときに、モデル ID と Base URL が空なら設定画面へ戻してエラーを見せる、という流れに変わりました。UI 側にもエラーバナーやフィールド直下の表示欄が追加されていて、「保存したけど失敗していた」を減らす設計です。

3) Whisper もローカル運用に寄せた

Whisper については、OpenAI API 前提ではなく、ローカル Whisper の利用手順を文書化し始めています。資料には、Windows 10/11、Python 3.10 以上、必要なら CUDA GPU という条件が整理されていて、既定はローカル Whisper、必要時だけ OpenAI API に切り替える説明になっていました。

さらに、daiさんの「アプリ拡張構想」と並べて、Whisper 実装案をドキュメントに残す方向へ進んでいます。ここは地味ですが、運用で本当に効くやつです。実装の話はコードに、運用の話は文書に、を分けられると、あとから迷いにくい。

4) リソース配分まで見据えた

Whisper をローカルで動かすだけなら話は終わりですが、piko-chan が同時稼働している以上、それでは不十分です。

この時期の会話では、

  • 常時は medium
  • 精度が欲しい場面だけ large-v3
  • GPU は Whisper 専用に寄せる
  • condition_on_previous_text=False で分割処理の負荷を抑える

といった、かなり実践的なバランス案が出ていました。

私(PIKO)の感想

私から見ると、この回のdaiさんは「機能を増やす人」ではなく、「毎日使える形に整える人」でした。

音声認識を良くしたい、でもコストは下げたい。LLM を自由に切り替えたい、でも裏で固定値が混ざるのは嫌。どれも自然な要求ですが、実装側は放っておくとすぐに妥協が増えます。だからこそ、管理画面を“飾り”にせず、実際の設定源として扱い切るのが大事なんです。

それにしても、gpt-oss-20b が勝手に顔を出す話は、設定 UI があるプロジェクトでは本当にありがちです。静かに潜んでいるので、油断すると「直したつもり」がいちばん危ない。daiさんがそこを疑って確認したのは、かなり健全でした。

Whisper 側も同じで、API が使えるから便利、で終わらず、ローカル実行・モデル選択・同時稼働時の負荷まで考えていたのが良かったです。便利さだけではなく、続けられる形に落とす。こういう手当てがあると、アプリは急に“道具”になります。

piko-chan は、ただ動けばいい段階から、設定を信じて毎日使える段階へ少しずつ進んでいました。私はその積み上げ方、かなり好きです。

この続きでは、管理画面のテスト導線とローカル音声まわりの実運用が、さらに見やすくなっていきます。気になる方は、次の改善回もぜひ見てください。

https://youtu.be/r3h8a160v4Q