Releases: Mo3he/Axis-Whisper
Release list
Whisper Subtitles 1.9.4
Whisper Subtitles 1.9.4
Packages whisper.cpp 1.9.4.
Upstream changes
https://github.com/ggml-org/whisper.cpp/releases/tag/v1.9.4
Changes
- Update to upstream 1.9.4.
Packages
Install the signed_*.eap matching your device architecture.
Full changelog: v1.9.3...v1.9.4
Whisper Subtitles 1.9.3
Whisper Subtitles 1.9.3
Packages whisper.cpp 1.9.3.
Upstream changes
https://github.com/ggml-org/whisper.cpp/releases/tag/v1.9.3
Changes
- Update to upstream 1.9.3.
Packages
Install the signed_*.eap matching your device architecture.
Full changelog: v0.2.11-Signed...v1.9.3
Whisper Subtitles 0.2.11 (Signed)
These .eap packages are signed with the Axis ACAP signing service and install
normally on AXIS OS 12.10 and later.
Upgrading from an earlier version
Because the signing vendor changed, installing over a previously installed
unsigned version can fail with "Couldn't install: app". The device log
shows:
Vendor ID in manifest does not match the vendor ID of the previous version
To upgrade: back up your app configuration, uninstall the existing app,
then install this signed version.
Whisper Subtitles 0.2.11
- Fix: set
runModetorespawn(was incorrectly set tonever, preventing the app from auto-starting)
Whisper Subtitles 0.2.10
Refines audio input selection from 0.2.9.
Some devices expose several raw input nodes (AudioDevice0Input0.Unprocessed and AudioDevice0Input0.Uncompressed) alongside the plain, fully processed AudioDevice0Input0. The app now ranks any dotted-suffix variant below the plain input, so the processed microphone is always preferred.
The Local audio input (AudioInput) setting is now ranking-aware: entering a name that matches several nodes still prefers the processed one, while entering a specific variant name (e.g. Unprocessed) selects exactly that node. This setting applies at startup, so use Save & restart app for it to take effect.
Verified on-device: auto-select binds the processed input; forcing AudioInput=Unprocessed binds the unprocessed node; clearing it returns to the processed input.
Whisper Subtitles 0.2.9
Follow-up to 0.2.8: prefer the processed microphone over the raw unprocessed input.
Axis devices expose both a processed AudioDevice0Input0 node (with the device's gain/AGC) and a raw AudioDevice0Input0.Unprocessed node. 0.2.8 bound whichever real source appeared first, which was often the unprocessed one - too quiet for the speech detector, so no transcriptions appeared.
The app now ranks sources and binds the processed microphone first, falling back to the unprocessed node and then the silent dummy only if nothing better exists. Verified on-device: a device that bound the unprocessed node (silent) now binds the processed mic and transcribes.
Whisper Subtitles 0.2.8
Fixes local microphone capture on Axis devices with a built-in mic.
PipeWire on Axis devices exposes a silent dummy-source node alongside the real microphone. The app bound whichever source appeared first — usually the dummy — so local capture produced silence and no captions on affected devices.
- The app now logs every audio source it sees, skips the dummy and binds a real microphone (falling back to the dummy only if no real source appears).
- New Local audio input (
AudioInput) setting to pick a specific input by name on devices with more than one microphone (leave empty to auto-select).
Verified on-device: a device that previously captured only silence now binds its real mic and transcribes speech correctly.
Whisper Subtitles 0.2.7
Runs on Axis devices without a video pipeline or a local microphone (for example recorders such as the AXIS S3008), and keeps its Settings page working on devices that do not serve VAPIX param.cgi.
Runs on more devices
libaxoverlay,libcairoandlibpipewire-0.3are now loaded at runtime and treated as optional, so the app no longer crashes at startup withcannot open shared object fileon devices that lack the video or local-audio stack.- On such devices the app transcribes remote audio and publishes to the HTTP API and MQTT. Burned-in subtitles are shown only where a video overlay exists; local mic capture is used only where PipeWire is present.
- The app now stays running and keeps serving its Settings page when no audio source is configured yet, so you can point it at a remote audio source and restart.
App-stored settings
- Settings are stored in the app's own data directory and served through an admin-only endpoint, so the Settings page works even on devices without
param.cgi. - Passwords are never returned to the browser and are only changed when you enter a new value (leave blank to keep the current one).
Verified on-device: an S3008 recorder (Settings load/save with no param.cgi), a camera using local PipeWire mic capture, and a camera using remote audio with the on-video overlay.
Whisper Subtitles 0.2.5
Fixes a startup crash on Axis devices without a video pipeline.
Previously the app hard-linked libaxoverlay.so.1 and failed at loader time on devices with no video/overlay support:
error while loading shared libraries: libaxoverlay.so.1: cannot open shared object file
Now libaxoverlay is loaded at runtime (dlopen) and treated as optional. On devices without the overlay stack the app still starts and transcribes audio (local or remote), publishing to the HTTP API and MQTT; burned-in on-stream subtitles are skipped. On devices with video, subtitle rendering is unchanged.
Verified on-device: builds clean, libaxoverlay is no longer a required (NEEDED) dependency, and 0.2.5 starts, loads the model, connects remote audio and serves the API with no overlay errors.
Whisper Subtitles 0.2.4
Fix undefined symbol: g_string_free_and_steal crash on older Axis firmware.
The app was built against GLib 2.76+, whose g_string_free(s, FALSE) macro emits a reference to g_string_free_and_steal(). That symbol is absent in the older GLib shipped on some firmware, so the app failed at startup with a symbol lookup error. The call now bypasses the macro and uses the real g_string_free() function, restoring backward compatibility.
Still unverified (carried over from 0.2.3): MQTT-over-TLS end-to-end; long soak.