[FEATURE] FluidMeet: recover excluded microphone audio after the call with offline echo cancellation
Maintainers usually reply within 1 day
Nobody has claimed this yet.
Assessment
- Difficulty
- 5/5
- Estimated time
- Over a week
- Newbie friendliness
- 15/100
- Issue type
- Feature
- Clarity
- Mostly clear
- Activity status
- Active
- Tech stack
- macos, swift
- Domain
- audio-video-rtc, desktop-dev
Research direction
Start with AEC/MeetingAECStreamJoiner.swift to see how live AEC3 aligns the application and microphone tracks, then with MeetingReferenceSynchronizer.swift for offline alignment. The Retry menu in MeetingTranscriptionView.swift (contextMenu(for:)) is where the new action would go. Done means a cleaned microphone era is transcribed without duplicating the remote speaker, and it is marked with the new provenance.
Written by the indexing model from the issue text.
Description
Follow-up from #1135.
Problem
When FluidMeet cannot prove that the microphone is free of speaker echo, it keeps the microphone audio on disk but leaves it out of the transcript. In #1135, 54 minutes of the user's side of a Zoom call were lost from the transcript this way, while the audio file was still on the Mac.
There is no way to get that speech into the transcript after the call:
- "Retry Transcription" shows only for failed or interrupted meetings (
MeetingTranscriptionView.swift,contextMenu(for:)). - Retry applies the same admission rule, so it drops the same unprotected microphone eras again.
Transcribing the raw microphone as it is would duplicate the other side of the call, because their voice leaks from the speakers into the mic. The text echo filter (MeetingEchoDetector) catches most repeats, but not double-talk, where the local speaker talks over the remote one.
Proposal
Run echo cancellation after the call on the saved files, then transcribe the cleaned microphone audio.
- On the ScreenCaptureKit path, the application track and the microphone track are stamped on the same host clock. Live AEC3 already requires the two to line up within one sample (
AEC/MeetingAECStreamJoiner.swift). - Run AEC3 offline with the application track as the reference, on each unprotected microphone era.
- Mark the cleaned eras with a new provenance (for example
offlineEchoCancelled), so the record shows that they were cleaned after the call. - Add a "Recover my microphone" (working title) action on completed meetings that have
transcriptCoverageIncompletewith microphone reasons. MeetingReferenceSynchronizer.swiftis an existing offline-only synchronizer that may help with alignment.
Known difficulties
- The chunk writer appends gaps of 0.5 s or less without padding, so after a gap the sample index no longer matches the timestamp. Alignment must use the chunk
presentationStartvalues. - Each new producer epoch, and any backward timestamp, shifts the writer's timeline offset.
- While live AEC is active, the file holds AEC output, not raw audio. Those eras are already admitted.
- Stream handoffs and rebuilds leave real gaps in the microphone audio.
- The voice-processing and AVCapture fallback paths use separate clocks, so offline alignment there is weaker. Exclude them at first.
- Audio retention policy: recovery is possible only while the audio is still on disk.
Out of scope
- The live warning and wired external speaker support. Those are in #1135.
- Dominant language
- Swift
- Stars
- 11.9k
- Forks
- 863
- Avg merge
- 1d 13h
- Merged PRs (30d)
- 28
Getting set up
This project ships no dev container, Dockerfile or contributing guide, so setting up is up to you: start from its README, and see our first-contribution guide for the general steps.
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from altic-dev/FluidVoice
-
bug
Difficulty 4/5 1-2 days Newbie friendliness 35/100
altic-dev/FluidVoice#1138 · 2 comments ·
Maintainers usually reply within 1 day
-
Difficulty 5/5 Over a week Newbie friendliness 10/100
altic-dev/FluidVoice#1137 ·
Maintainers usually reply within 1 day
-
Difficulty 4/5 3-5 days Newbie friendliness 30/100
altic-dev/FluidVoice#1135 · 1 comment ·
Maintainers usually reply within 1 day
-
[BUG]Openbug
Difficulty 4/5 3-5 days Newbie friendliness 15/100
altic-dev/FluidVoice#1133 ·
Maintainers usually reply within 1 day
-
bug
Difficulty 4/5 3-5 days Newbie friendliness 45/100
altic-dev/FluidVoice#1119 · 2 comments ·
Maintainers usually reply within 1 day
All issues in altic-dev/FluidVoice
Similar issues
-
builtin-port enhancement
Difficulty 2/5 1-3 hours Newbie friendliness 62/100
cmlarsen/writemorebetter#235 ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 62/100
callstack/agent-device#3627 ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 70/100
maziyarpanahi/openmed#4207 · 1 comment ·
Maintainers usually reply within 3 days
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 60/100
meshtastic/Meshtastic-Apple#2603 ·
Maintainers usually reply within 1 day
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
Maintainers usually reply within 1 day