Hacktoberfest 2026: the issues maintainers tagged for October, open and beginner-friendly. Browse Hacktoberfest issues

[FEATURE] FluidMeet: recover excluded microphone audio after the call with offline echo cancellation

Open
#1,136 0 comments 0 reactions 0 assignees View on GitHub

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

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 transcriptCoverageIncomplete with microphone reasons.
  • MeetingReferenceSynchronizer.swift is 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 presentationStart values.
  • 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

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from altic-dev/FluidVoice

All issues in altic-dev/FluidVoice

Similar issues

More Swift issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.