Skip to content

ReaLackey v0.4.0-beta.1

Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 19 Sep 23:50
· 4 commits to main since this release

Added

  • Take envelopes. The assistant can now read and edit the automation lanes
    drawn on an item's take: get_take_envelopes / get_take_envelope_points list
    them, create_take_envelope makes a volume, pan, mute, or pitch lane (returning
    an existing one untouched rather than hiding it), and
    insert_take_envelope_point / set_take_envelope_point /
    delete_take_envelope_point edit the curve. All edits are confirmation-gated and
    undo-wrapped. Take envelope times are item-relative and scaled by the take's
    playrate; the tools say so, so the model doesn't mistake them for project seconds.

  • Take FX are now fully editable, not just readable. add_take_fx puts a
    plugin on a take's FX chain and set_take_fx_param changes a parameter
    (normalized 0..1, reporting the resulting display value) — closing the odd
    asymmetry where the assistant could list a take FX's parameters but only ever
    change them on tracks. Both confirmation-gated and undo-wrapped.

  • Speech-to-text (transcription) — a new provider type alongside chat. The
    Providers dialog is now tabbed by role (Chat / Transcription); on the
    Transcription tab, Add → "OpenAI Whisper" (or "Local Whisper server")
    and set it as the default, and the assistant can transcribe a media item's audio
    to text
    with timestamps — ask it to caption, summarise, or find spoken words in
    the selected item, then act on the text. Cloud transcription is consent-gated (the
    audio is uploaded); a local whisper server (whisper.cpp, faster-whisper, LocalAI)
    keeps it on-machine. Long items are transcribed in chunks automatically. whisper-1
    (or a local whisper model) returns timestamped segments; OpenAI's gpt-4o-transcribe
    returns text only. Each role has its own default account. Bindable actions
    (also under Extensions → ReaLackey) transcribe the selected item straight to its
    notes
    , a plain-text file, or an SRT subtitle file — no chat needed. File
    outputs are written next to the source media and never overwrite an existing file
    (a numbered variant is used instead); the result is spoken and its path announced.
    A progress dialog (progress bar + Cancel) shows while a transcription action
    runs, so sighted users get visible progress and can cancel part-way through.

  • Clear the conversation — a Clear button next to Send empties the chat and
    the assistant's memory of it. Handy when switching to a different provider: without
    it the next message re-sends the whole previous conversation to the new model, which
    costs tokens and can fail outright where two providers disagree about how a past turn
    should look (a reasoning block or a tool call the new one won't accept). The button
    is reachable by Tab and announced; it does nothing mid-reply, so it can't cut a
    message off half-written.

  • Advanced mode (auto-approve edits): a toggle that lets the assistant apply
    changes without asking for confirmation each time. Flip it from Extensions
    → ReaLackey → "Advanced mode (auto-approve edits)"
    (the menu item shows the
    current on/off state) or bind the "ReaLackey: Toggle advanced mode" action to
    a key. Off by default; the state persists. The RAAI_CONFIRM environment
    variable still overrides it. (Edits remain undoable in REAPER, and each tool the
    assistant runs is still announced — you're just not prompted per change.)

  • Cut by text — edit audio the way modern video editors do: transcribe an
    item, then cut it down to a shortened transcript. Ask the assistant to "cut out
    the part where I fumble the intro" (or give it the transcript with the unwanted
    lines deleted) and it transcribes the item, works out which words you dropped,
    and cuts those spans out of the audio, sliding the kept parts together so
    they play back-to-back. It's deletion-only for now (moving text around isn't
    reordered yet), and it needs a transcription provider that returns per-word
    timings
    — whisper-1 or a local Whisper server (OpenAI's gpt-4o-transcribe
    doesn't). By default only the target item is compacted; ask it to "ripple the
    track" to also pull later items on that track earlier. The cut is confirmed
    before it runs and is fully undoable. There's also a lower-level
    remove_item_time_ranges the assistant can use to cut explicit time ranges
    out of an item (e.g. "remove 12s–15s") without transcribing.

  • Cut-by-text editor — a keyboard-driven editor for cutting by text yourself,
    built accessibility-first. Bind "ReaLackey: Cut selected item by text" (or run
    it from Extensions → ReaLackey → "Cut selected item by text…", or ask the
    assistant to open it): it transcribes the item and opens a modal where you
    navigate the transcript by keyboard — Up/Down move by sentence (and read
    the whole sentence), Left/Right by word (staying within the sentence), each
    landing plays that snippet of audio so you can edit by ear. Space selects a
    word, Shift+arrows extend the selection, Delete removes words (struck
    through, reversibly), Ctrl+Z / Ctrl+Y undo/redo, and Tab reaches the
    Confirm / Cancel buttons. A three-way audio-feedback setting (spoken word,
    audio snippet, or both) lets you tune what you hear on each move; a Play button
    previews the edited result. Confirm cuts exactly what you removed, as a single
    undo point. Deletion-only for now (moving text is a later step); needs the HTML
    pane (Windows/macOS) and a word-timestamp model (whisper-1 or local Whisper).
    A Keys button in the editor's header expands the full shortcut list, so
    the keys are discoverable without leaving the editor; a Report button
    copies a whole-clip, per-word diagnostic table to the clipboard — transcript
    span, measured span, the drift between them, the gap to the next word, and,
    for each edge the analysis could not measure, why — with a header that
    summarises causes across the clip.

  • Local word-timing refinement (optional) — cut-by-text is only as precise
    as each word's timestamps, and plain Whisper endpoints are often 50-200 ms
    off: the difference between a clean cut and a clipped consonant. A new
    per-provider setting on the Transcription tab, "Refine word timings
    locally"
    , re-times every word on your own machine with a forced-alignment
    model after each transcription — no audio leaves your computer for this step.
    Off by default; enabling it offers a one-time download (~350 MB: the model
    plus the ONNX Runtime libraries) with progress and Cancel, every file checked
    against pinned digests. On Windows, "Use the graphics card for
    refinement"
    runs the aligner via DirectML on any DirectX-12 GPU — measured
    7-8x faster than the CPU even on a 2016 GTX 1060 — using a higher-precision
    model (~670 MB download) and falling back to the CPU when no usable GPU
    exists. For machines where a large download is not an option, each release
    now also ships realackey-<version>-with-models-<platform>.zip with the
    CPU set pre-bundled: merge its folders into the REAPER resource path and
    nothing needs downloading. macOS: Apple Silicon only (ONNX Runtime no longer
    provides Intel-mac builds); elsewhere transcription simply runs without
    refinement. The alignment model (Meta AI's MMS forced aligner) is licensed
    CC-BY-NC 4.0 — non-commercial use.

  • Templates — the assistant can now list, load, and save REAPER
    templates. Ask it to list your track and project templates, load one by name (a
    track template adds its tracks to the current project; a project template opens a
    new project from it, leaving your current one alone), or save the selected
    track(s) as a track template
    (with options for envelopes and media; existing
    templates are never overwritten — a numbered variant is used). Saving the whole
    project as a project template isn't included, since there's no way to do it without
    re-pointing your current project at the template file — use REAPER's File menu for
    that.

  • Perplexity (Agent API) provider (Add → "Perplexity (Agent API, web-grounded)").
    Unlike Perplexity's plain Sonar endpoint — which can't call tools and so can't
    drive REAPER — the Agent API speaks the OpenAI Responses protocol with
    client-side function calling, so the assistant can control REAPER and ground
    its answers on live web results (web_search) in one loop. It's multi-provider:
    pick a strong agentic model by id (openai/gpt-5.1, anthropic/claude-…, or
    sonar-…) — the Model field is free-text (the Agent API has no model list to
    fetch). Fixed endpoint, needs a Perplexity API key; web grounding is always on.

  • oMLX provider preset (Add → "oMLX (local, Apple Silicon)"). oMLX is a native
    MLX inference server for Apple Silicon (continuous batching, SSD KV cache) that's
    faster than Ollama on a Mac. It exposes an OpenAI-compatible endpoint, so it uses
    the existing adapter — the preset just points at http://localhost:8000/v1; pick
    your model with Fetch models…. (Any oMLX instance already worked via the
    generic "OpenAI-compatible" provider; this is just one-click setup.)

Changed

  • The "still working" feedback now says what the assistant is doing instead of
    how many seconds have passed. The status line shows the live activity — "Reasoning…",
    "Transcribing the audio", "Reading the project", "Running: set fx param", "Writing
    the reply…" — and the periodic spoken reminder announces that activity rather than
    "Still working… N seconds". (The activity is derived from the tool being run and the
    reasoning/answer phase; the model's exact internal reasoning isn't exposed, so
    during thinking it shows "Reasoning…".)

Fixed

  • Connections behind antivirus / corporate proxies now work. ReaLackey trusted
    only its own bundled list of certificate authorities, so on machines where security
    software or a company proxy inspects HTTPS traffic (common with Kaspersky, ESET,
    360, Zscaler and similar), every request failed with an unhelpful "error sending
    request" — even though the same URL opened fine in a browser. It now also trusts the
    certificates installed in your operating system's store, like your browser does.
    (#3)
  • Network errors now say what actually went wrong. Instead of just "error sending
    request for url (…)", the message names the real cause — an untrusted certificate, a
    DNS failure, a refused connection, a timeout — and adds a hint for the ones you can
    act on. This applies to fetching models and to chat/transcription requests.
  • Fetch models now authenticates with the top (highest-priority) key from the
    key list
    — the one that would actually be used to send — instead of the "Add
    key" input field or the stale saved key. Reordering or editing the key list and
    then fetching (before saving) used the wrong key; typing into the Add-key field no
    longer overrides the configured list either. (Falls back to a just-typed key only
    when the list is empty, e.g. a brand-new account before you press Add.)
  • Screen-reader announcements were spoken twice (most noticeably under
    VoiceOver): the assistant announced through both OSARA and the webview's
    aria-live region, so a reader observing both channels heard everything doubled.
    It now speaks through one channel — OSARA when it's present (focus-independent,
    both platforms), and the aria-live region only as the fallback when OSARA isn't —
    so each announcement is spoken once.
  • The message field no longer makes a screen reader recite a long instruction
    string every time it gets focus. Its accessible name is now just "Message
    the assistant" and the placeholder is a short prompt; the Enter / Alt+number /
    Alt+P shortcuts moved into an optional, collapsed "Keyboard shortcuts"
    section under the composer. Nothing is announced when you focus the field —
    previously the full instructions lived in the field's accessible name and
    placeholder, so VoiceOver (and NVDA) re-read them on every focus.
  • macOS: Alt+number message reading is now reliable. Jumping to a message
    (Alt+1 … Alt+0) read it only intermittently on the Mac because it relied on
    moving focus to the message heading, and VoiceOver only sometimes announces a
    programmatic focus change on the WebKit view. The read now goes through the
    same aria-live channel the copy confirmation uses — reliable on VoiceOver and
    NVDA alike — and it announces the message's actual text, so navigating to an
    assistant message now reads the response rather than just "Assistant".