Repository navigation
Releases: alkove-ai/alkove
Release list
0.3.3
Every package is built from this commit, on the same Rust core: for the same 16 kHz audio, the same output to the bit in the browser, in Python and on Android.
| Package | Version |
|---|---|
alkove on npm |
0.3.3 |
alkove on PyPI |
0.3.3 |
livekit-plugins-alkove |
1.0.0 |
pipecat-alkove |
1.0.0 |
ai.alkove:alkove and ai.alkove:alkove-livekit on maven.alkove.ai |
0.3.3 |
Models unchanged: huggingface.co/alkove-ai, at the revisions 0.2 already pinned. Docs: alkove.ai/docs.
Wideband sound gives the same outputs to the bit as 0.3.2; only a stream empty above 4 kHz changes.
- Phone audio (#1): a stream with nothing above 4 kHz, as a phone line at 8 kHz leaves it, gets a faint noise up there, -45 dBFS, before Focus and before Cue. The two models never heard such an empty band and lost the voice. The stream itself tells: the power from 4.6 kHz up, averaged in dB over a second of sound, under -78 dB of the total (phone lines -87 at most, wideband sound -71 at least). Wideband sound is the same to the bit: the digests do not move. On 384 phrases through G.711, G.726, G.723.1 and Opus at 8 kHz, with another voice in the gaps, the chain missed 328 to 365 of them in 0.3.2 and misses 0 to 2 now,
nearincluded, as Pipecat's filter then VAD; iLBC 383 to 8. livekit-plugins-alkove1.0.0 andpipecat-alkove1.0.0, onalkove>=0.3.3,<0.4.
Pipecat plugin 1.0.0
pipecat-alkove 1.0.0 on PyPI, on alkove>=0.3.3,<0.4.
See integrations/pipecat.
LiveKit plugin 1.0.0
livekit-plugins-alkove 1.0.0 on PyPI, on alkove>=0.3.3,<0.4.
See integrations/livekit.
Wyoming server 0.1.0
wyoming-alkove 0.1.0 on PyPI, on alkove>=0.3.2,<0.4.
See integrations/wyoming.
ESPHome component 0.1.0
Alkove Spot for ESPHome 0.1.0 (preview): typed wake words on the ESP32-S3, in place of micro_wake_word. The component downloads these files itself and checks them against bundle.json.
See integrations/esphome.
Claude Code mod 0.1.0
The Claude Code mod and its binary, 0.1.0. Install:
/plugin install voice-commands --marketplace alkove-ai/alkove
0.3.2
Every package is built from this commit, on the same Rust core: for the same 16 kHz audio, the same output to the bit in the browser, in Python and on Android.
| Package | Version |
|---|---|
alkove on npm |
0.3.2 |
alkove on PyPI |
0.3.2 |
livekit-plugins-alkove |
0.3.2 |
pipecat-alkove |
0.3.2 |
ai.alkove:alkove and ai.alkove:alkove-livekit on maven.alkove.ai |
0.3.2 |
Models unchanged: huggingface.co/alkove-ai, at the revisions 0.2 already pinned. Docs: alkove.ai/docs.
Every package moves to 0.3.2 together; the core is unchanged, the same outputs to the bit as 0.3.1.
livekit-plugins-alkove, as in its pull request tolivekit/agents. Focus keeps one stream per sample rate: LiveKit sends the pre-connect audio through the same processor as the live track, which reset it in mid-phrase. Focus and the VAD refuse models without theirs when they are built, not on every frame. The VAD's start of speech keeps its whole prefix whateverstart_secs(from 1 s on, it was cut); a speech longer thanmax_buffered_speechkeeps its start and warns once, as Silero does (it kept its end); a frame at another rate is refused with an error, as Silero does;min_silence_durationfollowsspeech.stop_secs; the audio is no longer copied whole on every frame.alkove.Timbreandalkove.Voiceprintcome with the plugin.
0.3.1
Every package is built from this commit, on the same Rust core: for the same 16 kHz audio, the same output to the bit in the browser, in Python and on Android.
| Package | Version |
|---|---|
alkove on npm |
0.3.1 |
alkove on PyPI |
0.3.1 |
livekit-plugins-alkove |
0.3.1 |
pipecat-alkove |
0.3.1 |
ai.alkove:alkove and ai.alkove:alkove-livekit on maven.alkove.ai |
0.3.1 |
Models unchanged: huggingface.co/alkove-ai, at the revisions 0.2 already pinned. Docs: alkove.ai/docs. The LiveKit and Pipecat plugins now need alkove>=0.3.1.
- The gain before Focus brings a quiet microphone up to about -30 dBFS on its loud moments, no longer -20: a microphone at a speaking level gets none. In 0.3.0, AMI's headsets got about 5 dB, and the other voices came through Focus twice as often (1.19 to 2.26 words a minute on the 134 windows of the model card); another voice alone came out 1.8 dB louder (-7.76 to -5.95 dB). Every number of the model card is back: AMI, another voice, VoiceBank+DEMAND (the same to the bit) and DNS. A quiet microphone still comes up: AMI's headsets brought down to -50 to -60 dBFS keep within 4 s as much speech as at -30, where 0.2 kept almost none at -55 and -60. Two of the three digests 0.3.0 moved are back.
0.3.0
Every package is built from this commit, on the same Rust core: for the same 16 kHz audio, the same output to the bit in the browser, in Python and on Android.
| Package | Version |
|---|---|
alkove on npm |
0.3.0 |
alkove on PyPI |
0.3.0 |
livekit-plugins-alkove |
0.3.0 |
pipecat-alkove |
0.3.0 |
ai.alkove:alkove and ai.alkove:alkove-livekit on maven.alkove.ai |
0.3.0 |
Models unchanged: huggingface.co/alkove-ai, at the revisions 0.2 already pinned. Docs: alkove.ai/docs.
Every package moves to 0.3 together (npm, Python and its LiveKit and Pipecat plugins, Android): the same core. One default changes an output: a quiet microphone gets a gain before Focus.
Voices far from the microphone, mute and hold to talk
nearon the agent and call inputs: a voice 10 dB under the session's main voice (near: { gapDb }to change it) opens no phrase and comes as the diagspeech.far, without any voiceprint. The session's voice is the median of its last phrases within the gap of the loudest. A far voice right after the user ends the phrase on the user's last near frame; the leveling, a call's gate and a print's learning follow the near voice.levels, implied bynear:speechendandutterancecarry the phrase'slevel(voiceDb, Focus's output before the leveling;noiseDb;refDb, the session's voice).input.listen(on): off drops the phrase under way (the new eventspeechcancel) and every phrase until it is on again.input.hold()andinput.release(): a phrase between the two whatever Cue hears, its utterance sent once Focus has given the last samples; withnear, the far voices it holds are silenced.- Off by default: every output is the same to the bit.
- A quiet microphone is brought up before Focus, which takes a voice under about -45 dBFS for noise: at most 24 dB, rising 4 dB a second, from the loudest hops of the last 10 s of loud ones, so a silence never raises it; exactly none at a normal level. Phrase levels stay those the microphone gave. On by default: on the test streams, only their quiet passages move (three digests); Python's
ChainandLivegiveinput_gain_db. input.ready: resolves once the models run; a failed try rejects the calls waiting on it (the load's code,engine.failed) and a later call waits for the SDK's next try; without SIMD (browser.unsupported) or once disposed, it rejects at once.listen(),hold()andrelease()called before the models run apply once they do, and again after a crash.- A
warndiag nobody listens to, on an input or onAlkove.onDiag, goes to the console once per code. - Raw for 2 s on a microphone the SDK opened: the browser's noise suppression and gain control come back on, and go off once the models run (
mic.browser). Chrome keeps a live track's processing: the SDK opens the microphone again there.
Python and Android
The same options and events: Chain and Live take levels and near and give set_listen, hold, release and input_gain_db (Python), setListen, hold, release and inputGainDb (Kotlin); Android's AgentOptions takes levels and near, and AgentInput gives listen, hold and release, with Event.SpeechCancel and a PhraseLevel on Event.SpeechEnd and Event.Utterance. alkove.NEAR_GAP_DB and Alkove.NEAR_GAP_DB are 10 dB.
0.2.0
All four packages are built from this commit, on the same Rust core: for the same 16 kHz audio, the same output to the bit in the browser and in Python.
| Package | Version |
|---|---|
alkove on npm |
0.2.0 |
alkove on PyPI |
0.2.0, first release |
livekit-plugins-alkove |
0.2.0, first release |
pipecat-alkove |
0.2.0, first release |
Models: huggingface.co/alkove-ai, at the revisions this version pins. Docs: alkove.ai/docs.
The web library (npm)
The SDK runs on Alkove's own engine instead of onnxruntime. Breaking: stored prints and words must be made again.
- The models are
.alkfiles (alkove-focus-1-preview.alk, …) instead of.onnx. Same weights: the outputs differ from the ONNX ones by less than 10⁻⁴. - The engine is
alkove-engine.wasm, 134 KB brotli instead of 1.5 MB, and gives the same result to the bit in every browser. - The chain (Focus, Cue, level, gate), Spot's search, compiling and enrolling words, Lex's beam search, Timbre's prints and learning, and the inputs' own rules (learning windows, verified wakes, utterances) run in Alkove's core, in Rust inside
alkove-engine.wasm: the same outputs and events to the bit, shared with the Python package. An input'sutterancenow comes as soon as the speech ends, not with the next batch of events. - A print's learning paces itself on the audio's clock (one window every 1.5 s, then every 10 s), not on the wall clock: the same under load as without.
- Lex reads a word once, then gives one phoneme per call, keeping what it computed for each beam: a word takes about 5 ms instead of 75 (WebAssembly, Apple M1 Max). Same pronunciations.
- Focus is 4 % faster and takes half the memory per input.
- The SDK's own math (word scores, levels, fades, resampling, voiceprint thresholds) no longer goes through
Math.exp,Math.log,Math.sinor**, whose last digit varies between browsers: the same audio gives the same events, to the bit, in Chrome, Firefox and Safari. Alkove.configure({ models: { ort } })becomesmodels: { engine }.- Self-hosting: run
npx alkove models <dir>again. The.onnxfiles andalkove-ort.wasmcan go; your CSP stays the same. - Prints and words are bound to the model file's hash, which changed:
Voiceprint.fromJSON()returnsnullfor a print made by 0.1, and a word compiled or enrolled with 0.1 throwsword.outdated. Learn prints again, compile or enroll words again. - Spot's default thresholds for typed words, measured again on the engine: fr −1.26, en −1.22, es −1.18, it −1.02, pt −1.41, other languages −1.21 (were −1.23, −1.21, −1.14, −1.01, −1.39, −1.17); ca and ro unchanged.
- Spot keeps the input's clock when its words change, when it starts on a running input (
input.spot()), and for a second enrollment on the same input: wakes and takes are dated on the stream, and their audio is cut from the right place. In 0.1 their times started again from 0. - Options the engine cannot follow throw a
RangeErrorinstead of stopping the worker: an outputrateoutside 1 to 768 kHz,keepRecentorrecord()past 600 seconds. THIRD_PARTY_LICENSESis gone with onnxruntime.