Skip to content

feat: add call transcriber MVP - #964

Closed
souljorje wants to merge 10 commits into
altic-dev:mainfrom
souljorje:feature/call-transcriber
Closed

souljorje wants to merge 10 commits into
altic-dev:mainfrom
souljorje:feature/call-transcriber

Conversation

@souljorje

@souljorje souljorje commented Sep 11, 2026

Copy link
Copy Markdown

Description

Adds call recording and transcription to FluidVoice.

Captures system audio and microphone audio separately, transcribes both, identifies microphone speech as You, diarizes other participants, and combines everything into a chronological speaker-labeled transcript.

Dictation stays available while a call is being recorded, but:

  • If dictation is active when the call stops, call transcription waits for it to finish;
  • While post-call transcription is running, new dictation is temporarily unavailable and FluidVoice informs the user;

Limitations:

  • No Acoustic Echo Cancellation, so better use headphones during the call;
  • No speakers count prompt, but it's the next thing I would add

Extras:

  • Refactored NotificationService, now it's easier to use

Type of Change

  • 🐞 Bug fix
  • ✨ New feature
  • 💥 Breaking change
  • 🧹 Chore
  • 📝 Documentation update

Related Issue or Discussion

@altic-dev I intentionally didn't change too much, to avoid bloated PR.

I saw more general #796, but this one is simple version and can be delivered early :)

Testing

  • Tested on Intel Mac
  • Tested on Apple Silicon Mac
  • Tested on macOS version: version: 26.5.2 (25F84)
  • Ran linter locally: swiftlint --strict --config .swiftlint.yml Sources Tests Package.swift
  • Ran formatter locally: swiftformat --config .swiftformat Sources
  • Ran tests locally:
  • Full build test suit
  • No new tests added, but I would add AudioCaptureCoordinatorTests, CallTranscriptAssemblerTests if needed

Screenshots / Video

Call controls and recording state in the menu bar

Screenshot 2026-09-11 at 15 46 20 Screenshot 2026-09-11 at 15 33 04

Call transcript history and access to the saved recording

Screenshot 2026-09-11 at 15 35 12

Errors handled

Screenshot 2026-09-11 at 15 33 15

Notes

- Capture microphone and system audio as separate tracks, transcribe both, and merge them into a chronological speaker-labeled transcript.

- Add call controls to the menu bar, persist mixed recordings, link recordings from transcription history, and coordinate call transcription with existing dictation and ASR resources.
@github-actions github-actions Bot added needs PR template Pull request is missing required template content. needs screenshots Pull request needs screenshot or video evidence. labels Sep 11, 2026
@souljorje souljorje changed the title Feature/call transcriber feature: call transcriber Sep 11, 2026
@github-actions

github-actions Bot commented Sep 11, 2026

Copy link
Copy Markdown

This PR has been closed because it still does not follow the required PR template after the 48-hour correction window.

Please open a new PR with the required description, related issue or accepted Discussion, testing notes, and screenshot/video evidence when applicable.

@greptile-apps

greptile-apps Bot commented Sep 11, 2026

Copy link
Copy Markdown

Greptile Summary

Adds an MVP for recording and transcribing calls while preserving the existing dictation and file-transcription workflows.

  • Captures microphone and system audio into aligned tracks and saves a mixed local recording.
  • Serializes speech-provider operations shared by dictation, call, and file transcription.
  • Builds chronological speaker-labeled call transcripts and stores them in file-transcription history.
  • Adds menu-bar controls, recording state, transcript navigation, and source-file reveal actions.
  • Refactors local notification delivery and adds call-transcription availability messaging.

Confidence Score: 5/5

The PR appears safe to merge, with the prior blocking findings addressed and no actionable new failure established by the latest changes.

File transcription now uses the shared provider executor, excessive capture gaps fail instead of writing unbounded silence, recording cleanup is limited to call entries, and active microphone invalidations are surfaced. All previous threads are resolved, and no new blocking or non-blocking finding remains.

Reviews (9): Last reviewed commit: "refactor(asr): centralize provider seria..." | Re-trigger Greptile

Comment thread Sources/Fluid/Services/ASRService.swift Outdated
Comment thread Sources/Fluid/Services/CallPCMTrackWriter.swift
Comment thread Sources/Fluid/Persistence/FileTranscriptionHistoryStore.swift

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: f9420b29f6

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread Sources/Fluid/Services/ASRService.swift Outdated
Comment thread Sources/Fluid/Services/MeetingTranscriptionService.swift
Comment thread Sources/Fluid/Persistence/FileTranscriptionHistoryStore.swift Outdated

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 4541a7955d

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +133 to +134
while self.isTranscribing, self.captureSession == nil {
await self.waitForPipelineActivity()

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Cancel post-call transcription during termination

When the user quits while post-call ASR is running, this loop waits for the entire transcription pipeline, but AppDelegate.shutdownASRRuntimeForTermination() stops waiting after eight seconds. Long calls routinely exceed that deadline, so the process exits before the pipeline's deferred cleanup and history write run, potentially leaving raw temporary tracks and a saved M4A with no history entry. Cancel the active pipeline and await bounded artifact cleanup rather than waiting for transcription to finish.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not sure how to fix this better ,@altic-dev what u say?

Comment thread Sources/Fluid/Services/CallCaptureSession.swift Outdated
@souljorje
souljorje force-pushed the feature/call-transcriber branch from 63e8919 to 4541a79 Compare September 11, 2026 12:10

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 63e89197f9

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread Sources/Fluid/Services/ASRService.swift Outdated
@souljorje souljorje changed the title feature: call transcriber feature: call transcriber MVP Sep 11, 2026
@souljorje
souljorje force-pushed the feature/call-transcriber branch from a2d8770 to 5525a73 Compare September 11, 2026 12:48
@greptile-apps

greptile-apps Bot commented Sep 11, 2026

Copy link
Copy Markdown

Want your agent to iterate on Greptile's feedback? Start a greploop in Codex and it will work through the open comments and keep going until this PR reviews clean.

@souljorje
souljorje force-pushed the feature/call-transcriber branch from 5525a73 to 33c8d82 Compare September 11, 2026 12:50
Comment thread Sources/Fluid/Services/CallCaptureSession.swift Outdated

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 33c8d82c5d

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread Sources/Fluid/Services/CallPCMTrackWriter.swift Outdated

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: f3f5399733

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread Sources/Fluid/Services/CallTranscriptionService.swift
@souljorje souljorje changed the title feature: call transcriber MVP feat: add call transcriber MVP Sep 11, 2026

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: b9571baf5f

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +162 to +165
guard missingSeconds <= Self.maximumInsertedSilenceSeconds else {
throw CallTranscriptionError.audioWriterFailed(
"Captured audio was interrupted during the call."
)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Preserve the healthy track after a source interruption

When either capture source has a callback gap longer than one second—for example, during a transient Bluetooth or system-audio stall—this throw is stored by the writer, so CallCaptureSession.stop() later aborts while finishing the tracks and deletes the entire recording directory, including the unaffected track. Fresh evidence after the earlier discontinuity report is that the final version now converts the gap into a fatal whole-session error rather than merely compressing the timeline. Treat the interrupted source as unavailable while retaining the healthy source, which the downstream partial-track transcription path already supports.

Useful? React with 👍 / 👎.

@github-actions github-actions Bot closed this Sep 14, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

needs PR template Pull request is missing required template content. needs screenshots Pull request needs screenshot or video evidence.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant