Show HN: Pipecat 기반의 오픈 소스 맞춤형 AI 음성 받아쓰기
요약
Pipecat 기반의 오픈 소스 맞춤형 AI 음성 받아쓰기 도구인 Tambourine을 소개합니다. 사용자가 원하는 STT 및 LLM 제공업체를 선택하거나 로컬에서 실행할 수 있으며, 단순 전사를 넘어 추임새 제거 및 문맥에 맞는 텍스트 포맷팅 기능을 제공합니다.
핵심 포인트
- Wispr Flow, Superwhisper, Willow의 오픈 소스 대안으로 완전한 제어권과 투명성 제공
- 사용자 정의 사전 및 프롬프트를 통한 개인화된 텍스트 포맷팅 지원
- 다양한 AI 제공업체(OpenAI, Anthropic, Groq 등) 및 로컬 모델(Whisper, Ollama) 선택 가능
- 현재 사용 중인 애플리케이션의 문맥을 인식하여 이메일, 메시지, 코드 등에 최적화된 포맷 적용
- Pipecat의 모듈형 파이프라인을 기반으로 한 높은 확장성
어떤 앱에서든 사용할 수 있는 개인용 음성 인터페이스입니다. 맞춤형 AI 음성 받아쓰기 (AI voice dictation) 기능을 통해 자연스럽게 말하면 커서가 있는 곳 어디든 당신의 말이 나타납니다.
Wispr Flow, Superwhisper, 그리고 Willow의 오픈 소스 대안입니다.
🚀
호스팅 서비스 출시 예정! 서버를 직접 실행하지 않고 Tambourine을 사용하려면 대기 명단에 등록하세요.
당신의 목소리, 어떤 앱에서든. Tambourine은 이메일, 메시지, 문서, 코드 에디터, 터미널 등 어디에서나 작동하는 범용 음성-텍스트 (voice-to-text) 인터페이스를 제공합니다. 단축키를 누르고 말하면 당신의 말이 커서 위치에 입력됩니다. 복사 및 붙여넣기, 앱 전환, 제한 사항이 없습니다.
생각의 속도로 말하세요. 타이핑은 평균 40-50 wpm(분당 단어 수)이지만, 말하기는 평균 130-160 wpm입니다. 아이디어가 사라지기 전에 포착하고, 키보드로부터 당신의 손에 휴식을 주십시오.
당신을 이해하는 AI. 단순한 전사 (transcription)와 달리, Tambourine은 AI를 사용하여 음성을 깔끔한 텍스트로 포맷팅합니다. 즉, 추임새 (filler words)를 제거하고, 문장 부호를 추가하며, 기술 용어 및 고유 명사를 위한 개인 사전 (personal dictionary)을 적용합니다.
왜 기본 받아쓰기를 사용하지 않나요? 내장된 받아쓰기 기능은 개인화되어 있지 않지만, Tambourine은 당신의 말하기 및 글쓰기 스타일과 흔치 않은 용어를 위한 개인 사전을 통해 맞춤 설정이 가능합니다.
왜 독점 도구를 사용하지 않나요? Wispr Flow나 Superwhisper와 달리, 이 프로젝트는 당신에게 완전한 제어권과 투명성을 제공합니다.
완전한 맞춤 설정 가능. 이것은 당신의 방식대로 구축된 당신만의 음성 인터페이스입니다:
AI 제공업체 선택— STT (Cartesia, Deepgram, AssemblyAI, Speechmatics, Azure, AWS, Google, Groq, OpenAI, Nemotron) 및 LLM (Cerebras, OpenAI, Anthropic, Gemini, Groq, OpenRouter)을 선택하거나, Whisper 및 Ollama를 사용하여 완전히 로컬에서 실행하거나, Pipecat에서 지원하는 서비스에서 더 많은 것을 추가할 수 있습니다.
포맷팅 맞춤 설정— 프롬프트 (prompts)를 수정하고, 사용자 정의 규칙을 추가하며, 개인 사전을 구축하십시오.
자유로운 확장— Pipecat의 모듈형 파이프라인 (modular pipeline)을 기반으로 구축된 완전한 오픈 소스입니다.
| 플랫폼 | 호환성 |
|---|---|
| Windows | ✅ |
| ... | |
| 이중 모드 녹음- 누르고 녹음하기 (Hold-to-record): | |
Ctrl+Alt+ |
-
누르고 녹음하기, 떼면 중지 - 토글 모드 (Toggle mode):
Ctrl+Alt+Space -
한 번 눌러 시작, 다시 눌러 중지
-
누르고 녹음하기 (Hold-to-record):
실시간 음성-텍스트 변환 (Real-time Speech-to-Text)- 설정 가능한 STT (Speech-to-Text) 제공업체를 통한 빠른 전사 (Transcription)
LLM 텍스트 포맷팅 (LLM Text Formatting)- 설정 가능한 LLM (Large Language Model)을 사용하여 추임새 (Filler words)를 제거하고 문장 부호를 추가
문맥 인식 포맷팅 (Context-Aware Formatting)- 현재 포커스된 애플리케이션을 자동으로 감지하여 그에 맞게 포맷팅을 조정합니다. 이메일 클라이언트는 적절한 인사말과 맺음말을 사용하고, 메시징 앱은 캐주얼한 포맷을 적용하며, 코드 에디터는 적절한 대소문자와 문장 부호를 포함한 구문 인식 (Syntax-aware) 출력을 제공합니다.
사용자 정의 프롬프트 (Customizable Prompts)- 포맷팅 규칙 편집, 고급 기능 활성화, 개인 사전 추가
앱 내 제공업체 선택 (In-App Provider Selection)- 재시작 없이 STT 및 LLM 제공업체 전환
자동 타이핑 (Automatic Typing)- 포커스된 위치에 텍스트를 직접 입력
녹음 오버레이 (Recording Overlay)- 플로팅 시각적 표시기
전사 기록 (Transcription History)- 이전 받아쓰기 내용을 확인하고 복사
마지막 전사 내용 붙여넣기 (Paste Last Transcription)-Ctrl+Alt+.으로 이전 받아쓰기 내용을 다시 입력
오디오 자동 음소거 (Auto-Mute Audio)- 받아쓰기 중 시스템 오디오를 자동으로 음소거 (Windows/macOS)
기타 (Misc.)- 시스템 트레이 통합, 마이크 선택, 사운드 피드백, 단축키 설정
음성 기반 텍스트 수정 (Voice-Driven Text Modification)- 기존 텍스트를 강조(Highlight)한 뒤 어떻게 수정할지 말하면 됩니다. 단락을 선택하고 "이 내용을 더 격식 있게 만들어줘" 또는 "문법을 수정해줘"라고 말하여 텍스트를 즉시 변환할 수 있습니다.
음성 단축키 (Voice Shortcuts)- 서식이 지정된 전체 텍스트로 확장되는 사용자 정의 트리거를 생성합니다. "회의 링크 삽입"이라고 말하여 일정 URL을 붙여넣거나, "서명"이라고 말하여 이메일 서명을 입력할 수 있습니다.
자동 학습 사전 (Auto-Learning Dictionary)- 수동으로 사전에 항목을 입력할 필요 없이, 사용 패턴으로부터 새로운 단어, 이름, 전문 용어를 자동으로 학습합니다.
관찰 가능성 및 평가 (Observability and Evaluation)- Pipecat 및 기타 음성 에이전트 프레임워크의 도구를 통합하여 전사(Transcription) 품질, 지연 시간(Latency) 지표, 서식 정확도를 추적합니다. 이러한 통찰을 활용하여 개인용 받아쓰기 워크플로우를 지속적으로 최적화할 수 있습니다.
호스팅 서비스 (Hosted Service)- Python 서버를 로컬에서 실행하지 않고도 Tambourine을 사용할 수 있도록 선택 가능한 클라우드 호스팅 백엔드를 제공합니다.
┌─────────────────────────────────────────────────────────────┐
│ Tauri App (app/) │
│ - Global hotkeys (Ctrl+Alt+Space, Ctrl+Alt+`) │
...
- Rust
- Node.js
- pnpm
- Python 3.13+
- uv (Python 패키지 관리자)
sudo apt-get install libwebkit2gtk-4.1-dev build-essential curl wget file \libxdo-dev libssl-dev libayatana-appindicator3-dev librsvg2-dev libgtk-3-dev
Tambourine을 처음 사용할 때 운영 체제에서 마이크 권한 승인을 요청합니다. 음성 받아쓰기를 활성화하려면 이 권한을 허용하십시오.
macOS에서 Tambourine은 커서 위치에 텍스트를 입력하기 위해 접근성(Accessibility) 권한이 필요합니다.
빌드된 앱 실행 시: "Tambourine"에 접근성 권한을 부여하십시오.
개발 모드에서 실행 시: 코드를 실행하는 애플리케이션에 접근성 권한을 부여하십시오:
- VS Code에서 실행하는 경우: "Visual Studio Code"를 추가
- 터미널에서 실행하는 경우: "Terminal" (또는 iTerm2와 같은 터미널 앱)을 추가
⚠️ 빌드 진행 중
이 프로젝트는 활발히 개발 중입니다. 핵심 기능은 잘 작동하지만, 프로젝트가 진화함에 따라 코드, 아키텍처 및 설정에 중대한 변경(Breaking changes)이 발생할 수 있습니다.
제공자(Provider)를 선택하세요 (최소 하나 이상의 STT와 하나의 LLM이 필요합니다):
참고: 다음은 넉넉한 무료 티어(Free tier)를 제공하는 제공자들의 예시입니다. Tambourine은 유료 API 키를 통해 훨씬 더 많은 제공자를 지원합니다. 전체 목록은 server/.env.example을 참조하세요.
| 제공자 (Provider) | 유형 (Type) | 무료 티어 (Free Tier) | 가입 (Sign Up) |
|---|---|---|---|
| Cartesia | STT | 월 3시간 | cartesia.ai |
| ... |
완전한 로컬 배포(Fully local deployment)를 위한 설정:
-
.env파일에OLLAMA_BASE_URL=http://localhost:11434를 설정하세요. -
Faster-Whisper 로컬 STT를 사용하려면
WHISPER_ENABLED=true로 설정하세요 (서버 시작 시 모델이 미리 다운로드됩니다).- 선택 사항: Faster-Whisper 튜닝을 위해
WHISPER_DEVICE(cpu또는cuda),WHISPER_MODEL(예:tiny,base,small,medium,large), 그리고WHISPER_COMPUTE_TYPE(예:int8,float16)을 설정할 수 있습니다.
- 선택 사항: Faster-Whisper 튜닝을 위해
-
Apple Silicon MLX Whisper 로컬 STT를 사용하려면
WHISPER_MLX_ENABLED=true로 설정하세요 (서버 시작 시 모델이 미리 다운로드됩니다).- 선택 사항: MLX 모델을 재정의하려면
WHISPER_MLX_MODEL(예:mlx-community/whisper-large-v3-turbo)을 설정하세요.
- 선택 사항: MLX 모델을 재정의하려면
cd server
# 환경 변수 템플릿을 복사하고 API 키를 추가합니다
cp .env.example .env
...
cd app
# 의존성 설치
pnpm install
...
-
먼저 서버를 실행하세요 (
uv run python main.py) -
앱을 실행하세요 (
pnpm dev) -
다음 단축키 중 하나를 사용하세요:
- 토글(Toggle):
Ctrl+Alt+Space를 눌러 시작하고, 다시 누르면 중지합니다. - 홀드(Hold): 말하는 동안 `Ctrl+Alt+``를 누르고 있다가, 떼면 중지합니다.
- 토글(Toggle):
-
정제된 텍스트가 커서 위치에 입력됩니다.
cd server
# 서버 시작 (기본값: 127.0.0.1:8765)
uv run python main.py
...
로컬에 Python 의존성을 설치하는 대신 Docker에서 서버를 실행하세요. 서버는 RTP/WebRTC의 무작위 UDP 포트 할당으로 인해 호스트 네트워킹(Host networking)이 필요합니다.
로컬에서 호스팅되는 Whisper 모델에 GPU 가속을 사용하려면, 컨테이너 데몬(Container daemon)에 대한 GPU 액세스를 설정하세요:
https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html#installing-with-yum-or-dnf
https://podman-desktop.io/docs/podman/gpu
cd server
# 환경 템플릿을 복사하고 API 키를 추가합니다
cp .env.example .env
...
.env 파일은 런타임(runtime) 시점에 읽히므로 (이미지에 포함되지 않음), API 키를 안전하게 유지할 수 있습니다.
Tambourine 서버와 coturn을 하나의 로컬 스택(local stack)으로 사용하려는 경우 루트 레벨(root-level)의 compose 스택을 사용하세요.
# 리포지토리 루트에서
cp server/.env.example server/.env
# server/.env를 편집하여 최소 하나 이상의 STT + 하나 이상의 LLM 제공자 키를 설정합니다
...
이 스택은 두 서비스 모두에 Linux 호스트 네트워킹 (host networking)을 사용합니다. Linux가 아닌 Docker 런타임(runtime)에서는 호스트 네트워킹이 예상대로 동작하지 않을 수 있습니다.
컨테이너가 실행 중으로 표시되고 로그에 Tambourine Server Ready!가 출력되지만, 클라이언트가 여전히 연결할 수 없거나 (또는 호스트에서 http://127.0.0.1:8765/health 호출이 실패하는 경우), Docker 런타임에서 호스트 네트워킹이 실제로 활성화/지원되는지 확인하십시오.
이 프로젝트는 WebRTC/RTP 신뢰성을 위해 server/docker-compose.yml에서 network_mode: "host"를 사용합니다. Docker 설정에서 호스트 네트워킹이 비활성화되어 있으면, 컨테이너가 정상(healthy)인 것처럼 보여도 앱에서 접근할 수 없는 상태가 될 수 있습니다.
CDI device injection failed: unresolvable CDI devices nvidia.com/gpu=all 메시지가 나타나면, 사용 중인 런타임이 Docker에서 Podman GPU 구문(stanza)을 사용하려고 시도하는 것일 가능성이 높습니다. server/docker-compose.yml에서 사용 중인 런타임과 일치하는 GPU 블록만 남겨두고 나머지는 비활성화하십시오.
cd app
# 개발
pnpm check # 모든 체크 실행 (lint + typecheck + knip + test + cargo)
...
서버는 8765 포트(기본값)에서 HTTP 엔드포인트(endpoints)를 노출합니다. 샘플 엔드포인트는 다음과 같습니다:
GET /health - 컨테이너 오케스트레이션(orchestration)을 위한 상태 확인(Health check)
GET /api/providers - 사용 가능한 STT 및 LLM 제공자 목록
모든 엔드포인트는 server/main.py 및 server/api/config_api.py에서 확인할 수 있습니다. 모든 엔드포인트에는 속도 제한(rate-limited)이 적용됩니다.
.env.example을 .env로 복사하고, 최소 하나 이상의 STT 및 하나 이상의 LLM 제공자에 대한 API 키를 추가하십시오. Deepgram, Cartesia, OpenAI, Anthropic, Cerebras, Groq, AWS 등을 포함하여 지원되는 모든 제공자는 예시 파일을 참조하십시오. Pipecat이 지원하는 추가 제공자들도 쉽게 추가할 수 있습니다.
선택적으로 환경 변수를 통해 Silero VAD 파라미터를 설정할 수 있습니다 (server/.env.example을 참조하여 VAD_CONFIDENCE, VAD_START_SECS, VAD_STOP_SECS, VAD_MIN_VOLUME 설정 가능).
앱은 기본적으로 WebRTC를 통해 http://127.0.0.1:8765에 연결됩니다. 설정은 로컬에 저장되며 다음 항목을 포함합니다:
제공자 (Providers)
- 사용 가능한 옵션 중에서 활성화된 STT 및 LLM 제공자 선택
오디오 (Audio) - 마이크 선택, 사운드 피드백, 녹음 중 자동 음소거
단축키 (Hotkeys) - 토글(toggle) 및 누르고 말하기(hold-to-record) 단축키 사용자 정의
LLM 포맷팅 프롬프트 (LLM Formatting Prompt) - 세 가지 사용자 정의 섹션:
- 핵심 포맷팅 규칙 (Core Formatting Rules) - 추임새(filler word) 제거, 문장 부호, 대문자 표기
- 고급 기능 (Advanced Features) - 이전 내용 수정 ("scratch that"), 목록 포맷팅
- 개인 사전 (Personal Dictionary) - 사용자 정의 단어
Tambourine은 설정 데이터를 내보내기(export) 및 가져오기(import)할 수 있어, 설정을 백업하거나 구성을 공유하고, 커뮤니티 예제를 시도하기가 쉽습니다.
Settings > Data Management로 이동하여 내보내기(export) 버튼을 클릭하십시오. 폴더를 선택하면 Tambourine이 5개의 파일을 내보냅니다:
| 파일 | 설명 |
|---|---|
tambourine-settings.json | 앱 설정 (단축키, 제공자, 오디오 기본 설정) |
tambourine-history.json | 받아쓰기 기록 항목 |
tambourine-prompt-main.md | 핵심 포맷팅 규칙 |
tambourine-prompt-advanced.md | 고급 기능 (이전 내용 수정, 목록 포맷팅) |
tambourine-prompt-dictionary.md | 사용자 정의 용어를 위한 개인 사전 |
Settings > Data Management에서 가져오기(import) 버튼을 클릭하고 하나 이상의 파일(.json 또는 .md)을 선택하십시오. Tambourine은 파일 내용을 통해 파일 형식을 자동으로 감지합니다.
기록(history) 가져오기의 경우, 병합 전략을 선택할 수 있습니다:
Merge (skip duplicates) (병합 - 중복 건너뛰기)
- 새로운 항목을 추가하고 기존 항목은 건너뜁니다.
Merge (keep all) (병합 - 모두 유지) - 가져온 모든 항목을 추가합니다.
Replace (교체) - 기존 기록을 삭제하고 가져온 항목을 사용합니다.
examples/ 폴더에는 다양한 사용 사례에 즉시 사용할 수 있는 프롬프트 구성이 포함되어 있습니다.
예제를 사용하려면:
- Settings > Data Management 열기 - 가져오기 (import) 버튼을 클릭합니다.
examples/<example-name>/경로로 이동합니다.- 세 개의
.md파일을 모두 선택합니다 - 열기 (Open)를 클릭합니다.
프롬프트가 즉시 업데이트됩니다. Settings > LLM Formatting Prompt에서 추가로 사용자 정의할 수 있습니다.
데스크톱 앱 (Desktop App): Rust, Tauri
프론트엔드 (Frontend): TypeScript, React, Vite
UI: Mantine, Tailwind CSS
상태 관리 (State Management): Zustand, Tanstack Query, XState
백엔드 (Backend): Python, FastAPI
음성 파이프라인 (Voice Pipeline): Pipecat
통신 (Communications): WebRTC
검증 (Validation): Zod, Pydantic
코드 품질 (Code Quality): Biome, Ruff, Ty, Clippy
크로스 플랫폼 데스크톱 앱을 위한 Tauri와 모듈형 음성 AI 파이프라인을 위한 Pipecat으로 구축되었습니다.
개발 환경 설정 및 가이드라인은 CONTRIBUTING.md를 참조하세요.
Tambourine이 유용하다고 느끼신다면, 다음과 같은 방법으로 프로젝트를 지원할 수 있습니다:
리포지토리 스타 (Star the repo) 하기 — 다른 사람들이 프로젝트를 발견하도록 돕고 개발 동기를 부여합니다.
이슈 보고 (Report issues) 하기 — 버그를 발견했거나 기능 요청이 있나요? 이슈를 생성하세요.
Discord 참여하기 — Discord 서버에서 커뮤니티와 연결하여 도움을 받고 토론하세요.
기여하기 (Contribute) — 기여 방법에 대한 가이드라인은 CONTRIBUTING.md를 확인하세요.
AI 자동 생성 콘텐츠
본 콘텐츠는 HN AI Engineering의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기