Skip to content

Releases: erikRepo/trango

v0.1.54

Choose a tag to compare

@github-actions github-actions released this 18 Jul 18:09
c2cc054

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_hebrew gates the pipeline, niqud_to_pronunciation deterministically converts niqud text into a hyphenated Latin guide, tokenizer.rs/decode.rs reimplement the niqud model's tokenizer and output reconstruction directly (no tokenizers crate needed — confirmed to be character-level despite its WordPiece format), and OnnxNiqudClient runs the model via ort (ONNX Runtime bindings) with no subprocess/Python involved. Configured via Settings' new "Hebrew niqud model (.onnx)" field; see docs/src/usage/word-analysis.md for installing the model and docs/src/developer/technology/ort.md. The required ONNX Runtime library needs no manual setup either: the .deb package now depends on Ubuntu/Debian's libonnxruntime1.23, and trango finds it in the usual system library locations on its own — no ORT_DYLIB_PATH or 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.toml setting 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_source previously had no UI at all and required hand-editing config.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/pronunciation stay 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::warn every 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-sentence tracing::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

Choose a tag to compare

@github-actions github-actions released this 18 Jul 06:51
88b39e9

See releasenotes.md.

v0.1.52

Choose a tag to compare

@github-actions github-actions released this 17 Jul 19:58
2480307

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 via pactl get-default-sink, overridable through config.toml's audio_monitor_source. Linux/PulseAudio-PipeWire only. A failed start/stop (e.g. missing pactl/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>.wav name locked for the duration of the recording, editable afterwards (Enter commits a rename on disk). config.rs's audio_recording_folder remembers the last folder a recording was written to, same principle as video_folder
  • Audio source can open and play back an existing .wav file: the top bar's "Open…" button is now shared by both sources, listing video files in the Video source and .wav recordings in the Audio source. A picked or freshly recorded audio file loads through the same video_player::VideoPlayer path as a video, so the scrub bar/speed slider/play-pause and same-stem .srt auto-linking all work identically once one is loaded
  • "Generate subtitles" now also works for the Audio source's recorded/opened .wav files, via the same "Subtitles…" button/dialog and WhisperCliGenerator the Video source uses — WhisperCliGenerator::generate skips its ffmpeg audio-extraction step for .wav input, 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's keep-open=yes pauses at EOF rather than unloading, but unpausing there without seeking just re-hits the same EOF. toggle_playback now checks mpv's eof-reached property and seeks back to 0 first, so Space restarts playback from the beginning instead

v0.1.51

Choose a tag to compare

@github-actions github-actions released this 16 Jul 16:38
210f1eb

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 .deb package as a GitHub Release whenever the workspace version in Cargo.toml changes on master — skips if a release for that version already exists. Packaging metadata lives in crates/app/Cargo.toml's [package.metadata.deb] (cargo-deb)

Fixed

  • CI's test job failed on GitHub's headless runners: constructing AppWindow needs a working windowing backend even without ever showing the window, contrary to what docs/src/developer/technology/slint.md previously claimed. scripts/test.sh now runs under xvfb-run in CI, and the docs are corrected