这种切玻璃水果的视频,你一定看过:

这就是利用 google 最新视频大模型 veo 3 生成的。像这一类的 ASMR 视频,小红书、抖音、视频号全都在疯传,随便一条都是几千上万的点赞量! 由于AI生成的视频有一定的随机性,作为程序员,我们肯定不可能手动点击生成,所以用python批量生成,然后从中筛选是效率最高的方法。

准备工作

  1. 注册 Defapi 账号,并获得API密钥
  2. 安装必要的Python库
pip install requests

核心代码实现

1. 基础配置和工具函数

import requests
import time
import json
import random

class VeoVideoGenerator:
    def __init__(self, api_key):
        self.api_key = api_key
        self.base_url = "https://api.defapi.org"
        self.headers = {
            "Authorization": f"Bearer {api_key}",
            "Content-Type": "application/json"
        }

    def generate_video(self, prompt, image_url=""):
        """生成视频任务"""
        url = f"{self.base_url}/api/google/veo/generate"
        payload = {
            "model": "google/veo3-fast",
            "prompt": prompt,
            "image": image_url
        }

        response = requests.post(url, headers=self.headers, json=payload)
        return response.json()

    def query_task(self, task_id):
        """查询任务状态"""
        url = f"{self.base_url}/api/task/query"
        params = {"task_id": task_id}

        response = requests.get(url, headers=self.headers, params=params)
        return response.json()

    def wait_for_completion(self, task_id, max_wait_time=300):
        """等待任务完成"""
        start_time = time.time()

        while time.time() - start_time < max_wait_time:
            result = self.query_task(task_id)

            if result["code"] == 0:
                status = result["data"]["status"]
                print(f"任务 {task_id} 状态: {status}")

                if status == "success":
                    return result["data"]["result"]["video_url"]
                elif status == "failed":
                    print(f"任务失败: {result['data']['status_reason']['message']}")
                    return None

            time.sleep(10)  # 每10秒检查一次

        print("任务超时")
        return None

2. ASMR切水果提示词生成器

class ASMRFruitPrompts:
    def __init__(self):
        # 水果类型
        self.fruits = [
            "苹果", "橙子", "柠檬", "西瓜", "哈密瓜", "猕猴桃",
            "草莓", "蓝莓", "葡萄", "梨子", "桃子", "芒果"
        ]

        # 切割动作描述
        self.cutting_actions = [
            "缓慢地切片", "轻柔地切块", "精细地切丁", "小心地对半切开",
            "优雅地切成薄片", "温柔地切成小块", "仔细地去皮切片"
        ]

        # 环境和氛围
        self.environments = [
            "在安静的厨房里", "在温馨的家中", "在明亮的料理台上",
            "在自然光线下", "在整洁的操作台上", "在舒适的环境中"
        ]

        # 视觉效果
        self.visual_effects = [
            "水果汁液缓慢滴落", "果肉纹理清晰可见", "切面光滑平整",
            "颜色鲜艳诱人", "质感丰富细腻", "画面清新自然"
        ]

        # ASMR特定描述
        self.asmr_elements = [
            "发出清脆的切割声", "产生令人放松的声音", "创造舒缓的氛围",
            "声音清晰悦耳", "节奏缓慢平稳", "动作轻柔优雅"
        ]

    def generate_prompt(self):
        """生成随机的ASMR切水果提示词"""
        fruit = random.choice(self.fruits)
        action = random.choice(self.cutting_actions)
        environment = random.choice(self.environments)
        visual = random.choice(self.visual_effects)
        asmr = random.choice(self.asmr_elements)

        prompt = f"""
        ASMR视频:{environment},一双手正在{action}{fruit},{asmr}。
        画面特点:{visual},镜头聚焦在切割过程,
        整体氛围宁静舒缓,适合放松和冥想。
        高清画质,柔和光线,专业ASMR视频风格。
        """.strip().replace('\n        ', ' ')

        return prompt, fruit

3. 批量生成主程序

def batch_generate_asmr_videos(api_key, video_count=5):
    """批量生成ASMR切水果视频"""

    generator = VeoVideoGenerator(api_key)
    prompt_maker = ASMRFruitPrompts()

    results = []

    print(f"开始批量生成 {video_count} 个ASMR切水果视频...")

    for i in range(video_count):
        print(f"\n=== 生成第 {i+1} 个视频 ===")

        # 生成提示词
        prompt, fruit = prompt_maker.generate_prompt()
        print(f"水果类型: {fruit}")
        print(f"提示词: {prompt}")

        # 提交生成任务
        response = generator.generate_video(prompt)

        if response["code"] == 0:
            task_id = response["data"]["task_id"]
            print(f"任务已提交,ID: {task_id}")

            # 等待完成
            video_url = generator.wait_for_completion(task_id)

            if video_url:
                result = {
                    "index": i + 1,
                    "fruit": fruit,
                    "prompt": prompt,
                    "task_id": task_id,
                    "video_url": video_url,
                    "status": "success"
                }
                print(f"✅ 视频生成成功: {video_url}")
            else:
                result = {
                    "index": i + 1,
                    "fruit": fruit,
                    "prompt": prompt,
                    "task_id": task_id,
                    "video_url": None,
                    "status": "failed"
                }
                print("❌ 视频生成失败")
        else:
            result = {
                "index": i + 1,
                "fruit": fruit,
                "prompt": prompt,
                "task_id": None,
                "video_url": None,
                "status": "error",
                "error": response.get("message", "未知错误")
            }
            print(f"❌ 提交任务失败: {response.get('message')}")

        results.append(result)

        # 避免请求过于频繁
        if i < video_count - 1:
            print("等待5秒后继续...")
            time.sleep(5)

    return results

def save_results(results, filename="asmr_videos_results.json"):
    """保存生成结果"""
    with open(filename, 'w', encoding='utf-8') as f:
        json.dump(results, f, ensure_ascii=False, indent=2)
    print(f"\n结果已保存到 {filename}")

def print_summary(results):
    """打印生成摘要"""
    total = len(results)
    success = len([r for r in results if r["status"] == "success"])
    failed = total - success

    print(f"\n=== 生成摘要 ===")
    print(f"总数: {total}")
    print(f"成功: {success}")
    print(f"失败: {failed}")
    print(f"成功率: {success/total*100:.1f}%")

    print(f"\n=== 成功的视频 ===")
    for result in results:
        if result["status"] == "success":
            print(f"{result['index']}. {result['fruit']} - {result['video_url']}")

4. 使用示例

def main():
    # 替换为你的API密钥
    API_KEY = "your-api-key-here"

    try:
        # 批量生成5个ASMR切水果视频
        results = batch_generate_asmr_videos(API_KEY, video_count=5)

        # 保存结果
        save_results(results)

        # 打印摘要
        print_summary(results)

    except Exception as e:
        print(f"程序执行出错: {e}")

if __name__ == "__main__":
    main()