RagLeap
ragleap-voice · release notes

ragleap-voice v0.3.0

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 unverified and none is a default. The new stream modules are building blocks and are not exported yet: transcribe_stream is a batch adapter (it buffers the audio and runs transcribe() once at the end, so there are no partial transcripts), synthesize_stream is chunked playback of a finished waveform, and StreamGate is 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: stateful Down2Stream and Up2Stream resamplers (process() and finish()), so audio can be resampled chunk by chunk without the boundary errors of calling down2()/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() and TranscriptStream (feed, finish, cancel, event iteration with stream.started, transcript.segment, transcript.final, stream.no_speech, stream.cancelled, stream.error). A batch adapter, not incremental recognition: audio is buffered, StreamGate decides whether speech qualified, and the engine runs once at finish(). Bounded input, not exported, no latency measured, no partial transcripts.
  • ragleap_voice.synth_stream: synthesize_stream() and SpeechStream: chunked playback of a finished waveform (stream.started, ordered audio.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/

View on GitHub Package page All releases
← v0.2.0v0.3.1 →

Release notes mirrored from GitHub Releases.