Merge pull request 'fix(calls): say when ML noise suppression fails or falls back; drop the spoofable listener (#260)' (#413) from fix/denoise-state-notice into lotus
CI / Build & Quality Checks (push) Canceled after 0s
CI / Trigger Desktop Build (push) Canceled after 0s
CI / Secret scan (gitleaks) (push) Canceled after 0s
CI / Docker image build & smoke test (push) Canceled after 0s
CI / Playwright smoke (e2e) (push) Canceled after 0s
CI / Build & Quality Checks (push) Canceled after 0s
CI / Trigger Desktop Build (push) Canceled after 0s
CI / Secret scan (gitleaks) (push) Canceled after 0s
CI / Docker image build & smoke test (push) Canceled after 0s
CI / Playwright smoke (e2e) (push) Canceled after 0s
This commit was merged in pull request #413.
This commit is contained in:
@@ -0,0 +1,17 @@
|
||||
import { test } from 'node:test';
|
||||
import assert from 'node:assert/strict';
|
||||
import { denoiseNotice } from './denoiseNotice';
|
||||
|
||||
test('denoiseNotice: says when ML is off or fell back (#260)', () => {
|
||||
assert.equal(denoiseNotice('deepfilternet', { active: true, model: 'deepfilternet' }), undefined);
|
||||
assert.match(
|
||||
denoiseNotice('deepfilternet', { active: true, model: 'rnnoise' }) ?? '',
|
||||
/^DeepFilterNet 3 couldn't start, so noise suppression is using RNNoise instead\.$/,
|
||||
);
|
||||
assert.match(
|
||||
denoiseNotice('rnnoise', { active: false, error: 'boom' }) ?? '',
|
||||
/unfiltered audio/,
|
||||
);
|
||||
assert.equal(denoiseNotice('rnnoise', undefined), undefined);
|
||||
assert.equal(denoiseNotice('rnnoise', { model: 'x' }), undefined);
|
||||
});
|
||||
@@ -0,0 +1,29 @@
|
||||
/**
|
||||
* [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<string, string> = {
|
||||
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;
|
||||
}
|
||||
Reference in New Issue
Block a user