文字起こしのアップロード

番組設定では「自動で文字起こしを行う」と「文字起こしの公開範囲」を別々に選べます。自動生成をオフ、公開範囲を公開にすると、自動文字起こし・要約・話者分離を止めたまま、自作字幕を公開できます。既存の本文や要約は自動で削除されません。

この変更以降にアップロードした文字起こしは、自動文字起こし・出演者変更による話者分離で上書きしません。本文差し替え後の要約は保持されます。要約APIで編集・再生成できます。検索インデックスへの変更反映は非同期です。

自動文字起こしの既知の誤挿入話者ラベルは、行頭に限ってWeb・VTT/SRT/TXTダウンロード・APIで共通に除去します。保存済み原文の一括削除は行わず、新規アップロード字幕は除去対象外です。生成済みの要約の誤記や、反復によって欠落した会話が、この処理だけで復元されるわけではありません。

専用のREST APIで、エピソードにSRT・VTT形式の文字起こしをアップロードできます。無料を含む全プランで利用できます。番組のオーナー権限と、APIトークンのupdate権限が必要です。{episode}にはエピソードIDを指定します。ファイルをUTF-8で読み込み、本文をJSONのcontentに渡してください(10 MB以下、20,000字幕以内)。

エンドポイント

PUT https://listen.style/api/v1/episodes/{episode}/transcript
jq -n --rawfile content transcript.vtt '{format: "vtt", content: $content}' | \
  curl -X PUT "https://listen.style/api/v1/episodes/$EPISODE_ID/transcript" \
    -H "Authorization: Bearer $LISTEN_API_TOKEN" \
    -H 'Accept: application/json' \
    -H 'Content-Type: application/json' \
    --data-binary @-

レスポンス

成功時は、新規作成なら201、置き換えなら200と、次のJSONを返します。

{"data":{"episode_id":"EPISODE_ID","segment_count":12,"transcript_imported_at":"2026-10-16T06:00:00+00:00"}}

401は未認証、403は権限不足、404はエピソードが見つからない場合、422は形式・時刻・サイズの不備や文字起こし処理中、429は回数制限です。422の詳細はJSONのerrorsを確認してください。

取り込み済みの印を確認する

transcript_imported_at は最後に字幕のアップロードが成功した日時(UTC、ISO 8601形式)です。再アップロードが成功すると更新され、失敗した場合は更新されません。日時が入っていれば取り込み済みの印があり、自動文字起こし・出演者変更による自動話者分離の上書きから保護されています。

あとから確認する場合は GET /api/v1/episodes/{episode}、まとめて照合する場合は GET /api/v1/podcasts/{podcast}/episodes の各 data に含まれる同名の項目を確認してください。取得には番組オーナー権限とトークンの read 権限が必要です。無料を含む全プランで利用できます。

null は記録がないことを表し、字幕がない場合・自動生成・印の導入前のアップロードを区別しません。以前のアップロード分にも確実に印を付けたい場合は、手元の字幕を再アップロードしてください。日時は本文の内容一致や検索反映の完了を保証するものではありません。

対応形式とアップロード時の動作

SRTの場合はformat: "srt"を指定します。各字幕の開始・終了時刻は必須です。時刻のないテキスト、重複・逆順の時刻はアップロードできません。VTTの<v 話者名>にも対応します(1字幕につき1話者)。

アップロードしたファイルの本文・字幕の区切り・時刻で、既存の文字起こし全体を置き換えます。既存チャプターのタイトル・開始時刻とサマリーは保持します。単語単位の時刻情報は削除します。文字起こしがまだないエピソードにもアップロードできます。自動文字起こし・話者分離の処理中はエラーになるため、完了後に再度実行してください。

目次だけをアップロードする場合は、チャプターのアップロードを参照してください。