{"id":50719359,"url":"https://github.com/lopatnov/translate","last_synced_at":"2026-06-09T22:02:10.431Z","repository":{"id":352982231,"uuid":"1206217366","full_name":"lopatnov/translate","owner":"lopatnov","description":"Self-hosted speech and text translation service. Whisper (STT) → NLLB-200 (text) → Piper (TTS). .NET 10 · gRPC · ONNX Runtime · Docker.","archived":false,"fork":false,"pushed_at":"2026-05-15T22:20:31.000Z","size":1673,"stargazers_count":1,"open_issues_count":2,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-15T23:42:49.217Z","etag":null,"topics":["docker","dotnet","dotnet-10","grpc","machine-learning","nllb","nlp","onnx","onnx-runtime","piper-tts","portfolio","self-hosted","text-to-text","translation","whisper"],"latest_commit_sha":null,"homepage":"https://lopatnov.github.io/translate/","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lopatnov.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":"NOTICE.md","maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-09T17:37:11.000Z","updated_at":"2026-05-10T05:56:34.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/lopatnov/translate","commit_stats":null,"previous_names":["lopatnov/translate"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/lopatnov/translate","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lopatnov%2Ftranslate","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lopatnov%2Ftranslate/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lopatnov%2Ftranslate/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lopatnov%2Ftranslate/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lopatnov","download_url":"https://codeload.github.com/lopatnov/translate/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lopatnov%2Ftranslate/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34127345,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-09T02:00:06.510Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["docker","dotnet","dotnet-10","grpc","machine-learning","nllb","nlp","onnx","onnx-runtime","piper-tts","portfolio","self-hosted","text-to-text","translation","whisper"],"created_at":"2026-06-09T22:02:10.373Z","updated_at":"2026-06-09T22:02:10.423Z","avatar_url":"https://github.com/lopatnov.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Lopatnov.Translate\n\n\u003e Self-hosted speech and text translation service. **.NET 10 · gRPC · ONNX Runtime · Docker.**\n\n[![CI](https://github.com/lopatnov/translate/actions/workflows/ci.yml/badge.svg)](https://github.com/lopatnov/translate/actions/workflows/ci.yml)\n[![License: Apache 2.0](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](LICENSE)\n[![GitHub issues](https://img.shields.io/github/issues/lopatnov/translate)](https://github.com/lopatnov/translate/issues)\n[![GitHub stars](https://img.shields.io/github/stars/lopatnov/translate?style=social)](https://github.com/lopatnov/translate/stargazers)\n\nA self-hosted gRPC service for speech-to-text transcription, text translation, text-to-speech synthesis, and end-to-end speech-to-speech translation. All models run locally — no cloud dependencies. Multiple models can be configured by name and selected per request. Optional GPU/NPU acceleration via DirectML (Windows) or CUDA (Linux).\n\n---\n\n## Getting Started\n\n### 1. Clone\n\n```bash\ngit clone https://github.com/lopatnov/translate.git\ncd translate\n```\n\n### 2. Download models through hf\n\n```bash\n# Translation model (MIT, 100 languages)\nhf download lopatnov/m2m100_418M-onnx --local-dir ./models/translate/m2m100_418M\n\n# Language detection — required for auto-detect and DetectLanguage RPC (CC-BY-SA 3.0)\nhf download lopatnov/fasttext-language-id lid.176.bin --local-dir ./models/detect-lang/fasttext-language-id\n\n# Speech-to-text — Whisper small (~500 MB, MIT)\nhf download lopatnov/whisper.cpp ggml-small.bin --local-dir ./models/audio-to-text/whisper.cpp\n\n# Text-to-speech — Piper English voice (MIT)\nhf download lopatnov/piper-voices \\\n  en_US/en_US-joe-medium.onnx en_US/en_US-joe-medium.onnx.json \\\n  --local-dir ./models/text-to-audio/piper-voices\n```\n\nSee [docs/models.md](docs/models.md) for all available models, voices, and language detection options.\n\n### 3. Start\n\n```bash\ndocker compose -f docker/docker-compose.yml up --build\n```\n\nThe gRPC server starts on port **5100**.\n\n### 4. Translate text\n\n```bash\ngrpcurl -plaintext \\\n  -d '{\"text\":\"Hello\",\"source_language\":\"en\",\"target_language\":\"uk\"}' \\\n  localhost:5100 lopatnov.translate.v1.TranslateService/TranslateText\n```\n\n### 5. Transcribe audio\n\n```bash\n# Linux (GNU base64)\ngrpcurl -plaintext \\\n  -d \"{\\\"audio_data\\\": \\\"$(base64 -w0 my-audio.wav)\\\", \\\"language\\\": \\\"auto\\\"}\" \\\n  localhost:5100 lopatnov.translate.v1.TranslateService/TranscribeAudio\n\n# macOS (BSD base64 has no -w flag)\ngrpcurl -plaintext \\\n  -d \"{\\\"audio_data\\\": \\\"$(base64 my-audio.wav | tr -d '\\n')\\\", \\\"language\\\": \\\"auto\\\"}\" \\\n  localhost:5100 lopatnov.translate.v1.TranslateService/TranscribeAudio\n\n# PowerShell (Windows)\n$b = [Convert]::ToBase64String([IO.File]::ReadAllBytes(\"my-audio.wav\"))\ngrpcurl -plaintext -d \"{`\"audio_data`\":`\"$b`\",`\"language`\":`\"auto`\"}\" `\n  localhost:5100 lopatnov.translate.v1.TranslateService/TranscribeAudio\n```\n\n### 6. Synthesize speech\n\n```bash\ngrpcurl -plaintext \\\n  -d '{\"text\":\"Hello, world!\",\"language\":\"en\"}' \\\n  localhost:5100 lopatnov.translate.v1.TranslateService/SynthesizeSpeech \\\n  | jq -r '.audioData' | base64 -d \u003e output.wav\n```\n\n### 7. Speech-to-speech translation\n\n```bash\n# Transcribe + translate + synthesize in one call\ngrpcurl -plaintext \\\n  -d \"{\\\"audio_data\\\": \\\"$(base64 -w0 speech.wav)\\\", \\\"source_language\\\": \\\"uk\\\", \\\"target_language\\\": \\\"en\\\"}\" \\\n  localhost:5100 lopatnov.translate.v1.TranslateService/TranslateAudio \\\n  | jq -r '.translatedAudio' | base64 -d \u003e translated.wav\n```\n\nSee [docs/api.md](docs/api.md) for the full API reference.\n\n---\n\n## Documentation\n\n| Doc                                        | Description                                     |\n| ------------------------------------------ | ----------------------------------------------- |\n| [docs/api.md](docs/api.md)                 | gRPC API reference — RPCs, messages, examples   |\n| [docs/models.md](docs/models.md)           | Model setup — download, configuration, licenses |\n| [docs/deployment.md](docs/deployment.md)   | Docker deployment                               |\n| [docs/development.md](docs/development.md) | Local dev, build, testing                       |\n\n---\n\n## Project Structure\n\n```text\nsrc/\n  Lopatnov.Translate.Grpc/           # gRPC server, DI wiring, model registry\n  Lopatnov.Translate.Core/           # interfaces, language detection, JSON localization\n  Lopatnov.Translate.Nllb/           # NLLB-200 translator (ONNX Runtime)\n  Lopatnov.Translate.M2M100/         # M2M-100 translator (ONNX Runtime)\n  Lopatnov.Translate.Whisper/        # Whisper speech-to-text (Whisper.net)\n  Lopatnov.Translate.Piper/          # Piper text-to-speech (ONNX Runtime + espeak-ng)\n  Lopatnov.Translate.LibreTranslate/ # LibreTranslate HTTP client (optional)\n\ntests/\n  Lopatnov.Translate.Grpc.Tests/     # service dispatch, model session manager\n  Lopatnov.Translate.Core.Tests/     # language detection, JSON localization\n  Lopatnov.Translate.Nllb.Tests/     # tokenizer, translator, integration\n  Lopatnov.Translate.M2M100.Tests/   # tokenizer, translator, integration\n  Lopatnov.Translate.Whisper.Tests/  # audio resampling, recognizer, integration\n  Lopatnov.Translate.Piper.Tests/    # phonemizer, synthesizer, integration\n\nmodels/                              # gitignored — populate via hf (see docs/models.md)\n  translate/                         # M2M-100, NLLB ONNX files\n  detect-lang/                       # FastText LID-176, GlotLID\n  audio-to-text/                     # Whisper ggml files\n  text-to-audio/                     # Piper voice files\n\nclients/\n  translate-angular/                 # Angular web UI (7 pages: translate, detect, localize,\n                                     #   transcribe, synthesize, speech-to-speech, live)\n  translate-mcp/                     # MCP server — integrates the service as an AI tool\n\ndocker/\n  Dockerfile\n  docker-compose.yml\n```\n\n---\n\n## Contributing\n\nContributions are welcome. Please read [CONTRIBUTING.md](CONTRIBUTING.md) before opening a pull request.\n\n- Bug reports → [open an issue](https://github.com/lopatnov/translate/issues)\n- Found it useful? A [star on GitHub](https://github.com/lopatnov/translate/stargazers) helps others discover the project\n\n---\n\n## License\n\n[Apache 2.0](LICENSE) © 2026 [Oleksandr Lopatnov](https://github.com/lopatnov) · [LinkedIn](https://www.linkedin.com/in/lopatnov/)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flopatnov%2Ftranslate","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flopatnov%2Ftranslate","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flopatnov%2Ftranslate/lists"}