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.7

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.7
File Size Uploaded
livekit_plugins_nabrah-1.8.7.tar.gz 10.8 kB Details

Built distribution (wheel)

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

Total release size: 22.5 kB

Release files / livekit_plugins_nabrah-1.8.7.tar.gz

Download URL livekit_plugins_nabrah-1.8.7.tar.gz
Size 10.8 kB
Tags Source
SHA-256 checksum
How to use checksums
3c3891f1a932eeab746b12bf0eae42d86d463891edadd4bb74bc93ab08e9fb97
BLAKE2b-256 checksum
How to use checksums
025aad841d07856dee382ea8f45f37d485fac601aef9057b3b323f358c4aea81
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 14, 2026.

Transparency log

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

Download URL livekit_plugins_nabrah-1.8.7-py3-none-any.whl
Size 11.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
ebd54ec4b8ba7cf422c8c6a5a023e4617dc81c4366fd4bcd034af99efca56b8c
BLAKE2b-256 checksum
How to use checksums
489e54f5e1c993a1363ff2b6fe8a040d86dc068e914e997ee747f1dbcf49df97
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 14, 2026.

Transparency log

Release history Release notifications | RSS feed

1.8.8

2 release files

This release

1.8.7 This release

2 release files

1.8.6

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