ListenHubOpenAPI
API 레퍼런스

슬라이드

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}"
  }
}

요청 파라미터

파라미터타입필수설명
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}

반환된 episodeIdprocessStatussuccess가 될 때까지 폴링합니다.

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를 저장하세요.

완료까지 폴링

processStatussuccess가 될 때까지 GET /v1/storybook/episodes/{episodeId}를 10초마다 폴링합니다(최초 60초 대기 후).

슬라이드 + 스크립트 활용(선택)

pages[] 배열에는 슬라이드 비주얼(imageUrl)과 내레이션 스크립트(text)가 들어 있습니다. 영상을 생성하지 않고도 이를 다운로드해 자체 프레젠테이션을 구성할 수 있습니다.

영상 생성

POST /v1/storybook/episodes/{episodeId}/video를 호출해 슬라이드를 내레이션이 포함된 영상으로 합성합니다.

영상 상태 폴링

videoStatussuccess가 될 때까지 폴링합니다. videoUrl 필드에 다운로드 링크가 들어 있습니다.

이 페이지의 내용