{"id":50241037,"url":"https://github.com/ut42tech/llmeta-translation-api","last_synced_at":"2026-05-26T21:04:02.704Z","repository":{"id":316564707,"uuid":"1063884721","full_name":"ut42tech/llmeta-translation-api","owner":"ut42tech","description":"Realtime Translation API for Project LLMeta","archived":false,"fork":false,"pushed_at":"2025-09-30T04:09:31.000Z","size":249,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-10-01T20:44:54.615Z","etag":null,"topics":["api","llm","seamless","translation"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ut42tech.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-09-25T08:46:07.000Z","updated_at":"2025-09-30T04:09:34.000Z","dependencies_parsed_at":"2025-10-01T20:44:55.127Z","dependency_job_id":null,"html_url":"https://github.com/ut42tech/llmeta-translation-api","commit_stats":null,"previous_names":["ut42univ/llmeta-translation-api","ut42tech/llmeta-translation-api"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/ut42tech/llmeta-translation-api","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ut42tech%2Fllmeta-translation-api","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ut42tech%2Fllmeta-translation-api/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ut42tech%2Fllmeta-translation-api/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ut42tech%2Fllmeta-translation-api/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ut42tech","download_url":"https://codeload.github.com/ut42tech/llmeta-translation-api/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ut42tech%2Fllmeta-translation-api/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33538672,"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":"ssl_error","status_checked_at":"2026-05-26T15:22:15.568Z","response_time":63,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["api","llm","seamless","translation"],"created_at":"2026-05-26T21:03:57.590Z","updated_at":"2026-05-26T21:04:02.698Z","avatar_url":"https://github.com/ut42tech.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# llmeta-translation-api\n\nSeamlessM4T v2 を利用した FastAPI バックエンドです。テキストと音声の同時翻訳を提供し、翻訳結果の音声合成も行えます。Python のパッケージ管理は [uv](https://github.com/astral-sh/uv) を使用します。\n\n## セットアップ\n\n```bash\nuv sync\n```\n\nMac で `fairseq2` 系のライブラリを利用するために `libsndfile` が必要です。未インストールの場合は Homebrew などで追加してください。\n\n```bash\nbrew install libsndfile\n```\n\nモデルの初回ロード時には Hugging Face から数 GB のモデルがダウンロードされます。十分なディスク容量とネットワーク帯域を確保してください。\n\n## サーバー起動\n\n```bash\nuv run uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload\n```\n\n起動後、`http://localhost:8000/docs` で OpenAPI ドキュメントを確認できます。\n\nフロントエンドのデモページを確認する場合は `http://localhost:8000/demo` にアクセスしてください。\n\n## エンドポイント概要\n\n| メソッド | パス               | 説明                                 |\n| -------- | ------------------ | ------------------------------------ |\n| GET      | `/health`          | モデルロード状況とデバイス情報を返す |\n| POST     | `/translate/text`  | テキストの翻訳と音声合成             |\n| POST     | `/translate/audio` | 音声ファイルの翻訳と音声合成         |\n\n### `/translate/text`\n\nリクエスト例:\n\n```http\nPOST /translate/text HTTP/1.1\nContent-Type: application/json\n\n{\n\t\"text\": \"Hello, my dog is cute\",\n\t\"src_lang\": \"eng\",\n\t\"tgt_lang\": \"jpn\",\n\t\"return_audio\": true\n}\n```\n\nレスポンス例:\n\n```json\n{\n  \"translated_text\": \"こんにちは、私の犬はかわいいです\",\n  \"audio_base64\": \"...\",\n  \"audio_sample_rate\": 16000,\n  \"target_lang\": \"jpn\"\n}\n```\n\n`audio_base64` は WAV バイト列を Base64 でエンコードしたものです。デコードして保存すると翻訳音声を再生できます。\n\n### `/translate/audio`\n\nサポートするファイル形式は `torchaudio.load` が扱えるもの（WAV, FLAC, MP3 など）です。curl を使ったサンプル:\n\n```bash\ncurl -X POST \\\n\t-F \"file=@input.wav\" \\\n\t-F \"src_lang=eng\" \\\n\t-F \"tgt_lang=jpn\" \\\n\t-F \"return_audio=true\" \\\n\thttp://localhost:8000/translate/audio\n```\n\n## リアルタイム音声ストリーミング\n\nWebSocket を用いたリアルタイム通訳エンドポイントを追加しています。クライアントは 16-bit PCM (リトルエンディアン) の音声チャンクをバイナリで送信し、翻訳結果のテキストと音声を逐次受信できます。\n\n- エンドポイント: `ws://\u003chost\u003e:\u003cport\u003e/ws/translate`\n- 音声は任意のサンプルレートで送って構いません（内部で 16 kHz にリサンプルされます）。\n- 最初に JSON メッセージで構成情報を送信し、その後にバイナリ音声チャンクを連続送信します。\n\n### 初期メッセージ例\n\n```jsonc\n{\n  \"type\": \"config\",\n  \"src_lang\": \"eng\", // ISO 639-3 言語コード\n  \"tgt_lang\": \"jpn\",\n  \"sample_rate\": 48000, // クライアント側オーディオのサンプルレート\n  \"return_text\": true, // 文字起こしを受信するか\n  \"streaming_audio\": true, // SeamlessStreaming で逐次音声を受信するか\n  \"expressive_audio\": false // SeamlessExpressive を利用するか（gated モデルが必要）\n}\n```\n\n以降は `Uint8Array` もしくは `ArrayBuffer` で PCM16 の音声データを送信してください。発話が終わったタイミングで JSON メッセージ `{\"type\": \"end\"}` を送ると、残りのバッファがフラッシュされてセッションが終了します。\n\n### サーバーからのメッセージ種別\n\n| type               | 説明                                                                             |\n| ------------------ | -------------------------------------------------------------------------------- |\n| `ready`            | 準備完了。`target_sample_rate` と `expressive_available` が含まれます。          |\n| `partial_text`     | 部分的な翻訳テキスト。`final=true` の場合は発話が確定したことを表します。        |\n| `streaming_audio`  | SeamlessStreaming によるリアルタイム音声。`audio_base64` は PCM16 を Base64 化。 |\n| `expressive_audio` | SeamlessExpressive による音声（利用可能な場合のみ）。                            |\n| `error`            | エラー内容。                                                                     |\n| `done`             | セッション終了。                                                                 |\n\n## SeamlessExpressive を利用する場合\n\nSeamlessExpressive のモデルと vocoder は gated asset のため、事前に Meta のライセンスと Hugging Face 上のアクセス申請が必要です。取得したモデルファイルを任意のディレクトリに配置し、環境変数 `SEAMLESS_EXPRESSIVE_DIR` でパスを指定してください。\n\n```bash\nexport SEAMLESS_EXPRESSIVE_DIR=/path/to/seamless_expressive_assets\n```\n\n上記が設定されていない場合は Expressive 音声の要求が拒否され、テキストおよび通常のストリーミング音声のみが利用できます。\n\n## 言語コードについて\n\nSeamlessM4T v2 は ISO 639-3 ベースの言語コードを使用します。主要なコード例は以下の通りです。\n\n- `eng`: 英語\n- `jpn`: 日本語\n- `cmn`: 中国語 (Mandarin)\n- `kor`: 韓国語\n\nその他のコードは [Hugging Face モデルカード](https://huggingface.co/facebook/seamless-m4t-v2-large) を参照してください。\n\n## テスト\n\n構文エラーのチェックには次のコマンドを利用できます。\n\n```bash\nuv run python -m compileall app\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fut42tech%2Fllmeta-translation-api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fut42tech%2Fllmeta-translation-api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fut42tech%2Fllmeta-translation-api/lists"}