スライド
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}"
}
}リクエストパラメータ
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
| sources | array(1) | はい | コンテンツソース。最大 1 件。 |
| sources[].type | string | はい | "text" または "url" |
| sources[].content | string | はい | テキストコンテンツまたは URL |
| sources[].uri | string | いいえ | ソースの URI |
| sources[].metadata | object | いいえ | ソースのメタデータ |
| speakers | array(1) | はい | 音声設定。最大 1 件。 |
| speakers[].speakerId | string | はい | 話者 ID(話者一覧 を参照) |
| language | string | いいえ | 言語コード(例:"en"、"zh") |
| mode | string | はい | "slides" を指定します |
| style | string | いいえ | ビジュアルスタイル ID |
エピソードのステータスを照会する
GET /v1/storybook/episodes/{episodeId}
返された episodeId を使って、processStatus が success になるまでポーリングします。
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'])レスポンス(processStatus が success のとき):
{
"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
完了したスライドのエピソードについて動画生成をトリガーします。processStatus は success である必要があります。
このエンドポイントを呼び出す前に、processStatus が success になるまで待ってください。
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
}
}トリガー後は、videoStatus が success になるまで GET /v1/storybook/episodes/{episodeId} をポーリングします。
完全なワークフロー
スライドのエピソードを作成する
mode: "slides"、コンテンツソース、話者を指定して POST /v1/storybook/episodes を呼び出します。返された episodeId を保存してください。
完了までポーリングする
最初に 60 秒待ってから、processStatus が success になるまで GET /v1/storybook/episodes/{episodeId} を 10 秒ごとにポーリングします。
スライドと原稿を利用する(任意)
pages[] 配列には、スライドのビジュアル(imageUrl)とナレーション原稿(text)が含まれます。これらをダウンロードすれば、動画を生成せずに独自のプレゼンテーションを組み立てられます。
動画を生成する
POST /v1/storybook/episodes/{episodeId}/video を呼び出して、スライドをナレーション付きの動画に合成します。
動画ステータスをポーリングする
videoStatus が success になるまでポーリングします。videoUrl フィールドにダウンロードリンクが入ります。