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

Speak Najdi to it from your terminal. Interrupt it and it stops. Say a product name in English and it keeps up.
A complete example with an order lookup tool is in the repository: examples/agent.py.

Choosing the dialect

The voice sets the sound. The instructions set the words. Choose both.
A Najdi voice given no dialect instruction reads whatever the LLM writes, and an LLM left alone writes Fusha. That sounds like a recording to a Saudi caller. Put the dialect words in the instructions.
Switch during a call, for example when a Jeddah caller reaches a Riyadh line:
See Voices and languages for the full catalog.

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
Register the worker under the same name:
4

Ring it

Call the number. Telephone audio is 8 kHz and LiveKit resamples it in both directions.
For outbound calls, create an outbound trunk and add the callee with 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 calls prewarm(), 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_url pointed 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.

Source

The plugin is open source under Apache-2.0: github.com/yar-malik/livekit-plugins-voho. Tests run against a local mock of the API with no key needed.