extract speech-to-text into its own plugin
Moves platform STT out into a plugin that owns the whole whisper.cpp contract: sidecar, config (a JSON file under DATA_PATH/transcribe/, validated against the server before storing), a thin proxy router, a skill so an agent knows the contract without being told, and a script-mode file-browser task (not agentic — no model turn per audio file). sidecar/transcribe.ts and its test moved unchanged from src/servers/api/stt/ — every constant in it has a reason attached and none of it was touched. The platform-side removal (routes, dead useAudioRecording path, Settings screen, locale keys) lands in a separate, uncommitted change in the platform repo for review. Not yet reachable from the file browser: the platform does not load tasks from a plugin's directory yet (skills/affordances/notifications do). Ships anyway per instructions. Officer-Session: 656f5c85-e49a-4f1f-b9f3-042a04b4d043
This commit is contained in:
+51
@@ -0,0 +1,51 @@
|
||||
import type { PluginManifest } from '@@/plugins/manifest';
|
||||
|
||||
/**
|
||||
* Transcribe — Officer's speech-to-text, talking to a self-hosted whisper.cpp server.
|
||||
*
|
||||
* ── What this plugin is, and what it is not ──
|
||||
*
|
||||
* It does NOT run Whisper, and it does not ship a model. You point it at a whisper.cpp `/inference`
|
||||
* server you already run (the same container the platform used to talk to directly) and it forwards to
|
||||
* it. Nothing is transcribed here — the sidecar's whole job is the request shape: detect the language,
|
||||
* then transcribe faithfully in it, tuned for one person talking into a phone.
|
||||
*
|
||||
* Named for the feature, not the implementation — the same reasoning as `photos` not `immich`. Swapping
|
||||
* the backend for a different `/inference`-compatible server would not move the mount point or the route
|
||||
* shape.
|
||||
*
|
||||
* ── Where the connection lives ──
|
||||
*
|
||||
* A single URL, in a JSON file under `DATA_PATH/transcribe/`, not in Postgres and not in this
|
||||
* repository. There is only ever one Whisper server for the whole install — unlike `photos_config` or
|
||||
* `jellyfin_servers`, nobody has a reason to keep more than one — so a file the owner can also edit by
|
||||
* hand is simpler than a table with one row. See `sidecar/config.ts`.
|
||||
*
|
||||
* ── No `osDependencies` ──
|
||||
*
|
||||
* Nothing shells out. The sidecar reaches whisper.cpp with `fetch`, the same as the code it replaces did.
|
||||
*
|
||||
* ── No `web/` ──
|
||||
*
|
||||
* This plugin ships no dashboard route and no dock tile — `plugin.web` gates the tile, and a
|
||||
* backend-only plugin has nothing to pin one to. It is reached from a task's right-click menu and by an
|
||||
* agent that has read its skill, not by a screen.
|
||||
*/
|
||||
export const manifest: PluginManifest = {
|
||||
publisher: 'officerdev',
|
||||
version: '1.0.0',
|
||||
platform: '>=1.0.0',
|
||||
|
||||
label: 'Transcribe',
|
||||
summary: 'Speech-to-text over your own whisper.cpp server',
|
||||
icon: 'AudioLines',
|
||||
color: '#f97316',
|
||||
|
||||
permissions: [
|
||||
{
|
||||
key: 'transcribe',
|
||||
label: 'Transcribe',
|
||||
description: 'Turn audio into text over your own whisper.cpp server',
|
||||
},
|
||||
],
|
||||
};
|
||||
Reference in New Issue
Block a user