From 89ebfa79eda9ad1fd4b18ca1156f1ff164193ca9 Mon Sep 17 00:00:00 2001 From: webadderall <131426131+webadderall@users.noreply.github.com> Date: Sun, 22 Mar 2026 18:32:18 +1100 Subject: [PATCH] feat: add backend Whisper and native audio support Add Electron IPC handlers and preload wiring for Whisper caption generation, small-model download management, and safer project media source resolution. Update native macOS capture helpers to mux separate system and microphone audio outputs before finalizing recordings. --- electron/electron-env.d.ts | 57 ++ electron/ipc/handlers.ts | 881 ++++++++++++++++-- .../native/ScreenCaptureKitRecorder.swift | 77 +- .../openscreen-screencapturekit-helper | Bin 189776 -> 187504 bytes electron/preload.ts | 33 + 5 files changed, 958 insertions(+), 90 deletions(-) diff --git a/electron/electron-env.d.ts b/electron/electron-env.d.ts index 262d6a6d..f06f73d1 100644 --- a/electron/electron-env.d.ts +++ b/electron/electron-env.d.ts @@ -134,6 +134,50 @@ interface Window { ) => Promise<{ success: boolean; path?: string; message?: string; canceled?: boolean }>; openVideoFilePicker: () => Promise<{ success: boolean; path?: string; canceled?: boolean }>; openAudioFilePicker: () => Promise<{ success: boolean; path?: string; canceled?: boolean }>; + openWhisperExecutablePicker: () => Promise<{ + success: boolean; + path?: string; + canceled?: boolean; + error?: string; + }>; + openWhisperModelPicker: () => Promise<{ + success: boolean; + path?: string; + canceled?: boolean; + error?: string; + }>; + getWhisperSmallModelStatus: () => Promise<{ + success: boolean; + exists: boolean; + path?: string | null; + error?: string; + }>; + downloadWhisperSmallModel: () => Promise<{ + success: boolean; + path?: string; + alreadyDownloaded?: boolean; + error?: string; + }>; + deleteWhisperSmallModel: () => Promise<{ success: boolean; error?: string }>; + onWhisperSmallModelDownloadProgress: ( + callback: (state: { + status: "idle" | "downloading" | "downloaded" | "error"; + progress: number; + path?: string | null; + error?: string; + }) => void, + ) => () => void; + generateAutoCaptions: (options: { + videoPath: string; + whisperExecutablePath?: string; + whisperModelPath: string; + language?: string; + }) => Promise<{ + success: boolean; + cues?: AutoCaptionCue[]; + message?: string; + error?: string; + }>; setCurrentVideoPath: (path: string) => Promise<{ success: boolean }>; setCurrentRecordingSession: (session: { videoPath: string; @@ -256,3 +300,16 @@ interface SystemCursorAsset { width: number; height: number; } + +interface AutoCaptionCue { + id: string; + startMs: number; + endMs: number; + text: string; + words?: Array<{ + text: string; + startMs: number; + endMs: number; + leadingSpace?: boolean; + }>; +} diff --git a/electron/ipc/handlers.ts b/electron/ipc/handlers.ts index a4e38c7c..846299e3 100644 --- a/electron/ipc/handlers.ts +++ b/electron/ipc/handlers.ts @@ -4,7 +4,8 @@ import { execFile, spawn, spawnSync } from 'node:child_process' import type { ChildProcessWithoutNullStreams } from 'node:child_process' import fs from 'node:fs/promises' -import { constants as fsConstants } from 'node:fs' +import { constants as fsConstants, createWriteStream } from 'node:fs' +import { get as httpsGet } from 'node:https' import { createRequire } from 'node:module' import path from 'node:path' import { fileURLToPath, pathToFileURL } from 'node:url' @@ -26,6 +27,9 @@ const AUTO_RECORDING_RETENTION_COUNT = 20 const AUTO_RECORDING_MAX_AGE_MS = 14 * 24 * 60 * 60 * 1000 const ALLOW_RECORDLY_WINDOW_CAPTURE = Boolean(process.env['VITE_DEV_SERVER_URL']) const RECORDING_SESSION_MANIFEST_SUFFIX = '.recordly-session.json' +const WHISPER_MODEL_DOWNLOAD_URL = 'https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-small.bin' +const WHISPER_MODEL_DIR = path.join(app.getPath('userData'), 'whisper') +const WHISPER_SMALL_MODEL_PATH = path.join(WHISPER_MODEL_DIR, 'ggml-small.bin') function getAssetRootPath() { if (app.isPackaged) { @@ -83,6 +87,7 @@ let nativeCaptureProcess: ChildProcessWithoutNullStreams | null = null let nativeCaptureOutputBuffer = '' let nativeCaptureTargetPath: string | null = null let nativeCaptureStopRequested = false +let nativeCaptureSystemAudioPath: string | null = null let nativeCaptureMicrophonePath: string | null = null let nativeCapturePaused = false let nativeCursorMonitorProcess: ChildProcessWithoutNullStreams | null = null @@ -236,6 +241,70 @@ function normalizeVideoSourcePath(videoPath?: string | null): string | null { return trimmed } +async function resolveProjectMediaSources(project: unknown): Promise< + | { + success: true + videoPath: string + webcamPath: string | null + } + | { + success: false + message: string + } +> { + if (!project || typeof project !== 'object') { + return { success: false, message: 'Invalid project file format' } + } + + const rawVideoPath = (project as { videoPath?: unknown }).videoPath + if (typeof rawVideoPath !== 'string') { + return { success: false, message: 'Project file is missing a video path' } + } + + const normalizedVideoPath = normalizeVideoSourcePath(rawVideoPath) + if (!normalizedVideoPath) { + return { success: false, message: 'Project file is missing a valid video path' } + } + + try { + await fs.access(normalizedVideoPath, fsConstants.F_OK) + } catch { + return { + success: false, + message: `Project video file not found: ${normalizedVideoPath}`, + } + } + + const rawWebcamPath = + typeof (project as { editor?: { webcam?: { sourcePath?: unknown } } }).editor?.webcam?.sourcePath === 'string' + ? ((project as { editor?: { webcam?: { sourcePath?: string } } }).editor?.webcam?.sourcePath ?? null) + : null + const normalizedWebcamPath = normalizeVideoSourcePath(rawWebcamPath) + + if (!normalizedWebcamPath) { + return { + success: true, + videoPath: normalizedVideoPath, + webcamPath: null, + } + } + + try { + await fs.access(normalizedWebcamPath, fsConstants.F_OK) + return { + success: true, + videoPath: normalizedVideoPath, + webcamPath: normalizedWebcamPath, + } + } catch { + return { + success: true, + videoPath: normalizedVideoPath, + webcamPath: null, + } + } +} + function getRecordingSessionManifestPath(videoPath: string) { const extension = path.extname(videoPath) const baseName = path.basename(videoPath, extension) @@ -438,13 +507,33 @@ function getNativeCaptureHelperSourcePath() { } function getNativeArchTag() { - return process.arch === 'arm64' ? 'darwin-arm64' : 'darwin-x64' + if (process.platform === 'darwin') { + return process.arch === 'arm64' ? 'darwin-arm64' : 'darwin-x64' + } + + if (process.platform === 'win32') { + return process.arch === 'arm64' ? 'win32-arm64' : 'win32-x64' + } + + if (process.platform === 'linux') { + return process.arch === 'arm64' ? 'linux-arm64' : 'linux-x64' + } + + return `${process.platform}-${process.arch}` } function getPrebundledNativeHelperPath(binaryName: string) { return resolveUnpackedAppPath('electron', 'native', 'bin', getNativeArchTag(), binaryName) } +function getBundledWhisperExecutableCandidates() { + const binaryNames = process.platform === 'win32' + ? ['whisper-cli.exe', 'whisper-cpp.exe', 'whisper.exe', 'main.exe'] + : ['whisper-cli', 'whisper-cpp', 'whisper', 'main'] + + return binaryNames.map((binaryName) => getPrebundledNativeHelperPath(binaryName)) +} + function getNativeCaptureHelperBinaryPath() { return path.join(app.getPath('userData'), 'native-tools', 'openscreen-screencapturekit-helper') } @@ -677,6 +766,544 @@ function getFfmpegBinaryPath() { return ffmpegStatic } +function sendWhisperModelDownloadProgress( + webContents: Electron.WebContents, + payload: { status: 'idle' | 'downloading' | 'downloaded' | 'error'; progress: number; path?: string | null; error?: string }, +) { + webContents.send('whisper-small-model-download-progress', payload) +} + +async function getWhisperSmallModelStatus() { + try { + await fs.access(WHISPER_SMALL_MODEL_PATH, fsConstants.R_OK) + return { + success: true, + exists: true, + path: WHISPER_SMALL_MODEL_PATH, + } + } catch { + return { + success: true, + exists: false, + path: null, + } + } +} + +function downloadFileWithProgress( + url: string, + destinationPath: string, + onProgress: (progress: number) => void, +): Promise { + const request = (currentUrl: string, redirectCount = 0): Promise => { + return new Promise((resolve, reject) => { + const req = httpsGet(currentUrl, (response) => { + const statusCode = response.statusCode ?? 0 + const location = response.headers.location + + if (statusCode >= 300 && statusCode < 400 && location) { + response.resume() + if (redirectCount >= 5) { + reject(new Error('Too many redirects while downloading Whisper model.')) + return + } + + const nextUrl = new URL(location, currentUrl).toString() + void request(nextUrl, redirectCount + 1).then(resolve).catch(reject) + return + } + + if (statusCode < 200 || statusCode >= 300) { + response.resume() + reject(new Error(`Whisper model download failed with status ${statusCode}.`)) + return + } + + const totalBytes = Number.parseInt(String(response.headers['content-length'] ?? '0'), 10) + let downloadedBytes = 0 + const fileStream = createWriteStream(destinationPath) + + response.on('data', (chunk: Buffer) => { + downloadedBytes += chunk.length + if (Number.isFinite(totalBytes) && totalBytes > 0) { + onProgress(Math.min(100, Math.round((downloadedBytes / totalBytes) * 100))) + } + }) + + response.on('error', (error) => { + fileStream.destroy(error) + }) + + fileStream.on('error', (error) => { + response.destroy(error) + reject(error) + }) + + fileStream.on('finish', () => { + onProgress(100) + resolve() + }) + + response.pipe(fileStream) + }) + + req.on('error', reject) + }) + } + + return request(url) +} + +async function downloadWhisperSmallModel(webContents: Electron.WebContents) { + await fs.mkdir(WHISPER_MODEL_DIR, { recursive: true }) + const tempPath = `${WHISPER_SMALL_MODEL_PATH}.download` + + sendWhisperModelDownloadProgress(webContents, { + status: 'downloading', + progress: 0, + path: null, + }) + + try { + await fs.rm(tempPath, { force: true }) + await downloadFileWithProgress(WHISPER_MODEL_DOWNLOAD_URL, tempPath, (progress) => { + sendWhisperModelDownloadProgress(webContents, { + status: 'downloading', + progress, + path: null, + }) + }) + await fs.rename(tempPath, WHISPER_SMALL_MODEL_PATH) + sendWhisperModelDownloadProgress(webContents, { + status: 'downloaded', + progress: 100, + path: WHISPER_SMALL_MODEL_PATH, + }) + return WHISPER_SMALL_MODEL_PATH + } catch (error) { + await fs.rm(tempPath, { force: true }).catch(() => undefined) + sendWhisperModelDownloadProgress(webContents, { + status: 'error', + progress: 0, + path: null, + error: String(error), + }) + throw error + } +} + +async function deleteWhisperSmallModel() { + await fs.rm(WHISPER_SMALL_MODEL_PATH, { force: true }) +} + +function parseSrtTimestamp(value: string) { + const match = value.trim().match(/^(\d{2}):(\d{2}):(\d{2}),(\d{3})$/) + if (!match) { + return null + } + + const [, hours, minutes, seconds, milliseconds] = match + return ( + Number(hours) * 60 * 60 * 1000 + + Number(minutes) * 60 * 1000 + + Number(seconds) * 1000 + + Number(milliseconds) + ) +} + +type CaptionWordPayload = { + text: string + startMs: number + endMs: number + leadingSpace?: boolean +} + +type CaptionCuePayload = { + id: string + startMs: number + endMs: number + text: string + words?: CaptionWordPayload[] +} + +type WhisperJsonToken = { + text?: unknown + offsets?: { + from?: unknown + to?: unknown + } +} + +type WhisperJsonSegment = { + text?: unknown + offsets?: { + from?: unknown + to?: unknown + } + tokens?: unknown +} + +function isFiniteNumber(value: unknown): value is number { + return typeof value === 'number' && Number.isFinite(value) +} + +function buildCaptionTextFromWords(words: CaptionWordPayload[]) { + return words + .map((word, index) => `${index > 0 && word.leadingSpace ? ' ' : ''}${word.text}`) + .join('') + .trim() +} + +function parseWhisperJsonWords(tokens: unknown) { + if (!Array.isArray(tokens)) { + return [] + } + + const words: CaptionWordPayload[] = [] + let nextLeadingSpace = false + + for (const token of tokens) { + if (!token || typeof token !== 'object') { + continue + } + + const tokenData = token as WhisperJsonToken + const tokenText = typeof tokenData.text === 'string' ? tokenData.text : '' + if (!tokenText) { + continue + } + + const tokenStartMs = isFiniteNumber(tokenData.offsets?.from) ? Math.round(tokenData.offsets.from) : null + const tokenEndMs = isFiniteNumber(tokenData.offsets?.to) ? Math.round(tokenData.offsets.to) : null + const parts = tokenText.match(/\s+|[^\s]+/g) ?? [] + + for (const part of parts) { + if (/^\s+$/.test(part)) { + nextLeadingSpace = words.length > 0 + continue + } + + if (tokenStartMs == null || tokenEndMs == null || tokenEndMs <= tokenStartMs) { + return [] + } + + const previousWord = words.length > 0 ? words[words.length - 1] : null + if (!previousWord || nextLeadingSpace) { + words.push({ + text: part, + startMs: tokenStartMs, + endMs: tokenEndMs, + ...(words.length > 0 && nextLeadingSpace ? { leadingSpace: true } : {}), + }) + } else { + previousWord.text += part + previousWord.endMs = Math.max(previousWord.endMs, tokenEndMs) + } + + nextLeadingSpace = false + } + } + + return words.filter((word) => word.text.trim().length > 0) +} + +function parseWhisperJsonCues(content: string) { + try { + const parsed = JSON.parse(content) as { + transcription?: unknown + } + + if (!Array.isArray(parsed.transcription)) { + return [] + } + + return parsed.transcription + .map((segment, index) => { + if (!segment || typeof segment !== 'object') { + return null + } + + const segmentData = segment as WhisperJsonSegment + const startMs = isFiniteNumber(segmentData.offsets?.from) ? Math.round(segmentData.offsets.from) : null + const endMs = isFiniteNumber(segmentData.offsets?.to) ? Math.round(segmentData.offsets.to) : null + const segmentText = typeof segmentData.text === 'string' ? segmentData.text.trim() : '' + + if (startMs == null || endMs == null || endMs <= startMs) { + return null + } + + const words = parseWhisperJsonWords(segmentData.tokens) + const text = words.length > 0 ? buildCaptionTextFromWords(words) : segmentText + + if (!text) { + return null + } + + return { + id: `caption-${index + 1}`, + startMs, + endMs, + text, + ...(words.length > 0 ? { words } : {}), + } + }) + .filter((cue): cue is CaptionCuePayload => cue != null) + } catch (error) { + console.warn('[auto-captions] Failed to parse Whisper JSON output:', error) + return [] + } +} + +function parseSrtCues(content: string) { + return content + .split(/\r?\n\r?\n/) + .map((block, index) => { + const lines = block.split(/\r?\n/).map((line) => line.trim()) + const timingLine = lines.find((line) => line.includes('-->')) + if (!timingLine) { + return null + } + + const [rawStart, rawEnd] = timingLine.split('-->').map((part) => part.trim()) + const startMs = parseSrtTimestamp(rawStart) + const endMs = parseSrtTimestamp(rawEnd) + if (startMs == null || endMs == null || endMs <= startMs) { + return null + } + + const text = lines + .slice(lines.indexOf(timingLine) + 1) + .filter((line) => line.length > 0) + .join('\n') + .trim() + + if (!text) { + return null + } + + return { + id: `caption-${index + 1}`, + startMs, + endMs, + text, + } + }) + .filter((cue): cue is CaptionCuePayload => cue != null) +} + +function shouldRetryWhisperWithoutJson(error: unknown) { + const message = error instanceof Error ? error.message : String(error) + return /unknown argument|output-json-full|output-json|ojf|\boj\b/i.test(message) +} + +async function ensureReadableFile(filePath: string, description: string) { + await fs.access(filePath, fsConstants.R_OK) + if (description === 'whisper executable') { + try { + await fs.access(filePath, fsConstants.X_OK) + } catch { + throw new Error('The selected Whisper executable is not marked as executable.') + } + } +} + +async function isExecutableFile(filePath: string) { + try { + await fs.access(filePath, fsConstants.R_OK | fsConstants.X_OK) + return true + } catch { + return false + } +} + +async function resolveWhisperExecutablePath(preferredPath?: string | null) { + const candidatePaths = [ + preferredPath?.trim() || null, + ...getBundledWhisperExecutableCandidates(), + process.env['WHISPER_CPP_PATH']?.trim() || null, + process.platform === 'darwin' ? '/opt/homebrew/bin/whisper-cli' : null, + process.platform === 'darwin' ? '/usr/local/bin/whisper-cli' : null, + process.platform === 'darwin' ? '/opt/homebrew/bin/whisper-cpp' : null, + process.platform === 'darwin' ? '/usr/local/bin/whisper-cpp' : null, + ].filter((value): value is string => Boolean(value)) + + for (const candidate of candidatePaths) { + const normalized = path.resolve(candidate) + if (await isExecutableFile(normalized)) { + return normalized + } + } + + const pathCommand = process.platform === 'win32' ? 'where' : 'which' + const binaryNames = process.platform === 'win32' + ? ['whisper-cli.exe', 'whisper.exe', 'main.exe'] + : ['whisper-cli', 'whisper-cpp', 'whisper', 'main'] + + for (const binaryName of binaryNames) { + const result = spawnSync(pathCommand, [binaryName], { encoding: 'utf-8' }) + if (result.status === 0) { + const resolvedPath = result.stdout + .split(/\r?\n/) + .map((line) => line.trim()) + .find(Boolean) + + if (resolvedPath && await isExecutableFile(resolvedPath)) { + return resolvedPath + } + } + } + + throw new Error('No Whisper runtime was found. Recordly looked for a bundled binary first, then checked common system install locations.') +} + +async function resolveCaptionAudioCandidates(videoPath: string) { + const candidates: Array<{ path: string; label: string }> = [] + const seenPaths = new Set() + + const pushCandidate = (candidatePath: string | null | undefined, label: string) => { + const normalizedCandidatePath = normalizeVideoSourcePath(candidatePath) + if (!normalizedCandidatePath || seenPaths.has(normalizedCandidatePath)) { + return + } + + seenPaths.add(normalizedCandidatePath) + candidates.push({ path: normalizedCandidatePath, label }) + } + + pushCandidate(videoPath, 'recording') + + const requestedRecordingSession = await resolveRecordingSession(videoPath) + pushCandidate(requestedRecordingSession?.webcamPath, 'linked webcam recording') + + pushCandidate(currentRecordingSession?.videoPath, 'current recording') + pushCandidate(currentRecordingSession?.webcamPath, 'current linked webcam recording') + pushCandidate(currentVideoPath, 'current video') + + return candidates +} + +async function extractCaptionAudioSource(options: { + videoPath: string + ffmpegPath: string + wavPath: string +}) { + const candidates = await resolveCaptionAudioCandidates(options.videoPath) + const attemptedCandidates: Array<{ + path: string + label: string + readable: boolean + extractedAudio: boolean + error?: string + }> = [] + + for (const candidate of candidates) { + try { + await ensureReadableFile(candidate.path, 'video file') + await execFileAsync( + options.ffmpegPath, + ['-y', '-i', candidate.path, '-map', '0:a:0', '-vn', '-ac', '1', '-ar', '16000', '-c:a', 'pcm_s16le', options.wavPath], + { timeout: 5 * 60 * 1000, maxBuffer: 20 * 1024 * 1024 }, + ) + attemptedCandidates.push({ ...candidate, readable: true, extractedAudio: true }) + return candidate + } catch (error) { + attemptedCandidates.push({ + ...candidate, + readable: true, + extractedAudio: false, + error: error instanceof Error ? error.message : String(error), + }) + // Try the next candidate instead of failing on stale editor state. + } + } + + console.warn('[auto-captions] No audio source candidate could be extracted:', attemptedCandidates) + + throw new Error('No audio was found to transcribe in the saved recording file. Captions need an audio track. If this recording should have contained sound, the recording was saved without an audio stream.') +} + +async function generateAutoCaptionsFromVideo(options: { + videoPath: string + whisperExecutablePath?: string + whisperModelPath: string + language?: string +}) { + const ffmpegPath = getFfmpegBinaryPath() + const normalizedVideoPath = normalizeVideoSourcePath(options.videoPath) + if (!normalizedVideoPath) { + throw new Error('Missing source video path.') + } + + const whisperExecutablePath = await resolveWhisperExecutablePath(options.whisperExecutablePath) + const whisperModelPath = path.resolve(options.whisperModelPath) + await ensureReadableFile(whisperExecutablePath, 'whisper executable') + await ensureReadableFile(whisperModelPath, 'whisper model') + + const tempBase = path.join(app.getPath('temp'), `recordly-captions-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`) + const wavPath = `${tempBase}.wav` + const outputBase = `${tempBase}-whisper` + const srtPath = `${outputBase}.srt` + const jsonPath = `${outputBase}.json` + + try { + const audioSource = await extractCaptionAudioSource({ + videoPath: normalizedVideoPath, + ffmpegPath, + wavPath, + }) + + const language = options.language && options.language.trim() ? options.language.trim() : 'auto' + const whisperBaseArgs = [ + '-m', whisperModelPath, + '-f', wavPath, + '-osrt', + '-of', outputBase, + '-l', language, + '-np', + ] + + let jsonEnabled = true + try { + await execFileAsync(whisperExecutablePath, [...whisperBaseArgs, '-ojf'], { + timeout: 30 * 60 * 1000, + maxBuffer: 20 * 1024 * 1024, + }) + } catch (error) { + if (!shouldRetryWhisperWithoutJson(error)) { + throw error + } + + jsonEnabled = false + console.warn('[auto-captions] Whisper runtime does not support JSON full output, retrying with SRT only:', error) + await execFileAsync(whisperExecutablePath, whisperBaseArgs, { + timeout: 30 * 60 * 1000, + maxBuffer: 20 * 1024 * 1024, + }) + } + + const timedCues = jsonEnabled + ? parseWhisperJsonCues(await fs.readFile(jsonPath, 'utf-8')) + : [] + const cues = timedCues.length > 0 + ? timedCues + : parseSrtCues(await fs.readFile(srtPath, 'utf-8')) + if (cues.length === 0) { + throw new Error('Whisper completed, but no caption cues were produced.') + } + + return { + cues, + audioSourceLabel: audioSource.label, + } + } finally { + await Promise.allSettled([ + fs.rm(wavPath, { force: true }), + fs.rm(srtPath, { force: true }), + fs.rm(jsonPath, { force: true }), + ]) + } +} + function waitForFfmpegCaptureStart(process: ChildProcessWithoutNullStreams) { return new Promise((resolve, reject) => { const onError = (error: Error) => { @@ -1122,39 +1749,46 @@ function waitForNativeCaptureStop(process: ChildProcessWithoutNullStreams) { }) } -async function fileHasAudioStream(filePath: string) { +async function muxNativeMacRecordingWithAudio( + videoPath: string, + systemAudioPath?: string | null, + microphonePath?: string | null, +) { const ffmpegPath = getFfmpegBinaryPath() + const mixedOutputPath = `${videoPath}.mixed.mp4` - try { - await execFileAsync( - ffmpegPath, - ['-i', filePath], - { timeout: 30000, maxBuffer: 10 * 1024 * 1024 }, - ) - } catch (error) { - const stderr = typeof error === 'object' && error !== null && 'stderr' in error - ? String((error as { stderr?: unknown }).stderr ?? '') - : '' + const inputs = ['-i', videoPath] + const availableAudioInputs: string[] = [] - if (stderr) { - return /Audio:/i.test(stderr) + if (systemAudioPath) { + try { + await fs.access(systemAudioPath) + inputs.push('-i', systemAudioPath) + availableAudioInputs.push('system') + } catch { + // system audio file not available } } - return false -} + if (microphonePath) { + try { + await fs.access(microphonePath) + inputs.push('-i', microphonePath) + availableAudioInputs.push('microphone') + } catch { + // microphone audio file not available + } + } -async function mixNativeMacAudioTracks(videoPath: string, microphonePath: string) { - const ffmpegPath = getFfmpegBinaryPath() - const mixedOutputPath = `${videoPath}.mixed.mp4` - const videoHasAudio = await fileHasAudioStream(videoPath) + if (availableAudioInputs.length === 0) { + return + } - const args = videoHasAudio + const args = availableAudioInputs.length === 2 ? [ '-y', - '-i', videoPath, - '-i', microphonePath, - '-filter_complex', '[0:a][1:a]amix=inputs=2:duration=longest:normalize=0[aout]', + ...inputs, + '-filter_complex', '[1:a][2:a]amix=inputs=2:duration=longest:normalize=0[aout]', '-map', '0:v:0', '-map', '[aout]', '-c:v', 'copy', @@ -1165,8 +1799,7 @@ async function mixNativeMacAudioTracks(videoPath: string, microphonePath: string ] : [ '-y', - '-i', videoPath, - '-i', microphonePath, + ...inputs, '-map', '0:v:0', '-map', '1:a:0', '-c:v', 'copy', @@ -1183,7 +1816,12 @@ async function mixNativeMacAudioTracks(videoPath: string, microphonePath: string ) await moveFileWithOverwrite(mixedOutputPath, videoPath) - await fs.rm(microphonePath, { force: true }) + + for (const audioPath of [systemAudioPath, microphonePath]) { + if (audioPath) { + await fs.rm(audioPath, { force: true }).catch(() => {}) + } + } } function emitRecordingInterrupted(reason: string, message: string) { @@ -1227,6 +1865,8 @@ function attachNativeCaptureLifecycle(process: ChildProcessWithoutNullStreams) { nativeScreenRecordingActive = false nativeCaptureTargetPath = null nativeCaptureStopRequested = false + nativeCaptureSystemAudioPath = null + nativeCaptureMicrophonePath = null const sourceName = selectedSource?.name ?? 'Screen' BrowserWindow.getAllWindows().forEach((window) => { @@ -2259,7 +2899,10 @@ body{background:transparent;overflow:hidden;width:100vw;height:100vh} const outputPath = path.join(recordingsDir, `recording-${Date.now()}.mp4`) const capturesSystemAudio = Boolean(options?.capturesSystemAudio) const capturesMicrophone = Boolean(options?.capturesMicrophone) - const microphoneOutputPath = capturesSystemAudio && capturesMicrophone + const systemAudioOutputPath = capturesSystemAudio + ? path.join(recordingsDir, `recording-${Date.now()}.system.m4a`) + : null + const microphoneOutputPath = capturesMicrophone ? path.join(recordingsDir, `recording-${Date.now()}.mic.m4a`) : null const config: Record = { @@ -2277,6 +2920,10 @@ body{background:transparent;overflow:hidden;width:100vw;height:100vh} config.microphoneLabel = options.microphoneLabel } + if (systemAudioOutputPath) { + config.systemAudioOutputPath = systemAudioOutputPath + } + if (microphoneOutputPath) { config.microphoneOutputPath = microphoneOutputPath } @@ -2294,6 +2941,7 @@ body{background:transparent;overflow:hidden;width:100vw;height:100vh} nativeCaptureOutputBuffer = '' nativeCaptureTargetPath = outputPath + nativeCaptureSystemAudioPath = systemAudioOutputPath nativeCaptureMicrophonePath = microphoneOutputPath nativeCaptureStopRequested = false nativeCapturePaused = false @@ -2323,6 +2971,7 @@ body{background:transparent;overflow:hidden;width:100vw;height:100vh} nativeScreenRecordingActive = false nativeCaptureProcess = null nativeCaptureTargetPath = null + nativeCaptureSystemAudioPath = null nativeCaptureMicrophonePath = null nativeCaptureStopRequested = false nativeCapturePaused = false @@ -2407,6 +3056,7 @@ body{background:transparent;overflow:hidden;width:100vw;height:100vh} const process = nativeCaptureProcess const preferredVideoPath = nativeCaptureTargetPath + const preferredSystemAudioPath = nativeCaptureSystemAudioPath const preferredMicrophonePath = nativeCaptureMicrophonePath nativeCaptureStopRequested = true process.stdin.write('stop\n') @@ -2414,6 +3064,7 @@ body{background:transparent;overflow:hidden;width:100vw;height:100vh} nativeCaptureProcess = null nativeScreenRecordingActive = false nativeCaptureTargetPath = null + nativeCaptureSystemAudioPath = null nativeCaptureMicrophonePath = null nativeCaptureStopRequested = false nativeCapturePaused = false @@ -2423,12 +3074,11 @@ body{background:transparent;overflow:hidden;width:100vw;height:100vh} await moveFileWithOverwrite(tempVideoPath, finalVideoPath) } - if (preferredMicrophonePath) { + if (preferredSystemAudioPath || preferredMicrophonePath) { try { - await fs.access(preferredMicrophonePath) - await mixNativeMacAudioTracks(finalVideoPath, preferredMicrophonePath) + await muxNativeMacRecordingWithAudio(finalVideoPath, preferredSystemAudioPath, preferredMicrophonePath) } catch (error) { - console.warn('Failed to mix native macOS microphone audio into capture:', error) + console.warn('Failed to mux native macOS audio into capture:', error) } } @@ -2439,6 +3089,7 @@ body{background:transparent;overflow:hidden;width:100vw;height:100vh} nativeScreenRecordingActive = false nativeCaptureProcess = null nativeCaptureTargetPath = null + nativeCaptureSystemAudioPath = null nativeCaptureMicrophonePath = null nativeCaptureStopRequested = false nativeCapturePaused = false @@ -3025,6 +3676,118 @@ body{background:transparent;overflow:hidden;width:100vw;height:100vh} } }); + ipcMain.handle('open-whisper-executable-picker', async () => { + try { + const result = await dialog.showOpenDialog({ + title: 'Select Whisper Executable', + filters: [ + { name: 'Executables', extensions: process.platform === 'win32' ? ['exe', 'cmd', 'bat'] : ['*'] }, + { name: 'All Files', extensions: ['*'] }, + ], + properties: ['openFile'], + }) + + if (result.canceled || result.filePaths.length === 0) { + return { success: false, canceled: true } + } + + return { success: true, path: result.filePaths[0] } + } catch (error) { + console.error('Failed to open Whisper executable picker:', error) + return { success: false, error: String(error) } + } + }) + + ipcMain.handle('open-whisper-model-picker', async () => { + try { + const result = await dialog.showOpenDialog({ + title: 'Select Whisper Model', + filters: [ + { name: 'Whisper Models', extensions: ['bin'] }, + { name: 'All Files', extensions: ['*'] }, + ], + properties: ['openFile'], + }) + + if (result.canceled || result.filePaths.length === 0) { + return { success: false, canceled: true } + } + + return { success: true, path: result.filePaths[0] } + } catch (error) { + console.error('Failed to open Whisper model picker:', error) + return { success: false, error: String(error) } + } + }) + + ipcMain.handle('get-whisper-small-model-status', async () => { + try { + return await getWhisperSmallModelStatus() + } catch (error) { + return { success: false, exists: false, path: null, error: String(error) } + } + }) + + ipcMain.handle('download-whisper-small-model', async (event) => { + try { + const existing = await getWhisperSmallModelStatus() + if (existing.exists) { + sendWhisperModelDownloadProgress(event.sender, { + status: 'downloaded', + progress: 100, + path: existing.path, + }) + return { success: true, path: existing.path, alreadyDownloaded: true } + } + + const modelPath = await downloadWhisperSmallModel(event.sender) + return { success: true, path: modelPath } + } catch (error) { + console.error('Failed to download Whisper small model:', error) + return { success: false, error: String(error) } + } + }) + + ipcMain.handle('delete-whisper-small-model', async (event) => { + try { + await deleteWhisperSmallModel() + sendWhisperModelDownloadProgress(event.sender, { + status: 'idle', + progress: 0, + path: null, + }) + return { success: true } + } catch (error) { + console.error('Failed to delete Whisper small model:', error) + return { success: false, error: String(error) } + } + }) + + ipcMain.handle('generate-auto-captions', async (_, options: { + videoPath: string + whisperExecutablePath: string + whisperModelPath: string + language?: string + }) => { + try { + const result = await generateAutoCaptionsFromVideo(options) + return { + success: true, + cues: result.cues, + message: result.audioSourceLabel === 'recording' + ? `Generated ${result.cues.length} caption cues.` + : `Generated ${result.cues.length} caption cues from the ${result.audioSourceLabel}.`, + } + } catch (error) { + console.error('Failed to generate auto captions:', error) + return { + success: false, + error: String(error), + message: 'Failed to generate auto captions', + } + } + }) + ipcMain.handle('reveal-in-folder', async (_, filePath: string) => { try { // shell.showItemInFolder doesn't return a value, it throws on error @@ -3185,22 +3948,23 @@ body{background:transparent;overflow:hidden;width:100vw;height:100vh} const filePath = result.filePaths[0] const content = await fs.readFile(filePath, 'utf-8') const project = JSON.parse(content) - currentProjectPath = filePath - if (project && typeof project === 'object' && typeof project.videoPath === 'string') { - const normalizedVideoPath = normalizeVideoSourcePath(project.videoPath) ?? project.videoPath - currentVideoPath = normalizedVideoPath - const webcamPath = - typeof (project as { editor?: { webcam?: { sourcePath?: unknown } } }).editor?.webcam - ?.sourcePath === 'string' - ? ((project as { editor?: { webcam?: { sourcePath?: string } } }).editor?.webcam - ?.sourcePath ?? null) - : null - currentRecordingSession = { - videoPath: normalizedVideoPath, - webcamPath, + const mediaSources = await resolveProjectMediaSources(project) + + if (!mediaSources.success) { + return { + success: false, + canceled: false, + message: mediaSources.message, } } + currentProjectPath = filePath + currentVideoPath = mediaSources.videoPath + currentRecordingSession = { + videoPath: mediaSources.videoPath, + webcamPath: mediaSources.webcamPath, + } + return { success: true, path: filePath, @@ -3224,20 +3988,21 @@ body{background:transparent;overflow:hidden;width:100vw;height:100vh} const content = await fs.readFile(currentProjectPath, 'utf-8') const project = JSON.parse(content) - if (project && typeof project === 'object' && typeof project.videoPath === 'string') { - const normalizedVideoPath = normalizeVideoSourcePath(project.videoPath) ?? project.videoPath - currentVideoPath = normalizedVideoPath - const webcamPath = - typeof (project as { editor?: { webcam?: { sourcePath?: unknown } } }).editor?.webcam - ?.sourcePath === 'string' - ? ((project as { editor?: { webcam?: { sourcePath?: string } } }).editor?.webcam - ?.sourcePath ?? null) - : null - currentRecordingSession = { - videoPath: normalizedVideoPath, - webcamPath, + const mediaSources = await resolveProjectMediaSources(project) + + if (!mediaSources.success) { + return { + success: false, + message: mediaSources.message, } } + + currentVideoPath = mediaSources.videoPath + currentRecordingSession = { + videoPath: mediaSources.videoPath, + webcamPath: mediaSources.webcamPath, + } + return { success: true, path: currentProjectPath, diff --git a/electron/native/ScreenCaptureKitRecorder.swift b/electron/native/ScreenCaptureKitRecorder.swift index 274b3562..220b112b 100644 --- a/electron/native/ScreenCaptureKitRecorder.swift +++ b/electron/native/ScreenCaptureKitRecorder.swift @@ -10,6 +10,7 @@ struct CaptureConfig: Codable { let outputPath: String? let capturesSystemAudio: Bool? let capturesMicrophone: Bool? + let systemAudioOutputPath: String? let microphoneDeviceId: String? let microphoneLabel: String? let microphoneOutputPath: String? @@ -21,12 +22,13 @@ final class ScreenCaptureRecorder: NSObject, SCStreamOutput, SCStreamDelegate { private let queue = DispatchQueue(label: "openscreen.screencapturekit.video") private var assetWriter: AVAssetWriter? private var videoInput: AVAssetWriterInput? - private var audioInput: AVAssetWriterInput? + private var systemAudioWriter: AVAssetWriter? + private var systemAudioInput: AVAssetWriterInput? private var microphoneOnlyWriter: AVAssetWriter? private var microphoneOnlyInput: AVAssetWriterInput? private var stream: SCStream? private var firstSampleTime: CMTime = .zero - private var firstPrimaryAudioSampleTime: CMTime? + private var firstSystemAudioSampleTime: CMTime? private var firstMicrophoneSampleTime: CMTime? private var lastSampleBuffer: CMSampleBuffer? private var lastVideoPresentationTime: CMTime = .zero @@ -44,17 +46,11 @@ final class ScreenCaptureRecorder: NSObject, SCStreamOutput, SCStreamDelegate { private var windowValidationTask: Task? private var capturesSystemAudio = false private var capturesMicrophone = false + private var writesSystemAudioToSeparateTrack = false private var writesMicrophoneToSeparateTrack = false - private enum PrimaryAudioSource { - case system - case microphone - } - private let microphoneOutputTypeRawValue = 2 - private var primaryAudioSource: PrimaryAudioSource? - func startCapture(configJSON: String) async throws { guard !isRecording else { throw NSError(domain: "RecordlyCapture", code: 1, userInfo: [NSLocalizedDescriptionKey: "Recording is already in progress"]) @@ -76,8 +72,11 @@ final class ScreenCaptureRecorder: NSObject, SCStreamOutput, SCStreamDelegate { userInfo: [NSLocalizedDescriptionKey: "Native microphone capture is unavailable on this macOS/Xcode runtime"] ) } + writesSystemAudioToSeparateTrack = capturesSystemAudio writesMicrophoneToSeparateTrack = capturesSystemAudio && capturesMicrophone - primaryAudioSource = capturesSystemAudio ? .system : (capturesMicrophone ? .microphone : nil) + if capturesMicrophone && !capturesSystemAudio { + writesMicrophoneToSeparateTrack = true + } let requestedFPS = max(targetCaptureFPS, config.fps ?? targetCaptureFPS) streamConfig.minimumFrameInterval = CMTime(value: 1, timescale: CMTimeScale(requestedFPS)) streamConfig.queueDepth = 6 @@ -144,7 +143,7 @@ final class ScreenCaptureRecorder: NSObject, SCStreamOutput, SCStreamDelegate { let outputFileType: AVFileType = destinationURL.pathExtension.lowercased() == "mp4" ? .mp4 : .mov assetWriter = try AVAssetWriter(url: destinationURL, fileType: outputFileType) microphoneOutputURL = nil - firstPrimaryAudioSampleTime = nil + firstSystemAudioSampleTime = nil firstMicrophoneSampleTime = nil guard let assistant = AVOutputSettingsAssistant(preset: .preset3840x2160) else { @@ -174,21 +173,34 @@ final class ScreenCaptureRecorder: NSObject, SCStreamOutput, SCStreamDelegate { assetWriter.add(videoInput) self.videoInput = videoInput - if primaryAudioSource != nil { - let audioInput = AVAssetWriterInput(mediaType: .audio, outputSettings: Self.audioOutputSettings(bitRate: 160_000)) - audioInput.expectsMediaDataInRealTime = true - - guard assetWriter.canAdd(audioInput) else { - throw NSError(domain: "RecordlyCapture", code: 11, userInfo: [NSLocalizedDescriptionKey: "Unable to add audio writer input"]) + if writesSystemAudioToSeparateTrack { + guard let systemAudioOutputPath = config.systemAudioOutputPath, !systemAudioOutputPath.isEmpty else { + throw NSError(domain: "RecordlyCapture", code: 11, userInfo: [NSLocalizedDescriptionKey: "Missing system audio output path for audio capture"]) } - assetWriter.add(audioInput) - self.audioInput = audioInput + let systemAudioURL = URL(fileURLWithPath: systemAudioOutputPath) + let systemAudioWriter = try AVAssetWriter(url: systemAudioURL, fileType: .m4a) + let systemAudioInput = AVAssetWriterInput(mediaType: .audio, outputSettings: Self.audioOutputSettings(bitRate: 160_000)) + systemAudioInput.expectsMediaDataInRealTime = true + + guard systemAudioWriter.canAdd(systemAudioInput) else { + throw NSError(domain: "RecordlyCapture", code: 12, userInfo: [NSLocalizedDescriptionKey: "Unable to add system audio writer input"]) + } + + systemAudioWriter.add(systemAudioInput) + self.systemAudioWriter = systemAudioWriter + self.systemAudioInput = systemAudioInput + + guard systemAudioWriter.startWriting() else { + throw NSError(domain: "RecordlyCapture", code: 13, userInfo: [NSLocalizedDescriptionKey: systemAudioWriter.error?.localizedDescription ?? "Unable to start system audio writing"]) + } + + systemAudioWriter.startSession(atSourceTime: .zero) } if writesMicrophoneToSeparateTrack { guard let microphoneOutputPath = config.microphoneOutputPath, !microphoneOutputPath.isEmpty else { - throw NSError(domain: "RecordlyCapture", code: 12, userInfo: [NSLocalizedDescriptionKey: "Missing microphone output path for dual-audio capture"]) + throw NSError(domain: "RecordlyCapture", code: 14, userInfo: [NSLocalizedDescriptionKey: "Missing microphone output path for microphone capture"]) } let microphoneURL = URL(fileURLWithPath: microphoneOutputPath) @@ -198,7 +210,7 @@ final class ScreenCaptureRecorder: NSObject, SCStreamOutput, SCStreamDelegate { microphoneInput.expectsMediaDataInRealTime = true guard microphoneWriter.canAdd(microphoneInput) else { - throw NSError(domain: "RecordlyCapture", code: 13, userInfo: [NSLocalizedDescriptionKey: "Unable to add microphone writer input"]) + throw NSError(domain: "RecordlyCapture", code: 15, userInfo: [NSLocalizedDescriptionKey: "Unable to add microphone writer input"]) } microphoneWriter.add(microphoneInput) @@ -206,7 +218,7 @@ final class ScreenCaptureRecorder: NSObject, SCStreamOutput, SCStreamDelegate { self.microphoneOnlyInput = microphoneInput guard microphoneWriter.startWriting() else { - throw NSError(domain: "RecordlyCapture", code: 14, userInfo: [NSLocalizedDescriptionKey: microphoneWriter.error?.localizedDescription ?? "Unable to start microphone audio writing"]) + throw NSError(domain: "RecordlyCapture", code: 16, userInfo: [NSLocalizedDescriptionKey: microphoneWriter.error?.localizedDescription ?? "Unable to start microphone audio writing"]) } microphoneWriter.startSession(atSourceTime: .zero) @@ -222,7 +234,7 @@ final class ScreenCaptureRecorder: NSObject, SCStreamOutput, SCStreamDelegate { guard let microphoneOutputType = SCStreamOutputType(rawValue: microphoneOutputTypeRawValue) else { throw NSError( domain: "RecordlyCapture", - code: 15, + code: 17, userInfo: [NSLocalizedDescriptionKey: "Microphone stream output type is unavailable"] ) } @@ -302,16 +314,14 @@ final class ScreenCaptureRecorder: NSObject, SCStreamOutput, SCStreamDelegate { } if outputType == .audio { - guard primaryAudioSource == .system, let audioInput else { return } - appendAudioSampleBuffer(sampleBuffer, to: audioInput, firstSampleTime: &firstPrimaryAudioSampleTime, presentationTime: presentationTime) + guard let systemAudioInput else { return } + appendAudioSampleBuffer(sampleBuffer, to: systemAudioInput, firstSampleTime: &firstSystemAudioSampleTime, presentationTime: presentationTime) return } if outputType.rawValue == microphoneOutputTypeRawValue { - if writesMicrophoneToSeparateTrack, let microphoneOnlyInput { + if let microphoneOnlyInput { appendAudioSampleBuffer(sampleBuffer, to: microphoneOnlyInput, firstSampleTime: &firstMicrophoneSampleTime, presentationTime: presentationTime) - } else if primaryAudioSource == .microphone, let audioInput { - appendAudioSampleBuffer(sampleBuffer, to: audioInput, firstSampleTime: &firstPrimaryAudioSampleTime, presentationTime: presentationTime) } return } @@ -349,23 +359,26 @@ final class ScreenCaptureRecorder: NSObject, SCStreamOutput, SCStreamDelegate { assetWriter?.endSession(atSourceTime: lastSampleBuffer?.presentationTimeStamp ?? .zero) videoInput?.markAsFinished() - audioInput?.markAsFinished() await assetWriter?.finishWriting() + systemAudioInput?.markAsFinished() + await systemAudioWriter?.finishWriting() + microphoneOnlyInput?.markAsFinished() await microphoneOnlyWriter?.finishWriting() let path = outputURL?.path ?? "" assetWriter = nil videoInput = nil - audioInput = nil + systemAudioWriter = nil + systemAudioInput = nil microphoneOnlyWriter = nil microphoneOnlyInput = nil outputURL = nil microphoneOutputURL = nil sessionStarted = false firstSampleTime = .zero - firstPrimaryAudioSampleTime = nil + firstSystemAudioSampleTime = nil firstMicrophoneSampleTime = nil lastSampleBuffer = nil lastVideoPresentationTime = .zero @@ -377,8 +390,8 @@ final class ScreenCaptureRecorder: NSObject, SCStreamOutput, SCStreamDelegate { accumulatedPausedDuration = .zero capturesSystemAudio = false capturesMicrophone = false + writesSystemAudioToSeparateTrack = false writesMicrophoneToSeparateTrack = false - primaryAudioSource = nil return path } diff --git a/electron/native/bin/darwin-arm64/openscreen-screencapturekit-helper b/electron/native/bin/darwin-arm64/openscreen-screencapturekit-helper index 9bdbccc51d040b5db73fb998339ca508984efa36..825dd53e63694da31d6d9ca6137e47d77ff49f85 100755 GIT binary patch literal 187504 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 literal 189776 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 diff --git a/electron/preload.ts b/electron/preload.ts index 1f6f48b6..f5c8fa53 100644 --- a/electron/preload.ts +++ b/electron/preload.ts @@ -153,6 +153,39 @@ contextBridge.exposeInMainWorld("electronAPI", { openAudioFilePicker: () => { return ipcRenderer.invoke("open-audio-file-picker"); }, + openWhisperExecutablePicker: () => { + return ipcRenderer.invoke("open-whisper-executable-picker"); + }, + openWhisperModelPicker: () => { + return ipcRenderer.invoke("open-whisper-model-picker"); + }, + getWhisperSmallModelStatus: () => { + return ipcRenderer.invoke("get-whisper-small-model-status"); + }, + downloadWhisperSmallModel: () => { + return ipcRenderer.invoke("download-whisper-small-model"); + }, + deleteWhisperSmallModel: () => { + return ipcRenderer.invoke("delete-whisper-small-model"); + }, + onWhisperSmallModelDownloadProgress: ( + callback: (state: { status: "idle" | "downloading" | "downloaded" | "error"; progress: number; path?: string | null; error?: string }) => void, + ) => { + const listener = ( + _event: Electron.IpcRendererEvent, + payload: { status: "idle" | "downloading" | "downloaded" | "error"; progress: number; path?: string | null; error?: string }, + ) => callback(payload); + ipcRenderer.on("whisper-small-model-download-progress", listener); + return () => ipcRenderer.removeListener("whisper-small-model-download-progress", listener); + }, + generateAutoCaptions: (options: { + videoPath: string; + whisperExecutablePath?: string; + whisperModelPath: string; + language?: string; + }) => { + return ipcRenderer.invoke("generate-auto-captions", options); + }, setCurrentVideoPath: (path: string) => { return ipcRenderer.invoke("set-current-video-path", path); },