fd7e1a5907
AudioRecorder captures system audio (ScreenCaptureKit) + mic (AVAudioEngine) on a single serial ioQueue, one shared monotonic t0, time-driven writers (pad gaps / trim overlaps) so tracks stay aligned, and an energy mic-VAD for 'self' spans. AudioMixer sums the aligned tracks into mixed_mono_16k.wav. SessionController drives a serialized start/stop state machine, writes the session folder + self_vad.json, exposes live level meters, and finalizes on quit. Hardening from review: ioQueue single-domain (no races), stop() never hangs (mic-first teardown + bounded stopCapture), layout-agnostic mic deep-copy, discard-only video output to keep SCStream alive, VAD lockstep on committed frames, stable signing team in project.yml, single-instance enforcement.
69 lines
2.8 KiB
Markdown
69 lines
2.8 KiB
Markdown
# Ten31 Transcripts
|
||
|
||
Native macOS menu-bar app that auto-detects conference calls, records local audio,
|
||
builds a visual-derived speaker timeline, and hands audio + timeline to the
|
||
SparkControl backend for naming/transcription. See `docs/` for the full spec.
|
||
|
||
This repo is at **Phase 0** (scaffold, permissions, backend health check).
|
||
|
||
## One-time setup
|
||
|
||
1. **Install Xcode** from the Mac App Store (free; ~40 GB). Open it once and
|
||
accept the license prompt.
|
||
2. **Install XcodeGen** (generates the Xcode project from `project.yml`):
|
||
```sh
|
||
brew install xcodegen
|
||
```
|
||
3. **Generate the project:**
|
||
```sh
|
||
xcodegen generate
|
||
```
|
||
This creates `Ten31Transcripts.xcodeproj` (git-ignored — regenerate any time).
|
||
4. **Open it:**
|
||
```sh
|
||
open Ten31Transcripts.xcodeproj
|
||
```
|
||
5. Signing is preconfigured: `project.yml` sets `DEVELOPMENT_TEAM` to the free
|
||
personal team `BK4Y6CXN35` with automatic signing, so **Signing & Capabilities
|
||
should already show the team** — no manual selection needed. (If you ever sign
|
||
with a different Apple ID, update `DEVELOPMENT_TEAM` in `project.yml`, not in
|
||
Xcode — `xcodegen generate` overwrites Xcode-side changes.)
|
||
6. Press **Run** (⌘R).
|
||
|
||
> **Note:** after adding files in a new phase, re-run `xcodegen generate` and let
|
||
> Xcode reload the project. The signing team persists because it lives in
|
||
> `project.yml`, so macOS permissions stay granted across rebuilds.
|
||
|
||
## What Phase 0 does
|
||
|
||
- Launches as a menu-bar-only app (no Dock icon).
|
||
- Menu panel shows live status for the three permissions it needs — **Microphone**,
|
||
**Screen Recording**, **Accessibility** — with Grant / Open Settings buttons.
|
||
- Shows a **backend health check** (`GET /api/status`) against the configured host.
|
||
- **Settings:** backend base URL, skip-TLS toggle (on by default for the
|
||
self-signed cert), output folder, and adapter toggles (inert this phase).
|
||
|
||
No audio capture, call detection, screen reading, or backend hand-off yet — those
|
||
arrive in Phases 1–6 (`docs/04_BUILD_PLAN.md`).
|
||
|
||
## Project layout
|
||
|
||
```
|
||
project.yml # XcodeGen recipe → generates the .xcodeproj
|
||
Ten31Transcripts/
|
||
App/ Ten31TranscriptsApp.swift, AppDelegate.swift
|
||
UI/ MenuBarView, SettingsView, PermissionRow
|
||
Permissions/PermissionsManager.swift
|
||
Backend/ SparkControlHealth.swift, InsecureTrustDelegate.swift
|
||
Settings/ AppSettings.swift
|
||
Support/ Info.plist, Ten31Transcripts.entitlements
|
||
Ten31TranscriptsTests/ # placeholder; real tests land in Phase 3
|
||
```
|
||
|
||
## Notes
|
||
|
||
- **App Sandbox is off** and **Hardened Runtime is off** — this is a personal,
|
||
LAN-only tool that must observe other apps. Revisit only if distributing.
|
||
- The default backend host is `https://your-spark-backend.local:62419` (editable in
|
||
Settings).
|