Я сталкиваюсь с проблемой в FFMPEG при запуска приведенного ниже кода
Я работаю над приложением колбы, которое генерирует видео, комбинируя последовательность изображений из папки и синтезированную звуковую дорожку с использованием коры (Suno /Bark-Small). Идея состоит в том, чтобы использовать FFMPEG для сшивания изображений в видео, применять накладку и масштабирование, а затем объединить его с помощью сгенерированного звука. Я запускаю конечную точку /генерировать видео с простым запросом на пост, передавая сценарий, который преобразуется в аудио. В то время как изображение и обработка аудио работают, как и ожидалось, FFMPEG не работает во время выполнения, а сервер возвращает ошибку 500. Я добавил регистрацию ошибок, чтобы захватить выход FFMPEG STDERR, который предполагает, что что -то идет не так либо с генерируемым файлом input.txt, либо с форматом входов, передаваемых FFMPEG. Я не уверен, связана ли проблема с путями файлов, форматированием Concat Demuxer или, возможно, несоответствием длительности аудио/видео. Любое понимание того, как отладить или исправить команду FFMPEG, будет оценено.curl -X POST http://localhost:5000/generate-video \
-H "Content-Type: application/json" \
-d '{"script": "Hello, this is a test script to generate a video."}' \
--output output_video.mp4
< /code>
import os
import uuid
import subprocess
from pathlib import Path
import numpy as np
from flask import Flask, request, jsonify, send_file
from transformers import AutoProcessor, AutoModelForTextToWaveform
from scipy.io.wavfile import write as write_wav
import torch
# ========== CONFIG ==========
IMAGE_FOLDER = "./images"
OUTPUT_FOLDER = "./output"
RESOLUTION = (1280, 720)
IMAGE_DURATION = 3 # seconds per image
SAMPLE_RATE = 24000
app = Flask(__name__)
os.makedirs(OUTPUT_FOLDER, exist_ok=True)
# Load Bark-small model and processor
device = "cuda" if torch.cuda.is_available() else "cpu"
processor = AutoProcessor.from_pretrained("suno/bark-small")
model = AutoModelForTextToWaveform.from_pretrained("suno/bark-small").to(device)
# ========== UTILS ==========
def run_ffmpeg(cmd):
result = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
if result.returncode != 0:
print("[FFmpeg ERROR]\n", result.stderr.decode())
raise RuntimeError("FFmpeg failed.")
else:
print("[FFmpeg] Success.")
def find_images(folder):
return sorted([
f for f in Path(folder).glob("*")
if f.suffix.lower() in {".jpg", ".jpeg", ".png"}
])
def create_ffmpeg_input_list(images, list_file_path):
with open(list_file_path, "w") as f:
for img in images:
f.write(f"file '{img.resolve()}'\n")
f.write(f"duration {IMAGE_DURATION}\n")
# Repeat last image to avoid cutoff
f.write(f"file '{images[-1].resolve()}'\n")
# ========== FLASK ROUTE ==========
@app.route('/generate-video', methods=['POST'])
def generate_video():
data = request.get_json()
script = data.get("script")
if not script:
return jsonify({"error": "No script provided"}), 400
images = find_images(IMAGE_FOLDER)
if not images:
return jsonify({"error": "No images found in ./images"}), 400
# Generate audio
print("[1/3] Generating audio with Bark...")
inputs = processor(script, return_tensors="pt").to(device)
with torch.no_grad():
audio_values = model.generate(**inputs)
audio_np = audio_values[0].cpu().numpy().squeeze()
audio_np = np.clip(audio_np, -1.0, 1.0)
audio_int16 = (audio_np * 32767).astype(np.int16)
audio_path = os.path.join(OUTPUT_FOLDER, f"{uuid.uuid4()}.wav")
write_wav(audio_path, SAMPLE_RATE, audio_int16)
# Create FFmpeg concat file
print("[2/3] Preparing image list for FFmpeg...")
list_file = os.path.join(OUTPUT_FOLDER, "input.txt")
create_ffmpeg_input_list(images, list_file)
# Final video path
final_video_path = os.path.join(OUTPUT_FOLDER, f"{uuid.uuid4()}.mp4")
# Run FFmpeg
print("[3/3] Running FFmpeg to create video...")
ffmpeg_cmd = [
"ffmpeg", "-y",
"-f", "concat", "-safe", "0", "-i", list_file,
"-i", audio_path,
"-vf", f"scale={RESOLUTION[0]}:{RESOLUTION[1]}:force_original_aspect_ratio=decrease,"
f"pad={RESOLUTION[0]}:{RESOLUTION[1]}:(ow-iw)/2:(oh-ih)/2:color=black",
"-c:v", "libx264", "-pix_fmt", "yuv420p",
"-c:a", "aac", "-b:a", "192k",
"-shortest", "-movflags", "+faststart",
final_video_path
]
try:
run_ffmpeg(ffmpeg_cmd)
except RuntimeError:
return jsonify({"error": "FFmpeg failed. Check server logs."}), 500
return send_file(final_video_path, as_attachment=True)
# ========== RUN APP ==========
if __name__ == '__main__':
app.run(debug=True)
Подробнее здесь: https://stackoverflow.com/questions/796 ... -images-fo
Генерация видео с моделью SUNO/BARK и FFMPEG с изображениями, хранящимися в папке изображений ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение