/** * [Gitea #260] The fork reports what noise suppression actually runs as * `io.lotus.denoise_state { active, model, error? }`. Pure: the toast text for * a report, or undefined when what runs is what the user picked. */ export type DenoiseStateReport = { active?: unknown; model?: unknown; error?: unknown }; const MODEL_NAMES: Record = { rnnoise: 'RNNoise', speex: 'Speex', dtln: 'DTLN', deepfilternet: 'DeepFilterNet 3', }; const modelName = (m: unknown): string => typeof m === 'string' ? (MODEL_NAMES[m] ?? m) : 'the selected model'; export function denoiseNotice( requestedModel: string, report: DenoiseStateReport | undefined, ): string | undefined { if (!report || typeof report.active !== 'boolean') return undefined; if (!report.active) { return `ML noise suppression couldn't start, so your microphone is sending unfiltered audio. You can pick another model in Settings → Calls.`; } if (typeof report.model === 'string' && report.model !== requestedModel) { return `${modelName(requestedModel)} couldn't start, so noise suppression is using ${modelName(report.model)} instead.`; } return undefined; }