Releases: erikRepo/trango
Releases · erikRepo/trango
Release list
v0.1.54
Added
- Hebrew sentences' word-analysis pronunciation is now derived from a real niqud (vowel-point) diacritization model instead of Ollama's own unreliable guess (e.g. שכב "shkach" -> "sha-khav") — automatic (detected from script, no setting for which sentences), with graceful fallback to Ollama's own guess for whichever words can't be reconciled with niqud's (e.g. no model configured, or it fails to load). New
crates/niqud:contains_hebrewgates the pipeline,niqud_to_pronunciationdeterministically converts niqud text into a hyphenated Latin guide,tokenizer.rs/decode.rsreimplement the niqud model's tokenizer and output reconstruction directly (notokenizerscrate needed — confirmed to be character-level despite its WordPiece format), andOnnxNiqudClientruns the model viaort(ONNX Runtime bindings) with no subprocess/Python involved. Configured via Settings' new "Hebrew niqud model (.onnx)" field; seedocs/src/usage/word-analysis.mdfor installing the model anddocs/src/developer/technology/ort.md. The required ONNX Runtime library needs no manual setup either: the.debpackage now depends on Ubuntu/Debian'slibonnxruntime1.23, and trango finds it in the usual system library locations on its own — noORT_DYLIB_PATHor other environment variable needed. Model loading also runs with a bounded timeout at startup, so an incompatible/broken ONNX Runtime install can no longer hang the whole app - Settings screen: a gear icon in the top bar opens a dialog showing and editing every
config.tomlsetting in one place — video folder, audio monitor source, and audio recording folder are plain text fields that save immediately; whisper model, Ollama model, target language, and the Hebrew niqud model reopen the same pickers/field already used elsewhere in the app.audio_monitor_sourcepreviously had no UI at all and required hand-editingconfig.toml. The Hebrew niqud model row started as a plain text field but was switched to an in-app folder picker (same chrome as the whisper/Ollama model rows) after a relative path silently failed to resolve depending on trango's working directory at launch — the picker always saves an absolute one. Picking a new niqud model shows "Restart TrangoPlayer to use this model", since the pick only takes effect on the next launch, not live - Word analysis now breaks Hebrew's single-letter prefix particles (ו/ה/ב/כ/ל/מ/ש, e.g. לסרטים = ל "to" + סרטים "movies", written attached with no space) into a "parts" translation breakdown shown as a small second line in the Ctrl+A popup (e.g. "ל = to · סרטים = movies") — while
word/pronunciationstay as the whole combined form, matching how it's actually pronounced together in speech (an earlier version split such words into separate top-level entries, which got both of those wrong). Since small local Ollama models don't reliably follow this even when asked, a word Ollama still splits despite it is merged back onto niqud's own whitespace-delimited word boundaries (niqud never splits a fused word) before it's ever shown or cached, so the popup always shows one row per actually-spoken word regardless of how Ollama split it internally - Audio source's placeholder panel now always shows which folder a new recording will be saved to ("Saving to: …"), kept in sync with the Settings screen's audio-recording-folder field
- Starting a recording (Ctrl+Space/Rec) into a folder that doesn't exist now surfaces "Recording folder does not exist: …" in the Audio panel instead of silently failing —
ffmpeg's own error was previously discarded (Stdio::null()), so a missing folder looked like the shortcut/button did nothing
Changed
- "Analyze all sentences" now retries a cue up to 3 times before giving up on it, instead of giving up after a single failed Ollama call — covers a transient hiccup (e.g. a model occasionally dropping a field from its JSON reply) without needing to rerun an otherwise-long batch. A cue that still fails after all retries is saved with an empty analysis rather than left out of the cache entirely, so the run moves on and isn't retried again on every future run
- Word analysis for Hebrew sentences now runs niqud's whitespace-based word split before asking Ollama anything, and hands Ollama that fixed word list to fill in translations for, instead of letting Ollama split the sentence itself and reconciling the mismatch afterward. Ollama's own free-text word splitting kept drifting from niqud's boundaries in real use (e.g. a 31-word Ollama split against niqud's 30, logged as a
tracing::warnevery time) even after several rounds of prompt wording fixes — asking a token-based LLM to fill in blanks for a list it's already given is far more reliable than asking it to reproduce an exact word count/order on its own. The niqud-boundary reconciliation added previously (hebrew_word_merge::merge_by_niqud_boundaries) still runs as a safety net for the rarer case where Ollama's response doesn't match the given list either - "Analyze all sentences" now logs one aggregate
tracing::info!summary at the end of the run (retried/failed sentence counts, plus how many niqud-routed sentences needed a word-count reconciliation), instead of Ollama's mistakes only being visible as scattered per-sentencetracing::warn!lines that are easy to lose track of across a long run
Fixed
- Switching the top bar's Video/Audio source no longer leaves whatever was playing in the panel being hidden running silently behind the other one: clicking either segment now pauses mpv first. The visible panel's ScrubBar/SpeedSlider/mpv picture also only show once the actually-loaded file matches that panel (
AppWindow::media-ready) — previously a loaded video's scrub bar and picture could bleed into the Audio panel just because some file was loaded, since both sources always shared one mpv instance - Switching to the Audio source now also blanks the current-sentence card and sentence list until a matching file is loaded there, instead of leaving the Video source's sentence stuck on screen — Ctrl+A reports "No sentence is currently in focus" rather than analyzing that stale sentence. Cue navigation itself still never depends on which source is visible; only what's shown/analyzed as "current" does now
v0.1.53
v0.1.52
Added
- Independent Video/Audio source toggle in the top bar (
playback_state::MediaSource), alongside the existing Normal/Sentence-by-sentence toggle — any combination of source and mode now works - Audio source: Ctrl+Space starts/stops capturing the system's own audio output (e.g. a video playing in the browser) to a single WAV file via an
ffmpeg -f pulse -i <monitor-source>subprocess. The PulseAudio/PipeWire monitor source is autodetected viapactl get-default-sink, overridable throughconfig.toml'saudio_monitor_source. Linux/PulseAudio-PipeWire only. A failed start/stop (e.g. missingpactl/ffmpeg) surfaces an explanatory message in the Audio source's placeholder panel instead of only logging it - Audio source's placeholder panel shows a Rec/Stop button (same command as Ctrl+Space) and the current recording's filename: a default
<date>_<time>.wavname locked for the duration of the recording, editable afterwards (Enter commits a rename on disk).config.rs'saudio_recording_folderremembers the last folder a recording was written to, same principle asvideo_folder - Audio source can open and play back an existing
.wavfile: the top bar's "Open…" button is now shared by both sources, listing video files in the Video source and.wavrecordings in the Audio source. A picked or freshly recorded audio file loads through the samevideo_player::VideoPlayerpath as a video, so the scrub bar/speed slider/play-pause and same-stem.srtauto-linking all work identically once one is loaded - "Generate subtitles" now also works for the Audio source's recorded/opened
.wavfiles, via the same "Subtitles…" button/dialog andWhisperCliGeneratorthe Video source uses —WhisperCliGenerator::generateskips itsffmpegaudio-extraction step for.wavinput, since it's already audio - Validated that sentence list, Ctrl+A word analysis, and the translation toggle work identically in the Audio source as in the Video source, since they never depended on a video being loaded — locked in with new tests that switch to the Audio source mid-run
Fixed
- Pressing Space to replay a file that had already played to its end (Normal mode's/Audio's unbounded
VideoPlayer::toggle_playback) looked like a no-op — mpv'skeep-open=yespauses at EOF rather than unloading, but unpausing there without seeking just re-hits the same EOF.toggle_playbacknow checks mpv'seof-reachedproperty and seeks back to0first, so Space restarts playback from the beginning instead
v0.1.51
Added
- CI on every pull request against
master:scripts/check.sh(fmt + clippy),scripts/test.sh, and a release-profile build, each as a separate GitHub Actions job (.github/workflows/ci.yml) - GitHub Actions workflow (
.github/workflows/release-deb.yml) publishes a.debpackage as a GitHub Release whenever the workspace version inCargo.tomlchanges onmaster— skips if a release for that version already exists. Packaging metadata lives incrates/app/Cargo.toml's[package.metadata.deb](cargo-deb)
Fixed
- CI's
testjob failed on GitHub's headless runners: constructingAppWindowneeds a working windowing backend even without ever showing the window, contrary to whatdocs/src/developer/technology/slint.mdpreviously claimed.scripts/test.shnow runs underxvfb-runin CI, and the docs are corrected