[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-80927":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":14,"subscribersCount":14,"size":14,"stars1d":15,"stars7d":16,"stars30d":16,"stars90d":14,"forks30d":14,"starsTrendScore":17,"compositeScore":18,"rankGlobal":9,"rankLanguage":9,"license":19,"archived":20,"fork":20,"defaultBranch":21,"hasWiki":20,"hasPages":20,"topics":22,"createdAt":9,"pushedAt":9,"updatedAt":23,"readmeContent":24,"aiSummary":25,"trendingCount":14,"starSnapshotCount":14,"syncStatus":26,"lastSyncTime":27,"discoverSource":28},80927,"polytalk","PolyTalkIO\u002Fpolytalk","PolyTalkIO","Privacy-first, self-hosted real-time speech-to-speech translation.",null,"Python",41,3,1,0,4,9,12,1.81,"GNU Affero General Public License v3.0",false,"main",[],"2026-06-12 02:04:08","\u003Cp align=\"center\">\n  \u003Ca href=\"https:\u002F\u002Fwww.polytalk.io\u002F\">\n    \u003Cimg src=\"assets\u002Flogo.png\" alt=\"PolyTalk\" width=\"260\">\n  \u003C\u002Fa>\n\u003C\u002Fp>\n\n\u003Ch1 align=\"center\">PolyTalk Community Edition\u003C\u002Fh1>\n\n\u003Cp align=\"center\">\n  \u003Cstrong>Self-hosted, privacy-first speech-to-speech live translation.\u003C\u002Fstrong>\u003Cbr>\n  Speak in one language. Hear it in another. Run the stack on infrastructure you control.\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Ca href=\"https:\u002F\u002Fwww.polytalk.io\u002F\">\u003Cstrong>Website\u003C\u002Fstrong>\u003C\u002Fa> ·\n  \u003Ca href=\"#quick-start\">\u003Cstrong>Quick Start\u003C\u002Fstrong>\u003C\u002Fa> ·\n  \u003Ca href=\"docs\u002Fproduction-deployment.md\">\u003Cstrong>Production Guide\u003C\u002Fstrong>\u003C\u002Fa> ·\n  \u003Ca href=\"CONTRIBUTING.md\">\u003Cstrong>Contribute\u003C\u002Fstrong>\u003C\u002Fa>\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FPolyTalkIO\u002Fpolytalk\u002Factions\u002Fworkflows\u002Fci.yml\">\u003Cimg alt=\"CI\" src=\"https:\u002F\u002Fgithub.com\u002FPolyTalkIO\u002Fpolytalk\u002Factions\u002Fworkflows\u002Fci.yml\u002Fbadge.svg\">\u003C\u002Fa>\n  \u003Ca href=\"LICENSE\">\u003Cimg alt=\"License: AGPL-3.0\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FLicense-AGPL--3.0-blue.svg\">\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fwww.polytalk.io\u002F\">\u003Cimg alt=\"Website\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FWebsite-polytalk.io-2ea44f.svg\">\u003C\u002Fa>\n  \u003Cimg alt=\"Python 3.10+\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FPython-3.10%2B-3776AB.svg\">\n  \u003Cimg alt=\"FastAPI\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FFastAPI-powered-009688.svg\">\n\u003C\u002Fp>\n\nPolyTalk CE is an open-source FastAPI application for live speech translation. It records microphone audio in the browser, streams it through transcription, translation, and text-to-speech services, then plays translated speech back in near real time.\n\nCreated and maintained by BizzAppDev Systems Pvt. Ltd.\n\n\u003Cp align=\"center\">\n  \u003Ca href=\"https:\u002F\u002Fwww.polytalk.io\u002F\">\u003Cstrong>Visit polytalk.io\u003C\u002Fstrong>\u003C\u002Fa> · \u003Ca href=\"#quick-start\">\u003Cstrong>Run PolyTalk locally\u003C\u002Fstrong>\u003C\u002Fa>\n\u003C\u002Fp>\n\n## Why PolyTalk\n\n- **Own the pipeline**: self-host speech processing and keep user audio under your control.\n- **Start safely**: mock mode works without API keys or external services.\n- **Deploy practically**: Docker Compose includes the app, faster-whisper STT, and Piper TTS services.\n- **Bring your provider**: use OpenAI-compatible, Anthropic-style, Gemini-style, or self-hosted translation APIs.\n- **Tune for real conversations**: adjust streaming latency, batching, VAD, and TTS settings for your environment.\n\n## How It Works\n\n1. **Recording**: Browser-based microphone recording\n2. **Transcription**: Audio to text using Whisper-compatible services\n3. **Translation**: Text translation using OpenAI-compatible APIs\n4. **Synthesis**: Text-to-speech conversion\n5. **Playback**: Browser-based audio playback\n\n## Features\n\n- Clean, modular architecture with service-oriented design\n- Mock mode for testing without external API keys\n- Configurable via YAML config file and environment variables\n- Docker and Docker Compose support\n- Simple vanilla JavaScript frontend\n- Easy to extend for additional providers and workflows\n\n## Quick Start\n\n### Prerequisites\n\n- Python 3.10+ (for local development)\n- Docker and Docker Compose (for containerized deployment)\n\n### Local Development\n\n**Note**: Local development starts safely in mock mode. To use real audio translation without Docker, configure external STT, translation, and TTS services.\n\n1. **Clone and setup**:\n   ```bash\n   cp .env.example .env\n   cp config\u002Fconfig.yaml.example config\u002Fconfig.yaml\n   ```\n\n2. **Configure** (edit `config\u002Fconfig.yaml`):\n   - Set `mock_mode: true` for testing without API keys\n   - Set `mock_mode: false` and add API keys for production use\n   - `config\u002Fconfig.yaml.example` defaults to mock mode, so copying it as-is runs the UI flow without real STT, translation, or TTS calls.\n\n3. **Install dependencies**:\n   ```bash\n   pip install -r requirements.txt\n   ```\n\n4. **Run the application**:\n   ```bash\n   python -m app.main\n   ```\n\n5. **Access the app**:\n   Open http:\u002F\u002Flocalhost:9000 in your browser\n\n### Docker Deployment (Recommended)\n\nThe Docker Compose setup includes:\n- **STT Service**: Self-hosted faster-whisper transcription service\n- **TTS Service**: Self-hosted Piper text-to-speech service\n- **PolyTalk App**: Main application with all services\n\n1. **Setup environment**:\n   ```bash\n   cp .env.example .env\n   cp config\u002Fconfig.yaml.example config\u002Fconfig.yaml\n   # Edit .env with your API keys (optional for mock mode)\n   ```\n\n2. **Build and run**:\n   ```bash\n   docker compose up -d\n   ```\n\n   For GPU-backed STT, use the GPU override:\n   ```bash\n   docker compose -f docker-compose.yml -f docker-compose.gpu.yml up -d --build\n   ```\n\n3. **Access the app**:\n   Open http:\u002F\u002Flocalhost:9000 in your browser\n\n**Note**: Port 9000 is used for the PolyTalk app. The STT and TTS services run on the internal Docker network.\n\n## Configuration\n\n### Config File (`config\u002Fconfig.yaml`)\n\nThe main configuration file supports these sections:\n\n#### Whisper (Transcription)\n```yaml\nwhisper:\n  enabled: true\n  mock_mode: true  # Set false for real API calls\n  base_url: \"${WHISPER_BASE_URL}\"\n  ws_endpoint: \"${WHISPER_WS_ENDPOINT}\"\n  max_reconnect_attempts: 3\n```\n\n#### Translation\n```yaml\ntranslation:\n  enabled: true\n  mock_mode: true  # Set false for real API calls\n  api_format: \"${TRANSLATION_API_FORMAT}\"\n  base_url: \"${TRANSLATION_BASE_URL}\"\n  endpoint: \"${TRANSLATION_ENDPOINT}\"\n  api_key: \"${TRANSLATION_API_KEY}\"\n  model: \"${TRANSLATION_MODEL}\"\n  temperature: 0.0\n  max_tokens: \"${TRANSLATION_MAX_TOKENS}\"\n```\n\n#### TTS (Text-to-Speech)\n```yaml\ntts:\n  enabled: true\n  mock_mode: true  # Set false for real API calls\n  provider: \"piper\"\n  base_url: \"${TTS_BASE_URL}\"\n  voice: \"en_GB-jenny_dioco-medium\"\n  timeout_seconds: 10\n```\n\n#### App\n```yaml\napp:\n  host: \"${APP_HOST}\"\n  port: \"${APP_PORT}\"\n  debug: \"${APP_DEBUG}\"\n  save_media: true\n  media_output_dir: \"media\u002Foutput\"\n```\n\n### Environment Variables\n\nCopy `.env.example` to `.env` and set:\n\n```bash\nTRANSLATION_API_FORMAT=openai_chat\nTRANSLATION_API_KEY=your_key_here\nTRANSLATION_BASE_URL=https:\u002F\u002Fai.example.com\nTRANSLATION_ENDPOINT=\u002Fv1\u002Fchat\u002Fcompletions\nTRANSLATION_MODEL=qwen3-8b\nTRANSLATION_MAX_TOKENS=240\nWHISPER_BASE_URL=http:\u002F\u002Fstt:8000\nTTS_BASE_URL=http:\u002F\u002Ftts:5000\nAPP_PORT=9000\nALLOWED_ORIGINS=http:\u002F\u002Flocalhost:9000,http:\u002F\u002F127.0.0.1:9000\nLOG_LEVEL=INFO\n```\n\nSupported translation API formats:\n\n| Format | Base URL | Endpoint | Response parser | Test status |\n|--------|----------|----------|-----------------|-------------|\n| `openai_chat` | `https:\u002F\u002Fai.example.com` | `\u002Fv1\u002Fchat\u002Fcompletions` | `choices[0].message.content` | Fully tested with OpenAI-compatible chat providers |\n| `openai_chat` for Ollama | `http:\u002F\u002Flocalhost:11434` | `\u002Fv1\u002Fchat\u002Fcompletions` | OpenAI-compatible chat response | Fully tested as OpenAI-compatible chat format |\n| `openai_chat` for vLLM | your vLLM server URL | `\u002Fv1\u002Fchat\u002Fcompletions` | OpenAI-compatible chat response | Fully tested as OpenAI-compatible chat format |\n| `openai_responses` | OpenAI-compatible Responses server URL | `\u002Fv1\u002Fresponses` | `output_text` | Fully tested with OpenAI-compatible Responses format |\n| `anthropic_messages` | `https:\u002F\u002Fapi.anthropic.com` | `\u002Fv1\u002Fmessages` | text blocks in `content[]` | Adapter unit-tested; live provider not fully tested |\n| `gemini_generate_content` | `https:\u002F\u002Fgenerativelanguage.googleapis.com\u002Fv1beta` | `\u002Fmodels\u002F{model}:generateContent` | `candidates[].content.parts[].text` | Adapter unit-tested; live provider not fully tested |\n\nSet `TRANSLATION_BASE_URL` to your self-hosted AI server when using OpenAI-compatible local or private deployments such as Ollama, vLLM, LM Studio, or LiteLLM. `TRANSLATION_ENDPOINT` is used as-is unless it contains `{model}`, in which case PolyTalk substitutes the configured `TRANSLATION_MODEL` before sending the request.\n\nUse `.env` for deployment-specific values such as API keys, service URLs, ports, and Docker model settings. Use `config\u002Fconfig.yaml` for application behavior such as mock mode, translation prompts, voice defaults, media storage, and latency thresholds.\n\n### Latency Tuning\n\nThe main latency knobs are:\n\n| Setting | Default | Description |\n|---------|---------|-------------|\n| `LOG_LEVEL` | `INFO` | Application and STT service log level. Set `DEBUG` to include streaming diagnostics. |\n| `STT_STREAM_CHUNK_SECONDS` | `3.0` | Audio window processed by the STT service. Lower values reduce first transcript latency; higher values can improve transcript stability. |\n| `STT_EMIT_MIN_CHARS` | `120` | Minimum new transcript text before STT emits an update to PolyTalk. Increase this if live chunks are too small. |\n| `STT_EMIT_INTERVAL_SECONDS` | `4.5` | Maximum time to hold pending transcript text before emitting it. |\n| `STT_PAUSE_FLUSH_SECONDS` | `1.2` | Flush and emit the current speech window after this much trailing silence. Set `0` to disable pause flushing. |\n| `STT_SILENCE_RMS_THRESHOLD` | `0.003` | Skip STT for very quiet audio windows. Raise this if Whisper hallucinates while nobody is speaking. |\n| `STT_NO_SPEECH_PROB_THRESHOLD` | `0.50` | Drop faster-whisper segments classified as likely no-speech. |\n| `STT_LOG_PROB_THRESHOLD` | `-1.0` | Drop low-confidence faster-whisper segments. |\n| `STT_MAX_CROSS_DELTA_WORD_REPEATS` | `6` | Stop appending the same leading word across transcript updates after this many existing repeats. |\n| `STT_VAD_FILTER` | `true` | Enable faster-whisper VAD before decoding. |\n| `STT_VAD_MIN_SILENCE_MS` | `500` | Silence duration used by VAD to split speech. Raise for fewer, larger speech regions. |\n| `STT_VAD_SPEECH_PAD_MS` | `200` | Padding kept around detected speech. Raise if words are clipped near speech boundaries. |\n| `STT_CONDITION_ON_PREVIOUS_TEXT` | `false` | Reuse previous Whisper text as context. Keep disabled for lowest hallucination risk in streaming. |\n| `STT_INITIAL_PROMPT` | empty | Optional Whisper prompt for domain terms, names, and expected vocabulary. |\n| `whisper.ping_interval_seconds` | `null` | App-to-STT WebSocket ping interval. `null` disables client pings, which avoids timeouts during long local model inference. |\n| `whisper.ping_timeout_seconds` | `null` | App-to-STT WebSocket ping timeout. |\n| `APP_WORKERS` | `3` | Number of PolyTalk app Gunicorn workers. Increase for more concurrent sessions after checking CPU and memory headroom. |\n| `STT_WORKERS` | `1` | Number of STT web workers. Each worker loads its own Whisper model. |\n| `STT_PRELOAD_MODEL` | `true` | Load the Whisper model during STT startup instead of delaying the first stream. |\n| `STT_CHUNK_OVERLAP_SECONDS` | `0.25` | Audio overlap between STT windows. Helps avoid missing words at chunk boundaries. |\n| `STT_TRANSCRIBE_WORKERS` | `2` | Per-stream STT transcription workers. Use more than 1 only when the GPU has spare compute. |\n| `STT_TRANSCRIBE_QUEUE_SIZE` | `8` | Max queued audio windows per stream before receiver backpressure. |\n| `STT_MODEL_WORKERS` | `2` | faster-whisper\u002FCTranslate2 model workers for concurrent transcribe calls. |\n| `app.translation_flush_chars` | `300` | Translate buffered text once this many characters are available. |\n| `app.translation_flush_seconds` | `5.0` | Translate buffered text after this many seconds if enough text is available. |\n| `app.translation_flush_min_chars` | `120` | Minimum text required for time-based translation flushing. |\n| `translation.model` | `qwen3-8b` | Use a model supported by your provider or self-hosted server, such as qwen3-8b, TranslateGama, or another open-source\u002Fopen-weight model. |\n| `translation.max_tokens` | `240` | Maximum translation output tokens. Keep bounded for live streaming, but allow enough room for Indic-script targets and longer sentence buffers. |\n| `tts.timeout_seconds` | `10` | Maximum wait for TTS generation. |\n| `TTS_WORKERS` | `4` | Number of Piper Gunicorn workers. Keep `2-4` on small hosts; raise toward `min(8, CPU cores)` only after CPU and memory headroom are confirmed. |\n\nFor larger continuous-speech translation chunks, start with:\n\n```bash\nSTT_STREAM_CHUNK_SECONDS=3.0\nSTT_EMIT_MIN_CHARS=120\nSTT_EMIT_INTERVAL_SECONDS=4.5\nSTT_PAUSE_FLUSH_SECONDS=1.2\n```\n\n```yaml\napp:\n  translation_flush_chars: 300\n  translation_flush_seconds: 5.0\n  translation_flush_min_chars: 120\n```\n\nFor lower latency, start with:\n\n```bash\nSTT_STREAM_CHUNK_SECONDS=0.5\nSTT_EMIT_MIN_CHARS=24\nSTT_EMIT_INTERVAL_SECONDS=1.0\nSTT_PAUSE_FLUSH_SECONDS=1.0\n```\n\n```yaml\napp:\n  translation_flush_chars: 60\n  translation_flush_seconds: 0.8\n  translation_flush_min_chars: 16\n```\n\nFor better translation quality, increase those values so the translation model receives more context.\n\nSet `LOG_LEVEL=DEBUG` when diagnosing latency. Streaming debug logs include STT\nqueue wait, STT inference time, emit delay, ASR-to-translation queue wait,\ntranslation request time, and TTS queue\u002Fduration. When `LOG_LEVEL` is unset,\nPolyTalk defaults to `INFO`.\n\n## API Endpoints\n\n### `GET \u002Fapi\u002Fhealth`\n\nHealth check endpoint.\n\n### `WS \u002Fapi\u002Fws\u002Ftranslate`\n\nStreaming translation endpoint used by the frontend.\n\nQuery parameters:\n- `source_language`: Source language code (default: `en`)\n- `target_language`: Target language code (default: `gu`)\n\nExample:\n\n```text\nws:\u002F\u002Flocalhost:9000\u002Fapi\u002Fws\u002Ftranslate?source_language=en&target_language=hi\n```\n\nThe browser sends raw 16 kHz mono int16 PCM chunks as binary WebSocket messages. The server returns JSON messages with these common `type` values:\n\n- `transcription`: Current STT transcript\n- `translation`: Current accumulated translation\n- `tts`: URL for generated speech audio\n- `language_swapped`: Confirmation after a live source\u002Ftarget swap\n- `error`: Pipeline error\n\n## Project Structure\n\n```\n.\n├── app\u002F\n│   ├── main.py              # FastAPI application entry\n│   ├── config.py            # Configuration loader\n│   ├── schemas\u002F             # Pydantic models\n│   ├── routers\u002F             # API and web routers\n│   ├── services\u002F            # Business logic services\n│   ├── templates\u002F           # Jinja2 templates\n│   ├── static\u002F              # CSS and JavaScript\n│   └── utils\u002F               # Utility functions\n├── config\u002F\n│   ├── config.yaml          # Active configuration\n│   └── config.yaml.example  # Config template\n├── media\u002F\n│   └── output\u002F              # Generated media files\n├── tests\u002F                   # Test files\n├── requirements.txt\n├── Dockerfile\n├── docker-compose.yml\n├── .env.example             # Env template\n└── README.md\n```\n\n## Supported Languages\n\n- English (en)\n- Gujarati (gu)\n- Hindi (hi)\n- Spanish (es)\n- Spanish, Mexico (es_MX)\n- French (fr)\n- German (de)\n- Portuguese (pt)\n- Chinese (zh)\n- Japanese (ja)\n- Korean (ko)\n- Arabic (ar)\n- Russian (ru)\n- Italian (it)\n- Dutch (nl)\n- Dutch, Belgium (nl_BE)\n- Turkish (tr)\n- Tamil (ta)\n- Bengali (bn)\n- Marathi (mr)\n- Telugu (te)\n- Kannada (kn)\n- Malayalam (ml)\n\n## Mock Mode\n\nMock mode allows testing the full application flow without API keys:\n\n- **Mock Transcription**: Returns pre-defined sample text\n- **Mock Translation**: Returns pre-defined translations\n- **Mock TTS**: Generates a silence audio file\n\n`config\u002Fconfig.yaml.example` defaults all service sections to `mock_mode: true`\nfor safe local startup. With those defaults, PolyTalk will not call real STT,\ntranslation, or TTS services. For a real deployment, set `mock_mode: false` in\nthe `whisper`, `translation`, and `tts` sections and configure the matching\nservice URLs\u002FAPI keys in `.env`.\n\n## Extending the Application\n\nThe modular service architecture makes it easy to extend PolyTalk:\n\n- **Add new services**: Create service classes in `app\u002Fservices\u002F` that implement base interfaces\n- **Add new providers**: Implement provider-specific services (e.g., TTS providers) and configure them\n- **Add features**: Extend the pipeline service to orchestrate new capabilities\n\n## License\n\nPolyTalk Community Edition is released under the **GNU Affero General Public License v3.0 (AGPL-3.0)**.\n\n### What This Means:\n- **Free to use**: You can run, modify, and distribute this software\n- **Copyleft**: Modifications must be licensed under AGPL-3.0\n- **Network use**: If you run a modified version as a service, you must provide its source code\n\n### Commercial Licensing\n\nIf you need to use PolyTalk under different terms (e.g., for proprietary or closed-source projects), a **commercial license** is available. Contact **BizzAppDev Systems Pvt. Ltd.** for licensing options.\n\nPolyTalk follows a dual-licensing model: AGPL-3.0 for Community Edition and proprietary licensing for Enterprise Edition.\n\n### SaaS Hosting:\nIf you are using PolyTalk as a hosted service, you must provide users with access to the corresponding source code as required by AGPL-3.0 Section 13.\n\nSee [LICENSE](LICENSE) for the full AGPL-3.0 text and [COPYRIGHT](COPYRIGHT) for copyright information.\n\n## Contributing\n\nWe welcome contributions from the community!\n\nStart with [CONTRIBUTING.md](CONTRIBUTING.md) for setup, validation, and merge\nrequest expectations. For security issues, follow [SECURITY.md](SECURITY.md)\ninstead of opening a public issue.\n\n### How to Contribute:\n1. Fork the repository\n2. Create a feature branch (`git checkout -b feature\u002Famazing-feature`)\n3. Commit your changes (`git commit -m 'Add amazing feature'`)\n4. Push to the branch (`git push origin feature\u002Famazing-feature`)\n5. Open a Pull Request\n\n### Code Requirements:\n- Follow Black formatting standards\n- Include type hints where practical\n- Add docstrings to all public methods\n- Write tests for new features\n- Ensure all tests pass before submitting PR\n\n> **Contribution Agreement**: By contributing to this project, you agree that:\n> 1. Your contributions will be licensed under AGPL-3.0\n> 2. You grant BizzAppDev Systems Pvt. Ltd. the right to use, modify, and relicense your contributions as part of commercial or proprietary versions of PolyTalk\n\n## Development\n\n### Running Tests\n\n```bash\npytest tests\u002F\n```\n\n### Code Style\n\nThe project follows Black formatting standards:\n\n```bash\nblack app\u002F\n```\n\n### Benchmarking\n\nSee [Benchmarking](docs\u002Fbenchmarking.md) for STT, translation, TTS, and full\npipeline latency benchmark scripts.\n\n### Provider Extension\n\nSee [Provider Extension](docs\u002Fprovider-extension.md) for the current STT,\ntranslation, and TTS service contracts, compatible provider expectations, and\nguidance for adding custom provider adapters.\n\n## Troubleshooting\n\n- Browser cannot access the microphone: use `localhost` or HTTPS and allow microphone permission.\n- WebSocket disconnects behind a proxy: confirm the proxy supports WebSocket upgrade and has a long enough read timeout.\n- Translation fails: check `TRANSLATION_API_KEY`, `TRANSLATION_BASE_URL`, `translation.model`, and `translation.mock_mode`.\n- STT is slow on CPU: use a smaller model, keep `STT_COMPUTE_TYPE=int8`, or use CUDA with `STT_DEVICE=cuda` and `STT_COMPUTE_TYPE=float16`.\n- CUDA fails inside Docker: confirm `docker compose -f docker-compose.yml -f docker-compose.gpu.yml exec stt nvidia-smi` works. If it does not, install\u002Fconfigure NVIDIA Container Toolkit or run with the GPU override file.\n- TTS voice is missing: check `tts.default_voices` and the voice files mounted under `tts\u002Fvoices`.\n- Audio files accumulate: generated files are stored in `media\u002Foutput`; clear or rotate that directory in production.\n\n## Production Notes\n\n- See [Production Deployment](docs\u002Fproduction-deployment.md) for a complete\n  Docker, GPU STT, nginx, HTTPS, and translation-provider deployment guide.\n- Set `APP_DEBUG=false`.\n- Set `ALLOWED_ORIGINS` to the exact browser origins that should access the app.\n- Put the app behind a reverse proxy that supports WebSockets.\n- Persist `media\u002Foutput` if generated audio should survive restarts.\n- Treat transcripts, translations, and generated audio as user data.\n- Review AGPL-3.0 obligations before offering a modified hosted service.\n","PolyTalk 是一个注重隐私、可自托管的实时语音翻译项目。它利用FastAPI框架，通过浏览器录制音频，然后经过转录、翻译和文本转语音等步骤，在接近实时的情况下播放出翻译后的语音。该项目支持Docker Compose部署，便于用户在自己控制的基础设施上运行整个处理流程，并允许使用多种兼容OpenAI的翻译服务。适用于需要保护数据隐私且希望拥有完全控制权的多语言交流场景，如国际会议、跨国公司内部沟通等。此外，其模块化设计使得系统易于扩展与定制。",2,"2026-06-11 04:02:53","CREATED_QUERY"]