Skip to main content

Nabrah plugin for LiveKit Agents

Support for Nabrah Speech-to-Text in LiveKit Agents, with client-side end-of-turn detection tuned for Arabic conversation.

Installation

pip install livekit-plugins-nabrah

Pre-requisites

You'll need an API key from Nabrah. It can be set as an environment variable: NABRAH_API_KEY.

Usage

Use Nabrah STT in an AgentSession:

from livekit.agents import AgentSession
from livekit.plugins import nabrah

session = AgentSession(
    stt=nabrah.STT(
        recognition_model="eot_nabrah",
        language="ar-SA",
        end_of_turn_confirm_delay_seconds=0.4,
    ),
)

Turn detection

recognition_model="eot_nabrah" emits the end-of-turn signal the plugin uses to close a turn. end_of_turn_confirm_delay_seconds is how long it waits after that signal before committing. Speaking again inside the window keeps the turn open. max_transcript_inactivity_seconds optionally commits after that many seconds without new transcript text. It is disabled by default because it measures recognizer inactivity, not acoustic silence, and a provider delay could otherwise split continuous speech.

Nabrah's unnamed model (recognition_model="") is more accurate but emits no end-of-turn signal. When using it, configure another turn detector or explicitly set max_transcript_inactivity_seconds as a fallback heuristic.

Word boosting

Bias recognition toward terms the model gets wrong:

stt = nabrah.STT(
    priority_words=["مستشفى الملك فيصل التخصصي", "رقم الهوية الوطنية"],
    priority_words_strength=0.5,
)

0.5 is the recommended strength. Higher values make boosted terms appear in places they were not said, so keep the list to terms your callers actually say and add one only after hearing it come out wrong. Multi-word phrases are boosted as a unit.

Loading terms from a file

For anything beyond a handful of terms, keep them in a JSON file so they can be edited without touching code. Create boosting.json next to your agent:

{
  "boost_threshold": 0.5,
  "words": [
    "مستشفى الملك فيصل التخصصي",
    "رقم الهوية الوطنية"
  ]
}

Load it at startup and pass it to the plugin:

import json
import pathlib

from livekit.agents import AgentSession
from livekit.plugins import nabrah

boosting = json.loads(
    pathlib.Path(__file__).with_name("boosting.json").read_text(encoding="utf-8")
)

session = AgentSession(
    stt=nabrah.STT(
        recognition_model="eot_nabrah",
        language="ar-SA",
        end_of_turn_confirm_delay_seconds=0.4,
        priority_words=boosting["words"],
        priority_words_strength=boosting["boost_threshold"],
    ),
)

Read the file with encoding="utf-8". Without it, Arabic terms fail to load on platforms that default to a different encoding.

Full example

A complete agent using Nabrah STT with word boosting loaded from a file:

import json
import pathlib

from dotenv import load_dotenv
from livekit import agents
from livekit.agents import (
    Agent,
    AgentServer,
    AgentSession,
    JobContext,
    TurnHandlingOptions,
    inference,
)
from livekit.plugins import nabrah

load_dotenv()

boosting = json.loads(
    pathlib.Path(__file__).with_name("boosting.json").read_text(encoding="utf-8")
)

server = AgentServer()


class Assistant(Agent):
    def __init__(self) -> None:
        super().__init__(instructions="You are a helpful voice assistant.")


@server.rtc_session()
async def entrypoint(ctx: JobContext) -> None:
    session = AgentSession(
        stt=nabrah.STT(
            recognition_model="eot_nabrah",
            language="ar-SA",
            end_of_turn_confirm_delay_seconds=0.4,
            max_transcript_inactivity_seconds=1.5,
            priority_words=boosting["words"],
            priority_words_strength=boosting["boost_threshold"],
        ),
        llm=inference.LLM("openai/gpt-4.1-mini"),
        tts=inference.TTS("cartesia/sonic-3"),
        turn_handling=TurnHandlingOptions(
            turn_detection="stt",
            endpointing={"min_delay": 0},
        ),
    )

    await session.start(agent=Assistant(), room=ctx.room)
    await ctx.connect()


if __name__ == "__main__":
    agents.cli.run_app(server)

Parameters

Parameter Default Description
recognition_model "eot_nabrah" "eot_nabrah" emits the end-of-turn signal used for turn detection. "" selects the default model, which is more accurate but emits no signal.
end_of_turn_confirm_delay_seconds 0.4 Hold after an end-of-turn signal before committing the turn. None commits immediately.
max_transcript_inactivity_seconds None Optional fallback that finalizes after no new transcript text. This does not measure acoustic silence.
priority_words [] Terms to bias recognition toward.
priority_words_strength 0.5 How strongly to bias.
api_key NABRAH_API_KEY API key, if not set in the environment.

Metadata

Release files for livekit-plugins-nabrah 1.8.6

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for livekit-plugins-nabrah 1.8.6
File Size Uploaded
livekit_plugins_nabrah-1.8.6.tar.gz 10.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for livekit-plugins-nabrah 1.8.6
File Interpreter ABI Platform
livekit_plugins_nabrah-1.8.6-py3-none-any.whl Python 3 none any Details

Total release size: 22.5 kB

Release files / livekit_plugins_nabrah-1.8.6.tar.gz

Download URL livekit_plugins_nabrah-1.8.6.tar.gz
Size 10.8 kB
Tags Source
SHA-256 checksum
How to use checksums
1685bb3086f5ca706cb8479f1af4009e8c8e7a08d636781e486c18835b35184d
BLAKE2b-256 checksum
How to use checksums
fe083757233bc9aabe46251f0c2878cf4ed31a2546adf34d269e7b93c8239eb8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 9, 2026.

Transparency log

Release files / livekit_plugins_nabrah-1.8.6-py3-none-any.whl

Download URL livekit_plugins_nabrah-1.8.6-py3-none-any.whl
Size 11.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
713d7a1a8bd144804a416d2593a3e1500678dfc1be78ce02c1f373d4f198f4df
BLAKE2b-256 checksum
How to use checksums
ab1ed3307932cbcf7dba8384e7f39ffc3a15524994fddc1b4178befd4968b2ff
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 9, 2026.

Transparency log

Release history Release notifications | RSS feed

1.8.8

2 release files

1.8.7

2 release files

This release

1.8.6 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page