NorthNest
AI開発

n8nで作る音声チャットフロー:macOSローカル環境で完結するAI音声対話

📅 2025年9月15日
✍️ 王 家豪
#n8n
#音声認識
#SpeechToText
#TextToSpeech
#LLM
#Webhook
#ローカル開発

n8nで作る音声チャットフロー(macOSローカル環境)

本記事では、macOS上に構築した n8n(ローカル環境) を使い、

  • 音声入力
  • 音声認識(Speech-to-Text)
  • LLMによる応答生成(会話履歴考慮)
  • 音声合成(Text-to-Speech)
  • Webhook経由でブラウザに音声返却

までを すべてn8n上で完結 させる方法を解説します。

クラウドに依存せず、
プロトタイピング・個人開発・PoC用途に最適な音声チャット構成 です。

構成図


🎯 ゴール

以下を満たす「音声チャット体験」を構築します。

  1. 音声をWebhookに送信するとテキストに変換される
  2. LLMが会話履歴を考慮して自然な応答を生成する
  3. 応答を音声に変換する
  4. ブラウザ上でそのまま音声が再生される

🏗️ 全体アーキテクチャ

  1. Webhook
    音声ファイルを受信
  2. Speech-to-Text
    音声 → テキスト変換
  3. Memory Manager / Buffer Memory
    会話履歴を保持
  4. LLM(Gemini / OpenAI / Claude など)
    応答生成
  5. Text-to-Speech
    音声合成(ElevenLabs / Fish Audio / MiniMax Audio)
  6. Respond to Webhook
    音声データを返却

ローカルn8nだけで
音声 → AI → 音声 のループを実現します。


📝 構築手順

1. Webhookで音声を受け取る

使用ノード

  • Webhook

設定例

  • Path: voice_message
  • HTTP Method: POST
  • Response Mode: Response Node

動作確認(curl)

curl -X POST http://localhost:5678/webhook-test/voice_message \
  -H "Content-Type: multipart/form-data" \
  -F "voice_message=@sample.m4a"

👉 ここで Binary形式の音声ファイル がn8nに渡ります。


2. 音声をテキスト化する(Speech-to-Text)

使用ノード

  • OpenAI - Speech to Text
    ※ Whisper互換

設定

  • Resource: audio
  • Operation: transcribe
  • Binary Property Name: voice_message

ポイント:

  • 音声形式は .m4a, .wav, .mp3 が安定
  • 長時間音声は分割推奨

3. 会話履歴を管理する(Conversation Memory)

使用ノード構成

  • Get Chat(過去履歴取得)
  • Aggregate(履歴整形)
  • Insert Chat(新規保存)
  • Window Buffer Memory(履歴制限)

なぜ必要か?

  • 単発応答では「会話」にならない
  • 直近N件を渡すことで自然な対話が可能

ベストプラクティス

  • 履歴は 直近5〜10往復
  • トークン肥大化を防ぐ

4. LLMで応答を生成

使用ノード

  • Basic LLM Chain

モデル例

  • Google Gemini Chat Model
  • OpenAI GPT-4.x
  • Claude Sonnet

プロンプト設計ポイント

  • 「これまでの会話を考慮して回答してください」
  • 「簡潔かつ音声向きの表現で」

LLM設定例


5. 応答を音声に変換する(Text-to-Speech)

使用ノード

  • HTTP Request

サービス例

  • ElevenLabs API
  • Fish Audio
  • MiniMax Audio

ElevenLabs API例

POST https://api.elevenlabs.io/v1/text-to-speech/{voice_id}

Headers

{
  "Content-Type": "application/json",
  "xi-api-key": "YOUR_API_KEY"
}

Body

{
  "text": "={{ $('Basic LLM Chain').item.json.text }}"
}

👉 応答を Binary(audio) として受け取るのがポイント


6. Webhookで音声を返却する

使用ノード

  • Respond to Webhook

設定

  • Respond With: Binary
  • Binary Property: data
  • Response Content Type: audio/mpeg
  • Response Headers:
    • Content-Disposition: inline(任意)

これにより、

👉 ブラウザでWebhook URLを叩くだけで音声が再生 されます。


🔒 セキュリティ・運用の注意点

  • Webhook URLは外部公開しない
  • ngrok利用時はIP制限推奨
  • APIキーはn8n Credential管理
  • 音声ログの保存可否を明確に

✅ まとめ

本構成により、

  • 音声入力
  • 会話履歴を考慮したAI応答
  • 高品質な音声合成
  • ブラウザ即再生

n8nだけで実現 できます。

ローカル環境でも十分に「音声チャットAI体験」を構築可能です。
ぜひ、自分の声でAIと会話する環境を作ってみてください。


AI活用についてご相談ください

貴社のビジネス課題に最適なAIソリューションをご提案いたします