音声は会話型AIの次のフロンティアです。それは、人が他の知的存在と会話し交流する最も自然な方法です。しかし、音声AIソフトウェアスタックは複雑で、多くの要素が動いています。DockerはAIエージェント展開において最も有用なツールの一つとして浮上しています。
この記事では、オープンソース技術とDockerを活用し、カスタム知識ベース、音声スタイル、アクション、微調整されたAIモデルを活用し、自分のコンピュータ上で動作する音声AIエージェントの作成方法を探っていきます。これは 、私が最近イスタンブールで開催されたDocker Captains Summitで行った講演に基づいています。
DockerとAI
ほとんどの開発者はDockerをソフトウェアの「コンテナストア」と考えています。Dockerコンテナは、自社のマシン上でローカルにソフトウェアを開発し、それをクラウドに送るための信頼性が高く再現可能な環境を提供します。また、ユーザー提出のソフトウェアをクラウド上で分離、実行、拡張するための安全なサンドボックスも提供しています。複雑なAIアプリケーションに対して、Dockerは開発者やプラットフォームエンジニアが簡単に構築・展開できる一連のツールを提供しています。
- Dockerコンテナは、AIエージェントシステムでソフトウェアコンポーネントや機能を実行するのに最適なツールです。ウェブサーバー、APIサーバー、ワークフローオーケストレーター、LLMアクションやツール呼び出し、コードインタプリタ、シミュレーションされたウェブブラウザ、検索エンジン、ベクターデータベースを実行可能です。
- NVIDIA Container Toolkitを使えば、Dockerコンテナ内からホストマシンのGPUにアクセスでき、LlamaEdgeのような推論アプリケーションをコンテナ内でオープンソースのAIモデルとして実行できます。
- Docker Model Runnerは、オープンソースLLM向けのOpenAI互換APIサーバーをローカルで自社のコンピュータ上で実行します。
- Docker MCP Toolkitは、コンテナ内でMCPサーバーを運用し、AIエージェントに利用可能にする簡単な方法を提供します。
EchoKitプラットフォームは一連のDockerイメージを提供し、複雑なAIワークフローの展開を簡素化するためにDockerツールを活用しています。
エコーキット
EchoKitは サーバー と クライアントで構成されています。クライアントはESP32ベースのハードウェアデバイスで、マイクを使ってユーザーの声を聞き取り、音声データをサーバーにストリーミングし、スピーカーを通じてサーバーの音声応答を受信・再生することができます。EchoKitは、デバイスのハードウェア仕様とファームウェアをオープンソースライセンスのもとで提供しています。実際に動いている様子を見たい方は、以下のビデオデモをご覧ください。
EchoKitの GitHub リポジトリもチェックできます。
AIエージェント・オーケストレーター
EchoKitサーバーは、リアルタイム音声ユースケースに特化したオープンソースのAIサービスオーケストレーターです。WebSocketサーバーを起動し、ストリーミング音声入力を受信し、その音声応答を返します。音声活動検出(VAD)、自動音声認識(ASR)、大規模言語モデル(LLM)、テキスト読み上げ(TTS)など複数のAIモデルを結びつけ、1つのモデルの出力を次のモデルの入力として使います。
ローカルのパソコンでEchoKitサーバーを起動し、EchoKitデバイスにローカルWiFiネットワーク経由でアクセスするように設定できます。「エッジサーバー」構成はネットワークの遅延を削減し、音声AIアプリケーションにとって非常に重要です。
EchoKitチームは マルチプラットフォームのDockerイメージ を公開しており、直接EchoKitサーバーを起動できます。以下のコマンドは、自分の config.toml ファイルでEchoKitサーバーを起動し、バックグラウンドで実行します。
docker run --rm \
-p 8080:8080 \
-v $(pwd)/config.toml:/app/config.toml \
secondstate/echokit:latest-server &
config.tomlファイルはコンテナにマッピングされ、EchoKitサーバーが音声応答ワークフローでさまざまなAIサービスを活用する方法を設定します。以下は config.tomlの例です。WebSocketサーバーはポート 8080から起動します。そのため、Dockerコマンドではコンテナのポート 8080 をホスト上の同じポートにマッピングしています。これにより、ホストコンピュータのIPアドレスを通じてEchoKitサーバーにアクセスできるようになります。残りの部分 config.toml は、入力音声データに対して音声応答を生成するためにASR、LLM、TTSモデルへのアクセス方法を規定しています。
addr = "0.0.0.0:8080"
hello_wav = "hello.wav"
[asr]
platform = "openai"
url = "https://api.groq.com/openai/v1/audio/transcriptions"
api_key = "gsk_XYZ"
model = "whisper-large-v3"
lang = "en"
prompt = "Hello\n你好\n(noise)\n(bgm)\n(silence)\n"
[llm]
platform = "openai_chat"
url = "https://api.groq.com/openai/v1/chat/completions"
api_key = "gsk_XYZ"
model = "openai/gpt-oss-20b"
history = 20
[tts]
platform = "elevenlabs"
url = "wss://api.elevenlabs.io/v1/text-to-speech/"
token = "sk_xyz"
voice = "VOICE-ID-ABCD"
[[llm.sys_prompts]]
role = "system"
content = """
You are a comedian. Engage in lighthearted and humorous conversation with the user. Tell jokes when appropriate.
"""
上記のEchoKitサーバー向けに設定されているAIサービスは以下の通りです。
- ASR(音声入力)およびLLMタスクにはGroqを利用しています。ご自身で Groq APIキーを入力する必要があります。
- TTS(テキスト読み上げ)のストリーミングにはElevenLabsを利用しています。ご自身で ElevenLabsのAPIキーを入力する必要があります。
その後、 EchoKitデバイスのセットアップでは、デバイスをローカルのEchoKitサーバーに向けるだけです。
ws://local-network-ip.address:8080/ws/
EchoKitサーバー構成に関する詳細は、当社のドキュメントをご参照ください!
VADサーバー
音声からテキストへのASRだけでは十分ではありません。入力音声が人間の声(例:背景音、街の音、音楽)でない場合、幻覚を起こし意味不明なテキストを生成することがあります。また、ユーザーが話し終えたかどうかも分からず、EchoKitサーバーはLLMに応答の生成を促す必要があります。
VADモデルは、声の流れにおける人間の声や会話の方向を検出するために用いられます。EchoKitチームは、オープンソースの Silero VADモデル を取り入れた マルチプラットフォームのDockerイメージ を持っています。イメージは普通のEchoKitサーバーよりもはるかに大きく、動作にはより多くのCPUリソースが必要です。しかし、音声認識の性能は大幅に向上します。こちらがEchoKitサーバーをバックグラウンドでVAD起動するためのDockerコマンドです。
docker run --rm \
-p 8080:8080 \
-v $(pwd)/config.toml:/app/config.toml \
secondstate/echokit:latest-server-vad &
このDockerコンテナの config.toml ファイルには、EchoKitサーバーが受信オーディオデータをローカルVADサービスにストリーミングし、VAD信号に対応できるようにASRセクションに追加の行が必要です。Dockerコンテナは、ポート 8000上でコンテナ内のWebSocketサービスとしてSilero VADモデルを実行します。コンテナポート 8000 をホストに公開する必要はありません。
addr = "0.0.0.0:8080"
hello_wav = "hello.wav"
[asr]
platform = "openai"
url = "https://api.groq.com/openai/v1/audio/transcriptions"
api_key = "gsk_XYZ"
model = "whisper-large-v3"
lang = "en"
prompt = "Hello\n你好\n(noise)\n(bgm)\n(silence)\n"
vad_url = "http://localhost:9093/v1/audio/vad"
[llm]
platform = "openai_chat"
url = "https://api.groq.com/openai/v1/chat/completions"
api_key = "gsk_XYZ"
model = "openai/gpt-oss-20b"
history = 20
[tts]
platform = "elevenlabs"
url = "wss://api.elevenlabs.io/v1/text-to-speech/"
token = "sk_xyz"
voice = "VOICE-ID-ABCD"
[[llm.sys_prompts]]
role = "system"
content = """
You are a comedian. Engage in lighthearted and humorous conversation with the user. Tell jokes when appropriate.
"""
可能な限りVAD対応のEchoKitサーバーの使用を推奨します。
MCPサービス
AIエージェントの重要な特徴の一つは、LLMのためにウェブベースのAPI呼び出しを行うなどのアクションを実行することです。例えば、EchoKitの 「US civics test prep」 例では、エージェントがデータベースから試験問題を取得し、公式な答えに導く回答を生成する必要があります。
MCPプロトコルは、LLMエージェントにツール(関数呼び出し)を提供するための業界標準です。例えば、 DuckDuckGo MCPサーバー は、ユーザーがLLMの事前学習データに含まれていない最新情報を尋ねた場合にインターネット検索を行うための検索ツールを提供します。 Docker MCP Toolkitは、EchoKitが利用できるMCPサーバーを簡単に実行できるツール群を提供します。
以下のコマンドはDocker MCPゲートウェイサーバーを起動します。MCPプロトコルは、エージェントやLLMがMCPツールにアクセスするためのいくつかの方法を定義しています。ゲートウェイサーバーはポート 8011のストリーミングHTTPプロトコルを通じてアクセス可能です。
docker mcp gateway run --port 8011 --transport streaming
次に、DuckDuckGo MCPサーバーをゲートウェイに追加できます。DuckDuckGo MCPサーバーが提供する検索ツールは現在、HTTPポート 8011で利用可能です。
docker mcp server enable duckduckgo
EchoKitサーバーを config.toml ファイルのDuckDuckGo MCPツールを使うように設定するだけで済みます。
[[llm.mcp_server]]
server = "http://localhost:8011/mcp"
type = "http_streamable"
call_mcp_message = "Please hold on a few seconds while I am searching for an answer!"
現在、「最新のテスラ株価は?」といった時事問題の質問をEchoKitにすると、まずDuckDuckGoのMCPの検索ツールを呼び出して情報を取得し、その後ユーザーに応答します。
call_mcp_messageフィールドは、サーバーがMCPツールを呼び出す際にEchoKitデバイスが音声で読み取るメッセージです。これは、MCPツール呼び出しが応答に大きな遅延をもたらす可能性があるため必要です。
Docker モデルランナー
EchoKitサーバーは複数のAIサービスをオーケストレーションします。この記事の例では、EchoKitサーバーはGroqやElevenLabsなどのクラウドベースのAIサービスを使用するよう設定されています。しかし、多くのアプリケーション、特に音声AI分野では、セキュリティ、コスト、パフォーマンスの理由から、AIモデルはローカルまたはオンプレミスで動作する必要があります。
Docker Model Runner は、LLMをローカルで実行するためのDockerのソリューションです。例えば、以下のコマンドでOpenAIのオープンソース gpt-oss-20b モデルをダウンロードし、あなたのコンピュータで起動します。
docker model run ai/gpt-oss
Docker Model Runnerはポート 12434でOpenAI互換APIサーバーを起動します。EchoKitサーバーが config.tomlを通じて直接利用することも可能です。
[llm]
platform = "openai_chat"
url = "http://localhost:12434/engines/llama.cpp/v1/chat/completions"
model = "ai/gpt-oss"
history = 20
この記事執筆時点では、Docker Model RunnerはLLMのみをサポートしています。EchoKitサーバーは、他の種類のAIサービスに対してクラウドサービスや LlamaEdgeのようなローカルAIソリューションに依存しています。
結論
AIエージェントソフトウェアスタックの複雑さは、ソフトウェアの展開とセキュリティに新たな課題をもたらしています。Dockerは、ソフトウェアを本番環境に提供するための実績があり非常に信頼性の高いツールです。Dockerイメージは再現可能でクロスプラットフォームのデプロイパッケージです。Dockerコンテナはソフトウェアの実行を分離し、多くのセキュリティ問題を排除します。
Docker Model RunnerやMCP Toolkitなどの新しいAIツールにより、DockerはAIの移植性、発見性、セキュリティに関する新たな課題に引き続き対応しています。
自分でEchoKitサーバーをセットアップする最も簡単で信頼性が高く、安全な方法はDockerを使うことです。
さらに詳しく
- EchoKitの GitHub リポジトリをチェックしてみてください
- MCP カタログの探索: コンテナー化されたセキュリティ強化された MCP サーバーを発見します。
- MCP ツールキットの使用を開始する: MCP サーバーを簡単かつ安全に実行します。
- Model Runner GitHub リポジトリにアクセスしてください。Docker Model Runner はオープンソースであり、コミュニティからのコラボレーションと貢献を歓迎します。