({
+ appVersion: "",
+ transcriptionModel: "Loading local model…",
+ transcriptionStatus: "loading",
+ });
// Session-scoped suggestion pins/dismissals, keyed by normalized text. The
// `analysis` listener is registered once, so it reads these via refs to avoid a
// stale closure.
@@ -248,6 +253,21 @@ function App() {
})
.catch(() => {});
+ // Subscribe before requesting the snapshot so a fast model-load completion
+ // cannot race between the initial response and event registration.
+ const offRuntimeInfo = Events.On("runtimeInfo", (e: { data: RuntimeInfo }) => {
+ setRuntimeInfo(e.data);
+ });
+ MeetingService.GetRuntimeInfo()
+ .then(setRuntimeInfo)
+ .catch(() =>
+ setRuntimeInfo((info) => ({
+ ...info,
+ transcriptionModel: "Model status unavailable",
+ transcriptionStatus: "error",
+ }))
+ );
+
const offStatus = Events.On("status", (e: { data: StatusEvent }) => {
setStatus(e.data);
setBusy(false);
@@ -306,6 +326,7 @@ function App() {
offTranscript();
offAnalysisStatus();
offAnalysis();
+ offRuntimeInfo();
};
}, []);
@@ -704,6 +725,24 @@ function App() {
/>
+
+
+ Parley{runtimeInfo.appVersion ? ` v${runtimeInfo.appVersion}` : ""}
+
+
+ {runtimeInfo.transcriptionStatus === "loading" && (
+
+ )}
+ Voice-to-text:
+
+ {runtimeInfo.transcriptionModel}
+
+
+
+
diff --git a/frontend/src/components/SettingsDialog.tsx b/frontend/src/components/SettingsDialog.tsx
index 310e1bf..79235aa 100644
--- a/frontend/src/components/SettingsDialog.tsx
+++ b/frontend/src/components/SettingsDialog.tsx
@@ -381,13 +381,14 @@ export function SettingsDialog({
onChange={(e) => setSettings({ ...settings, sttBaseURL: e.target.value })}
/>
- Blank = transcribe locally with the bundled Whisper model (private,
- no setup). Set this to a whisper.cpp server URL (e.g.
+ Blank = transcribe locally (private, no setup), using Nemotron on a
+ supported NVIDIA GPU or the bundled CPU Whisper fallback. Set this
+ to a compatible server URL (e.g.
http://192.168.1.10:8765) to offload transcription to another machine.
- Bundled model file
+ Bundled CPU fallback model