|
41 | 41 | ) |
42 | 42 |
|
43 | 43 |
|
44 | | -async def generate(prompt, first_frame_image=None, last_frame_image=None): |
| 44 | +async def generate( |
| 45 | + prompt, first_frame_image=None, last_frame_image=None, generate_audio=None |
| 46 | +): |
45 | 47 | try: |
| 48 | + if generate_audio is False: |
| 49 | + generate_audio = None |
| 50 | + model_name = getenv("MODEL_VIDEO_NAME", DEFAULT_VIDEO_MODEL_NAME) |
| 51 | + |
| 52 | + if model_name.startswith("doubao-seedance-1-0") and generate_audio: |
| 53 | + logger.warning( |
| 54 | + "The `doubao-seedance-1-0` series models do not support enabling the audio field. " |
| 55 | + "Please upgrade to the `doubao-seedance-1-5` series." |
| 56 | + ) |
| 57 | + generate_audio = None |
46 | 58 | if first_frame_image is None: |
47 | 59 | response = client.content_generation.tasks.create( |
48 | 60 | model=getenv("MODEL_VIDEO_NAME", DEFAULT_VIDEO_MODEL_NAME), |
49 | 61 | content=[ |
50 | 62 | {"type": "text", "text": prompt}, |
51 | 63 | ], |
| 64 | + generate_audio=generate_audio, |
52 | 65 | extra_headers={ |
53 | 66 | "veadk-source": "veadk", |
54 | 67 | "veadk-version": VERSION, |
@@ -148,6 +161,12 @@ async def video_generate( |
148 | 161 | URL or Base64 string (data URL) for the **last frame** (role = `last_frame`). |
149 | 162 | Use when you want the clip to end on a specific image. |
150 | 163 |
|
| 164 | + - generate_audio (bool | None): |
| 165 | + Boolean value, used to determine whether the generated video should have sound. |
| 166 | + If this field is not configured (None) or its value is `False`, no sound will be generated. |
| 167 | + If it is configured as `True`, sound can be generated. |
| 168 | + If you want to describe the sound content in detail, you can do so in the `prompt` field. |
| 169 | +
|
151 | 170 | Notes on first/last frame: |
152 | 171 | * When both frames are provided, **match width/height** to avoid cropping; if they differ, |
153 | 172 | the tail frame may be auto-cropped to fit. |
@@ -243,22 +262,32 @@ async def video_generate( |
243 | 262 | prompt = item["prompt"] |
244 | 263 | first_frame = item.get("first_frame", None) |
245 | 264 | last_frame = item.get("last_frame", None) |
| 265 | + generate_audio = item.get("generate_audio", None) |
246 | 266 | try: |
247 | 267 | if not first_frame: |
248 | 268 | logger.debug( |
249 | 269 | f"video_generate task_{idx} text generation: prompt={prompt}" |
250 | 270 | ) |
251 | | - response = await generate(prompt) |
| 271 | + response = await generate(prompt, generate_audio=generate_audio) |
252 | 272 | elif not last_frame: |
253 | 273 | logger.debug( |
254 | 274 | f"video_generate task_{idx} first frame generation: prompt={prompt}, first_frame={first_frame}" |
255 | 275 | ) |
256 | | - response = await generate(prompt, first_frame) |
| 276 | + response = await generate( |
| 277 | + prompt, |
| 278 | + first_frame_image=first_frame, |
| 279 | + generate_audio=generate_audio, |
| 280 | + ) |
257 | 281 | else: |
258 | 282 | logger.debug( |
259 | 283 | f"video_generate task_{idx} first and last frame generation: prompt={prompt}, first_frame={first_frame}, last_frame={last_frame}" |
260 | 284 | ) |
261 | | - response = await generate(prompt, first_frame, last_frame) |
| 285 | + response = await generate( |
| 286 | + prompt, |
| 287 | + first_frame_image=first_frame, |
| 288 | + last_frame_image=last_frame, |
| 289 | + generate_audio=generate_audio, |
| 290 | + ) |
262 | 291 | logger.debug( |
263 | 292 | f"batch_{start_idx // batch_size} video_generate task_{idx} response: {response}" |
264 | 293 | ) |
|
0 commit comments