
Babel Ears: 컨퍼런스 준비 과정에서 탄생한 macOS 음성 번역기
요약
컨퍼런스 강연 청취를 돕기 위해 개발된 macOS용 실시간 음성 번역기 'Babel Ears'를 소개합니다. Apple의 온디바이스 프레임워크를 기반으로 하며, 필요 시 Amazon Bedrock의 Claude 모델을 연동하여 고성능 번역 및 요약 기능을 제공합니다.
핵심 포인트
- Apple Speech 및 Translation 프레임워크를 활용한 온디바이스 처리
- Amazon Bedrock(Claude Haiku/Opus)을 통한 온라인 번역 및 요약 옵션 지원
- 다양한 언어 쌍 선택 및 텍스트 변환 전용 모드 제공
- 개인정보 보호를 위해 오디오 데이터는 외부로 전송하지 않음
저는 8월 22일에 AWS Community Day Singapore에서 발표를 하게 되었습니다. 싱가포르를 방문할 아주 좋은 핑계이기도 하지만, 동시에 제가 영어를 항상 완벽하게 듣지 못할 수도 있는 공간에서 하루 종일 강연을 들어야 한다는 의미이기도 합니다. 그래서 몇 주 전에 이를 도와줄 도구를 직접 만들었는데, 이것이 점차 제가 예상했던 것보다 더 큰 무언가로 성장했습니다.
시작점
세션 중에 제 옆에 앉아 발표자의 말을 듣고, 거의 실시간으로 일본어 번역을 보여주는 무언가가 필요했습니다. 이상적으로는 제 녹음 데이터가 어디로도 전송되지 않아야 했습니다.
저는 Apple의 온디바이스 (on-device) Speech 및 Translation 프레임워크를 사용하여 정확히 이 기능을 수행하는 macOS 앱인 minorun365/live-translator-macos를 발견했습니다. 영어-일본어 쌍이 고정되어 있고, 깔끔한 SwiftUI 인터페이스를 갖추고 있으며, 아무것도 Mac 외부로 나가지 않습니다. 좋은 시작점이었기에, 이를 참조하여 제가 실제로 필요로 하는 기능들을 확장하기 시작했습니다.
결과물
한번 손을 대기 시작하자, 하나의 기능 추가가 또 다른 추가로 이어졌습니다. 몇 주 후, 제가 현재 사용하고 있으며 결국 Babel Ears라고 이름을 붙이게 된 결과물은 다음과 같습니다:
- 런타임에 선택 가능한 모든 언어 쌍. 단순히 영어↔일본어에 국한되지 않습니다. Mac에서 Apple의 Speech 및 Translation 프레임워크가 지원하는 언어라면 무엇이든 두 개의 독립적인 드롭다운 메뉴에서 선택할 수 있습니다.
- 텍스트 변환(Transcript) 전용 모드. 듣기와 번역에 동일한 언어를 선택하면 번역 과정을 완전히 건너뛰고 원문 텍스트(Raw transcript)만 보여줍니다. 일본어 회의 중에 메모를 할 때도 매우 유용하다는 것을 알게 되었습니다.
- 온라인 옵션. 기본적으로 모든 기능은 온디바이스(On-device)로 실행됩니다. 하지만 번역이나 요약 과정에서 다른 의견을 듣고 싶거나 까다로운 언어 쌍을 더 잘 처리하고 싶을 때를 위해, 번역과 요약을 Amazon Bedrock으로 전환할 수 있는 토글이 있습니다. 번역에는 Claude Haiku 4.5를, 5분 단위의 롤링 요약(Rolling summary)에는 Claude Opus 4.5를 사용합니다. 오직 텍스트 변환된 텍스트만 AWS로 전송되며, 오디오는 절대 전송되지 않습니다.
- 복사 및 내보내기. 각 패널에는 복사 버튼이 있으며, 전체 세션을 TXT 또는 PDF로 다운로드할 수 있습니다.
- 실제로 보기 즐거운 UI. 인터페이스를 여러 번 다시 만들었습니다. 처음에는 다크 글래스(Dark glass) 스타일로, 그다음에는 더 밝은 스타일로 만들다가, 최종적으로는 일반적인 macOS 유틸리티처럼 느껴지지 않는, 약간은 장난스러운 느낌의 화이트 디자인에 안착했습니다.
대략적인 연결 구조는 다음과 같습니다:
음성 인식(Speech recognition)은 항상 Apple의 SpeechAnalyzer/SpeechTranscriber를 통해 온디바이스로 실행됩니다. 번역과 요약만이 선택적으로 온라인을 사용할 수 있는 유일한 단계입니다.
처음 시도했을 때 작동하지 않았던 세 가지
커맨드 라인 도구(Command Line Tools)만으로는 부족했습니다. 저는 Xcode Command Line Tools(CLT)만 설치된 Mac에서 개발을 시작했는데, SwiftUIMacros를 찾을 수 없다는 난해한 오류와 함께 빌드가 실패했습니다. 알고 보니 SwiftUI의 매크로(@State 및 관련 기능들)는 CLT뿐만 아니라 전체 Xcode.app이 필요했습니다. 매크로 플러그인은 CLT 단독으로는 제공되지 않기 때문입니다. Xcode를 설치하자마자 즉시 해결되었습니다.
aws login 인증 정보가 예상했던 위치에 없었습니다. Bedrock 옵션을 위해 앱이 전체 AWS SDK를 필요로 하지 않도록 작은 SigV4 서명기 (signer)를 작성했습니다. 첫 번째 버전은 ~/.aws/credentials에서 인증 정보를 읽어왔는데, 터미널에서는 잘 작동했지만 앱에서는 실행할 때마다 "인증 정보를 찾을 수 없습니다 (credentials not found)"라는 오류와 함께 실패했습니다. 알고 보니 aws login (최신 브라우저 기반 로그인 흐름)은 세션을 완전히 다른 곳에 캐싱하고 있었습니다. aws configure export-credentials를 실행하면 어떤 제공자가 발행했는지와 관계없이 인증 정보를 올바르게 해결할 수 있으므로, 대신 이 명령어를 셸 명령 (shell out)으로 호출하도록 변경했습니다.
Bedrock이 계속해서 제 서명을 거부했습니다. 인증 정보를 수정한 후에도 모든 Bedrock 호출은 403 오류와 함께 "우리가 계산한 요청 서명이 귀하가 제공한 서명과 일치하지 않습니다 (the request signature we calculated does not match the signature you provided)"라는 메시지를 반환했습니다. AWS의 에러 응답에는 다행히도 예상했던 정규화된 문자열 (canonical string)이 포함되어 있었고, 이를 제 것과 비교해 보니 차이점이 드러났습니다. 제 모델 ID에는 %3A가 포함되어 있었는데 (이는 us.anthropic.claude-haiku-4-5-20251001-v1:0에서 콜론을 URL 인코딩한 결과입니다), 정규화된 요청 (canonical request)에서는 해당 %를 다시 인코딩하여 %253A로 만들어야 했습니다. 대부분의 AWS 서비스는 정규화된 URI (canonical URI)가 이중 인코딩 (double-encoded)될 것을 기대합니다. S3는 잘 알려진 예외이며, 저는 다른 곳에도 동일한 예외가 적용될 것이라고 가정했습니다. 하지만 그렇지 않았습니다.
감사 인사
minorun365의 live-translator-macos라는 시작점이 없었다면 이 모든 일은 일어나지 않았을 것입니다. Apple의 온디바이스 Speech 및 Translation 프레임워크를 사용하여 모든 것을 처리하고 녹음 파일을 로컬에 유지한다는 핵심 아이디어는 바로 그 프로젝트에서 가져온 것입니다. 저는 해당 프로젝트에 Star를 눌렀으며, 만약 제가 추가한 수많은 설정값 없이 깔끔한 단일 언어 쌍 번역기를 찾고 계신다면 그 자체로도 훌륭한 선택이 될 것입니다.
마치며
이 앱은 현재 아직 저만을 위한 용도로 사용되고 있지만, 이미 제 역할을 다하고 있습니다. 지난 몇 주 동안 이 앱을 사용해 몇몇 영어 기술 강연 (tech talks)을 따라갔으며, 몇 주 뒤 싱가포르에 갈 때는 실제 컨퍼런스 룸에서 이 앱이 얼마나 잘 버텨줄지 확인하기 위해 노트북을 챙겨갈 예정입니다. 코드나 온디바이스 (on-device)/AWS 전환 방식, 또는 SigV4 서명기 (signer)를 확인하고 싶으시다면 GitHub에서 보실 수 있습니다.
읽어주셔서 감사합니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기
