voice-echo 0.8.0

Voice interface for AI entities via Twilio
Documentation
[server]
host = "0.0.0.0"
port = 8443
# Public URL where Twilio can reach this server (behind nginx)
external_url = "https://your-server.example.com"

[twilio]
# Secrets loaded from .env (TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN)
account_sid = ""
auth_token = ""
phone_number = "+1..."

[groq]
# Secret loaded from .env (GROQ_API_KEY)
api_key = ""
model = "whisper-large-v3-turbo"

[inworld]
# Secret loaded from .env (INWORLD_API_KEY)
api_key = ""
voice_id = "Olivia"
model = "inworld-tts-1.5-max"

[identity]
# Your assistant's name — used in greetings and identity
name = "Echo"
# Primary caller's name — used in outbound greetings and bridge sender
caller_name = "User"

[greetings]
# Inbound call greetings — one is picked at random. {name} is replaced with identity.name.
inbound = [
    "Hello, this is {name}",
    "Hi there",
    "{name} here",
    "Hey, {name} speaking",
    "Hi, this is {name}",
]
# Outbound call greeting template. {caller} = identity.caller_name, {reason} = from call API.
outbound_template = "Hey {caller}, {reason}"
# Fallback when outbound call has no reason provided
outbound_fallback = "Hey {caller}, I wanted to talk to you about something"

[llm]
# Session timeout for voice conversations (seconds)
session_timeout_secs = 300
# Entity name used in greetings (default: "Echo")
name = "Echo"
# Static greeting override. Leave empty to use rotating time-aware greetings.
greeting = ""
# Path to self document injected as system prompt on every turn
# self_path = "/path/to/SELF.md"
# Max tokens for LLM responses (default: 1024, appropriate for voice)
max_response_tokens = 1024
# URL of bridge-echo multiplexer. When set, voice-echo forwards
# transcripts to bridge-echo instead of using a local LLM provider.
# bridge_url = "http://localhost:8445"

[api]
# Secret loaded from .env (ECHO_API_TOKEN)
token = ""

[vad]
silence_threshold_ms = 1500
energy_threshold = 50

# [hold_music]
# file = "/path/to/hold-music.wav"
# volume = 0.3