livekit-plugins-voho gives a LiveKit Agents voice agent a Saudi voice and Saudi ears. Your agent speaks Najdi to a Riyadh caller and Hijazi to a Jeddah one, follows a caller who switches into English mid-sentence, and answers a Saudi phone number through LiveKit SIP.
Saudi dialects
Najdi and Hijazi as separate voices, plus Omani, Gulf, Egyptian and Modern Standard Arabic.
Streaming both ways
Speech starts while the LLM is still writing. Transcripts arrive while the caller is still talking.
Saudi hosting
Point the same plugin at an in-Kingdom or on-premise Voho deployment.
Quickstart
1
Install
2
Set your keys
Create a Voho key in the console. Any LiveKit LLM plugin works; OpenAI is shown here.
3
Write the agent
agent.py
4
Talk to it
examples/agent.py.
Choosing the dialect
The voice sets the sound. The instructions set the words. Choose both.
Switch during a call, for example when a Jeddah caller reaches a Riyadh line:
What the plugin calls
Audio is 16-bit mono PCM: 24 kHz from speech synthesis, 16 kHz into transcription. LiveKit resamples for the room.
Answering a Saudi phone number
LiveKit SIP connects a phone number to a room, and your agent joins the room. The plugin does not change.1
Get a number with SIP
Saudi 9200, 800 and geographic numbers come from a Saudi carrier that offers SIP trunking. Point the trunk at your LiveKit SIP endpoint. See Phone numbers.
2
Create the inbound trunk
inbound-trunk.json
3
Dispatch each call to your agent
dispatch.json
4
Ring it
Call the number. Telephone audio is 8 kHz and LiveKit resamples it in both directions.
ctx.api.sip.create_sip_participant(...). Same plugin, same voices.
Latency
Measured from a client about 100 ms from the API, with a warm connection: an agent starts speaking a sentence 430 to 480 ms after the plugin receives it. About 200 ms of that is synthesis and the rest is the network. The plugin keeps its speech socket open between sentences and opens it when LiveKit callsprewarm(), so the first sentence of a call is no slower than the rest. A client in the same region as an in-Kingdom deployment removes most of the network share.
Pricing and usage
A two-minute customer service call is roughly 400 characters spoken by the agent and two minutes heard: about 8¢. Billing comes from a prepaid balance per account.
GET /v1/usage returns what a key used, in the units it was billed in.
Data and hosting
- Audio is not stored. Billing keeps character and minute counts only.
- The public cloud API runs in London.
- In-Kingdom and on-premise deployments use the same API and plugin, with
base_urlpointed at the deployment. See Data residency.
Errors
Voho error codes appear in the exception message, so the log says what to fix.
Client errors are not retried. Server errors, rate limits and dropped sockets are retried using LiveKit’s
APIConnectOptions.

