TreeMap
무료 오픈소스 디스크 사용량 시각화 도구로, 사각형 트리맵·중복 파일 탐색·디스크 가득 예측·정리 시 파일을 휴지통으로만 이동한다
Say, Pi는 타이핑을 음성으로 전환해, 음성으로 Pi AI·Claude AI 등과 대화하며 핸즈프리·다국어·정확하게 이용합니다
Say, Pi turns typing into talking. Use your voice to chat with Pi AI, Claude AI, and more - hands-free, multilingual, and beautifully accurate. It's like voice control, but smarter.
생산성TypeScript · JavaScriptGitHub @Pedal-Intelligence온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
Enterprise-grade browser extension bringing multilingual voice interaction to AI chatbots (Pi, Claude, ChatGPT). Features real-time speech detection with Silero VAD, accurate transcription via OpenAI Whisper, and ElevenLabs TTS. Built with TypeScript, XState, and modern web standards. Progressive enhancement across Chrome, Firefox, and Safari
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Transform your AI conversations with natural, hands-free voice interaction.
Say, Pi is a browser extension that brings multilingual voice capabilities to AI chatbots. Built with enterprise-grade architecture and modern web standards, it delivers accurate speech recognition and natural text-to-speech across Pi.ai, Claude.ai, and ChatGPT.
Say, Pi is a three-tier system that enhances AI chat experiences with sophisticated voice interaction:README 전문 보기 ↗Transform your AI conversations with natural, hands-free voice interaction.
Say, Pi is a browser extension that brings multilingual voice capabilities to AI chatbots. Built with enterprise-grade architecture and modern web standards, it delivers accurate speech recognition and natural text-to-speech across Pi.ai, Claude.ai, and ChatGPT.
Watch Demo • Install for Chrome • Install for Firefox • Documentation
Say, Pi is a three-tier system that enhances AI chat experiences with sophisticated voice interaction:
┌─────────────────────────────────────────────────────────────┐
│ │
│ Browser Extension (saypi-userscript) │
│ ├─ Content Script: Voice UI, chatbot integration │
│ ├─ Service Worker: Auth, messaging, lifecycle management │
│ ├─ Offscreen Documents: Audio processing under strict CSP │
│ └─ Modern Stack: TypeScript, XState, Webpack, WXT │
│ │
└─────────────────────────────────────────────────────────────┘
↕
┌─────────────────────────────────────────────────────────────┐
│ │
│ API Server (saypi-api) │
│ ├─ FastAPI/Python: Speech-to-text, text-to-speech │
│ ├─ OpenAI Whisper: Accurate transcription │
│ ├─ Multi-voice TTS: Natural speech synthesis │
│ └─ Redis: Caching and quota management │
│ │
└─────────────────────────────────────────────────────────────┘
↕
┌─────────────────────────────────────────────────────────────┐
│ │
│ Web Application (saypi-saas) │
│ ├─ Nuxt.js/Vue.js: Subscription management, user dashboard │
│ ├─ Multi-provider billing: Stripe, LemonSqueezy, Chargebee │
│ ├─ PostgreSQL/Prisma: User accounts, entitlements │
│ └─ i18n: Multi-language support │
│ │
└─────────────────────────────────────────────────────────────┘
This repository (saypi-userscript) contains the browser extension—the client-side component that users install to enable voice chat with AI assistants.
This extension embodies enterprise development standards applied to browser extensions:
| Layer | Technologies |
|---|---|
| Build System | WXT (Web Extension Tooling; Vite/Rollup under the hood), TypeScript 5.2+ |
| State Management | XState v5 (state machines; see src/state-machines/README.md), RxJS (reactive streams) |
| Audio Processing | Web Audio API, AudioWorklet, ONNX Runtime Web |
| Machine Learning | Silero VAD models (ONNX), WASM acceleration |
| Browser APIs | Offscreen Documents (MV3), Service Workers, chrome.* APIs |
| Testing | Jest (JavaScript), Vitest (TypeScript/ESM), JSDOM |
| Code Quality | ESLint, Prettier, TypeScript strict mode |
src/
├── chatbots/ # Chatbot-specific implementations
│ ├── ChatbotService.ts # Factory for chatbot detection
│ ├── Chatbot.ts # Abstract base class
│ ├── Claude.ts # Claude.ai DOM integration
│ ├── Pi.ts # Pi.ai DOM integration
│ └── bootstrap.ts # DOMObserver with progressive search
│
├── audio/ # Audio pipeline
│ ├── AudioModule.js # Main coordinator
│ ├── OffscreenAudioBridge.js # Content ↔ offscreen bridge
│ ├── AudioInputMachine.ts # XState: mic → VAD → STT
│ └── AudioOutputMachine.ts # XState: TTS → playback
│
├── vad/ # Voice Activity Detection
│ ├── OffscreenVADClient.ts # Chrome/Edge (offscreen)
│ ├── OnscreenVADClient.ts # Firefox/Safari fallback
│ └── custom-model-fetcher.js # Firefox ArrayBuffer realm fix
│
├── tts/ # Text-to-Speech
│ ├── TextToSpeechService.ts # Core TTS management
│ ├── ChatHistoryManager.ts # TTS queue for chat messages
│ └── VoiceMenuUIManager.ts # Voice selection UI
│
├── dom/ # DOM Management
│ ├── Observation.ts # Found/decorated element tracking
│ └── bootstrap.ts # Progressive search with backoff
│
├── offscreen/ # Offscreen documents (CSP bypass)
│ ├── audio_handler.ts # Audio playback under CSP
│ ├── vad_handler.ts # VAD processing
│ └── media_coordinator.ts # Message routing
│
├── compat/ # Browser compatibility
│ ├── BrowserCompatibilityModule.ts # Detection logic
│ └── CompatibilityNotificationUI.ts # User-facing notices
│
└── svc/ # Background services
├── background.ts # Service worker (auth, lifecycle)
└── JwtManager.ts # Token management with refresh
The build system produces an optimized bundle under 2MB (excluding binary assets):
See CLAUDE.md for detailed bundle analysis.
The extension implements platform-specific adaptations for Chrome, Edge, Firefox, and Safari:
See Browser Compatibility Matrix for complete platform/feature grid.
Multi-layer testing ensures reliability across browsers and chatbot platforms:
npm test # Run all tests (Jest + Vitest)
npm run test:jest # JavaScript integration tests
npm run test:vitest # TypeScript unit tests
Install from your browser's extension store:
Prerequisites:
jq for Firefox builds (brew install jq / apt install jq)Quick Start:
# Clone and install dependencies
git clone <repository>
cd saypi-userscript
npm install
# Set up environment (copy and edit)
cp .env.example .env
cp .env.production.example .env.production
# Start development server with hot reload
npm run dev # Chrome (default)
npm run dev:firefox # Firefox MV2
# Build for production
npm run build # Chrome/Edge
npm run build:firefox # Firefox (with packaging)
Environment Management:
# Quick switch between local and remote API servers
npm run switch # Toggle between local/remote
npm run switch local # localhost:3000, 127.0.0.1:5001
npm run switch remote # saypi.ai, api.saypi.ai
npm run switch status # Check current config
Python Tooling (for ONNX model pruning):
# One-time setup per machine (creates .venv/)
npm run setup:python
# Runs automatically during builds, or manually:
npm run copy-onnx # Copy + prune ONNX models
See CLAUDE.md for complete development workflow and build commands.
Build Verification:
This extension uses Webpack for bundling. To verify the build matches the submitted code:
# Install dependencies
npm install
# Configure environment (copy templates, edit as needed)
cp .env.example .env
cp .env.production.example .env.production
# Build extension
npm run build
# Package for Firefox
./package-extension.sh firefox
Build Environment:
The dist/ output matches the submitted XPI exactly. All bundling is deterministic.
| Browser | Pi.ai | Claude.ai | ChatGPT | Notes |
|---|---|---|---|---|
| Chrome/Edge Desktop | ✅ Full | ✅ Full | ✅ Full | All features via Offscreen API |
| Firefox Desktop | ✅ Full | ⚠️ Voice input only | ✅ Full | No TTS on Claude (CSP + no offscreen) |
| Firefox Mobile | ✅ Full | ⚠️ Voice input only | ✅ Full | Same as desktop |
| Safari/Kiwi | ⚠️ Partial | ❌ Limited | ⚠️ Partial | Platform-specific limitations |
Legend: ✅ Full support • ⚠️ Partial (voice input works, TTS may be limited) • ❌ Not supported
See Browser Compatibility Matrix for technical details and workarounds.
# Development
npm run dev # Chrome dev server with hot reload
npm run dev:firefox # Firefox dev (opens temp profile)
# Building
npm run build # Production build (validates + copies ONNX)
npm run build:firefox # Firefox build + packaging
# Testing
npm test # All tests (Jest + Vitest)
npm run test:vitest:watch # Watch mode for rapid iteration
# Environment
npm run validate:env # Check .env files (auto-runs before dev/build)
npm run switch # Toggle local/remote API servers
Save VAD segments to disk (for debugging voice detection):
# In .env (not .env.production):
KEEP_SEGMENTS=true
# Start dev server
npm run dev
# Segments saved to: ~/Downloads/SayPiSegments/
# Format: saypi-segment_<start>_to_<end>_<duration>ms.wav
Note: downloads permission added only in dev builds; production ignores this setting.
The extension supports 30+ languages with a flexible translation workflow:
# Translate all content (UI strings + store descriptions)
npm run translate
# Verify setup without running translations
npm run translate:check
# Skip confirmation prompts
npm run translate -- --yes
When you only need to translate specific keys (e.g., after updating marketing copy):
# Translate specific keys from messages.json
python3 tools/i18n/i18n-translate-keys.py appName appDescription
# Translate multiple keys at once
python3 tools/i18n/i18n-translate-keys.py -y callInProgress callNotStarted voiceSettings
# Translate only description.txt (store listings)
python3 tools/i18n/i18n-translate-release-text.py -y
When to use which tool:
npm run translate - Full translation before major releases (slow but comprehensive)i18n-translate-keys.py - Update specific UI strings (fast, targeted)i18n-translate-release-text.py - Update store descriptions onlyWhat gets translated:
_locales/{locale}/messages.json - UI strings (via translate-cli for full sync, OpenAI for targeted)_locales/{locale}/description.txt - Browser store listings (via OpenAI API)Requirements:
translate-cli (Go): go install github.com/quailyquaily/translate-cli@latestexport OPENAI_API_KEY="..."requests library: pip install requestsThis is proprietary software. The source code is publicly visible for transparency and security review, but is not licensed for modification, distribution, or use beyond the terms in LICENSE.
We are not accepting external code contributions. However, we value feedback:
See CONTRIBUTING.md for details.
Questions? Feedback? We'd love to hear from you:
Say, Pi is an unofficial enhancement for Pi.ai, Claude.ai, and ChatGPT. It is not affiliated with Inflection AI, Anthropic, or OpenAI. Use responsibly and respect each platform's terms of service. Compatibility with future platform updates is not guaranteed.
Built with ❤️ by the Say, Pi team • www.saypi.ai