Skip to content

akou 1.2.0

Latest

Choose a tag to compare

@github-actions github-actions released this 14 Oct 10:02
· 6 commits to main since this release
65cf3ab

1.2.0 — your phone reads the Mac's history, and a call's first line comes in about a second

The desktop app can now be read from another device with a key that sees history and changes nothing, so the phone shows the Mac's old calls and transcripts the way the desktop window does. A default call's first line no longer waits for a model the call never uses: 1.3 s instead of 6 to 8 s on a busy Mac. The server gives an idle model's memory back sooner and stops inventing subtitles on silence, and the dictation key says why it does nothing when Accessibility is missing. The 8-hour soak ran for this release on the reference Mac, with a busy process on every core and the release's own capture helper in file mode: no hole in the audio, heap growth 0.17 MB, the event loop late by at most 227 ms, and nothing unreadable in the log (docs/gates/soak-1.2.0.json).

Desktop

  • A phone can read the desktop app's history with its own key (#409). A new key scope, read, sees every call, dictation and file job on one akou: the call list, each call's transcript, summary, notes and memo, its audio (with Range), the dictations and their audio, and every key's jobs. It writes nothing and reaches no setting, model, key, share, window or quit. A key can hold several scopes: akou keys create --name iphone --scope read --scope jobs. GET /v1/keys/me answers any key, so a client learns what its key may see.
  • The desktop app can listen on your tailnet for keys, when you turn it on (#409). network.enabled (off by default) opens a second listener on network.bind (tailnet, lan or an IPv4 address) and network.port (8478). It takes ak_ keys only: the app's own token is refused there, so it never crosses the network, and a refused key is a key.refused line in the log. With no tailnet address yet the app logs one line, looks again every 30 s, and opens the listener once Tailscale is up. Server mode ignores these settings. server.md walks through it.
  • A phone seeks a call's audio to the right place after a pause (#409). In the JSON answer of GET /v1/calls/{id}/transcript each line now carries part, a0 and a1, its start and end in seconds into that part's audio (GET /v1/calls/{id}/audio/{part}), as the window seeks by. The wall-clock w0 keeps running through a pause while the audio does not, so a player that seeked by it landed late.
  • The dictation key says why it does nothing (#404). Without Accessibility, Option+Space did nothing and nothing said why; a re-sign leaves the row stale. The app now asks macOS once per install to show its dialog and list akou in the pane, and while the grant is missing the Dictation page and the island say Dictation is off: allow akou under Accessibility, with a button to the pane and the recovery for a stale row. akou doctor reads the real grants from the running app instead of printing unknown.
  • An agent can follow a live call without polling (#403). akou events --mention prints a mention row, with time and speaker and never the text, when any word of user.name is said on the call channel. akou events -f --type health,share.started,share.stopped --mention is the monitor an agent runs instead of a loop. agent.summary_every_minutes (default 10, 0 for none) caps how often it posts a summary, and akou config get KEY reads a setting. The akou skill's new "Live-call posture" section uses them.

Transcription

  • A default call's first line comes in 1.3 s instead of 6 to 8 s (#406, #378). A streaming call with greedy decoding and no second pass loaded Parakeet before it handled any audio, 8 to 10 s on a busy M-series Mac, and the first lines waited behind it. It now loads only the model it decodes on. A new setting, asr.warmAtStart, is off by default; auto loads the streaming model at start when 4 GB of memory is available, on loads Parakeet too, and both let the models go when memory runs under 1.5 GB and no call uses them. Measured over three runs each way on an M4 Pro under load: first line 1.34 s, worst line in the first 10 s 1.99 s, versus 6.41 to 8.25 s on 1.1.0. A call that decodes on Parakeet, with a second pass, beam search or Parakeet as its live model, still waits for that load.

Server

  • No more invented subtitles on silence and noise, on every preset (#405). A model that hears room noise and no speech can write a sentence anyway, or loop on one word, and with Bazarr sending whole films that became a wrong subtitle. Every job now runs the VAD before any model loads: a file with no speech ends done with an empty text and note: "no_speech", a piece the VAD heard no speech in is never decoded, and a decoded piece that loops on a short phrase keeps it once. Bazarr's /asr answers an empty subtitle on noise and /detect-language answers und. Trap T4.37.
  • An idle model's memory comes back after 10 minutes instead of an hour (#402). server.model_idle_minutes now defaults to 10; a queued job on the model keeps it, and closing the service stops the timer. The setting's name and range are unchanged.

Behind the scenes

  • The nightly's recognizer and evaluation-audio caches are shared by the three OSes instead of saved once each, which takes about 5.4 GB out of the repository's Actions cache and stops the quota from evicting the audio every night (#401).

Signed and notarized. The app and the akou command line are signed with a Developer ID and notarized by Apple, so macOS opens them without an extra step, and the microphone and system audio grants should survive updates. Coming from 0.6.0 or older, which were not signed, macOS asks for both grants once more. The speech models are downloaded on first run. See docs/getting-started.md.

What's Changed

  • ci(nightly): one recognizer cache and one audio cache for the three OSes, so the quota stops evicting the audio by @GeiserX in #401
  • feat: let an agent hear dead capture and its user's name without polling, and cap its summaries by @GeiserX in #403
  • fix(dictation): tell the user why the dictation key does nothing without Accessibility by @GeiserX in #404
  • perf(server): give an idle model's memory back after 10 minutes instead of an hour by @GeiserX in #402
  • fix(server): stop inventing subtitles on silence and noise, on every preset by @GeiserX in #405
  • perf(asr): stop loading Parakeet before a streaming call's first lines, which came 6 to 8 s late by @GeiserX in #406
  • feat: let a phone read the desktop app's calls and dictations with a read-only key by @GeiserX in #409
  • release: 1.2.0, your phone reads the Mac's history and a call's first line comes in about a second by @GeiserX in #410

Full Changelog: v1.1.0...v1.2.0