Skip to content

Ito v1.1.0: text in, speech out on the chip

Latest

Choose a tag to compare

@danivs10 danivs10 released this 05 Nov 04:24
· 13 commits to main since this release

Ito now speaks English text on the chip. Give the ESP32-S3 a line of text (text Good morning! on its serial console, or a phrase list stored in flash) and it normalizes it, phonemizes it with a port of espeak-ng 1.52.0 and synthesizes it, with no computer in the loop. esp32/tools/say.py (phonemize on a computer, send ids) still works as the host alternative.

Measured on silicon (one ESP32-S3-DevKitC-1 N16R8 rev v0.2, 4 and 5 November 2026, a different board from the v1.0.0 measurements; female voice, full split, int4 set; details and commands in esp32/FRONTEND.md, table in esp32/README.md section 4d)

  • Token ids from the chip equal the Python front end's for 2004 of 2004 texts; the chip's PCM equals the host C engine's for 1661 of 1661 utterances.
  • Front end alone: median 6.8 ms, p99 36 ms, max 58.5 ms per utterance.
  • Text -> first 125 ms audio chunk computed: median 188.8 ms, max 199.2 ms over 36 texts of 5 to 247 words (183 ms median for 500 short texts); row-split fallback 240 to 250 ms. Long first sentences (over about 20 words) take 203 to 285 ms.
  • Stand-alone run with nothing on the serial port: 240 unseen texts, 748 utterances, 5448 s of audio, all ids and PCM identical to the host, 0 underruns, RTF 0.654. 20-boot reset loop and 1200 hostile inputs: no crash, hang or leak.

Not measured / caveats: no DAC, amplifier or I2S output was used and nothing was listened to (the timings are "audio computed", not "audio heard"); one board, powered over USB from a Mac, so no battery run, no cold power-up from zero volts and no true unplug; female voice only for the text path; English (en-us) only; one line of at most 4 KB per text, utterances limited to 2400 bytes and 400 tokens. Please send us your boot log and numbers.

What is in this release

  • ito_app_frontend_merged.bin: the prebuilt firmware with the on-chip front end (1,013,744 bytes, ESP-IDF 5.5.1), flash at 0x0. This is now the default of esp32/tools/flash.sh. No model weights: the weights come from the gated Hugging Face repository and go to 0x200000 / 0x680000 / 0xB00000 (esp32/tools/fetch_weights.sh, flash.sh). The older ito_app_merged.bin of v1.0.0 (phoneme ids only) remains in esp32/prebuilt/ and on the v1.0.0 release.
  • New partitions texts (0xF80000) and results (0xFA0000) for the stand-alone test mode (CONFIG_ITOFS_AUTOTEST, not in the prebuilt); the weight offsets are unchanged.
  • sha256 of ito_app_frontend_merged.bin: 9ef9553900aaaeadb522dfe41fc2816aecf2ac41cf9c2a35eb76a40c41f19eff

Licence

  • Code: GPLv3. The on-chip front end contains espeak-ng 1.52.0 and ucd-tools (GPLv3 or later, by their own authors; see NOTICE, esp32/frontend/espeak/COPYING, PORT.md), which Lokutor cannot relicense; a commercial firmware leaves it out (CONFIG_ITOFS_FRONTEND=n) or complies with the GPL for that part.
  • Weights: CC BY-NC-SA 4.0 plus terms (non-commercial), gated download at https://huggingface.co/lokutor-ai/ito. Free for hobby, research and education; contact@lokutor.com for commercial use.

Listen: https://lokutor-ai.github.io/ito/ . Limits as in v1.0.0: English only, two voices, listening-test results from a single listener who is an author, no independent reproduction yet; a paper is in preparation and not yet published.