Skip to content

[feat] 마이크 + 회의 소리 녹음 소스를 추가한다 - #15

Merged
m16khb merged 1 commit into
mainfrom
14-system-audio-recording
Oct 11, 2026
Merged

m16khb merged 1 commit into
mainfrom
14-system-audio-recording

Conversation

@m16khb

@m16khb m16khb commented Oct 11, 2026

Copy link
Copy Markdown
Collaborator

요약

녹음 카드에서 마이크만과 마이크 + 회의 소리 중 녹음 소스를 고를 수 있습니다. 마이크 + 회의 소리를 고르면 내 마이크에 더해 컴퓨터 스피커로 나오는 소리(Slack 허들, Zoom, Google Meet의 상대방 목소리)를 함께 녹음하고, 정지하면 회의 폴더에 WAV 파일 하나로 합칩니다. 합친 파일은 기존 전사, 화자 분리, Drive 업로드 흐름을 그대로 탑니다. 마이크만 녹음은 이전과 같습니다.

Closes #14

변경 내용

  • 소스 선택: 녹음 버튼 아래에 기존 segmented-control 마크업과 SEED 토큰으로 녹음 소스 선택을 넣었습니다. 선택은 바로 저장되고 다음 실행에 복원되며, 녹음 중에는 바뀌지 않습니다. 저장에 실패하면 이전 선택으로 돌아가고 오류를 알립니다. 마이크 + 회의 소리를 고르면 스피커 대신 헤드폰을 쓰라는 안내가 보입니다.
  • 시스템 소리 녹음: 기본 출력 장치를 Windows는 WASAPI 루프백으로, macOS는 Core Audio 프로세스 탭(macOS 14.6 이상)으로 엽니다. 두 입력은 녹음하는 동안 별도 트랙 파일에 쓰며, 오디오 콜백은 기존의 막히지 않는 대기열 경로를 그대로 씁니다. 시스템 트랙은 writer 스레드에서 mono로 줄여 저장하므로 5.1·7.1 출력 장치에서도 4GB 한도에 마이크 트랙보다 먼저 닿지 않습니다. Windows 루프백은 재생 중인 소리가 없으면 데이터를 주지 않아 무음 구간이 빠지므로, 녹음하는 동안 같은 출력 장치에 무음 출력 스트림을 함께 열어 둡니다.
  • 정지 뒤 합치기: 정지하면 마이크 샘플레이트의 mono 16-bit WAV 하나로 합친 뒤 두 트랙 파일을 지웁니다. 시스템 트랙은 선형 보간으로 샘플레이트를 맞추고, 두 소리의 합은 범위를 넘으면 잘라 내며, 짧은 트랙은 무음으로 채웁니다. 파일을 조각 단위로 읽고 쓰기 때문에 길이와 상관없이 메모리 사용량이 일정합니다.
  • 실패 처리: 출력 장치가 없거나 macOS 14.6 미만이거나 권한이 없어 시스템 소리를 열지 못하면 SYSTEM_AUDIO_UNAVAILABLE과 함께 이유와 "마이크만 녹음은 계속 쓸 수 있습니다."라는 안내를 한국어로 보여 줍니다. 시작 실패, 녹음 실패, 버리기 어느 경우에도 모든 .part 파일과 빈 회의 폴더를 지웁니다.
  • 계약과 설정: 설정에 recordingSource가 생기고(구버전은 이 키를 무시), start_recording에 source 인자가 늘었으며, Tauri 명령은 38개에서 40개가 됩니다. Info.plist에 NSAudioCaptureUsageDescription을 추가했고, README, DESIGN, ARCHITECTURE, 수동 Windows 확인 목록, 결정 기록(ADR)을 갱신했습니다.
  • 바뀌지 않은 것: worker 프로토콜, 녹음 결과 스키마, Drive 업로드, 마이크만 녹음의 파일 이름과 형식.

확인한 것

  • Windows에서 cargo fmt --check, cargo clippy --all-targets -- -D warnings, cargo test --all-targets(351건), bun run check, bun test(274건), worker 단위 테스트(141건), 플랫폼 문서 검사를 모두 통과했습니다.
  • 실제 장치(USB 마이크, S/PDIF 스피커) 확인은 일회성 코드로 했고 커밋하지 않았습니다.
    • 시스템 트랙만 10초간 녹음하며 중간 4초에 톤을 재생하니, 파일 길이가 10.00초이고 앞뒤 무음 구간이 그대로 남았습니다.
    • 마이크 + 회의 소리 녹음은 mono 48 kHz 파일 하나로 합쳐졌고 정지부터 합치기까지 0.28초가 걸렸습니다. 폴더에는 최종 .wav만 남았습니다. 버리면 폴더가 남지 않았고, 마이크만 녹음은 이전과 같은 2채널 파일이었습니다.
    • 한국어 음성 합성 26초를 재생하며 녹음한 파일을 설치된 worker로 전사하니 끝까지 완료됐고, 원본 음성 파일의 전사와 같은 낱말이 나왔습니다. 합성 음성이라 인식 정확도는 낮으며, 이 확인은 파이프라인 통과와 시스템 소리 보존만 보여 줍니다.
    • 10분 길이 트랙을 합치는 데 release 빌드에서 1.2초가 걸렸고, 60분이면 약 7초로 추정합니다.
  • 독립 리뷰에서 마이크 시작 실패 때 빈 회의 폴더가 남는 결함 한 건을 지적받아 고쳤고, 재리뷰를 통과했습니다.
  • 확인하지 못한 것: macOS 전체(프로세스 탭, 14.6 확인, 권한 창, 입력도 되는 출력 장치 거부)는 이 환경에 Mac이 없어 확인하지 못했습니다. 설치한 앱의 로그인 이후 화면에서 녹음하는 경로, 사람이 말하는 소리, 무음 스트림이 다른 앱의 재생 음량을 바꾸는지, 실제 화면 레이아웃도 확인하지 못했습니다.

리뷰 포인트

  • Windows는 무음 출력 스트림으로 루프백을 유지합니다. 장치마다 다른 콜백 타임스탬프로 무음을 채우는 방식은 정확도를 장담하기 어려워 택하지 않았습니다. 다른 앱의 재생 음량에 영향이 없는지 사용해 보며 확인해 주세요.
  • macOS에서 기본 출력 장치가 입력도 지원하면(일부 USB 헤드셋) cpal이 프로세스 탭 대신 그 장치의 입력을 열기 때문에, 이 경우를 오류로 거부합니다. Mac에서 실제 동작을 확인해 주세요.
  • 녹음 중에 기본 출력 장치가 바뀌면(예: 블루투스 헤드폰 연결) 시스템 트랙이 실패하고, 마이크 장치가 끊길 때와 같은 규칙으로 마이크 트랙을 포함한 녹음 전체를 버립니다. 이번에 이 규칙은 바꾸지 않았습니다.
  • 에코 제거와 앱별 소리 선택, 장치 선택은 범위 밖입니다. 스피커로 들으면 마이크가 상대 목소리를 한 번 더 녹음하므로 헤드폰을 권합니다. 두 스트림이 열리는 시각 차이(수 ms)는 보정하지 않습니다.

…hone

Why: Slack huddles, Zoom and Google Meet play the other side through the
speakers, so a microphone-only recording never contained it. The recorder now
offers "마이크 + 회의 소리": the default output device is captured through cpal
loopback (WASAPI on Windows, Core Audio tap on macOS 14.6+) into its own track,
and the two tracks are merged into the usual single mono WAV after stop, so
transcription, Drive upload and meeting folders are unchanged. The system track
is downmixed to mono in the writer thread, a silent render stream keeps WASAPI
loopback delivering during silence, and every failure or discard path removes
all partial files and the empty meeting folder. The choice is saved at once and
restored on launch. Microphone-only recording is unchanged.
Refs: galpi#14
Tested: cargo fmt --check, cargo clippy --all-targets -D warnings, cargo test
--all-targets (351 passed) on Windows; bun run check, bun test (274 passed);
worker unittest (141); verify-platform-fence.py, verify-docs-platform.py.
Windows real-device runs (not committed): loopback keeps silence gaps, combined
recording merges to one mono WAV, discard leaves no folder, the installed worker
transcribes the merged file. Merge of 10 min of audio takes about 1.2 s in
release.
Not-tested: macOS (no Mac: process tap, 14.6 gate, permission prompt, input
capable output device rejection), the installed app's UI path, the silent
stream's effect on other apps' volume, the rendered layout.
@m16khb m16khb linked an issue Oct 11, 2026 that may be closed by this pull request
6 tasks
@m16khb m16khb added the enhancement New feature or request label Oct 11, 2026
@m16khb m16khb self-assigned this Oct 11, 2026
@m16khb
m16khb marked this pull request as ready for review October 11, 2026 11:32
@m16khb
m16khb merged commit 7ded05e into main Oct 11, 2026
9 checks passed
@m16khb
m16khb deleted the 14-system-audio-recording branch October 11, 2026 11:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Slack 허들·Zoom·Google Meet 회의를 시스템 소리까지 녹음

1 participant