MIT License

技术解读

以下内容由 GitRead 中文社区 编辑团队基于项目 README 与官方资料整理, 结合中文开发者的常见使用场景补充技术选型建议。具体以项目官方文档为准。

CapCut TTS Wrapper API 深度技术分析

项目背景与痛点

在数字媒体处理领域,语音合成技术(TTS, Text-to-Speech)是极为关键的一环,尤其在视频编辑和自动化创作过程中。CapCut TTS 对应的API集合了免费的TTS服务,提供了强大的语音文本转换能力,进一步将文本内容直接转化为语音。它解决了开发者需要整合多个TTS服务的痛点,使得工程师可以便捷地集成TTS功能到自己的应用程序中,而不必分别处理不同服务提供商的API接口和实现复杂的数据传递。

核心技术揭秘

CapCut TTS Wrapper API 的设计是非常模块化的,将用户请求同内部服务的复杂实现细节区分开来。我们首先分析其内部架构,以及是如何有效地封装各种API,再调用相关的语音合成服务提供的功能。

graph TD A[用户请求] --> B{"验证参数"} B -->|"通过"| C[请求路由] C --> D[TTS服务请求] D --> E[语音响应] B -->|"验证失败"| F[错误处理]

在这个架构中,模块化的结构不仅简化了开发者对多服务的支持,同时也使得整体复杂度得到了控制。通过基于HTTP请求的模式,请求路由能有效地处理不同的服务需求,调用后端支持的服务。对我们理解总体协调机制提供了参考。

CAPCut TTS的API管理体现在封装,即前端系统提供一个标准化的接口,有效隔离了下游TTS服务的复杂性。数据流控制方面,从构造HTTP request开始,经由验证流程,到触发下游服务并将处理结果路由回调到前端接口,都严格遵循异步处理模型,保证并发能力的同时,提升了响应速度和效率。且通过封装,能够简化客户调用方API需要处理的场景,提高开发便利性及其扩展性。

功能亮点与差异

CapCut TTS 支持的语音合成服务广泛,多种类型的TTS服务都被保持支持,这并不是所有语音处理API集合所具有的,允许开发者在不同的场景中选择最适合的语音处理工具而不需担心兼容性问题。

此外,文档的明确书写和技术性能指标的公开透明,减轻了开发者尝试使用API的心理压力,提高了集成效率。这也让CapCut TTS在社区中的呼声持续升高,广泛受到开发者的喜爱。

应用场景与落地建议

它是专门为音频处理与文本转语音的相关解决方案设计的,在短视频剪辑和自动化创作场景中特别有用。这类场景下,能够将文字鲜活地转化为语音,可以极大地提升用户体验和增加产品功能的多样性。

但是,需要注意的是,免费服务可能会出现一些使用者数量限制以及服务质量不稳定的情况,因此在多个项目中引入CapCut TTS时,应提前考察每个服务的实际性能情况,采取合适的缓存策略,避免同样的语音被多次请求引起的负载激增。

综合评价

CapCut TTS作为一个API集合,它在集成过程中的高效,范围广泛的TTS服务支持,以及文档的整体可用性,显然都是其突出的优点。相对于市面上其他同类工具,CapCut TTS在服务灵活性和使用简便性方面颇有优势,是一个值得推荐的工具。

当然,一些服务使用上的限制条件仍是开发者需要权衡的地方,但从体验和价值的角度来看,CapCut TTS 依然是一个优秀的选项,适合作为企业与初创团队的快速语音解决方案引入。

简要分析

热度分
179
价值分
77
活跃状态
活跃

语言占比

Batchfile
JavaScript
Shell
TypeScript

Release

贡献者

README

CapCut TTS Wrapper API

English README

CapCut Web に email / password でログインし、session を維持しながら最新の Web TTS 経路で音声を取得する、セルフホスト用ラッパー API です。

旧来の token + websocket 方式ではなく、現在の CapCut Web の認証フローと storyboard/v1/tts/multi_platform に合わせています。

できること

  • CapCut Web に email / password でログインして session を維持
  • GET /v2/speakers で利用可能な話者一覧を取得
  • GET /v2/speakers/:speakerId/preview で話者プレビュー音声を取得
  • GET /v2/synthesize で MP3 音声を取得
  • POST /v2/synthesize で JSON body を使って MP3 音声を取得
  • GET /v1/synthesize で旧 token + websocket フローの WAV 音声を取得
  • buffer と stream の 2 つのレスポンス方式に対応
  • session を capcut-session.json に保存して再利用
  • CapCut の bundle から抽出した設定を capcut-bundle-config.json に保存して再利用

注意事項

  • このプロジェクトは CapCut の公式 SDK / 公式 API ラッパーではありません
  • CapCut 側の仕様変更により、突然動かなくなる可能性があります
  • 利用にあたっては、各自の責任で公開範囲や運用方法を判断してください

クイックスタート

1. 依存関係をインストール

npm install

2. .env を作成

cp .env.example .env

3. CapCut の認証情報を設定

最低限、次の 2 つを設定してください。

[email protected]
CAPCUT_PASSWORD=your-password

通常は他の値はデフォルトのままで動きます。

4. 開発サーバーを起動

npm run dev

5. API を呼び出す

# 話者一覧を取得
curl "http://localhost:8080/v2/speakers"

# 話者プレビューを取得
curl "http://localhost:8080/v2/speakers/ICL_en_female_jiaoao/preview" --output preview.mp3

# GET で音声合成
curl "http://localhost:8080/v2/synthesize?text=こんにちは&speaker=labebe&method=buffer" --output voice.mp3

# POST で音声合成
curl -X POST "http://localhost:8080/v2/synthesize" \
  -H "Content-Type: application/json" \
  -d '{"text":"こんにちは","speaker":"labebe","method":"buffer"}' \
  --output voice.mp3

旧フローを使う場合は、LEGACY_DEVICE_TIME と LEGACY_SIGN を設定したうえで次のように呼び出せます。

curl "http://localhost:8080/v1/synthesize?text=こんにちは&type=0&pitch=10&speed=10&volume=10&method=buffer" --output voice.wav

bundle 設定の扱い

このプロジェクトは、CapCut Web の bundle から見つかった各種設定値を capcut-bundle-config.json に保存しながら動作します。

ここで保存しているのは、たとえば次のような値です。

  • login / account 系 endpoint path
  • editor / TTS 系 endpoint path
  • appvr, version_name, sdk_version などの version 系値
  • editor API の sign 生成に使う recipe
  • 音声カテゴリ ID 一覧

capcut-bundle-config.json は、実際にページへアクセスして取得した bundle 情報のキャッシュです。ファイルが存在し、その内容がキャッシュ有効期間内であれば、毎回あらためて CapCut のページへアクセスして bundle を取り直さなくても動作します。

逆に、次のような場合は live で再取得を試みます。

  • capcut-bundle-config.json がまだ存在しない
  • キャッシュが期限切れになった
  • 必要な設定値がまだ十分に揃っていない

つまり、通常運用では HAR は必須ではありません。現在は HAR なしでも、サーバーが CapCut のページにアクセスできれば bundle 情報を動的に取得し、その結果を capcut-bundle-config.json に保存して以後の起動や通信で再利用します。

HAR と capcut:extract の位置づけ

npm run capcut:extract は、HAR から capcut-bundle-config.json を生成したいときの補助コマンドです。

npm run capcut:extract

これは必須コマンドではありません。主な用途は次のとおりです。

  • 初回に HAR から既知の設定を投入して起動を安定させたいとき
  • live アクセスを行う前に bundle 情報を手元で固定したいとき
  • CapCut 側の変更調査をするとき

API

ベース URL

http://<host>:<port>/

エンドポイント

メソッド パス 説明
GET /v2/speakers 利用可能な話者一覧を取得
GET /v2/speakers/:speakerId/preview 話者プレビュー音声を取得
GET /v2/synthesize 音声合成(クエリパラメーター)
POST /v2/synthesize 音声合成(JSON body)
GET /v1/models 旧音声モデル一覧
GET /v1/synthesize 旧フロー音声合成

GET /v2/speakers レスポンス

[
  {
    "id": "ICL_en_female_jiaoao",
    "resourceId": "7530105822785899777",
    "effectId": "7530105822785899777",
    "name": "ラベベさん",
    "description": "英語の明るい女性ボイス",
    "style": "",
    "language": "en"
  }
]

GET /v2/speakers/:speakerId/preview

指定した話者のプレビュー音声を返します。初回アクセス時のみ音声を生成して speaker-preview-temp/<speakerId>.mp3 に保存し、以降はキャッシュを返します。ファイルの更新日時が CAPCUT_SPEAKER_PREVIEW_MAX_AGE_DAYS を超えた場合は再生成します。

GET /v2/synthesize クエリパラメーター

パラメーター 型 必須 説明 デフォルト
text string はい 読み上げるテキスト なし
speaker string いいえ 話者指定。alias / effectId / resourceId / speaker name を受け付けます。type より優先されます なし
type number | string いいえ フォールバック用の voice index。speaker 未指定時に使用されます 0
pitch number いいえ 旧互換パラメーター。現在の Web TTS では未使用です 10
speed number いいえ 再生速度。10 が等速です 10
volume number いいえ 音量。10 が標準です 10
method string いいえ buffer または stream buffer

POST /v2/synthesize リクエストボディ

GET と同じフィールドを JSON body で送信します。

{
  "text": "こんにちは",
  "speaker": "labebe",
  "speed": 10,
  "volume": 10,
  "method": "buffer"
}

レスポンス

ステータスコード 内容
200 OK audio/mpeg
400 Bad Request パラメーターが不正
502 Bad Gateway CapCut 側の認証または音声生成に失敗

/v1/synthesize は旧 token + websocket フローを使い、audio/wav を返します。
LEGACY_DEVICE_TIME と LEGACY_SIGN が未設定の場合は 503 Service Unavailable を返します。

話者解決ルール

条件 挙動
speaker 指定あり speaker で話者を解決(type は無視)
type のみ指定 type でフォールバック話者を選択
両方なし デフォルト話者(index 0)を使用

type / speaker 互換表

type は次の固定話者にマップされます。speaker を使う場合は alias 列の値を指定できます。

これら以外の話者は、/v2/speakers を参照してください。

type alias 話者名
0 labebe ラベベさん
1 cool_lady 冷静なレディ
2 happy_dino ハッピーディノ
3 puppet おかしなあやつり人形
4 popular_guy モテ男
5 bratty_witch 生意気な魔女
6 game_host ゲームホスト
7 calm_dubbing 穏やかな吹き替え
8 gruff_uncle 濁声おじさん
9 witch_granny 魔婆
10 high_tension 高テンション
11 serious_man 真面目男
12 manager マネージャー
13 little_sister 妹系
14 young_girl 幼い女の子
15 peaceful_woman 平和な女性

環境変数

主要な環境変数は次のとおりです。

変数名 説明
CAPCUT_WEB_URL CapCut Web のベース URL
CAPCUT_EDIT_API_URL CapCut Edit API のベース URL
CAPCUT_LOGIN_HOST primary login host
CAPCUT_FALLBACK_LOGIN_HOST fallback login host
CAPCUT_EMAIL CapCut ログイン用 email
CAPCUT_PASSWORD CapCut ログイン用 password
CAPCUT_LOCALE API に送る locale
CAPCUT_PAGE_LOCALE login page URL の locale
CAPCUT_REGION CapCut request に使う region
CAPCUT_STORE_COUNTRY_CODE store-country-code header の値
CAPCUT_DEVICE_ID device id を固定したい場合に指定
CAPCUT_VERIFY_FP verifyFp を固定したい場合に指定
CAPCUT_BUNDLE_CONFIG_PATH bundle 設定キャッシュの保存先
CAPCUT_VOICE_CATEGORY_ID voice catalog 取得に使う category id
CAPCUT_SESSION_STORE_PATH session 保存先
CAPCUT_SPEAKER_PREVIEW_TEMP_DIR 話者プレビュー音声キャッシュの保存先
CAPCUT_SPEAKER_PREVIEW_TEXT プレビュー生成時に読み上げるテキスト
CAPCUT_SPEAKER_PREVIEW_MAX_AGE_DAYS プレビュー再生成までの日数
CAPCUT_TTS_TEXT_CHUNK_MAX_LENGTH 長文 TTS を分割する最大文字数
CAPCUT_TTS_TEXT_CHUNK_BOUNDARY_SEARCH_RATIO 区切り文字を探し始める位置の割合
LEGACY_CAPCUT_API_URL 旧 token API のベース URL
LEGACY_BYTEINTL_API_URL 旧 WebSocket 接続先のベース URL
LEGACY_DEVICE_TIME 旧 token API に送る Device-Time
LEGACY_SIGN 旧 token API に送る Sign
LEGACY_TOKEN_INTERVAL legacy token の再取得間隔。単位は時間
USER_AGENT CapCut へ送る User-Agent
SESSION_REFRESH_INTERVAL_MINUTES background session validation 間隔
HOST サーバー待ち受け host
PORT サーバー待ち受け port
CORS_POLICY_ORIGIN CORS 許可 Origin

npm scripts

コマンド 内容
npm run dev 開発サーバー起動
npm run typecheck TypeScript 型チェック
npm run lint ESLint
npm run build dist/ へビルド
npm run start ビルド済みアプリ起動
npm run capcut:extract HAR から capcut-bundle-config.json を生成

補足

  • 起動時に session の warmup を試み、その後は SESSION_REFRESH_INTERVAL_MINUTES ごとに検証します
  • 起動時や実行時に bundle 情報が必要になると、capcut-bundle-config.json を読み込み、必要に応じて live 抽出して更新します
  • LEGACY_DEVICE_TIME と LEGACY_SIGN を設定すると、起動時に legacy token の取得も試みます
  • speaker に effectId / resourceId / speaker name を直接渡しても選択できます
  • 現在の CapCut Web TTS は MP3 を返し、レスポンスの Content-Disposition は inline です

评论

暂无评论