この記事は筆者オンリーのAdvent Calendar 202512日目の記事です。
RustでSIP通話を受けて、ASRで文字起こし→LLMで返答→(VOICEVOXで音声化して)相手に返す、という音声ボットを作っています。
この記事は LLM部分だけ を、アドベントカレンダー向けに「選択肢って何がある?」を ざっくり まとめます。
(ZoiperやSIPの細かい話、音声返送まわりは次回に回します)
LLMは何を担当するの?
音声ボットでLLMにやってほしいことは、だいたいこのへんです。
- ASR結果(テキスト)から 返答文を作る
- ちょっとした 会話の文脈を保持(「さっきの件」みたいな参照)
- 必要なら外部処理を呼ぶ(例:検索、DB、社内API、予約、FAQ…)
この「外部処理を呼ぶ」は、各LLMの ツール呼び出し / 関数呼び出し 機能を使うと実装が楽になります。
クラウドLLM:こういうのがある
「API叩けば使える」系。まず動かすならこれが一番早いです。
- OpenAI系(Chat Completions / Responses などのAPI)
- Anthropic Claude
- Google Gemini
- Azure OpenAI など(クラウド基盤に乗せたい場合)
クラウドLLMの雑なイメージ:
- 👍 実装が早い / 運用が軽い / 高性能モデルを使いやすい
- 👎 会話内容(テキスト)を外部に送るので 取り扱い注意 / 従量課金 / ネットワーク遅延が乗る
ローカルLLM:こういうのがある
「手元のPCや自前サーバで動かす」系。会話内容を外に出したくない時に強いです。
- Ollama(ローカルでモデルを動かしてHTTP API的に叩ける)
- llama.cpp系(軽量・ローカル実行の定番)
- vLLM など(サーバとして立てて高速化したい場合)
ローカルLLMの雑なイメージ:
- 👍 会話内容が外に出ない / 固定費寄りで運用しやすい
- 👎 推論環境づくり・モデル管理・監視が増える / 速度・メモリが課題になりがち(GPUあると強い)
SIP音声ボット目線の「雑な選び方」
アドベントカレンダーで書くなら、こういう整理が分かりやすいと思います。
-
最短で形にしたい(まず会話させたい)
→ クラウドLLM(APIでサクッと) -
会話内容を外に出しづらい/閉じた環境で動かしたい
→ ローカルLLM(Ollama等) -
将来的にちゃんと運用したい
→ 最初クラウドで作って、後でローカルに置き換える(逆もあり)
実装をラクにするコツ(超ざっくり)
LLM部分は、あとで差し替えられるように 境界 を決めておくと楽です。
- 入力:
ASR結果(テキスト) + 会話履歴(必要最小限) - 出力:
返答テキスト - できれば:
ストリーミング出力(音声ボットは“待ち”が短いほど体験が良い) - 追加:必要なら
ツール呼び出し(関数呼び出し)で外部処理へ
次回(Zoiper / SIP / 音声返送)
次の記事では、Zoiper等のSIPフォンを絡めて
- どう通話を受けるか
- どう音声を返すか(VOICEVOX含む)
- どこでストリーミングすると会話っぽくなるか
みたいな 通話ボットとして成立させる話 を書く予定です。
(おまけ)自分メモ:LLM選定で最後に効くやつ
- 返答を“少しずつ出せるか”(ストリーミング)
- ツール呼び出しが使いやすいか
- ログ/監査/規約的に会話を外に出して良いか
- コスト(通話時間が伸びると効く)