Spaces:
Paused
Paused
Upload app.py
Browse files
app.py
CHANGED
|
@@ -747,16 +747,22 @@ def create_video_with_audio_from_slides_v2(
|
|
| 747 |
video_clip = img_clip.set_audio(audio_clip)
|
| 748 |
clips.append(video_clip)
|
| 749 |
|
| 750 |
-
logger.info(f"スライド {idx+1}: 音声{audio_duration:.2f}秒
|
| 751 |
|
| 752 |
if not clips:
|
| 753 |
raise Exception("動画クリップが生成されませんでした")
|
| 754 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 755 |
if progress_callback:
|
| 756 |
progress_callback(0.7, desc="動画を結合中...")
|
| 757 |
|
| 758 |
# 4. 全クリップを連結
|
|
|
|
| 759 |
final_video = concatenate_videoclips(clips, method="compose")
|
|
|
|
| 760 |
|
| 761 |
# 一時動画ファイルに出力
|
| 762 |
with tempfile.NamedTemporaryFile(suffix=".mp4", delete=False) as tmp_video:
|
|
@@ -766,6 +772,7 @@ def create_video_with_audio_from_slides_v2(
|
|
| 766 |
progress_callback(0.8, desc="動画をエンコード中...")
|
| 767 |
|
| 768 |
# 5. 動画エンコード
|
|
|
|
| 769 |
final_video.write_videofile(
|
| 770 |
video_path,
|
| 771 |
fps=30,
|
|
@@ -773,27 +780,34 @@ def create_video_with_audio_from_slides_v2(
|
|
| 773 |
audio_codec='aac',
|
| 774 |
logger=None # moviepyのログを抑制
|
| 775 |
)
|
|
|
|
| 776 |
|
| 777 |
# クリップをクローズ
|
| 778 |
final_video.close()
|
| 779 |
for clip in clips:
|
| 780 |
clip.close()
|
|
|
|
| 781 |
|
| 782 |
if progress_callback:
|
| 783 |
progress_callback(0.9, desc="動画をアップロード中...")
|
| 784 |
|
| 785 |
# 6. HFアップロード
|
|
|
|
|
|
|
| 786 |
video_url = video_uploader.upload_video(video_path, prefix="slidedata_video_v2")
|
|
|
|
| 787 |
|
| 788 |
# 7. 2ページ目画像アップロード
|
| 789 |
page2_image_url = None
|
| 790 |
if len(images) >= 2:
|
|
|
|
| 791 |
page2_image = images[1]
|
| 792 |
with tempfile.NamedTemporaryFile(suffix=".jpg", delete=False) as tmp_img:
|
| 793 |
page2_image_path = tmp_img.name
|
| 794 |
page2_image.save(page2_image_path, format='JPEG', quality=90)
|
| 795 |
|
| 796 |
page2_image_url = video_uploader.upload_image(page2_image_path, prefix="slidedata_page2")
|
|
|
|
| 797 |
|
| 798 |
# 一時ファイル削除
|
| 799 |
if os.path.exists(page2_image_path):
|
|
|
|
| 747 |
video_clip = img_clip.set_audio(audio_clip)
|
| 748 |
clips.append(video_clip)
|
| 749 |
|
| 750 |
+
logger.info(f"✅ スライド {idx+1}/{total_slides}: クリップ作成完了(音声{audio_duration:.2f}秒 + 余白0.6秒 = {slide_duration:.2f}秒)")
|
| 751 |
|
| 752 |
if not clips:
|
| 753 |
raise Exception("動画クリップが生成されませんでした")
|
| 754 |
|
| 755 |
+
# 総動画時間計算
|
| 756 |
+
total_video_duration = sum([clip.duration for clip in clips])
|
| 757 |
+
logger.info(f"📹 全{len(clips)}クリップ作成完了(総再生時間: {total_video_duration:.2f}秒)")
|
| 758 |
+
|
| 759 |
if progress_callback:
|
| 760 |
progress_callback(0.7, desc="動画を結合中...")
|
| 761 |
|
| 762 |
# 4. 全クリップを連結
|
| 763 |
+
logger.info(f"🔗 動画結合開始: {len(clips)}個のクリップを連結中...")
|
| 764 |
final_video = concatenate_videoclips(clips, method="compose")
|
| 765 |
+
logger.info(f"✅ 動画結合完了")
|
| 766 |
|
| 767 |
# 一時動画ファイルに出力
|
| 768 |
with tempfile.NamedTemporaryFile(suffix=".mp4", delete=False) as tmp_video:
|
|
|
|
| 772 |
progress_callback(0.8, desc="動画をエンコード中...")
|
| 773 |
|
| 774 |
# 5. 動画エンコード
|
| 775 |
+
logger.info(f"🎬 動画エンコード開始: {total_video_duration:.2f}秒の動画をH.264/AACでエンコード中...")
|
| 776 |
final_video.write_videofile(
|
| 777 |
video_path,
|
| 778 |
fps=30,
|
|
|
|
| 780 |
audio_codec='aac',
|
| 781 |
logger=None # moviepyのログを抑制
|
| 782 |
)
|
| 783 |
+
logger.info(f"✅ 動画エンコード完了: {video_path}")
|
| 784 |
|
| 785 |
# クリップをクローズ
|
| 786 |
final_video.close()
|
| 787 |
for clip in clips:
|
| 788 |
clip.close()
|
| 789 |
+
logger.info(f"🧹 メモリ解放完了({len(clips)}クリップクローズ)")
|
| 790 |
|
| 791 |
if progress_callback:
|
| 792 |
progress_callback(0.9, desc="動画をアップロード中...")
|
| 793 |
|
| 794 |
# 6. HFアップロード
|
| 795 |
+
video_file_size = os.path.getsize(video_path) / (1024 * 1024) # MB
|
| 796 |
+
logger.info(f"☁️ 動画アップロード開始: {video_file_size:.2f}MB → Hugging Face Dataset...")
|
| 797 |
video_url = video_uploader.upload_video(video_path, prefix="slidedata_video_v2")
|
| 798 |
+
logger.info(f"✅ 動画アップロード完了: {video_url}")
|
| 799 |
|
| 800 |
# 7. 2ページ目画像アップロード
|
| 801 |
page2_image_url = None
|
| 802 |
if len(images) >= 2:
|
| 803 |
+
logger.info(f"🖼️ 2ページ目画像アップロード開始...")
|
| 804 |
page2_image = images[1]
|
| 805 |
with tempfile.NamedTemporaryFile(suffix=".jpg", delete=False) as tmp_img:
|
| 806 |
page2_image_path = tmp_img.name
|
| 807 |
page2_image.save(page2_image_path, format='JPEG', quality=90)
|
| 808 |
|
| 809 |
page2_image_url = video_uploader.upload_image(page2_image_path, prefix="slidedata_page2")
|
| 810 |
+
logger.info(f"✅ 2ページ目画像アップロード完了: {page2_image_url}")
|
| 811 |
|
| 812 |
# 一時ファイル削除
|
| 813 |
if os.path.exists(page2_image_path):
|