ListenHubOpenAPI
API リファレンス

スライド

AI によるビジュアルとナレーション原稿を備えたプレゼンテーションスライドを生成し、会議や報告にそのまま活用できます。

スライドモードは、AI が生成したビジュアルとナレーション原稿を含むプロフェッショナルなプレゼンテーション形式のコンテンツを生成します。会議のプレゼン、ビジネスレポート、カンファレンス講演に最適です。

詳細
ビジュアルスタイルPPT レイアウト(グリッド、プロセスフロー、大きな数字のヒーロー)
1 ページ目プレゼンテーションのタイトルページ
最適な用途会議のプレゼン、ビジネスレポート、カンファレンス講演

PPT ファイルとして書き出すには、ListenHub のプラットフォームを直接ご利用ください。PPT の書き出しは OpenAPI では利用できません。


スライドのエピソードを作成する

POST /v1/storybook/episodes

AI が生成したプレゼンテーション用ビジュアルとナレーション原稿を含むスライドのエピソードを作成します。

sources は最大 1 件、speakers は最大 1 件までです。

curl -X POST "https://api.marswave.ai/openapi/v1/storybook/episodes" \
  -H "Authorization: Bearer $LISTENHUB_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "sources": [
      {"type": "text", "content": "Q3 revenue grew 45% year-over-year, driven by expansion in APAC markets..."}
    ],
    "speakers": [
      {"speakerId": "<SPEAKER_ID>"}
    ],
    "language": "en",
    "mode": "slides"
  }'
const response = await fetch('https://api.marswave.ai/openapi/v1/storybook/episodes', {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${process.env.LISTENHUB_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    sources: [{ type: 'text', content: 'Q3 revenue grew 45% year-over-year, driven by expansion in APAC markets...' }],
    speakers: [{ speakerId: '<SPEAKER_ID>' }],
    language: 'en',
    mode: 'slides',
  }),
});
const data = await response.json();
console.log(data);
import os, requests

response = requests.post(
    'https://api.marswave.ai/openapi/v1/storybook/episodes',
    headers={'Authorization': f'Bearer {os.environ["LISTENHUB_API_KEY"]}'},
    json={
        'sources': [{'type': 'text', 'content': 'Q3 revenue grew 45% year-over-year, driven by expansion in APAC markets...'}],
        'speakers': [{'speakerId': '<SPEAKER_ID>'}],
        'language': 'en',
        'mode': 'slides',
    }
)
print(response.json())

レスポンス

{
  "code": 0,
  "message": "",
  "data": {
    "episodeId": "{episodeId}"
  }
}

リクエストパラメータ

パラメータ必須説明
sourcesarray(1)はいコンテンツソース。最大 1 件。
sources[].typestringはい"text" または "url"
sources[].contentstringはいテキストコンテンツまたは URL
sources[].uristringいいえソースの URI
sources[].metadataobjectいいえソースのメタデータ
speakersarray(1)はい音声設定。最大 1 件。
speakers[].speakerIdstringはい話者 ID(話者一覧 を参照)
languagestringいいえ言語コード(例:"en""zh"
modestringはい"slides" を指定します
stylestringいいえビジュアルスタイル ID

エピソードのステータスを照会する

GET /v1/storybook/episodes/{episodeId}

返された episodeId を使って、processStatussuccess になるまでポーリングします。

curl "https://api.marswave.ai/openapi/v1/storybook/episodes/{episodeId}" \
  -H "Authorization: Bearer $LISTENHUB_API_KEY"
const response = await fetch(
  `https://api.marswave.ai/openapi/v1/storybook/episodes/${episodeId}`,
  { headers: { 'Authorization': `Bearer ${process.env.LISTENHUB_API_KEY}` } }
);
const data = await response.json();
console.log('Status:', data.data.processStatus);
import os, requests

response = requests.get(
    f'https://api.marswave.ai/openapi/v1/storybook/episodes/{episode_id}',
    headers={'Authorization': f'Bearer {os.environ["LISTENHUB_API_KEY"]}'}
)
data = response.json()
print('Status:', data['data']['processStatus'])

レスポンスprocessStatussuccess のとき):

{
  "code": 0,
  "message": "",
  "data": {
    "episodeId": "{episodeId}",
    "createdAt": 1700000000,
    "mode": "slides",
    "processStatus": "success",
    "credits": 30,
    "title": "Q3 Business Review",
    "cover": "https://assets.listenhub.ai/covers/{episodeId}.png",
    "audioUrl": "https://assets.listenhub.ai/storybook/{episodeId}.mp3",
    "audioDuration": 180,
    "videoUrl": "",
    "videoStatus": "not_generated",
    "pages": [
      {
        "text": "Welcome to the Q3 business review. This quarter saw remarkable growth...",
        "pageNumber": 1,
        "imageUrl": "https://assets.listenhub.ai/pages/{episodeId}-1.png",
        "audioTimestamp": 0
      },
      {
        "text": "Revenue grew 45% year-over-year, primarily driven by APAC expansion...",
        "pageNumber": 2,
        "imageUrl": "https://assets.listenhub.ai/pages/{episodeId}-2.png",
        "audioTimestamp": 25.3
      }
    ]
  }
}

スライド + ナレーション原稿pages[] の各要素には imageUrl(スライドのビジュアル)と text(ナレーション原稿、スライド 1 枚あたり約 80–100 語)が含まれます。これらをダウンロードして、独自のプレゼンテーションを組み立てたり、コンテンツを二次利用したりできます。

processStatus

意味
pending処理中
success完了
fail失敗(failCode を確認)

videoStatus

意味
not_generated動画生成がまだトリガーされていない
pending動画を生成中
success動画の準備完了(videoUrl が利用可能)
fail動画の生成に失敗

生成には通常 2–5 分かかります。推奨のポーリング方法:60 秒待ってから、10 秒ごとにポーリングします。


動画を生成する

POST /v1/storybook/episodes/{episodeId}/video

完了したスライドのエピソードについて動画生成をトリガーします。processStatussuccess である必要があります。

このエンドポイントを呼び出す前に、processStatussuccess になるまで待ってください。

curl -X POST "https://api.marswave.ai/openapi/v1/storybook/episodes/{episodeId}/video" \
  -H "Authorization: Bearer $LISTENHUB_API_KEY"
const response = await fetch(
  `https://api.marswave.ai/openapi/v1/storybook/episodes/${episodeId}/video`,
  {
    method: 'POST',
    headers: { 'Authorization': `Bearer ${process.env.LISTENHUB_API_KEY}` },
  }
);
console.log(await response.json());
import os, requests

response = requests.post(
    f'https://api.marswave.ai/openapi/v1/storybook/episodes/{episode_id}/video',
    headers={'Authorization': f'Bearer {os.environ["LISTENHUB_API_KEY"]}'}
)
print(response.json())

レスポンス

{
  "code": 0,
  "message": "",
  "data": {
    "success": true
  }
}

トリガー後は、videoStatussuccess になるまで GET /v1/storybook/episodes/{episodeId} をポーリングします。


完全なワークフロー

スライドのエピソードを作成する

mode: "slides"、コンテンツソース、話者を指定して POST /v1/storybook/episodes を呼び出します。返された episodeId を保存してください。

完了までポーリングする

最初に 60 秒待ってから、processStatussuccess になるまで GET /v1/storybook/episodes/{episodeId} を 10 秒ごとにポーリングします。

スライドと原稿を利用する(任意)

pages[] 配列には、スライドのビジュアル(imageUrl)とナレーション原稿(text)が含まれます。これらをダウンロードすれば、動画を生成せずに独自のプレゼンテーションを組み立てられます。

動画を生成する

POST /v1/storybook/episodes/{episodeId}/video を呼び出して、スライドをナレーション付きの動画に合成します。

動画ステータスをポーリングする

videoStatussuccess になるまでポーリングします。videoUrl フィールドにダウンロードリンクが入ります。

このページの内容