lingolix
Python client for the Lingolix pronunciation scoring API. Send a recording, get back per-syllable accuracy with expected vs. detected IPA, pitch and timing — in 17 languages.
Get an API key at lingolix.com/api-portal, then set
LINGOLIX_API_KEY in your environment. Keep it server-side — never ship it to a browser.
Install
pip install lingolix # or: uv add lingolix
Usage
from lingolix import Lingolix
with Lingolix() as client: # key from $LINGOLIX_API_KEY
r = client.check("audio.wav", sentence="Guten Morgen", language="de")
print(r.overall, r.accuracy, r.fluency, r.speaking_rate)
for word in r.words:
for s in word.syllables:
print(s.text, s.expected_ipa, "→", s.detected_ipa, s.pitch, round(s.accuracy, 2))
Async is the same class with an Async prefix:
from lingolix import AsyncLingolix
async with AsyncLingolix() as client:
r = await client.check(audio_bytes, sentence="こんにちは", language="ja")
check() takes a path, bytes, or any file-like object. Drop sentence and the audio is
transcribed first, then scored against its own transcription — useful for free-form speech.
Result shape
| Field | Meaning |
|---|---|
text |
What the audio was scored against — your sentence, or the transcription |
overall |
The score to show, 0–1: accuracy and fluency weighted as human raters weigh them |
accuracy |
How well the sounds were pronounced, 0–1 |
fluency |
Pace and pauses, 0–1; None/null when the utterance is too short to time (then overall = accuracy) |
completeness |
How much of the expected utterance was actually said, 0–1 |
speaking_rate |
Syllables (Japanese: morae) per second |
target_speaking_rate |
Pace from which fluency gets full credit (60% of a typical native pace) |
words[] |
text, accuracy, completeness, start_ms, end_ms, char_start, char_end, hesitation_ms (pause before or inside the word, else None/null) |
words[].syllables[] |
text, expected_ipa, detected_ipa, accuracy, completeness, pitch, duration_ms, start_ms, end_ms, is_missing, is_extra |
pitch is one of "high", "flat", "low", "unknown".
Errors
Every failure is a subclass of LingolixError carrying .status and .detail.
| Class | HTTP | Cause |
|---|---|---|
InvalidAudioError |
400, 413 | Undecodable audio, or over the 10 MiB limit |
AuthenticationError |
401 | Missing, malformed or unknown API key |
SubscriptionError |
403 | No active API subscription |
QuotaExceededError |
429 | Monthly quota exhausted |
ServiceUnavailableError |
503 | Scoring service temporarily down |
QuotaExceededError also carries plan, remaining_minutes, quota_percentage and
upgrade_url:
from lingolix import Lingolix, QuotaExceededError
try:
r = Lingolix().check("audio.wav", language="en")
except QuotaExceededError as e:
print(f"{e.plan} plan is out of minutes — upgrade at {e.upgrade_url}")
Languages
bg cs de el en es fi fr hu it ja ko nl pl pt sv uk — the default is ja.
Audio
Anything ffmpeg can read: WAV, MP3, M4A, OGG/Opus, FLAC, WebM. Uploads are capped at 10 MiB, checked client-side before sending. Prefer a compressed format — a single utterance is well under 1 MiB as MP3 or Opus.
Links
MIT licensed.
Metadata
Release files for lingolix 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| lingolix-0.2.0.tar.gz | 8.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| lingolix-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 15.8 kB
Release files / lingolix-0.2.0.tar.gz
| Download URL | lingolix-0.2.0.tar.gz |
|---|---|
| Size | 8.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
28e0831dd5123f97b687733c2858cc8d7af4885575ccdc7fddc2523224332b0a
|
|
BLAKE2b-256 checksum How to use checksums |
16bf581a9c8ce2df48b6161d3b1c33310c59f2e6ef330cc002570eb0b1e89c72
|
| 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 10, 2026.
Transparency logRelease files / lingolix-0.2.0-py3-none-any.whl
| Download URL | lingolix-0.2.0-py3-none-any.whl |
|---|---|
| Size | 7.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
08415be492e74f0bb1746087182448aff61eb9035baea04e790e49f70ca46ec8
|
|
BLAKE2b-256 checksum How to use checksums |
4a704435118782558c0ffa81565ea525c698c01f574c1ea7d5a501dd296619a3
|
| 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 10, 2026.
Transparency log