{"id":20626526,"url":"https://github.com/kuwacom/capcut-tts","last_synced_at":"2026-04-03T05:05:52.777Z","repository":{"id":207136072,"uuid":"714665204","full_name":"kuwacom/CapCut-TTS","owner":"kuwacom","description":"CapCut TTS Wrapper API - CapCut API","archived":false,"fork":false,"pushed_at":"2026-03-30T05:25:06.000Z","size":755,"stargazers_count":81,"open_issues_count":7,"forks_count":18,"subscribers_count":4,"default_branch":"main","last_synced_at":"2026-03-30T05:33:29.036Z","etag":null,"topics":["capcut","rapper","tts-api"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kuwacom.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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}},"created_at":"2023-11-05T14:45:45.000Z","updated_at":"2026-03-30T05:30:50.000Z","dependencies_parsed_at":"2024-01-30T18:34:32.720Z","dependency_job_id":"cd8bc042-629a-4107-9f67-834a6e04b989","html_url":"https://github.com/kuwacom/CapCut-TTS","commit_stats":null,"previous_names":["kuwacom/capcut-tts"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/kuwacom/CapCut-TTS","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kuwacom%2FCapCut-TTS","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kuwacom%2FCapCut-TTS/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kuwacom%2FCapCut-TTS/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kuwacom%2FCapCut-TTS/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kuwacom","download_url":"https://codeload.github.com/kuwacom/CapCut-TTS/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kuwacom%2FCapCut-TTS/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31335237,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-03T04:42:29.251Z","status":"ssl_error","status_checked_at":"2026-04-03T04:42:12.667Z","response_time":107,"last_error":"SSL_read: 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":["capcut","rapper","tts-api"],"created_at":"2024-11-16T13:13:48.458Z","updated_at":"2026-04-03T05:05:52.770Z","avatar_url":"https://github.com/kuwacom.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# CapCut TTS Wrapper API\n\n[English README](./README.en.md)\n\nCapCut Web に email / password でログインし、session を維持しながら最新の Web TTS 経路で音声を取得する、セルフホスト用ラッパー API です。\n\n旧来の `token + websocket` 方式ではなく、現在の CapCut Web の認証フローと `storyboard/v1/tts/multi_platform` に合わせています。\n\n## できること\n\n- CapCut Web に email / password でログインして session を維持\n- `GET /v1/synthesize` で MP3 音声を取得\n- `GET /legacy/synthesize` で旧 token + websocket フローの WAV 音声を取得\n- `buffer` と `stream` の 2 つのレスポンス方式に対応\n- session を `capcut-session.json` に保存して再利用\n- CapCut の bundle から抽出した設定を `capcut-bundle-config.json` に保存して再利用\n\n## 注意事項\n\n- このプロジェクトは CapCut の公式 SDK / 公式 API ラッパーではありません\n- CapCut 側の仕様変更により、突然動かなくなる可能性があります\n- 利用にあたっては、各自の責任で公開範囲や運用方法を判断してください\n\n## クイックスタート\n\n### 1. 依存関係をインストール\n\n```bash\nnpm install\n```\n\n### 2. `.env` を作成\n\n```bash\ncp .env.example .env\n```\n### 3. CapCut の認証情報を設定\n\n最低限、次の 2 つを設定してください。\n\n```env\nCAPCUT_EMAIL=your-account@example.com\nCAPCUT_PASSWORD=your-password\n```\n\n通常は他の値はデフォルトのままで動きます。\n\n### 4. 開発サーバーを起動\n\n```bash\nnpm run dev\n```\n\n### 5. API を呼び出す\n\n```bash\ncurl \"http://localhost:8080/v1/synthesize?text=こんにちは\u0026type=0\u0026method=buffer\" --output voice.mp3\n```\n\n旧フローを使う場合は、`LEGACY_DEVICE_TIME` と `LEGACY_SIGN` を設定したうえで次のように呼び出せます。\n\n```bash\ncurl \"http://localhost:8080/legacy/synthesize?text=こんにちは\u0026type=0\u0026pitch=10\u0026speed=10\u0026volume=10\u0026method=buffer\" --output voice.wav\n```\n\n## bundle 設定の扱い\n\nこのプロジェクトは、CapCut Web の bundle から見つかった各種設定値を `capcut-bundle-config.json` に保存しながら動作します。\n\nここで保存しているのは、たとえば次のような値です。\n\n- login / account 系 endpoint path\n- editor / TTS 系 endpoint path\n- `appvr`, `version_name`, `sdk_version` などの version 系値\n- editor API の sign 生成に使う recipe\n- 音声カテゴリ ID 一覧\n\n`capcut-bundle-config.json` は、実際にページへアクセスして取得した bundle 情報のキャッシュです。ファイルが存在し、その内容がキャッシュ有効期間内であれば、毎回あらためて CapCut のページへアクセスして bundle を取り直さなくても動作します。\n\n逆に、次のような場合は live で再取得を試みます。\n\n- `capcut-bundle-config.json` がまだ存在しない\n- キャッシュが期限切れになった\n- 必要な設定値がまだ十分に揃っていない\n\nつまり、通常運用では HAR は必須ではありません。現在は HAR なしでも、サーバーが CapCut のページにアクセスできれば bundle 情報を動的に取得し、その結果を `capcut-bundle-config.json` に保存して以後の起動や通信で再利用します。\n\n## HAR と `capcut:extract` の位置づけ\n\n`npm run capcut:extract` は、HAR から `capcut-bundle-config.json` を生成したいときの補助コマンドです。\n\n```bash\nnpm run capcut:extract\n```\n\nこれは必須コマンドではありません。主な用途は次のとおりです。\n\n- 初回に HAR から既知の設定を投入して起動を安定させたいとき\n- live アクセスを行う前に bundle 情報を手元で固定したいとき\n- CapCut 側の変更調査をするとき\n\n現在の実装では、固定値を単純にハードコードするのではなく、次のどちらかで得た値を `capcut-bundle-config.json` に保存して使う方針です。\n\n- HAR から抽出した値\n- 実際に CapCut のページへアクセスして live 抽出した値\n\nそのため、運用の基本は「保存済みの bundle 設定を再利用し、必要なときだけ再抽出する」という形です。\n\n## API\n\n### ベース URL\n\n```text\nhttp://\u003chost\u003e:\u003cport\u003e/\n```\n\n### エンドポイント\n\n```http\nGET /v1/synthesize\n```\n\n```http\nGET /legacy/synthesize\n```\n\n### クエリパラメーター\n\n| パラメーター | 型 | 必須 | 説明 | デフォルト |\n| --- | --- | --- | --- | --- |\n| `text` | string | はい | 読み上げるテキスト | なし |\n| `type` | number | いいえ | 互換用の voice index | `0` |\n| `voice` | string | いいえ | 明示的な voice 指定。alias / `effectId` / `resourceId` / `speaker` を受け付けます | なし |\n| `pitch` | number | いいえ | 旧互換パラメーター。現在の Web TTS では未使用です | `10` |\n| `speed` | number | いいえ | 再生速度。`10` が等速です | `10` |\n| `volume` | number | いいえ | 音量。`10` が標準です | `10` |\n| `method` | string | いいえ | `buffer` または `stream` | `buffer` |\n\n### レスポンス\n\n| ステータスコード | 内容 |\n| --- | --- |\n| `200 OK` | `audio/mpeg` |\n| `400 Bad Request` | クエリが不正 |\n| `502 Bad Gateway` | CapCut 側の認証または音声生成に失敗 |\n\n`/legacy/synthesize` は旧 token + websocket フローを使い、`audio/wav` を返します。\n`LEGACY_DEVICE_TIME` と `LEGACY_SIGN` が未設定の場合は `503 Service Unavailable` を返します。\n\n## `type`用 Voice 互換表\n\n`type` は次の固定 voice にマップされます。`voice` を使う場合は `alias` 列の値を指定できます。\n\nこれら以外の音声は、`/v1/models`を参照してください。\n\n| type | alias | voice |\n| --- | --- | --- |\n| `0` | `labebe` | ラベベさん |\n| `1` | `cool_lady` | 冷静なレディ |\n| `2` | `happy_dino` | ハッピーディノ |\n| `3` | `puppet` | おかしなあやつり人形 |\n| `4` | `popular_guy` | モテ男 |\n| `5` | `bratty_witch` | 生意気な魔女 |\n| `6` | `game_host` | ゲームホスト |\n| `7` | `calm_dubbing` | 穏やかな吹き替え |\n| `8` | `gruff_uncle` | 濁声おじさん |\n| `9` | `witch_granny` | 魔婆 |\n| `10` | `high_tension` | 高テンション |\n| `11` | `serious_man` | 真面目男 |\n| `12` | `manager` | マネージャー |\n| `13` | `little_sister` | 妹系 |\n| `14` | `young_girl` | 幼い女の子 |\n| `15` | `peaceful_woman` | 平和な女性 |\n\n## 環境変数\n\n主要な環境変数は次のとおりです。\n\n| 変数名 | 説明 |\n| --- | --- |\n| `CAPCUT_WEB_URL` | CapCut Web のベース URL |\n| `CAPCUT_EDIT_API_URL` | CapCut Edit API のベース URL |\n| `CAPCUT_LOGIN_HOST` | primary login host |\n| `CAPCUT_FALLBACK_LOGIN_HOST` | fallback login host |\n| `CAPCUT_EMAIL` | CapCut ログイン用 email |\n| `CAPCUT_PASSWORD` | CapCut ログイン用 password |\n| `CAPCUT_LOCALE` | API に送る locale |\n| `CAPCUT_PAGE_LOCALE` | login page URL の locale |\n| `CAPCUT_REGION` | CapCut request に使う region |\n| `CAPCUT_STORE_COUNTRY_CODE` | store-country-code header の値 |\n| `CAPCUT_DEVICE_ID` | device id を固定したい場合に指定 |\n| `CAPCUT_VERIFY_FP` | verifyFp を固定したい場合に指定 |\n| `CAPCUT_BUNDLE_CONFIG_PATH` | bundle 設定キャッシュの保存先 |\n| `CAPCUT_VOICE_CATEGORY_ID` | voice catalog 取得に使う category id |\n| `CAPCUT_SESSION_STORE_PATH` | session 保存先 |\n| `LEGACY_CAPCUT_API_URL` | 旧 token API のベース URL |\n| `LEGACY_BYTEINTL_API_URL` | 旧 WebSocket 接続先のベース URL |\n| `LEGACY_DEVICE_TIME` | 旧 token API に送る Device-Time |\n| `LEGACY_SIGN` | 旧 token API に送る Sign |\n| `LEGACY_TOKEN_INTERVAL` | legacy token の再取得間隔。単位は時間 |\n| `USER_AGENT` | CapCut へ送る User-Agent |\n| `SESSION_REFRESH_INTERVAL_MINUTES` | background session validation 間隔 |\n| `HOST` | サーバー待ち受け host |\n| `PORT` | サーバー待ち受け port |\n| `CORS_POLICY_ORIGIN` | CORS 許可 Origin |\n\n## npm scripts\n\n| コマンド | 内容 |\n| --- | --- |\n| `npm run dev` | 開発サーバー起動 |\n| `npm run typecheck` | TypeScript 型チェック |\n| `npm run lint` | ESLint |\n| `npm run build` | `dist/` へビルド |\n| `npm run start` | ビルド済みアプリ起動 |\n| `npm run capcut:extract` | HAR から `capcut-bundle-config.json` を生成 |\n\n## 補足\n\n- 起動時に session の warmup を試み、その後は `SESSION_REFRESH_INTERVAL_MINUTES` ごとに検証します\n- 起動時や実行時に bundle 情報が必要になると、`capcut-bundle-config.json` を読み込み、必要に応じて live 抽出して更新します\n- `LEGACY_DEVICE_TIME` と `LEGACY_SIGN` を設定すると、起動時に legacy token の取得も試みます\n- `voice` に `effectId` / `resourceId` / `speaker` を直接渡しても選択できます\n- 現在の CapCut Web TTS は MP3 を返すため、レスポンスも `audio/mpeg` です\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkuwacom%2Fcapcut-tts","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkuwacom%2Fcapcut-tts","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkuwacom%2Fcapcut-tts/lists"}