Speech out — version history
Text-to-speech with the voices installed on the workstation, sentence by sentence and word by word, with no third-party service or API key. Introduced in 3.0.
4.0 — October 2026 #
New #
- Abbreviations: a built-in list per language (
Mr.,Dr.,e.g.,M.,z.B.…) no longer ends the sentence, andof_add_abbreviation/of_clear_abbreviationsadd your own. - Two pronunciation tags:
[mark=name], which raises the newue_mark(as_name)event when the voice reaches it, and[rate=150]…[/rate], which changes the rate of a passage. of_is_paused(): true while reading is paused.- A sentence of more than 250 characters without punctuation is split into readable pieces; if the speech engine stops answering on a sentence, reading moves on to the next one instead of waiting forever.
Fixed #
ii_rate,ii_pitch,ii_volume,is_langandis_voicechanged during reading apply to the next sentence, as documented (they were only taken at the next reading).ue_startedis raised when the voice actually starts speaking, and reports the language really read (fr-FRwhenfr-CAhas no voice); a pause set right afterof_speakholds: nothing is said or announced beforeof_resume.ue_voice_fallbackis also raised when only the region is missing (fr-CAasked,fr-FRvoice); language tags are compared without case, andfr_FRequalsfr-FR.- A pause set while the voice list is still loading is no longer lost; pausing also stops the current-word tracking and the position.
of_is_speaking()returnstrueright afterof_speak, even before the voice list has arrived.- A
[pause=ms]silence no longer makes a sentence be spoken twice, and a[pause=ms]at the end of the text is honoured beforeue_stopped. - A
[spell]…[/spell]that contains a period (an e-mail address, a version number) no longer ends the sentence, and no longer sticks to the next word. of_sentence_count()andof_count()count the text as it is set, no longer the text of the previous reading.of_voice_used,of_durationandof_spoken_textanswer with the settings you have just set.of_pick_voice("", gender)picks withinis_lang, and a failure keepsis_voiceand fillsis_last_error.- Two quick
of_speakcalls, or new text set during reading, no longer leave the voice stuck or raiseue_startedtwice; a late event from an abandoned reading no longer drives the next one. - A script error in the voice's page raises
ue_error("script error: …")instead of staying silent. of_pause,of_resumeandof_clear_queueno longer create the voice for nothing: they return0and create nothing.
Behavior changes #
See the 3.0 → 4.0 migration guide, sections 11.3, 11.10, 11.34 and 11.43.
of_speak_frombeyond the last sentence returns-5and lets the current reading go on (it used to cut it and return0).- Every reading that started ends with
ue_stopped, even when cut by a newof_speakor byof_close; destroying the object no longer raises any — callof_close()in the window'scloseevent if yourue_stoppedmust act on closing. il_timeout_ms = 0means no limit (24 hours at most); it used to cut synchronous reading after 5 s.of_speak_synccalled from an event raised during anotherof_speak_syncis refused:-4andis_last_error = "already speaking synchronously".- A voice that could not be created (WebView2 runtime missing) makes the methods return
-2instead of-1, and-4when the page did not answer. - Sentence numbers in
ue_sentencemay differ from one version to the next (abbreviations, long sentences split): take them from the event. of_countreturns along, as on every component.- A runtime error in your events reaches
SystemErrorinstead of being swallowed.
3.0 — September 2026 #
New #
- First release: a text read sentence by sentence with the workstation's voices,
ue_sentencefor the current sentence andue_wordfor the current word (karaoke-style highlighting),of_spoken_textto display what the voice really reads. - Settings
is_lang,is_voice,ii_rate,ii_pitch,ii_volume;of_voices,of_languagesandof_voice_usedto know what the workstation can say;of_pick_voicepicks a voice by language and gender;ue_voice_fallbackwhen the requested language has no voice. - Control:
of_speak,of_speak_from,of_pause,of_resume,of_stop; a queue that never cuts (of_enqueue,of_clear_queue,of_queue_count,ue_queue_done). - Synchronous reading with
of_speak_sync, which returns at the end and is cut beyondil_timeout_ms. - Pronunciation:
[pause=ms],[spell]…[/spell],[say-as=digits|characters]tags and a replacement dictionary (of_add_replacement). - Estimated duration, position and progress (
of_duration,of_position,of_progress), which learn each voice's real rate. - Events delivered on their own, with no timer or receiver to wire;
n_pbt_utils.of_speech_languagesandof_speech_voiceslist the available languages and voices before the object is created.