タスク1: 通話を動かす¶
目的: 実プロバイダー (Twilio + STT + TTS + LLM) で1本の通話を完走させる。
Step 0: プロバイダーを選ぶ¶
推奨スタック (HVAC例と同じ):
- Transport: Twilio
- STT: Deepgram
- TTS: ElevenLabs
- LLM: OpenAI
理由: HVAC例はエンドツーエンドで動作確認済みのベースライン。
システムマップ¶
flowchart LR
Caller((Caller))
Transport[Transport: Twilio]
STT[STT: Deepgram]
Router[Router]
LLM[LLM: OpenAI]
TTS[TTS: ElevenLabs]
Observability[可観測性]
Caller --> Transport
Transport --> STT --> Router --> LLM --> TTS --> Transport
Transport --> Caller
Observability -.-> STT
Observability -.-> LLM
Observability -.-> TTS
Step 1: 参照設定をコピー¶
cp examples/hvac/config.yaml config.yaml
最低限必要な項目:
transports.providervendors.stt.providervendors.tts.providervendors.llm.provider
最小構成 (抜粋):
transports:
provider: twilio
settings:
account_sid: "${TWILIO_ACCOUNT_SID}"
auth_token: "${TWILIO_AUTH_TOKEN}"
public_url: "${TWILIO_PUBLIC_URL}"
vendors:
stt:
provider: deepgram
settings:
api_key: "${DEEPGRAM_API_KEY}"
model: "nova-2"
tts:
provider: elevenlabs
settings:
api_key: "${ELEVENLABS_API_KEY}"
voice_id: "${ELEVENLABS_VOICE_ID}"
llm:
provider: openai
settings:
api_key: "${OPENAI_API_KEY}"
model: "gpt-4o-mini"
Step 2: クレデンシャルを用意¶
環境変数を設定:
TWILIO_ACCOUNT_SIDTWILIO_AUTH_TOKENTWILIO_PUBLIC_URLDEEPGRAM_API_KEYELEVENLABS_API_KEYELEVENLABS_VOICE_IDOPENAI_API_KEY
TWILIO_PUBLIC_URL は公開到達可能である必要があります。ローカルならトンネル (ngrok, cloudflared) を使ってください。
Step 3: 例を実行¶
go run ./examples/hvac --config config.yaml
期待される状態:
ranya_initログに選択したproviderが表示される。- Twilio transportは
transports.settings.server_addr(デフォルト:8080) で待受。
Step 4: 電話番号をRanyaへ向ける¶
Twilio Voice webhook:
https://<public-url>/voice
RanyaはTwiMLを返し、ws_path (デフォルト /ws) にメディアストリームを開きます。
Step 5: エンドツーエンドを確認¶
以下が見えるはずです:
source=sttとis_final=trueのSTTフレーム。- LLMテキストフレーム。
- Transportへ送られるTTS音声。
タイムラインを有効化:
observability:
artifacts_dir: "examples/hvac/artifacts"
Step 6: タイムラインで高速デバッグ¶
- ログから
trace_idを取得。 artifacts_dirのJSONLを開く。- 最後の
frame_outを探し、停止したステージを修正。
よくある修正:
- inboundなし:
TWILIO_PUBLIC_URLが到達不可、またはvoice_pathが誤り。 - STTがfinalにならない: STT設定かエンコーディング不一致。
- LLMが無反応: API key不足、モデル未対応。
- TTSが無反応: voice ID不正、出力フォーマット不一致。
Related:
完了条件¶
- 通話がエンドツーエンドで完走。
- タイムラインから障害点を特定できる。
- コード変更なしでproviderを差し替えられる。