You need to split your stream into two streams.
const source = fromEvent(document.getElementById("text"), "input");
source
.pipe(debounceTime(10 * 1000))
.subscribe(() => console.log("saved after typing!"));
source
.pipe(
auditTime(10 * 1000)
)
.subscribe(() => console.log("saved while typing!"));
In first case, as you wrote in question, using debounceTime value will be emitted 10 seconds after user finished editing form/input. In second case, auditTime every 10 second will check if there is any new value. If there is, then would be emitted value. In callback you can reuse the same function responsible for saving data from form.
You can try it in this demo on stackblitz:
https://stackblitz.com/edit/rxjs-jj3kot?file=index.ts
I just changed time in demo to 1 second so it is easier to check result in console.
Side note:
This is plain JS demo. If you develop Angular app you should avoid getting elements with getElementById. Instead of this use direct reference to template: https://angular.io/api/core/ViewChild
Edit:
According to OP comment I've changed implementation a little bit. I merged two observables and used distinctUntilChanged operator to avoid emitting the same value twice. Demo in stackblitz is also changed
const afterTyping = source.pipe(debounceTime(1000));
const whileTyping = source.pipe(auditTime(1000));
merge(whileTyping, afterTyping)
.pipe(distinctUntilChanged())
.subscribe(console.log);