Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

OVOS Number Parser

Convert numbers between digits and spoken words, in 40 languages, with one small dependency-light library.

   "twenty twenty three"  ⇄  2023  ⇄  "two thousand, twenty three"

ovos-number-parser goes both ways:

  • words → digits — turn spoken-form text into numbers (extract_number, numbers_to_digits). Ideal for ASR post-processing / inverse text normalization and numeric entity extraction.
  • digits → words — turn numbers into natural spoken text (pronounce_number, pronounce_ordinal, pronounce_fraction). Ideal for TTS normalization before synthesis.

It ships as part of the OpenVoiceOS voice stack, but it is plain Python with no assistant dependencies — every example below runs after a single pip install, with no voice assistant involved.

Install

pip install ovos-number-parser
# or, with uv:
uv pip install ovos-number-parser

30-second quickstart

from ovos_number_parser import (pronounce_number, pronounce_ordinal,
                                 extract_number, numbers_to_digits,
                                 is_fractional, is_ordinal)

# digits -> words
pronounce_number(3.5, "en")               # 'three point five'
pronounce_number(2023, "en")              # 'two thousand, twenty three'
pronounce_ordinal(21, "en")               # 'twenty-first'

# words -> digits
extract_number("three point five liters", "en")          # 3.5
extract_number("dos mil veintitrés", "es")               # 2023
numbers_to_digits("set a timer for five minutes", "en")  # 'set a timer for 5 minutes'

# classification helpers
is_fractional("half", "en")               # 0.5
is_ordinal("third", "en")                 # 3

# no number in the text -> False
extract_number("hello world", "en")       # False

Pass a different language code and the same calls work — see the matrix for the 40 supported languages.

What it's good for (beyond voice assistants)

The library is a standalone text/number utility. Four common uses, each with a runnable script in examples/:

1. ASR post-processing / inverse text normalization

Speech-to-text emits numbers as words; most downstream systems want digits.

from ovos_number_parser import numbers_to_digits, extract_number

numbers_to_digits("i need twenty three of them", "en")   # 'i need 23 of them'
extract_number("three point five liters", "en")          # 3.5

examples/asr_itn.py

2. TTS normalization

Expand numbers into words before synthesis so the voice reads them naturally ("one thousand..." instead of "one-two-three-four dot five six").

from ovos_number_parser import pronounce_number

pronounce_number(1234.56, "en", places=2)
# 'one thousand, two hundred and thirty four point five six'
pronounce_number(-3.5, "en")               # 'minus three point five'

examples/tts_normalization.py

3. Numeric entity extraction (NER)

Pull cardinal, ordinal and fractional mentions out of free text without an ML model.

from ovos_number_parser import extract_number, is_fractional, is_ordinal

extract_number("shipped in three boxes", "en")   # 3
is_ordinal("second", "en")                        # 2
is_fractional("quarter", "en")                    # 0.25

examples/ner.py

4. Multilingual round-trips

The same two functions cover 40 languages, with dialect prefixes (pt-BR, pt-PTpt).

examples/multilingual.py

In an OVOS skill vs. standalone

The API is identical; only where you get the language code differs.

# Standalone Python — you pass the language yourself
from ovos_number_parser import extract_number
n = extract_number(text, "en")

# Inside an OVOS skill — the framework already knows the session language
class MySkill(OVOSSkill):
    def handle_intent(self, message):
        n = extract_number(message.data["utterance"], self.lang)

Supported languages

40 languages. Every language supports every public function: where a language has no hand-written implementation for a given function, a documented generic fallback fills in (unicode-rbnf for pronunciation, reverse-lookup for the rest — see Full function parity), so the call always returns a sensible result rather than raising.

  • Y — dedicated hand-written implementation
  • · — supported via the documented generic fallback
Code Language pronounce_number pronounce_ordinal extract_number numbers_to_digits is_fractional is_ordinal
ar Arabic Y Y Y · Y Y
an Aragonese Y Y Y Y Y Y
ast Asturian Y Y Y Y Y Y
az Azerbaijani Y · Y Y Y ·
eu Basque Y Y Y · Y Y
bg Bulgarian Y · Y Y Y ·
ca Catalan Y · Y Y Y ·
hr Croatian Y Y Y Y Y ·
cs Czech Y Y Y Y Y ·
da Danish Y Y Y Y Y Y
nl Dutch Y Y Y Y Y ·
en English Y · Y Y Y Y
et Estonian Y Y Y · Y Y
fi Finnish Y Y Y · Y Y
fr French Y · Y · Y ·
gl Galician Y Y Y Y Y Y
de German Y Y Y Y Y Y
el Greek Y Y Y · Y Y
he Hebrew Y Y Y · Y Y
hu Hungarian Y Y Y · Y Y
id Indonesian Y Y Y Y Y ·
it Italian Y · Y · Y ·
kab Kabyle Y Y Y · Y Y
ms Malay Y Y Y Y Y ·
mwl Mirandese Y Y Y Y Y Y
nb Norwegian Bokmål Y Y Y Y Y Y
nn Norwegian Nynorsk Y Y Y Y Y Y
oc Occitan Y Y Y Y Y Y
fa Persian Y Y Y · Y ·
pl Polish Y Y Y Y Y ·
pt Portuguese Y Y Y Y Y Y
ro Romanian Y Y Y Y Y Y
ru Russian Y · Y Y Y ·
sk Slovak Y Y Y Y Y ·
sl Slovenian Y · Y · Y Y
es Spanish Y · Y Y Y ·
sv Swedish Y Y Y · Y ·
tr Turkish Y Y Y Y Y ·
uk Ukrainian Y Y Y Y Y ·
fy West Frisian Y Y Y Y Y ·

Language-specific behaviour (compound-word splitting, vigesimal counting, grammatical gender, declensions, script handling) is documented in docs/languages.md.

Grammatical gender

Languages whose numerals inflect accept a gender argument:

from ovos_number_parser import pronounce_number
from ovos_number_parser.util import GrammaticalGender

pronounce_number(2, "pt", gender=GrammaticalGender.FEMININE)  # 'duas'

Documentation

Related projects

License

Apache License 2.0.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ovos_number_parser-0.18.10a1.tar.gz (346.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ovos_number_parser-0.18.10a1-py3-none-any.whl (284.8 kB view details)

Uploaded Python 3

File details

Details for the file ovos_number_parser-0.18.10a1.tar.gz.

File metadata

  • Download URL: ovos_number_parser-0.18.10a1.tar.gz
  • Upload date:
  • Size: 346.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for ovos_number_parser-0.18.10a1.tar.gz
Algorithm Hash digest
SHA256 4e9ea1bbdf148593394fc4f0f26a8d906e118081aaa76482748871747adf8c4d
MD5 71f1a6dddeac811356ff65b06303171a
BLAKE2b-256 0b9a858d8bef60aa8d7f29fe680c3db5eb8976c972cc6fa9013272aadf4dd994

See more details on using hashes here.

File details

Details for the file ovos_number_parser-0.18.10a1-py3-none-any.whl.

File metadata

File hashes

Hashes for ovos_number_parser-0.18.10a1-py3-none-any.whl
Algorithm Hash digest
SHA256 15f573cdef7b79a65f884dcb58ee4961bfafb01ecc0bd23950560718b2e25e5a
MD5 37d46ddaf15b4e6f3cc386cd1922de56
BLAKE2b-256 3f25c95359698962584c9a1e45c910ecc193e5be90b8ea9c69dbb979322bb562

See more details on using hashes here.

Release history Release notifications | RSS feed

0.19.13

2 files

0.19.7

2 files

This release

0.18.10a1 This release

2 files

0.5.1

2 files

0.4.2

2 files

0.4.0

2 files

0.3.2

2 files

0.3.1

2 files

0.0.2

2 files

0.0.1

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page