Status: pre-alpha. Open, local, MIT; no paid API in the default path. No model is verified yet and none is a default (calls need allow_unverified=True). The stream modules are building blocks and are not exported yet: transcribe_stream is a batch adapter with no partial transcripts, synthesize_stream is chunked playback of a finished waveform, and StreamGate is a level gate that cannot tell loud noise from speech. Nothing is measured on real phone audio. Number-word modules contributed by outside volunteers have not been reviewed by fluent speakers. No claim is made of being better than any other product; there is no such benchmark.
[0.3.0] - 2026-11-01
Status
- Still pre-alpha. Every model is
unverifiedand none is a default. The new stream modules are building blocks and are not exported yet:transcribe_streamis a batch adapter (it buffers the audio and runstranscribe()once at the end, so there are no partial transcripts),synthesize_streamis chunked playback of a finished waveform, andStreamGateis a level gate that cannot tell loud constant noise from speech. Their thresholds and limits are unmeasured. The Hindi normalizer change was written by an outside contributor and has not been reviewed by a fluent speaker.
Changed
- Hindi number normalization is now version
1+numbers-hi.2. The parser recognizes the source-attested cardinal spellingपांचalongside CLDR'sपाँच, and protects mixed cardinal/ordinal phrases (including irregular gender/case forms and regular ordinal suffix forms) from partial conversion. Hindi grouping accepts a terminal sentence comma or period only when the complete number is valid; malformed grouping remains uncombined. Unicode NFKC already maps decomposed nukta spellings such asकरोड़to the lookup spellingकरोड़. References: CLDR Hindi RBNF, Hindi ordinal numerals grammar, and Omniglot Hindi number table.
Added
ragleap_voice.audio: statefulDown2StreamandUp2Streamresamplers (process()andfinish()), so audio can be resampled chunk by chunk without the boundary errors of callingdown2()/up2()on each chunk. Tests check that chunked output equals one-shot output exactly. Still not exported, and the effect on recognition accuracy is not measured.ragleap_voice.gate:StreamGate, a frame-by-frame energy gate for streams (speech start after consecutive speech-like frames, end after a hangover or a hard cap, explicit no-speech outcome at the end of a silent stream). Standard library only, not exported. Hangover, hard cap and the consecutive-frame rule are unmeasured starting points, and like the batch gate it cannot tell loud constant noise from speech.ragleap_voice.stream:transcribe_stream()andTranscriptStream(feed,finish,cancel, event iteration withstream.started,transcript.segment,transcript.final,stream.no_speech,stream.cancelled,stream.error). A batch adapter, not incremental recognition: audio is buffered,StreamGatedecides whether speech qualified, and the engine runs once atfinish(). Bounded input, not exported, no latency measured, no partial transcripts.ragleap_voice.synth_stream:synthesize_stream()andSpeechStream: chunked playback of a finished waveform (stream.started, orderedaudio.chunk,audio.completed,stream.cancelled,stream.error). The engine synthesizes the whole utterance first; this is not incremental model generation and gives no first-audio advantage. Cancellation stops delivery between chunks. Bounded size, not exported.
Install: pip install ragleap-voice==0.3.0 (engines are optional extras, e.g. ragleap-voice[whisper]).
Package: https://pypi.org/project/ragleap-voice/0.3.0/