슬라이드
AI 비주얼과 내레이션 스크립트가 포함된 프레젠테이션 슬라이드를 생성해 회의와 보고에 바로 활용합니다.
슬라이드(Slides) 모드는 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를 저장하세요.
완료까지 폴링
processStatus가 success가 될 때까지 GET /v1/storybook/episodes/{episodeId}를 10초마다 폴링합니다(최초 60초 대기 후).
슬라이드 + 스크립트 활용(선택)
pages[] 배열에는 슬라이드 비주얼(imageUrl)과 내레이션 스크립트(text)가 들어 있습니다. 영상을 생성하지 않고도 이를 다운로드해 자체 프레젠테이션을 구성할 수 있습니다.
영상 생성
POST /v1/storybook/episodes/{episodeId}/video를 호출해 슬라이드를 내레이션이 포함된 영상으로 합성합니다.
영상 상태 폴링
videoStatus가 success가 될 때까지 폴링합니다. videoUrl 필드에 다운로드 링크가 들어 있습니다.