Eyuvaraj commited on
Commit
2266c59
·
1 Parent(s): 2817fcf

heygen api video gen, dynamic clipping

Browse files
app.py CHANGED
@@ -48,8 +48,8 @@ if number:
48
  # print(trim_bounds)
49
  # trim_settings.append(trim_bounds)
50
 
51
- trim_start = st.slider(f"Trim start for {clip}", 0.0, length, 0.10, 0.01, key=f"start_{i}")
52
- trim_end = st.slider(f"Trim end for {clip}", 0.0, length, 0.10, 0.01, key=f"end_{i}")
53
  trim_settings.append((trim_start, trim_end))
54
  print(trim_settings)
55
 
 
48
  # print(trim_bounds)
49
  # trim_settings.append(trim_bounds)
50
 
51
+ trim_start = st.slider(f"Trim start for {clip}", 0.0, length, 0.00, 0.01, key=f"start_{i}")
52
+ trim_end = st.slider(f"Trim end for {clip}", 0.0, length, 0.00, 0.01, key=f"end_{i}")
53
  trim_settings.append((trim_start, trim_end))
54
  print(trim_settings)
55
 
dev.ipynb CHANGED
@@ -205,6 +205,231 @@
205
  "# Trim first 1 second and last 2 seconds\n",
206
  "trimmed_clips = trim_clips(clips, 0.3, 0.3)\n"
207
  ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
208
  }
209
  ],
210
  "metadata": {
 
205
  "# Trim first 1 second and last 2 seconds\n",
206
  "trimmed_clips = trim_clips(clips, 0.3, 0.3)\n"
207
  ]
208
+ },
209
+ {
210
+ "cell_type": "code",
211
+ "execution_count": 6,
212
+ "metadata": {},
213
+ "outputs": [],
214
+ "source": [
215
+ "payload = {\n",
216
+ " \"title\": \"Sample Avatar Video\",\n",
217
+ " \"caption\": False,\n",
218
+ " \"callback_id\": \"your_custom_id_123\",\n",
219
+ " \"dimension\": {\n",
220
+ " \"width\": 1280,\n",
221
+ " \"height\": 720\n",
222
+ " },\n",
223
+ " \"video_inputs\": [\n",
224
+ " {\n",
225
+ " \"character\": {\n",
226
+ " \"type\": \"avatar\",\n",
227
+ " \"avatar_id\": \"Leos_sitting_sofa_front\",\n",
228
+ " \"scale\": 1.0,\n",
229
+ " \"avatar_style\": \"normal\",\n",
230
+ " \"offset\": {\n",
231
+ " \"x\": 0.0,\n",
232
+ " \"y\": 0.0\n",
233
+ " },\n",
234
+ " \"matting\": False\n",
235
+ " },\n",
236
+ " \"voice\": {\n",
237
+ " \"type\": \"audio\",\n",
238
+ " \"audio_url\": \"https://drive.google.com/file/d/1CF8TjWwPWiIPJX3D1bjpMopinHt4iw1D/view?usp=sharing\"\n",
239
+ " },\n",
240
+ " }\n",
241
+ " ],\n",
242
+ " \"callback_url\": \"https://your-callback-url.com\"\n",
243
+ "}"
244
+ ]
245
+ },
246
+ {
247
+ "cell_type": "code",
248
+ "execution_count": 7,
249
+ "metadata": {},
250
+ "outputs": [
251
+ {
252
+ "name": "stdout",
253
+ "output_type": "stream",
254
+ "text": [
255
+ "{\"error\": null, \"data\": {\"video_id\": \"e45ea4bfb773464a9c96187a44263c37\"}}\n"
256
+ ]
257
+ }
258
+ ],
259
+ "source": [
260
+ "import requests\n",
261
+ "\n",
262
+ "url = \"https://api.heygen.com/v2/video/generate\"\n",
263
+ "\n",
264
+ "\n",
265
+ "headers = {\n",
266
+ " \"accept\": \"application/json\",\n",
267
+ " \"content-type\": \"application/json\",\n",
268
+ " \"x-api-key\": \"YTBjYzk5MjI1ZWQzNGViOTgxMTI0NjM2OGQ5NDc2OGEtMTczMzk5MjA5MA==\"\n",
269
+ "}\n",
270
+ "\n",
271
+ "response = requests.post(url, json=payload, headers=headers)\n",
272
+ "\n",
273
+ "print(response.text)\n",
274
+ "\n",
275
+ "\n"
276
+ ]
277
+ },
278
+ {
279
+ "cell_type": "code",
280
+ "execution_count": 26,
281
+ "metadata": {},
282
+ "outputs": [],
283
+ "source": [
284
+ "url = \"https://api.heygen.com/v1/video_status.get\"\n",
285
+ "\n",
286
+ "headers = {\n",
287
+ " \"accept\": \"application/json\",\n",
288
+ " \"x-api-key\": \"YTBjYzk5MjI1ZWQzNGViOTgxMTI0NjM2OGQ5NDc2OGEtMTczMzk5MjA5MA==\"\n",
289
+ "}\n",
290
+ "\n",
291
+ "\n",
292
+ "response = requests.get(url, headers=headers, params={\"video_id\": \"e45ea4bfb773464a9c96187a44263c37\"}).json()"
293
+ ]
294
+ },
295
+ {
296
+ "cell_type": "code",
297
+ "execution_count": 29,
298
+ "metadata": {},
299
+ "outputs": [
300
+ {
301
+ "data": {
302
+ "text/plain": [
303
+ "{'code': 100,\n",
304
+ " 'data': {'callback_id': 'your_custom_id_123',\n",
305
+ " 'caption_url': '',\n",
306
+ " 'created_at': 1736190876,\n",
307
+ " 'duration': 23.458,\n",
308
+ " 'error': None,\n",
309
+ " 'gif_url': 'https://resource2.heygen.ai/video/gifs/e45ea4bfb773464a9c96187a44263c37.gif',\n",
310
+ " 'id': 'e45ea4bfb773464a9c96187a44263c37',\n",
311
+ " 'status': 'completed',\n",
312
+ " 'thumbnail_url': 'https://files2.heygen.ai/aws_pacific/avatar_tmp/a0cc99225ed34eb9811246368d94768a/e45ea4bfb773464a9c96187a44263c37.jpeg?Expires=1736796787&Signature=hx6utjHJZT2FzxXurir~891Yn5-zU86rmDiFVC-cUPTaZ0bCSEvEkpeZQHFQwuZ2gJncl3g7ggg7~egIi1VlW3tWewJGPQUVqcEgFSGngCLOcUs5hYAozAWYqR1ivGvjnQLjxjrwH5eWHxs4uV1g~vQ7v64Sd3plwvJWc0AsOVYKpNpE4lbdpdogrBoRF-~3w0aegYdpCexyIInFWv1VRUDc3xd7OW~hLEEhK6FMXb~3NMk~590IfLne3aztcwQRzc8gVx~PySOrJGFs18FXzGgBCP9aMt0dNW7xxFJIfL9O2aB06AVBrB2kPmrRM0Q~1faXHUFehqHn1P8PA~19NA__&Key-Pair-Id=K38HBHX5LX3X2H',\n",
313
+ " 'video_url': 'https://files2.heygen.ai/aws_pacific/avatar_tmp/a0cc99225ed34eb9811246368d94768a/e45ea4bfb773464a9c96187a44263c37.mp4?Expires=1736795934&Signature=KIzp-KtTCs1Ida7IB2GKgqikgTISq1W0yFZK04cP54z6rUlCrM7882UYrhzJxOjZAZoRDFPKZ07c-eKvGhlk1AKeyKr05Vu7338xfPZRUTKd43cpDi4QS9uyfELcu0UctjoAZwtwwJl7vANFZKCekElbUnWfruYW~k6PMrhtjkb9kWwvdlAFoBgu3agRsqVha9O8fTdwaKYyv1UUUS0TIdWwsa6sLM5ssB917ifUOXc25bPLFwoFp3i1ZotIDldeLpq2dPUPHOH-1ApXwuclGLyUIf-M9VILmit35yl3g-cAtw3cvT-1pJiiJLmLofksELpMsBKDpJDSkVq6jCyxFg__&Key-Pair-Id=K38HBHX5LX3X2H',\n",
314
+ " 'video_url_caption': None},\n",
315
+ " 'message': 'Success'}"
316
+ ]
317
+ },
318
+ "execution_count": 29,
319
+ "metadata": {},
320
+ "output_type": "execute_result"
321
+ }
322
+ ],
323
+ "source": [
324
+ "response"
325
+ ]
326
+ },
327
+ {
328
+ "cell_type": "code",
329
+ "execution_count": 33,
330
+ "metadata": {},
331
+ "outputs": [
332
+ {
333
+ "data": {
334
+ "text/plain": [
335
+ "100"
336
+ ]
337
+ },
338
+ "execution_count": 33,
339
+ "metadata": {},
340
+ "output_type": "execute_result"
341
+ }
342
+ ],
343
+ "source": [
344
+ "response[\"code\"]"
345
+ ]
346
+ },
347
+ {
348
+ "cell_type": "code",
349
+ "execution_count": 34,
350
+ "metadata": {},
351
+ "outputs": [],
352
+ "source": [
353
+ "video_url = response.get(\"data\").get(\"video_url\")"
354
+ ]
355
+ },
356
+ {
357
+ "cell_type": "code",
358
+ "execution_count": 36,
359
+ "metadata": {},
360
+ "outputs": [],
361
+ "source": [
362
+ "downloaded_video = requests.get(video_url)\n",
363
+ "\n",
364
+ "# save the video to a file\n",
365
+ "with open(\"UPIBOT.mp4\", \"wb\") as f:\n",
366
+ " f.write(downloaded_video.content)\n"
367
+ ]
368
+ },
369
+ {
370
+ "cell_type": "code",
371
+ "execution_count": null,
372
+ "metadata": {},
373
+ "outputs": [],
374
+ "source": [
375
+ "\n",
376
+ "import json\n",
377
+ "from moviepy.editor import VideoFileClip\n",
378
+ "\n",
379
+ "# Load the clips metadata\n",
380
+ "with open(\"clips_metadata.json\", \"r\") as f:\n",
381
+ " clips_metadata = json.load(f)\n",
382
+ "\n",
383
+ "# Load the downloaded video\n",
384
+ "video = VideoFileClip(\"UPIBOT.mp4\")\n",
385
+ "\n",
386
+ "\n",
387
+ "# use that video to generate short clips from using timestamps mentioned in clips_metadata\n",
388
+ "clips = []\n",
389
+ "for clip_data in clips_metadata:\n",
390
+ " start_time = clip_data[\"start_time_ms\"]\n",
391
+ " end_time = clip_data[\"end_time_ms\"]\n",
392
+ "\n",
393
+ " # convert milliseconds to seconds\n",
394
+ " start_time /= 1000\n",
395
+ " end_time /= 1000\n",
396
+ "\n",
397
+ " try:\n",
398
+ " clip_name = clip_data[\"file_name\"].split(\".\")[0]+\".mp4\"\n",
399
+ " clip = video.subclip(start_time, end_time)\n",
400
+ " clips.append(clip)\n",
401
+ " except Exception as e:\n",
402
+ " print(f\"Error in clip {clip_name}: {e}\")\n",
403
+ "\n",
404
+ "# save the clips to a dir\n",
405
+ "\n",
406
+ "import os\n",
407
+ "clips_dir = \"clips\"\n",
408
+ "os.makedirs(clips_dir, exist_ok=True)\n",
409
+ "\n",
410
+ "for i, clip in enumerate(clips):\n",
411
+ " clip_path = os.path.join(clips_dir, clips_metadata[i][\"file_name\"].split(\".\")[0]+\".mp4\")\n",
412
+ " clip.write_videofile(clip_path, codec=\"libx264\", audio_codec=\"aac\")"
413
+ ]
414
+ },
415
+ {
416
+ "cell_type": "code",
417
+ "execution_count": null,
418
+ "metadata": {},
419
+ "outputs": [],
420
+ "source": [
421
+ "import json\n",
422
+ "with open(\"clips_metadata.json\", \"r\") as f:\n",
423
+ " clips_metadata = json.load(f)\n",
424
+ "\n",
425
+ "for item in clips_metadata:\n",
426
+ " item[\"start_time_ms\"]=item[\"start_time_ms\"]-40\n",
427
+ " item[\"end_time_ms\"]=item[\"end_time_ms\"]+40\n",
428
+ "\n",
429
+ "# update the file with new timestamps\n",
430
+ "with open(\"clips_metadata.json\", \"w\") as f:\n",
431
+ " json.dump(clips_metadata, f, indent=4)"
432
+ ]
433
  }
434
  ],
435
  "metadata": {
output.mp4 CHANGED
Binary files a/output.mp4 and b/output.mp4 differ
 
trimmed_clips/0_cut.mp4 DELETED
Binary file (164 kB)
 
trimmed_clips/100000_cut.mp4 CHANGED
Binary files a/trimmed_clips/100000_cut.mp4 and b/trimmed_clips/100000_cut.mp4 differ
 
trimmed_clips/1000_cut.mp4 CHANGED
Binary files a/trimmed_clips/1000_cut.mp4 and b/trimmed_clips/1000_cut.mp4 differ
 
trimmed_clips/100_cut.mp4 CHANGED
Binary files a/trimmed_clips/100_cut.mp4 and b/trimmed_clips/100_cut.mp4 differ
 
trimmed_clips/10_cut.mp4 CHANGED
Binary files a/trimmed_clips/10_cut.mp4 and b/trimmed_clips/10_cut.mp4 differ
 
trimmed_clips/11_cut.mp4 CHANGED
Binary files a/trimmed_clips/11_cut.mp4 and b/trimmed_clips/11_cut.mp4 differ
 
trimmed_clips/12_cut.mp4 CHANGED
Binary files a/trimmed_clips/12_cut.mp4 and b/trimmed_clips/12_cut.mp4 differ
 
trimmed_clips/13_cut.mp4 CHANGED
Binary files a/trimmed_clips/13_cut.mp4 and b/trimmed_clips/13_cut.mp4 differ
 
trimmed_clips/14_cut.mp4 CHANGED
Binary files a/trimmed_clips/14_cut.mp4 and b/trimmed_clips/14_cut.mp4 differ
 
trimmed_clips/15_cut.mp4 CHANGED
Binary files a/trimmed_clips/15_cut.mp4 and b/trimmed_clips/15_cut.mp4 differ
 
trimmed_clips/16_cut.mp4 CHANGED
Binary files a/trimmed_clips/16_cut.mp4 and b/trimmed_clips/16_cut.mp4 differ
 
trimmed_clips/17_cut.mp4 CHANGED
Binary files a/trimmed_clips/17_cut.mp4 and b/trimmed_clips/17_cut.mp4 differ
 
trimmed_clips/18_cut.mp4 CHANGED
Binary files a/trimmed_clips/18_cut.mp4 and b/trimmed_clips/18_cut.mp4 differ
 
trimmed_clips/19_cut.mp4 CHANGED
Binary files a/trimmed_clips/19_cut.mp4 and b/trimmed_clips/19_cut.mp4 differ
 
trimmed_clips/1_cut.mp4 CHANGED
Binary files a/trimmed_clips/1_cut.mp4 and b/trimmed_clips/1_cut.mp4 differ
 
trimmed_clips/20_cut.mp4 CHANGED
Binary files a/trimmed_clips/20_cut.mp4 and b/trimmed_clips/20_cut.mp4 differ
 
trimmed_clips/2_cut.mp4 CHANGED
Binary files a/trimmed_clips/2_cut.mp4 and b/trimmed_clips/2_cut.mp4 differ
 
trimmed_clips/30_cut.mp4 CHANGED
Binary files a/trimmed_clips/30_cut.mp4 and b/trimmed_clips/30_cut.mp4 differ
 
trimmed_clips/3_cut.mp4 CHANGED
Binary files a/trimmed_clips/3_cut.mp4 and b/trimmed_clips/3_cut.mp4 differ
 
trimmed_clips/40_cut.mp4 CHANGED
Binary files a/trimmed_clips/40_cut.mp4 and b/trimmed_clips/40_cut.mp4 differ
 
trimmed_clips/4_cut.mp4 CHANGED
Binary files a/trimmed_clips/4_cut.mp4 and b/trimmed_clips/4_cut.mp4 differ
 
trimmed_clips/50_cut.mp4 CHANGED
Binary files a/trimmed_clips/50_cut.mp4 and b/trimmed_clips/50_cut.mp4 differ
 
trimmed_clips/5_cut.mp4 CHANGED
Binary files a/trimmed_clips/5_cut.mp4 and b/trimmed_clips/5_cut.mp4 differ
 
trimmed_clips/60_cut.mp4 CHANGED
Binary files a/trimmed_clips/60_cut.mp4 and b/trimmed_clips/60_cut.mp4 differ
 
trimmed_clips/6_cut.mp4 CHANGED
Binary files a/trimmed_clips/6_cut.mp4 and b/trimmed_clips/6_cut.mp4 differ
 
trimmed_clips/70_cut.mp4 CHANGED
Binary files a/trimmed_clips/70_cut.mp4 and b/trimmed_clips/70_cut.mp4 differ
 
trimmed_clips/7_cut.mp4 CHANGED
Binary files a/trimmed_clips/7_cut.mp4 and b/trimmed_clips/7_cut.mp4 differ
 
trimmed_clips/80_cut.mp4 CHANGED
Binary files a/trimmed_clips/80_cut.mp4 and b/trimmed_clips/80_cut.mp4 differ
 
trimmed_clips/8_cut.mp4 CHANGED
Binary files a/trimmed_clips/8_cut.mp4 and b/trimmed_clips/8_cut.mp4 differ
 
trimmed_clips/90_cut.mp4 CHANGED
Binary files a/trimmed_clips/90_cut.mp4 and b/trimmed_clips/90_cut.mp4 differ
 
trimmed_clips/9_cut.mp4 CHANGED
Binary files a/trimmed_clips/9_cut.mp4 and b/trimmed_clips/9_cut.mp4 differ
 
trimmed_clips/Conclusion_cut.mp4 CHANGED
Binary files a/trimmed_clips/Conclusion_cut.mp4 and b/trimmed_clips/Conclusion_cut.mp4 differ
 
trimmed_clips/Intro_cut.mp4 CHANGED
Binary files a/trimmed_clips/Intro_cut.mp4 and b/trimmed_clips/Intro_cut.mp4 differ
 
utils.py CHANGED
@@ -128,7 +128,7 @@ def create_advanced_video(number, trim_settings, output_file="output.mp4"):
128
  print(f"Error loading clip {clip_path}: {e}")
129
 
130
  clips_to_combine.extend(video_clips)
131
- # clips_to_combine.append(VideoFileClip(conclusion_file))
132
 
133
  if video_clips:
134
  final_video = concatenate_videoclips(clips_to_combine)
 
128
  print(f"Error loading clip {clip_path}: {e}")
129
 
130
  clips_to_combine.extend(video_clips)
131
+ clips_to_combine.append(VideoFileClip(conclusion_file))
132
 
133
  if video_clips:
134
  final_video = concatenate_videoclips(clips_to_combine)